Я пытаюсь предоставить очень простое "Вы хотите сохранить этот документ?" диалог при закрытии моего приложения.
Я использовал WindowAdapter
для этого. Это прекрасно работает, если приложение закрывается с помощью какого-либо действия с графическим интерфейсом пользователя (нажатие кнопки ЗАКРЫТЬ, закрытие панели задач, закрытие из диспетчера задач с помощью завершения задачи).
Однако, когда пользователь выходит из системы или завершает процесс приложения, приложение JVM получает сигнал завершения напрямую. Он закрывает любые ресурсы AWT без подтверждения пользователя и без вызова WindowAdapter
. Используя ShutdownHook
, невозможно взаимодействовать с графическим интерфейсом, поскольку поток обработки событий AWT уже остановлен.
До сих пор я нашел несколько способов обойти эту проблему:
- Используйте JNI или JNA для перехвата сигнала завершения до того, как он достигнет подсистемы AWT.
- Требуется отдельный код для каждой операционной системы.
- Используйте sun.misc.SignalHandler для перехвата сигнала завершения.
- Использует собственный интерфейс SUN. Не гарантируется работа на других виртуальных машинах.
- Используйте SWT для перехвата сигнала завершения до того, как он достигнет подсистемы AWT.
- Хорошо поддерживаемый интерфейс, но я ненавижу использовать SWT только для решения этой маленькой проблемы.
- Сохраните пользовательские данные во временный файл и проведите очистку при повторном запуске программы.
Есть ли другой, лучший способ исправить это? Кажется странным, что нет стандартного способа реализовать что-то столь простое и элементарное. Не могу ли я как-нибудь снова загрузить подсистему AWT?