我的情况:我有一个扩展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的原因。希望这可以帮助。

10-07 20:33