当我调用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)
答案 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)
mainclass
从JFrame
延伸。你不能有一个容器窗口,就像它一样。
尝试从[{1}}等mainclass
扩展{。}}。
我也关注JPanel
。这看起来非常像new ImageIcon("res/icon.png")
是嵌入式资源而不是文件系统上的文件。您可能会发现需要使用icon.png
,但我没有足够的背景来100%确定