Java 带内容的背景图像框架

Java 带内容的背景图像框架,java,swing,jframe,background-image,border-layout,Java,Swing,Jframe,Background Image,Border Layout,我有一个JFrame和BorderLayout,四周都有面板(北、东、…)。面板中主要有标签和按钮 现在我希望框架有一个背景图像,一些研究告诉我,我必须更改框架的内容窗格 但是,当我尝试此操作时,内容被放在背景中,不可见。另外,如果调整了帧的大小,我不知道如何调整图像的大小 是否有一个简单的修复方法,或者我必须重新编写大部分代码 将带有背景图像的JPanel(或JComponent)放在BorderLayout.CENTER,然后这个JPanel填充整个JFrame区域,其余JComponent

我有一个
JFrame
BorderLayout
,四周都有面板(北、东、…)。面板中主要有标签和按钮

现在我希望框架有一个背景图像,一些研究告诉我,我必须更改框架的内容窗格

但是,当我尝试此操作时,内容被放在背景中,不可见。另外,如果调整了帧的大小,我不知道如何调整图像的大小

是否有一个简单的修复方法,或者我必须重新编写大部分代码

  • 将带有背景图像的
    JPanel
    (或
    JComponent
    )放在
    BorderLayout.CENTER
    ,然后这个
    JPanel
    填充整个
    JFrame
    区域,其余
    JComponents
    放在这个
    JPanel

  • 四面(北、东、…)都有喷气式飞机。在JPanel中,主要有JLabel和JButton。

    这些
    JComponents
    覆盖了
    JFrame
    的所有可用
    Rectangle
    ,然后
    Background Image
    (从我的第一点开始)将永远不会显示,因为这些
    JComponents
    位于
    JFrame
    顶部,并且可以隐藏此
    图像

  • 添加带有背景图像的
    JPanel
    (从我的第一点开始),然后在那里放置另一个
    JPanel
    ,带有
    JPanel\setOpaque(false)
    ,则此
    JPanel
    将是透明的,请注意
    JPanel
    在默认情况下已实现
    FlowLayout


  • 这个例子将帮助您开始。像任何JPanel一样使用它

    public class JPanelWithBackground extends JPanel {
    Image imageOrg = null;
    Image image = null;
    {
        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                int w = JPanelWithBackground.this.getWidth();
                int h = JPanelWithBackground.this.getHeight();
                image = w>0&&h>0?imageOrg.getScaledInstance(w,h, 
                        java.awt.Image.SCALE_SMOOTH):imageOrg;
                JPanelWithBackground.this.repaint();
            }
        });
    }
    public JPanelWithBackground(Image i) {
        imageOrg=i;
        image=i;
        setOpaque(false);
    }
    public void paint(Graphics g) {
        if (image!=null) g.drawImage(image, 0, 0, null);
        super.paint(g);
    }
    }
    
    用法示例:

        Image image = your image
        JFrame f = new JFrame("");
        JPanel j = new JPanelWithBackground(image);
        j.setLayout(new FlowLayout());
        j.add(new JButton("YoYo"));
        j.add(new JButton("MaMa"));
        f.add(j);
        f.setVisible(true);
    
    GridLayout()
    BorderLayout
    CENTER
    的工作原理非常相似。注意:a)只有当图像在任何地方都不透明时,这才是有效的覆盖。b) 添加到contentPane并不满足以下所有添加内容的要求:-)
        Image image = your image
        JFrame f = new JFrame("");
        JPanel j = new JPanelWithBackground(image);
        j.setLayout(new FlowLayout());
        j.add(new JButton("YoYo"));
        j.add(new JButton("MaMa"));
        f.add(j);
        f.setVisible(true);