繁体   English   中英

JFrame中的背景图片

[英]Background image in a 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);时,它显示为红色cp.setLayout(null); ,则显示背景,但不显示其他组件。 我猜想这与没有由null LayoutManager调用的paintComponent有关,但是我完全不熟悉LayoutManager的工作方式(这是一个专为大学设计的项目,作业明确指出不要使用LayoutManager) 。

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

有谁有任何想法吗?

谢谢

当使用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。 仅仅因为您在组件上进行绘画不会赋予组件大小。 您仍然负责设置大小。 这就是为什么您应该始终使用布局管理器的原因。 它会为您照顾所有这些大小的东西,因此您不必担心。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM