Как правильно закрыть окно, JFrame
как если бы пользователь X
нажал кнопку закрытия или нажал Alt+ F4(в Windows)?
У меня есть моя операция закрытия по умолчанию, установленная так, как я хочу, через:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Это делает именно то, что я хочу с вышеупомянутыми элементами управления. Этот вопрос не об этом.
Что я действительно хочу сделать, так это заставить графический интерфейс вести себя так же, как нажатие X
кнопки закрытия приведет к его поведению.
Предположим, я должен был расширить WindowAdaptor
и затем добавить экземпляр моего адаптера в качестве слушателя через addWindowListener()
. Я хотел бы видеть ту же последовательность вызовов через windowDeactivated()
, windowClosing()
и windowClosed()
как это происходит с X
кнопкой закрытия. Не столько разорвать окно, сколько сказать, что оно себя разрывает, так сказать.
Ответы:
Если вы хотите, чтобы графический интерфейс вел себя так, как будто вы нажали
X
кнопку закрытия, вам нужно отправить событие закрытия окна вWindow
.ExitAction
От закрытия приложения позволяет добавить эту функцию в пункт меню или любой компонент , который используетAction
s легко.источник
Не слишком сложно.
источник
Если под Alt-F4 или X вы имеете в виду «Немедленно выйти из приложения, безотносительно к тому, что работают другие окна или потоки», тогда вы
System.exit(...)
будете делать именно то , что вам нужно, очень резким, грубым и, возможно, проблематичным образом.Если под Alt-F4 или X вы подразумеваете скрытие окна, то
frame.setVisible(false)
это то, как вы «закрываете» окно. Окно будет продолжать использовать ресурсы / память, но его можно будет снова быстро увидеть.Если под Alt-F4 или X вы имеете в виду скрыть окно и утилизировать все ресурсы, которые оно потребляет, то
frame.dispose()
это то, как вы «закрываете» окно. Если кадр был последним видимым окном и не запущены другие потоки, не являющиеся демонами, программа завершится. Если вы снова откроете окно, ему придется заново инициализировать все собственные ресурсы (графический буфер, дескрипторы окон и т. Д.).dispose()
может быть ближе всего к поведению, которое вы действительно хотите. Если в вашем приложении открыто несколько окон, хотите ли вы, чтобы Alt-F4 или X закрыли приложение или просто закрыли активное окно?Java Swing Учебник по Window Слушатели могут помочь прояснить вещи для вас.
источник
Если вы сделали это, чтобы убедиться, что пользователь не может закрыть окно:
Тогда вы должны изменить свой
pullThePlug()
метод, чтобы бытьЯ обнаружил, что это единственный способ, который хорошо сочетается с
WindowListener
иJFrame.DO_NOTHING_ON_CLOSE
.источник
Здесь будут ваши варианты:
источник
Выход из Java, запущенный процесс очень прост, в основном вам нужно сделать только две простые вещи:
System.exit(...)
в точке выхода приложения. Например, если ваше приложение основано на фреймах, вы можете добавить слушательWindowAdapter
и и вызватьSystem.exit(...)
его методwindowClosing(WindowEvent e)
.Примечание: вы должны позвонить,
System.exit(...)
иначе ваша программа связана с ошибкой.System.exit(...)
в нужную точку, но это не означает, что метод можно вызывать всегда, потому что непредвиденные исключения Java могут помешать вызову метода.Это тесно связано с вашими навыками программирования.
** Ниже приведен простейший пример (на
JFrame
основе), который показывает вам, как вызвать метод выходаисточник
Не только для закрытия JFrame, но и для запуска событий WindowListener, попробуйте это:
источник
Лучший способ закрыть рамку Swing программно - заставить ее вести себя так, как если бы нажата кнопка «X». Для этого вам нужно будет реализовать WindowAdapter, который соответствует вашим потребностям, и установить закрытие по умолчанию для фрейма по умолчанию (DO_NOTHING_ON_CLOSE).
Инициализируйте ваш кадр следующим образом:
Вы можете программно закрыть кадр, отправив ему событие WINDOW_CLOSING, например:
Это закроет кадр, как была нажата кнопка «X».
источник
Если вы действительно не хотите, чтобы приложение закрывалось при закрытии JFrame,
использовать:
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
вместо того :
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Вот краткий обзор того, как выглядит решение,
источник
Этот ответ дал Алекс, и я хотел бы рекомендовать его. Это сработало для меня, и еще одно, это просто и так просто.
источник
Этот пример показывает, как реализовать подтвержденную операцию закрытия окна.
В окне есть оконный адаптер, который переключает операцию закрытия по умолчанию
EXIT_ON_CLOSE
илиDO_NOTHING_ON_CLOSE
зависит от вашего ответа вOptionDialog
.Метод
closeWindow
изConfirmedCloseWindow
выстреливает закрытие окна события и может быть использован в любом месте т.е. как действие пункта менюисточник
Исходя из ответов, уже предоставленных здесь, я так и реализовал:
JFrame заставляет событие закрываться, а после закрытия выходит.
источник
Вы должны вставить вызов в очередь сообщений AWT, чтобы все синхронизации происходили правильно, иначе он не будет отправлять правильную последовательность событий, особенно в многопоточной программе. Когда это будет сделано, вы можете обработать результирующую последовательность событий точно так же, как если бы пользователь щелкнул по кнопке [x] для оформленного JFrame с операционной системой.
источник
Я пробовал это, написать свой собственный код для события formWindowClosing () .
Это спрашивает пользователя, хочет ли он выйти из Фрейма или Приложения.
источник
Отправка того, что было в теле вопроса, как CW ответа.
Хотел поделиться результатами, в основном полученными по ссылке camickr. В основном мне нужно бросить
WindowEvent.WINDOW_CLOSING
в очередь событий приложения. Вот краткий обзор того, как выглядит решениеисточник
Если вы не хотите, чтобы приложение закрывалось при закрытии JFrame, используйте: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)
вместо: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
Из документации:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
: Ничего не делай; требуется, чтобы программа обрабатывала операцию в методе windowClosing зарегистрированного объекта WindowListener.HIDE_ON_CLOSE (defined in WindowConstants)
: Автоматически скрывать фрейм после вызова любых зарегистрированных объектов WindowListener.DISPOSE_ON_CLOSE (defined in WindowConstants)
: Автоматически скрывать и удалять кадр после вызова любых зарегистрированных объектов WindowListener.EXIT_ON_CLOSE (defined in JFrame)
: Выйдите из приложения, используя метод выхода из системы. Используйте это только в приложениях.может быть полезным: вы можете использовать
setVisible(false)
на своем JFrame, если хотите снова отобразить тот же кадр. В противном случае вызовите,dispose()
чтобы удалить все ресурсы родного экрана.скопировано из Питера Ланга
https://stackoverflow.com/a/1944474/3782247
источник
источник
setVisible(false)
.setVisible(false); .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);