Слушайте переключатели вкладок на панелях JTabbedPane

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

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

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

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

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

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

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

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

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

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


person lhk    schedule 27.06.2013    source источник
comment
У вас должна быть модель данных GUI, содержащая всю информацию о лицах и задачах. Каждая панель JPanel будет обновляться и обновляться в соответствии с содержимым модели данных посредством действий контроллера. Это архитектура модели/представления/контроллера для создания приложений с графическим интерфейсом.   -  person Gilbert Le Blanc    schedule 27.06.2013
comment
Я знаю шаблон MVC. Swing в значительной степени заставляет вас использовать его. Я пытаюсь реализовать контроллер. Мне просто нужно найти способ сообщить контроллеру, когда данные были обновлены. Виктор Зайферт дал идеальный ответ   -  person lhk    schedule 27.06.2013


Ответы (1)


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

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

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

person Viktor Seifert    schedule 27.06.2013
comment
отлично, именно то, что я искал - person lhk; 27.06.2013