在JFrame中设置背景图片

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有关,但我对LayoutManager的工作方式一点也不熟悉(这是大学项目,任务明确指出不使用LayoutManager)。
当我将图像设置为背景时,必须显示null(因此透明(??)),红色方块就会出现,所以背景实际上可能在我的其他组件之上。
有人有什么想法吗?
谢谢

希望这个主题的线程也能对你有所帮助 :-) - nIcE cOw
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处。


3

请查看Root Pane的文档,了解所有需要的信息。请注意层次面板和玻璃面板以及内容面板的可用性。


2
默认情况下,所有组件的大小都为0。仅仅因为你在组件上进行了一些绘画并不会改变组件的大小。你仍然需要负责设置组件的大小。这就是为什么你应该始终使用布局管理器。它会帮助你处理所有这些大小问题,所以你不必担心。
我不知道为什么新手总是认为他们不能使用布局管理器。是的,学习需要一些时间,但从长远来看,它可以节省很多麻烦。 背景面板展示了几种方法。同样地,它们都假设你使用了布局管理器,因此你可能需要手动设置大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接