Как предотвратить одновременное появление нескольких диалогов?
-
03-07-2019 - |
Вопрос
Как я могу избежать отображения диалогового окна, когда оно уже есть на экране?
Подробности:В моем приложении работает много таймеров.Если произойдет фатальная ошибка, все затронутые потоки отобразят JDialog (с помощью swingx.JXErrorPane.showDialog()), что нежелательно.Даже если я отменю все работающие таймеры, некоторые диалоги все равно появятся одновременно.Как я могу добиться, чтобы отображался только один диалог?
Я попытался синхронизировать метод, вызывающий showDialog(), в результате чего весь мой графический интерфейс был заблокирован.Использование флага тоже не сработало.
Решение
Превратите диалог в наблюдателя и опубликуйте события ошибок этому новому наблюдателю (см. Шаблон проектирования наблюдателя).Когда происходит событие, диалог должен появиться сам (с основным фреймом в качестве родительского).Отобразите недавние ошибки в таблице в диалоговом окне.Добавьте новые ошибки в конец этой таблицы.
Другой вариант — отобразить ошибки в таблице в основном фрейме.Поместите таблицу в JSplitPane, чтобы пользователи могли ее свернуть.
Другие советы
Еще одним вариантом было бы превратить диалог в одноэлементный:
- Предоставьте диалогу частный конструктор.
- Создайте «частный статический экземпляр mydialog»; - Атрибут в классе диалога.
- Создайте «public static MyDialog getInstance() {...};— метод для возврата экземпляра и первого его создания, если он равен нулю.
Где MyDialog должно быть именем класса диалогового окна.
Затем каждый раз, когда вам нужно отобразить диалог, вы просто ссылаетесь на синглтон:
MyDialog.getInstance().showDialog();
Где showDialog просто делает диалоговое окно видимым.