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);