e.getWindow (). dispose () не работает? - PullRequest
1 голос
/ 02 июля 2010

У меня есть основная программа, которая вызывает JFrame для получения информации о пользователе. Если пользователь нажимает «Отправить», я сохраняю информацию в POJO и передаю ее в основную программу.

Если пользователь нажимает кнопку «Выход», я хочу удалить JFrame и также хочу выйти из основной программы после выполнения одного оператора записи в методе main.

Если я использую -

 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
and
this.addWindowListener(new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                e.getWindow().dispose();
            }
        });

все потоки завершаются немедленно, и я не могу выполнить регистрацию статистики в методе main.

Если я использую-

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 this.addWindowListener(new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                e.getWindow().dispose();
            }
        });

Мой основной метод выполняет эти записи в журнале, но никогда не завершается, после выполнения всех операторов он хранит молчание.

Если я использую это -

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 this.addWindowListener(new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                Thread.currentThread.interrupt();
            }
        });

Все отлично работает. Но правильно ли это делать?

Ответы [ 2 ]

1 голос
/ 02 июля 2010

Теоретически, если вы dispose используете все окна верхнего уровня, JVM должна завершиться корректно.

Однако необходимо убедиться в некоторых деталях, которые подробно описаны на этой странице :

Поэтому автономное приложение AWT, которое желает завершить работу без вызова System.exit, должно:

  • Убедитесь, что все компоненты AWT или Swing работаютсделал не отображаемым после завершения приложения.Это можно сделать, вызвав Window.dispose во всех Windows верхнего уровня.Смотрите Frame.getFrames.
  • Убедитесь, что ни один метод прослушивателей событий AWT, зарегистрированных приложением с каким-либо компонентом AWT или Swing, не может работать в бесконечном цикле или зависать бесконечно.Например, метод прослушивателя AWT, вызванный некоторым событием AWT, может отправить новое событие AWT того же типа в EventQueue.Аргумент заключается в том, что методы прослушивателей событий AWT обычно выполняются на вспомогательных потоках.

Если вам не удается найти то, что поддерживает программу, существует другой способ.:

-Используйте первый метод, который вы описали, с EXIT_ON_CLOSE
-Добавьте ShutdownHook в среду выполнения, чтобы выполнить ваши последние операторы регистрации:

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        //logging statements
    });
0 голосов
/ 02 июля 2010

Dispose метод только высвобождает системные ресурсы. Чтобы на самом деле закрыть окно, вы должны позвонить setVisible(false)

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