java.lang.IllegalArgumentException:向容器添加窗口

时间:2014-07-24 07:42:32

标签: java jframe

当我调用frame.add(this)时,我得到'java.lang.IllegalArgumentException:向容器添加一个窗口'。我做错了什么,以及如何修复错误。提前谢谢。

public class mainclass extends JFrame{

private static final long serialVersionUID = 1L;

private int width = 400;
private int height = 400;

public static JFrame frame;

public static void main(String args[]) {
frame = new JFrame();

    mainclass mainclass = new mainclass();
    mainclass.createFrame();
}

public void createFrame() {
    frame.setSize(new Dimension(width, height));
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.add(this); // this is where the error occurs
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setIconImage(new ImageIcon("res/icon.png").getImage());
}
}

堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
at java.awt.Container.checkNotAWindow(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at test.mainclass.createFrame(mainclass.java:27)
at test.mainclass.main(mainclass.java:21)

2 个答案:

答案 0 :(得分:2)

简单的答案是你无法做到这一点。您的问题将受益于描述为什么您想要这样做 - 您想要实现的最终结果是什么?

如果您尝试添加其他容器,则应使用JPanel s。如果您正在尝试创建类似MDI的应用,那么您应该查看JInternalFrame s。如果你想要一个弹出框架,你需要JDialog s。

有关更多信息,JFrame设计为顶级容器 - 它们包含JRootPane作为唯一的子容器。当您想要向框架添加内容时,您实际上会添加到框架的根窗格,称为内容窗格。正确的方法是致电frame.getContentPane().add()

这是一个令人沮丧的持续来源,因为许多开发人员本能地想要调用frame.add(),这实际上是所有其他Swing组件的工作方式。因此,方便frame.add()被覆盖以致电frame.getContentPane().add()

因此,如果您考虑现在示例中发生了什么,那么您正在尝试将JFrame添加到框架的根内容窗格中。可以理解的是,根窗格不能将其他顶级容器作为子元素,例如JFrame,因为它们拥有自己的根窗格。

答案 1 :(得分:0)

mainclassJFrame延伸。你不能有一个容器窗口,就像它一样。

尝试从[{1}}等mainclass扩展{。}}。

我也关注JPanel。这看起来非常像new ImageIcon("res/icon.png")是嵌入式资源而不是文件系统上的文件。您可能会发现需要使用icon.png,但我没有足够的背景来100%确定