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

java.lang.IllegalArgumentException:向容器添加窗口,java,jframe,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 JFram

当我调用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)

mainclass
扩展自
JFrame
。你不能把一个窗口放在一个容器上,这就是它的方式

尝试将
mainclass
扩展为类似
JPanel
的内容


我还关心
新图像图标(“res/icon.png”)
。这看起来很像
图标。png
是一个嵌入式资源,而不是文件系统上的文件。你可能会发现你需要使用新的图像图标(getClass().getResource(“/res/icon.png”),但是我没有足够的上下文来100%确定,简单的答案是你不能这样做。你的问题可以从描述你为什么要这样做中受益——你想要达到什么样的最终结果

如果您试图添加另一个容器,那么应该使用s。如果你正在尝试创建一个类似MDI的应用程序,那么你应该看看s。如果你想要一个弹出框,你需要s

关于更多信息,
JFrame
s被设计为顶级容器-它们包含一个
JRootPane
作为其唯一的子容器。当您想向框架添加内容时,实际上是在向框架的根窗格(称为内容窗格)添加内容。正确的方法是调用
frame.getContentPane().add()

这一直是一个令人沮丧的原因,因为许多开发人员本能地想要调用
frame.add()
,这实际上是所有其他Swing组件的工作方式。因此,为了方便起见,
frame.add()
被重写为调用
frame.getContentPane().add()


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

@Issac如果您可以发布StackTrace并将一个框架添加到另一个框架中,这将非常有用。请不要这样做。你想通过这个实现什么?@Sanjeev我想创建一个框架,然后在其上绘制,要在框架上绘制,你必须添加一些东西,我相信……
frame
属于
JFrame
类型。您正在将
JFrame
添加到
JFrame
。。这没意义。你可以用JPanel