Java 帧中的背景图像

Java 帧中的背景图像,java,swing,jframe,background-image,Java,Swing,Jframe,Background Image,这个问题被问了很多次,但到处都找不到答案。通过扩展JPanel并覆盖paintComponent,我可以获得一个JFrame来显示背景图像,如下所示: class BackgroundPanel extends JPanel { private ImageIcon imageIcon; public BackgroundPanel() { this.imageIcon = Icons.getIcon("foo"); } @Override p

这个问题被问了很多次,但到处都找不到答案。通过扩展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调用有关,但我对LayoutManager的工作方式一点也不熟悉(这是一个大学项目,作业中特别提到不要使用LayoutManager)

当我制作图像时,背景必须显示为空(因此,transparant(??)会显示红色方块,因此背景可能实际位于我的其他组件之上

有人有什么想法吗


谢谢

有关所需的所有信息,请查看上的文档。请注意分层窗格、玻璃窗格以及内容窗格的可用性。

默认情况下,所有组件的大小均为0。仅仅因为您在组件上进行了一些绘制,并不能为组件提供一个大小。您仍然负责设置大小。这就是为什么您应该始终使用布局管理器的原因。它为你照看所有这些尺寸的东西,所以你不必担心

我不知道为什么新手总是认为他们不能使用布局管理器。是的,它需要更多的几分钟来学习,但从长远来看,它为你节省了很多悲伤


显示了两种方法。同样,它们都假设您使用布局管理器,因此您可能需要手动设置大小。

当使用
null
layout(您几乎不应该这样做)时,您必须为每个组件提供边界,否则它默认为(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
大小为100x100,并将其放置在100x100y的框架上。

希望这也能对以下主题有所帮助:-)