Доступ к AWT из ShutdownHook - PullRequest
       2

Доступ к AWT из ShutdownHook

1 голос
/ 14 февраля 2012

Я пытаюсь предоставить очень простое "Вы хотите сохранить этот документ?" диалог при закрытии моего приложения.

Я использовал WindowAdapter для этого. Это прекрасно работает, если приложение закрывается с помощью какого-либо действия с графическим интерфейсом пользователя (нажатие кнопки ЗАКРЫТЬ, закрытие панели задач, закрытие из диспетчера задач с помощью завершения задачи).

Однако, когда пользователь выходит из системы или завершает процесс приложения, приложение JVM получает сигнал завершения напрямую. Он закрывает любые ресурсы AWT без подтверждения пользователя и без вызова WindowAdapter. Используя ShutdownHook, невозможно взаимодействовать с графическим интерфейсом, поскольку поток обработки событий AWT уже остановлен.

До сих пор я нашел несколько способов обойти эту проблему:

  • Используйте JNI или JNA для перехвата сигнала завершения до того, как он достигнет подсистемы AWT.
    • Требуется отдельный код для каждой операционной системы.
  • Используйте sun.misc.SignalHandler для перехвата сигнала завершения.
    • Использует собственный интерфейс SUN. Не гарантируется работа на других виртуальных машинах.
  • Используйте SWT для перехвата сигнала завершения до того, как он достигнет подсистемы AWT.
    • Хорошо поддерживаемый интерфейс, но я ненавижу использовать SWT только для решения этой маленькой проблемы.
  • Сохраните пользовательские данные во временный файл и проведите очистку при повторном запуске программы.

Есть ли другой, лучший способ исправить это? Кажется странным, что нет стандартного способа реализовать что-то столь простое и элементарное. Не могу ли я как-нибудь снова загрузить подсистему AWT?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Платформа хоста владеет JVM, на которой выполняется ваше приложение. В Mac OS X вы можете использовать OSXAdapter, обсуждается здесь . Другие системы могут иметь аналогичный механизм. Одной из полезных защитных мер является использование java.util.prefs.Preferences для записи информации об очистке. Это независимая от платформы, и типичные реализации предлагают лучшее удержание для данной платформы.

1 голос
/ 14 февраля 2012

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

1) скрыть контейнер (ы)

2) сохранить свойства приложений,

3) в Исключениях показывается JOptionPane с чем-то значимым о

4) вызов System.exit (0);

5) несколько крупнейших приложений (с Embedded_database для хранения локальных данных), сохраняющих эти процессы через несколько секунд после скрытия контейнеров

0) возможно поможет вам в этой теме об обходном пути в простой ванильной Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...