在JFrame中的背景图像

时间:2010-04-15 13:05:23

标签: java swing jframe background-image

这个问题已被问到很多,但到处都是答案不足。我可以通过扩展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(因此,透明(??))红色方块显示出来,因此背景可能实际上高于我的其他组件。

有没有人有任何想法?

由于

3 个答案:

答案 0 :(得分:5)

当使用null布局(并且你几乎从不)时,你必须为每个组件提供一个边界,否则它默认为(0 x,0 y,0 width,0高度),组件将不会显示。

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。

答案 1 :(得分:3)

查看Root Pane上的文档,了解您需要的所有信息。请注意分层窗格和玻璃窗格以及内容窗格的可用性。

答案 2 :(得分:2)

默认情况下,所有组件的大小均为0。仅仅因为你在一个组件上做一些绘画并没有给组件一个大小。您仍负责设置大小。这就是为什么你应该总是使用布局管理器。它为您照顾所有这些大小的东西,所以你不必担心。

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

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