Почему мое приложение продолжает работать после закрытия главного окна? - PullRequest
14 голосов
/ 29 октября 2008

Если я сделаю JFrame, как это

public static void main(String[] args) {

     new JFrame().setVisible(true);
}

затем после закрытия окна приложение не останавливается (мне нужно его убить).

Как правильно показывать главные окна приложения?

Я также хотел бы узнать причину предложенного решения.

Заранее спасибо.

Ответы [ 5 ]

20 голосов
/ 29 октября 2008

Вы должны вызвать setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); в вашем JFrame.

Пример кода:

public static void main(String[] args) {
    Runnable guiCreator = new Runnable() {
        public void run() {
            JFrame fenster = new JFrame("Hallo Welt mit Swing");
            fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fenster.setVisible(true);
        }
    };
    SwingUtilities.invokeLater(guiCreator);
}
3 голосов
/ 29 октября 2008

Вы должны избавиться от фрейма, вызвав метод dispose в вашем обработчике окон или используя setDefaultCloseOperation. Для аргумента последнего вы можете использовать две опции:

DISPOSE_ON_CLOSE или EXIT_ON_CLOSE.

DISPOSE_ON_CLOSE распоряжаться только ресурсами фрейма.

EXIT_ON_CLOSE располагает ресурсы фрейма и затем вызывает System.exit.

Нет реальной разницы между этими двумя, если у вас нет потоков, не являющихся демонами. Я предпочитаю использовать DISPOSE_ON_CLOSE, потому что таким образом я могу заметить, что я забыл прекратить поток, потому что JVM остановится, если не будет больше запущенных потоков. По этой же причине закрытие Frame без удаления не приведет к завершению приложения, поскольку Swing создает поток для обработки событий, которые завершаются только при вызове dispose.

3 голосов
/ 29 октября 2008

Существует разница между окном приложения и самим приложением ... Окно запускается в своем собственном потоке, и завершение main() не завершит приложение, если другие потоки все еще активны. При закрытии окна вы также должны закрыть приложение, возможно, позвонив по номеру System.exit(0);

Ювал = 8 -)

0 голосов
/ 30 марта 2017

Правильный способ сделать это (если вы не пишете очень тривиальное однооконное приложение, то есть нет других окон или потоков и т. Д.) - перехватить событие windowClosing(), а затем вызвать метод dispose(); формы.

Если ваша программа не завершает работу полностью после этого, это означает, что у вас запущены другие не-демоновские потоки, и вы должны остановить их так, как считаете нужным, в зависимости от вашей программы.

Вызов System.exit() или setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); принудительно остановит любые другие потоки (и всю программу), что означает, что ваш код менее переносим, ​​а принудительно останавливающие потоки, очевидно, опасны (в смысле программирования).

0 голосов
/ 28 декабря 2011

Вы можете установить оконный слушатель для фрейма, чтобы программа закрывалась после его закрытия.

     frame.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
              System.exit(0);
          }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...