我有一个JPanel的一个JFrame,其中有一个JLabel有一个ImageIcon()。 一切都可以正常使用,问题是我现在想与如按钮的所有其他的东西等等到JFrame添加其他的JPanel。 但它仍然显示在上面,并没有与第二JPanel的背景图像。
有人能帮我吗? 下面是我的代码的摘录:
JFrame window = new JFrame("Http Download");
/*
* Background Section
*/
JPanel panel1 = new JPanel();
JLabel lbl1 = new JLabel();
/*
* Component Section
*/
JPanel panel2 = new JPanel();
JLabel lbl2 = new JLabel();
/*
* Dimension Section
*/
Dimension windowSize = new Dimension(800, 600);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
public HTTPDownloadGUI() {
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.setLayout(null);
panel1.setSize(windowSize);
panel1.setOpaque(false);
panel2.setLayout(null);
panel2.setSize(windowSize);
panel2.setOpaque(false);
lbl1.setSize(windowSize);
lbl1.setLocation(0, 0);
lbl1.setIcon(new ImageIcon(getClass().getResource("bg1.png")));
panel1.add(lbl1);
lbl2.setBounds(0, 0, 100, 100);
//lbl2.setIcon(new ImageIcon(getClass().getResource("bg2.png")));
lbl2.setBackground(Color.GREEN);
panel2.add(lbl2);
panel1.add(panel2);
window.add(panel1);
int X = (screen.width / 2) - (windowSize.width / 2);
int Y = (screen.height / 2) - (windowSize.height / 2);
window.setBounds(X,Y , windowSize.width, windowSize.height);
window.setVisible(true);
}
- 避免空的布局,这里比较麻烦那么他们的价值
- 设置框架布局
BorderLayout
- 标签添加到框架
- 设置标签布局
BorderLayout
- 创建您面板和设置它的不透明属性设置为false
- 添加其他组件按照正常
- 面板添加到标签
查看
- 是否有对扩展的JFrame将图片作为背景的任何问题?
- 将一个JLabel与图像中的JLabel上方
举些例子
更新与范例
-
panel1
是主要的背景... - 设置
panel1
的布局BorderLayout
- 添加
lbl1
到panel1
- 设置
lbl1
的布局BorderLayout
- 一套
panel2
的布局,你想用什么都... - 一套
panel2
的不透明度属性为false
( panel2.setOpacity(false)
) - 添加
lbl2
到panel2
- 添加
panel2
到lbl1
- 添加
panel1
每一个你想要的。
public class TestLayout17 {
public static void main(String[] args) {
new TestLayout17();
}
public TestLayout17() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
/*
* Background Section
*/
JPanel panel1 = new JPanel();
JLabel lbl1 = new JLabel();
/*
* Component Section
*/
JPanel panel2 = new JPanel();
JLabel lbl2 = new JLabel();
/*
* Dimension Section
*/
Dimension windowSize = new Dimension(800, 600);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
public TestPane() {
setLayout(new BorderLayout());
panel1.setLayout(new BorderLayout());
lbl1.setLayout(new BorderLayout());
URL url = getClass().getResource("/bg1.gif");
System.out.println(url);
try {
BufferedImage image = ImageIO.read(url);
Image smaller = image.getScaledInstance(-1, image.getHeight() / 2, Image.SCALE_SMOOTH);
lbl1.setIcon(new ImageIcon(smaller));
} catch (Exception e) {
e.printStackTrace();
}
// lbl1.setIcon(new ImageIcon(url));
panel1.add(lbl1);
add(panel1);
panel2.setLayout(new GridBagLayout());
panel2.setOpaque(false);
lbl2.setBorder(new EmptyBorder(8, 8, 8, 8));
lbl2.setBackground(Color.GREEN);
lbl2.setText("Say hello");;
lbl2.setOpaque(true);
panel2.add(lbl2);
lbl1.add(panel2);
}
}
}
没有什么似乎显示了其原因panel2
是因为没有什么可以显示。 简单地设置文本lbl2
将显示该JPanel
本身是可见的:
JLabel lbl2 = new JLabel("Some text");
我会,但是建议不要使用null
布局,它给开发者设置的位置和尺寸其中的开销布局管理器可以轻松管理你。
我劝你听从MadProgrammer的建议。 如果你选择去用一个空的布局,确保您删除以前JPanel
并添加新的内容窗格window.setContentPane(panel2);
并调用window.repaint()
文章来源: More than one JPanel in a Frame / having a brackground Image and another Layer with Components on the top