Как правильно завершить приложение Swing из кода и в чем заключаются подводные камни?
Я пытался закрыть приложение автоматически после срабатывания таймера. Но просто звоню dispose()
на JFrame
не делать трюк - окно исчезло , но приложение не прекращается. Однако при закрытии окна с помощью кнопки закрытия приложение завершается. Что я должен делать?
Ответы:
Ваше действие закрытия JFrame по умолчанию может быть установлено на "
DISPOSE_ON_CLOSE
" вместоEXIT_ON_CLOSE
(почему люди продолжают использовать EXIT_ON_CLOSE, я не понимаю).Если у вас есть неустановленные окна или потоки, не являющиеся демонами, ваше приложение не завершится. Это следует рассматривать как ошибку (и решение ее с помощью System.exit - очень плохая идея).
Наиболее частыми виновниками являются java.util.Timer и созданный вами пользовательский поток. Оба должны быть установлены как демон или должны быть явно убиты.
Если вы хотите проверить все активные кадры, вы можете использовать
Frame.getFrames()
. Если все окна / фреймы удалены, используйте отладчик для проверки любых потоков, не являющихся демонами, которые все еще работают.источник
back
окна? Если второе окно затем закрывается, и вы используетеDISPOSE_ON_CLOSE
программу, не завершается, потому что первое окно все еще "неактивно" ... есть ли способ решить эту проблему без использованияDISPOSE_ON_CLOSE
?Я думаю, EXIT_ON_CLOSE
before
System.exit(0)
лучше, так как вы можете написать Window Listener для выполнения некоторых операций по очистке перед фактическим выходом из приложения.Этот оконный слушатель позволяет вам определять:
источник
Пытаться:
Грубый, но эффективный.
источник
Возможно, безопасный способ выглядит примерно так:
источник
Frame
с заглавной буквы, в точности как имя класса…Следующая программа включает код, который завершит программу, в которой отсутствуют посторонние потоки, без явного вызова System.exit (). Чтобы применить этот пример к приложениям, использующим потоки / слушатели / таймеры и т. Д., Нужно только вставить код очистки, запрашивающий (и, если применимо, ожидающий) их завершения, прежде чем WindowEvent будет вручную инициирован в actionPerformed ().
Для тех, кто хочет скопировать / вставить код, способный работать точно так, как показано, в конце включен немного уродливый, но в остальном неуместный основной метод.
источник
Если я вас правильно понял, вы хотите закрыть приложение, даже если пользователь не нажимал кнопку закрытия. Вам нужно будет зарегистрировать WindowEvents, возможно, с помощью addWindowListener () или enableEvents (), в зависимости от того, что вам больше подходит.
Затем вы можете вызвать событие с помощью вызова processWindowEvent (). Вот пример кода, который создаст JFrame, подождет 5 секунд и закроет JFrame без вмешательства пользователя.
Как видите, метод processWindowEvent () вызывает событие WindowClosed, где у вас есть возможность выполнить некоторую очистку кода, если вам это необходимо, перед закрытием приложения.
источник
Взгляните на документацию Oracle .
Начиная с JDK 1.4 приложение завершает работу, если:
Угловые шкафы:
В документе говорится, что некоторые пакеты создают отображаемые компоненты, не выпуская их. Программа, вызывающая Toolkit.getDefaultToolkit (), не завершится. среди прочего приводится в качестве примера.
Также другие процессы могут поддерживать AWT в рабочем состоянии, когда они по какой-либо причине отправляют события в собственную очередь событий.
Также я заметил, что в некоторых системах требуется несколько секунд, прежде чем приложение действительно завершит работу.
источник
Я думаю, идея здесь в WindowListener - вы можете добавить туда любой код, который хотите запустить, прежде чем вещь отключится.
источник
В ответ на другие комментарии DISPOSE_ON_CLOSE, похоже, не выходит из приложения должным образом - он только разрушает окно, но приложение продолжает работать. Если вы хотите закрыть приложение, используйте EXIT_ON_CLOSE.
источник