我的情况:我有一个扩展JFrame的MainScreen类(它实际上只是一个具有启动应用程序的主要方法的JFrame),在上面添加了一个扩展JLayeredPane的GameManager类,用于显示某些内容。
public static void main(String[] args) {
MainScreen ms = new MainScreen();
}
public MainScreen() {
this.initScreen();
this.gm = new GameManager();
this.add(gm, BorderLayout.CENTER);
this.setVisible(true);
}
现在,我想从GameManager类中添加一个JButton到主JFrame中。我认为这很容易,只需执行以下操作:
JButton button = new JButton("Hello");
this.getParent().add(button, BorderLayout.SOUTH);
但是getParent()返回null,因此显然不起作用。我不知道为什么,但是,我之前做过类似的事情(尽管使用了JComponent和JPanel),而且我认为将每个JComponent添加到容器时都将容器作为其父容器。我错过了什么?
最佳答案
如果有以下声明:this.getParent().add(button, BorderLayout.SOUTH);
存在于GameManager.java
的构造函数中,则getParent() is returning null
是正确的。这是因为GameManager
的对象是在调用MainScreen
之后添加到this.getParent().add(button, BorderLayout.SOUTH);
的。
根据https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html
每个顶级容器都有一个内容窗格,通常来说,
包含(直接或间接)
顶级容器的GUI。
对于JFrame
,默认内容窗格为JPanel
。因此,当您调用this.add(gm, BorderLayout.CENTER);
时,实际上是将GameManager
的实例添加到JFrame
的默认内容窗格中,即a JPanel
。这就是为什么GameManager.getParent()
是JPanel
的原因。希望这可以帮助。