在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) 。

当我制作图像时,背景必须显示为null(因此,透明(??))红色方块显示,因此可能是背景实际上高于我的其他组件。

有没有人有任何想法?

谢谢

当使用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。 仅仅因为你在组件上做一些绘画并没有给组件一个大小。 您仍负责设置大小。 这就是为什么你应该总是使用布局管理器。 它为您照顾所有这些大小的东西,所以你不必担心。

我不知道为什么新手总是认为他们不能使用布局管理器。 是的,需要花费几分钟的时间来学习,但从长远来看,它可以为您节省很多麻烦。

背景面板显示了几种方法。 他们再次假设您使用布局管理器,因此您可能需要手动设置大小。