如何从一个在其声明之外的类中关闭一个JFrame

时间:2019-05-07 00:58:14

标签: java swing user-interface jframe awt

因此,我正在用Java编写游戏蛇,然后在一个类中声明我的JFrame。如您所见,我使用其他类d={x : y for x , y in yourdf.groupby(s.cumsum())} GamePanelHEIGHT)中的一些类变量来设置尺寸并为{{ 1}}。我还有另一个类可以使SnakeGame实例化,以便实际运行游戏。该课程将有一个标题屏幕。 这是SnakeGame类:

WIDTH

我希望用户能够按'esc'键或按屏幕上的按钮来关闭GamePanel类中的setContentPane()。有什么可行的方法吗?

我尝试在 public final class SnakeGame{ JFrame frame = new JFrame("SnakeGame"); GamePanel g = new GamePanel(); public SnakeGame(){ //the content of the frame is the g object from the GamePanel class frame.setContentPane(g); //default close operation is to close when close button is pressed frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //user can't change size of panel frame.setResizable(false); frame.pack(); //size is set frame.setPreferredSize(new Dimension(GamePanel.WIDTH, GamePanel.HEIGHT)); frame.setLocationRelativeTo(null); //set visible = true so that the user can see it frame.setVisible(true); } } 类中使用一个返回frame的方法,以为我可以从我的GamePanel类中调用该方法以使用JFrame方法来更改SnakeGame ,但这似乎不起作用。

如果有帮助,这里是frame的构造函数:

GamePanel

1 个答案:

答案 0 :(得分:0)

您可以使用SwingUtilities.getWindowAncestor中的javax.swing.SwingUtilities函数来获取面板的顶部框架。

这是工作代码:

@Override
public void keyPressed(KeyEvent arg0) {
    if (arg0.getKeyCode() == 27) { // 27 is ascii code for esc button
        JFrame frame = (JFrame)SwingUtilities.getWindowAncestor(this);
        frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
    }
}

将此代码放入GamePanel的{​​{1}}函数中。