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

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

简单的答案是你不能这样做。 您的问题将受益于描述您为什么要这样做 – 您想要实现的最终结果是什么?

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

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

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

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

mainclassJFrame扩展而来。 你不能有一个容器的窗口,这就是它的方式。

尝试使用JPanel东西来扩展mainclass

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