我有一个JFrame,它使用背景图像作为内容窗格。我成功地完成了我的ImagePanel课程。但是,当我尝试添加其他组件时,这些组件不会显示。我猜这是关于Z顺序所以我试图设置标签的Z顺序,但它给了我一个错误。
frame.setContentPane(new ImagePanel(bg));
frame.setBackground(new Color(0,255,0,0));
frame.getContentPane().setComponentZOrder(jLabel1, 1);
frame.setVisible(true);
例外是:
java.lang.IllegalArgumentException: illegal component position
当我尝试将Z顺序更改为0时,它会给我一个不同的错误
frame.getContentPane().setComponentZOrder(jLabel1, 0);
错误是:
java.lang.IllegalArgumentException: component and container should be in the same top-level window
答案 0 :(得分:2)
您获得了例外,因为您没有将标签添加到框架中。但是,使用ZOorder不是解决问题的方法。
相反,您应该将JLabel添加到ImagePanel。
ImagePanel panel = new ImagePanel(bg);
panel.setLayout(...);
panel.add(label);
frame.setContentPane(panel);
答案 1 :(得分:1)
setComponentZOrder
的设置不能高于框架中的组件数量-1。
因此,在将Z顺序设置为1之前,请确保框架中至少有2个组件。
答案 2 :(得分:0)
您基本上不想替换框架的组件窗格,而是向其添加组件:
frame.add(jLabel1); // I assume this is included in your code
ImagePanel image = new ImagePanel(bg)
frame.add(image);
frame.getContentPane().setComponentZOrder(jLabel1, 1);
frame.getContentPane().setBackground(new Color(0,255,0,0));
frame.setVisible(true);
我还添加了一些.getContentPane()
以确保所有方法都与内容窗格相关,而不是框架,因为并非所有方法都被重定向。
请阅读JFrame和JFrame.setContentPane的Javadocs以获取更多信息。
答案 3 :(得分:0)
您尚未发布完整代码以查找问题,但这里是Z-order的小型演示:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class NewClass extends JFrame {
public NewClass(){
super("Test");
setSize(200, 200);
JPanel panel = new JPanel();
setContentPane(panel);
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
JButton button3 = new JButton("Button 3");
button1.setBounds(10, 10, 100, 40);
button2.setBounds(5, 5, 100, 30);
button3.setBounds(15, 15, 150, 40);
panel.setLayout(null);
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.setComponentZOrder(button1, 1);
panel.setComponentZOrder(button2, 0);
panel.setComponentZOrder(button3, 2);
// OR to swap z order of buttons, try below
// panel.setComponentZOrder(button1, 0);
// panel.setComponentZOrder(button2, 1);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String [] args){
new NewClass();
}
}