Java - как DO_NOTHING_ON_CLOSE, затем включить EXIT_ON_CLOSE? - PullRequest
1 голос
/ 14 декабря 2011

У меня есть игра, в которой я пытаюсь перехватить закрытое событие и вернуть пользователя в главное меню. Я понял половину этого с помощью DO_NOTHING_ON_CLOSE, но проблема в том, что я не могу вернуть обычную функциональность на экран меню.

Как вы, вероятно, знаете, проблема в том, что метод windowClosing, по-видимому, является последним запущенным слушателем, если DO_NOTHING... - операция.

Итак, мой вопрос, как я могу вернуть EXIT_ON_CLOSE в окно, после того, как NOTHING было сделано? Я бы хотел сделать это без участия пользователя. Я могу переключиться на другой JFrame и обработать его оттуда, но должен быть лучший способ сделать это.

Пример кода:

WindowAdapter waReturnToMenu = new WindowAdapter() {
   @Override
   public void windowClosing(final WindowEvent e) {
        view.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        changeMenuState(0);
   }
};

Затем в состоянии изменения меню:

public void changeMenuState(int i0) {
    //...screen returns to menu, then

    view.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Почему бы не включить эту логику в WindowListener, так как она будет вызываться при попытке закрытия? Ваш код устанавливает состояние логической переменной, чтобы сообщить WindowListener, хотите ли вы, чтобы он вернул пользователя в программу или закрыл ее. В WindowListener вы проверяете состояние этой логической переменной, и, если это определенное значение, выходите из программы через System.exit(...).

(сделано в ответ)

например.,

// class field
private boolean canClose = false;

//....

WindowAdapter waReturnToMenu = new WindowAdapter() {
   @Override
   public void windowClosing(final WindowEvent e) {
        if (canClose) {
           System.exit(0);
        } else {
           changeMenuState(0);
        }
   }
};

Затем в состоянии изменения меню:

public void changeMenuState(int i0) {
    //...screen returns to menu, then

    canClose = true;
}
0 голосов
/ 14 декабря 2011

Оказывается, мне просто нужно было добавить другого слушателя окна, чтобы захватить событие закрытия по умолчанию в changeMenuState.

Таким образом, вместо

public void changeMenuState(int i0) {
    //...screen returns to menu, then

    view.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

теперь у меня есть

public void changeMenuState(int i0) {
    //...screen returns to menu, then

    view.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent e) {
               view.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
           }
    });
}

..., который затем переопределяется при добавлении waReturnToMenu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...