Почему мое приложение все еще работает после закрытия главного окна?

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

public static void main(String[] args) {

     new JFrame().setVisible(true);
}

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

Каков правильный способ отображения основных окон приложения?

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

Спасибо заранее.

Ответы

Ответ 1

Вы должны называть 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);
}

Ответ 2

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

DISPOSE_ON_CLOSE или EXIT_ON_CLOSE.

DISPOSE_ON_CLOSE удалять ресурсы кадра.

EXIT_ON_CLOSE предоставляет ресурсы кадра, а затем вызывает System.exit.

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

Ответ 3

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

Yuval = 8 -)

Ответ 4

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

     frame.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
              System.exit(0);
          }
     }

Ответ 5

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

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

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