2010-04-15 76 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显示了几种方法。同样他们都假设你使用布局管理器,所以你可能需要手动设置大小。