Почему мое приложение все еще работает после закрытия главного окна?
Если я создаю 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);
заставит остановить любые другие потоки (и всю программу), что означает, что ваш код менее портативен, а потоки с принудительной остановкой, очевидно, опасны (в программировании).