2

我有一个 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
4

4 回答 4

2

您收到异常是因为您没有将标签添加到框架中。但是,使用 ZOorder 并不是解决问题的方法。

相反,您应该将 JLabel 添加到 ImagePanel。

ImagePanel panel = new ImagePanel(bg);
panel.setLayout(...);
panel.add(label);
frame.setContentPane(panel);
于 2013-10-15T19:05:45.967 回答
1

setComponentZOrder不能设置为高于框架中的组件数量 - 1。

因此,在将 Z 顺序设置为 1 之前,请确保框架中至少有 2 个组件。

于 2020-04-01T05:03:39.477 回答
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 以获得更多信息。

于 2013-10-15T18:54:51.277 回答
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();
    }
}
于 2013-10-15T19:19:08.900 回答