2013-06-27 2 views
0

Я разработал простой графический интерфейс Swing, чтобы разрешить пользователю редактировать данные моего приложения. Пользовательский интерфейс довольно прост:Слушайте переключатели вкладок на панелях JTabbedPane

  • JFrame, который содержит JTabbedPane.
  • Каждая вкладка состоит из одного подкласса JPanel, который предлагает инструменты для редактирования аспекта данных.
  • Данные сами содержатся в одном объекте, и эта ссылка передается каждому из JPanels.

Но есть проблема: мне нужно синхронизировать разные JPanels.

Например, объект данных хранит список лиц и список задач.

  • Один JPanel позволяет пользователю редактировать людей. Он может создавать новых Лиц и удалять существующие.

  • Второй JPanel позволяет пользователю назначать людей задачам.

Обе JPanels инициализируются при первом открытии. Компоненты создаются и устанавливается макет. Теперь пользователь может начать работать с пользовательским интерфейсом.

  1. Он открывает первую вкладку JTabbedPane и создает первое лицо.
  2. Он открывает вторую вкладку. Компоненты второй вкладки инициализируются и перечисляют один человек, который доступен. Он назначает задачу.
  3. Он возвращается к первой вкладке и создает второго человека.
  4. Он переключается на вторую вкладку, чтобы иметь дело с новым человеком.

Но вторая вкладка и JPanel, которые она содержит, уже были инициализированы. Пользователь не увидит второго человека, если JPanel не будет обновлен. Я применил специальный метод обновления в моем подклассе JPanel для вкладки 2. Но как я его называю?

Мне нужно событие Swing, которое запускается на компоненте, когда оно перерисовывается.

+2

У вас должна быть модель данных GUI, которая содержит всю информацию о человеке и задаче.Каждый JPanel будет обновляться и обновляться содержимым модели данных посредством действий контроллера. Это архитектура модели/представления/контроллера для создания графических приложений. –

+0

Я знаю шаблон MVC. Качание сильно заставляет вас использовать его. Я пытаюсь реализовать контроллер. Мне просто нужно найти способ сообщить контроллеру, когда данные будут обновлены. Виктор Зейферт дал прекрасный ответ – lhk

ответ

1

Фактически обновление второй панели при первом перефразировании - плохая идея, даже если вам удастся найти событие, которое будет запущено. Это приведет к тому, что вторая панель будет обновляться при каждом перерисовке первой панели, независимо от того, что перерисовка означает, что измененные данные изменились или нет (подумайте о несохраненных данных).

Вы должны сделать данные вашими табулатурами Observable (или Subject от Observer Pattern). Затем каждая вкладка может реагировать на изменения данных вместо изменений на других вкладках. Это сократит время обновления только тогда, когда оно действительно понадобится, а также отделит вкладки друг от друга.

Данные могут отражать изменения путем обжига PropertyChangeEvent's. Это, в свою очередь, должно приводить к действиям Controller, предложенным Гилбером Ле Бланком в комментариях.

+0

отлично, именно то, что я искал – lhk