Swing: как JDialogs общаются с JFrame - PullRequest
6 голосов
/ 16 августа 2011

Я создаю свое первое приложение Swing и пытаюсь выяснить, как мой JDialogs - вызывается исключительно при выборе пользователем JMenuItem - может обновлять компоненты в главной клиентской области JFrame, которая является родительским "окном"все приложение.

Это дизайн, который я придумал, но не знаю, является ли его: (1) просто плохим, (2) не стандартным (а значит, лучшим) способом, или (3) если я здесь полностью вне базы.Любые предложения приветствуются.

В основном пользователь выбирает JMenuItem, который запускает JDialog.Пользователь взаимодействует с компонентами в диалоговом окне, а затем нажимает кнопку «Готово».Если все проверяется, JDialog закрывается, и я хочу, чтобы родительское окно (JFrame) обновило свое состояние (и, в конечном итоге, распространилось на его компоненты).

Мой дизайн:

Имейте AppStateController, который является членом подкласса JFrame (мое приложение).Затем я создал бы подкласс AppStateChangeListener и AppStateChange EventObject, чтобы всякий раз, когда диалог проверялся и закрывался, он запускал событие AppStateChange.Поскольку родительский JFrame является единственным зарегистрированным прослушивателем этого события, я мог бы определить обработчик, который получает событие, переданное ему.Я хотел бы убедиться, что у AppStateChangeEvent было достаточно метаданных, чтобы описать все возможные изменения.

Теоретически мне нравится такой подход: он должен быть чистым и свободным от вызовов типа «спагетти» для нескольких элементов управления каждый разпроисходит другое событие.Однако, я боюсь, что это может быть излишним.

Что диктуют лучшие практики здесь?Я не совсем человек с графическим интерфейсом!

1 Ответ

5 голосов
/ 16 августа 2011

В Java есть несколько способов реализации шаблона наблюдателя ;некоторые обсуждаются здесь .

Механизм, предписанный EventListenerList, является, вероятно, наиболее общим, так как он позволит вам определять свои собственные события и типы слушателей,и это знакомо программистам Swing.Вместо того, чтобы сделать JFrame слушателем, пусть это сделает самый высокий уровень JComponent.Каждый экземпляр JComponent имеет подходящий элемент protected, listenerList.

Связанные свойства также являются отличным выбором,как показано здесь .

Если вы используете Observable, вам нужно будет использовать делегата.

Добавление: в качестве конкретных примеров, использует схему EventListenerList для управления событиями диаграмм, наборов данных и серий.Напротив, использует свойства bean для уведомления слушателей о выборе виджетов.

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