2010-04-15 108 views
3

這個問題已經有很多問題,但在任何地方答案都不盡人意。我可以得到一個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);,背景顯示出來,但不是我的其他組件。我猜這與paintComponent沒有被null LayoutManager調用有關,但我完全不瞭解LayoutManagers是如何工作的(這是一個專門針對大學的項目,並且該任務明確指出不使用LayoutManager) 。

當我讓圖像背景必須顯示空(等,transparant(??))紅色正方形顯示,所以它可能是背景實際上高於我的其他組件。

有沒有人有任何想法?

感謝

+0

希望這個[線程](http://stackoverflow.com/a/11428289/1057230)也可能有一些幫助,在主題:-) – 2013-05-26 04:03:38

回答

5

當使用null佈局(你幾乎從未應該)你必須提供一個界限爲每個組件,否則默認爲(0 X 0 Y,0寬度,高度爲0)和成分不會顯示。

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

沒有提供邊界。你需要做的是這樣:

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

這將使bg尺寸爲100×100,並將其放置在100×,100是在框架上。

3

查找你需要的所有信息在Root Pane的文件中。請注意分層窗格和玻璃窗格以及內容窗格的可用性。

2

默認情況下,所有組件的大小都爲0。僅僅因爲你在組件上做了一些繪畫並不會給組件一個大小。您仍然負責設置尺寸。這就是爲什麼你應該總是使用佈局管理器。它看起來像所有這些大小的東西,所以你不必擔心。

我不知道爲什麼新手總是認爲他們不能使用佈局管理器。是的,它需要幾分鐘的時間才能學會,但從長遠來看,它爲您節省了很多的痛苦。

Background Panel顯示了幾種方法。同樣他們都假設你使用佈局管理器,所以你可能需要手動設置大小。