簡體   English   中英

JFrame中的背景圖片

[英]Background image in a JFrame

這個問題已經問了很多,但是到處都是答案。 我可以通過擴展JPanel並重寫paintComponent來使JFrame很好地顯示背景圖像,如下所示:

class BackgroundPanel extends JPanel {
    private ImageIcon imageIcon;
    public BackgroundPanel() {
        this.imageIcon = Icons.getIcon("foo");
  }

    @Override
    protected void paintComponent(Graphics g) {
       super.paintComponent(g);
        g.drawImage(imageIcon.getImage(), 0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight(),this);
    }
}

但是現在,您如何在該背景之上添加組件? 我去的時候

JFrame w = new JFrame() ;
Container cp = w.getContentPane();
cp.setLayout(null);

BackgroundPanel bg = new BackgroundPanel();
cp.add(bg);

JPanel b = new JPanel();
b.setSize(new Dimension(30, 40));
b.setBackground(Color.red);
cp.add(b);
w.pack()
w.setVisible(true)

它顯示了紅色的小方塊(或任何其他組件),而不是背景,但是當我刪除cp.setLayout(null);時,它顯示為紅色cp.setLayout(null); ,則顯示背景,但不顯示其他組件。 我猜想這與沒有由null LayoutManager調用的paintComponent有關,但是我完全不熟悉LayoutManager的工作方式(這是一個專為大學設計的項目,作業明確指出不要使用LayoutManager) 。

當我制作圖像時,背景必須顯示為空(因此,透明色(??))會顯示紅色方塊,因此背景可能實際上在我的其他組件上方。

有誰有任何想法嗎?

謝謝

當使用null布局時(幾乎從不應該),您必須為每個組件提供邊界,否則默認為(0 x,0 y,0 width,0 height)並且組件將不會顯示。

BackgroundPanel bg = new BackgroundPanel();
cp.add(bg);

沒有提供界限。 您需要執行以下操作:

BackgroundPanel bg = new BackgroundPanel();
bg.setBounds(100, 100, 100, 100);
cp.add(bg);

這將使bg大小為100 x 100,並將其放置在框架上的100 x,100 y處。

根窗格上的文檔中查找所需的所有信息。 注意分層窗格和玻璃窗格以及內容窗格的可用性。

默認情況下,所有組件的大小均為0。 僅僅因為您在組件上進行繪畫不會賦予組件大小。 您仍然負責設置大小。 這就是為什么您應該始終使用布局管理器的原因。 它會為您照顧所有這些大小的東西,因此您不必擔心。

我不知道為什么新手總是認為他們不能使用布局管理器。 是的,學習需要花費更多時間,但從長遠來看,它可以節省很多麻煩。

背景面板顯示了幾種方法。 同樣,它們都假定您使用布局管理器,因此您可能需要手動設置大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM