3

这个问题被问了很多,但到处都没有答案。通过扩展 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);,背景会显示,但不会显示我的其他组件。我猜这与 null LayoutManager 没有调用paintComponent 有关,但我一点也不熟悉 LayoutManagers 的工作原理(这是一个大学项目,作业特别说明不要使用 LayoutManager) .

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

有没有人有任何想法?

谢谢

4

3 回答 3

5

当使用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 处。

于 2010-04-15T15:15:59.270 回答
3

在根窗格上的文档中查找您需要的所有信息。请注意分层窗格和玻璃窗格以及内容窗格的可用性。

于 2010-04-15T13:43:01.670 回答
2

默认情况下,所有组件的大小为 0。仅仅因为您在组件上进行了一些绘画并不会为组件指定大小。您仍然负责设置大小。这就是为什么您应该始终使用布局管理器的原因。它会为您处理所有这些尺寸的东西,因此您不必担心。

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

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

于 2010-04-15T15:14:42.047 回答