Как закрыть JFrame из класса вне того, в котором он был объявлен - PullRequest
0 голосов
/ 07 мая 2019

Итак, я программирую игровую змею на Java, и в одном классе я объявляю свой JFrame.Как видите, я использую некоторые переменные класса из моего другого класса GamePanel (HEIGHT и WIDTH) для задания размеров, а также для создания экземпляра GamePanel для setContentPane().У меня есть другой класс, который делает экземпляр SnakeGame для того, чтобы реально запустить игру.Этот класс будет иметь титульный экран.Вот класс SnakeGame:

    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);
     }
}

Я хочу, чтобы пользователь мог нажимать клавишу «esc» или нажимать экранную кнопку, чтобы закрыть frame из класса GamePanel.Есть ли какой-нибудь возможный способ сделать это?

Я попытался использовать метод в классе SnakeGame, который бы возвратил frame, думая, что я мог бы вызвать этот метод из моего GamePanel класса, чтобы использовать методы JFrame дляизмените frame, но, похоже, это не сработало.

Вот конструктор для GamePanel, если это поможет:

public GamePanel(){
          setPreferredSize(new Dimension(WIDTH, HEIGHT));
          setFocusable(true);
          requestFocus();
          addKeyListener(this);
     }

1 Ответ

0 голосов
/ 07 мая 2019

Вы можете использовать функцию 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));
    }
}

Введите этот код в *Функция 1008 * * KeyPressed.

...