Обновление состояний кнопок в приложении Java Swing - PullRequest
1 голос
/ 19 февраля 2011

Я реализовал базовый графический интерфейс Swing, основанный на концепции списка воспроизведения, как часть более крупного приложения для микширования звука DJ (представьте себе примитивный Virtual DJ (!)).Плейлист в основном состоит из JTable, на который треки могут быть треками, которые можно перетаскивать и удалять с JTree.JPanel, который включает в себя таблицу, также содержит набор кнопок для сохранения, загрузки и удаления списков воспроизведения, а также для загрузки проигрывателя (ей).Эти состояния кнопок необходимо обновить (включить / отключить) в зависимости от текущего состояния приложения (т. Е. Загружен ли список воспроизведения? Есть ли в списке воспроизведения треки? И т. Д.)

Я пытаюсь следить заШаблон MVC, в соответствии с которым базовая TableModel отделена от пользовательского интерфейса таблицы и кнопки через контроллер.

У меня такой вопрос ... Какой самый элегантный / эффективный способ обработки обновлений кнопок?В данный момент ссылка на загруженный в данный момент файл списка воспроизведения сохраняется в контроллере, и контроллер определяет, является ли список воспроизведения пустым из модели.Затем он отправляет два логических значения (isEmpty, isLoaded) в представление, которое затем определяет, какие кнопки включить на основе этих значений.Этот метод выглядит немного не элегантно, поэтому я буду рад любым предложениям.

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Вы можете сделать это более элегантно, используя слушателей и действия.Используйте AbstractAction для каждой кнопки.(Вы также можете повторно использовать их для пунктов меню.) Затем вы можете включить / отключить действие, и кнопка обновится в соответствии.Если вы добавите TableModelListener в вашу табличную модель, он будет уведомлен обо всех изменениях и может внести изменения в действия.

Вы не будете создавать свой собственный MVC.Вы будете использовать встроенный MVC в самих классах Swing.

1 голос
/ 19 февраля 2011

Как я понимаю MVC, теоретически:

  1. Контроллер обновляет модель
  2. Просмотр считывает модель и обновляется сам

Проблема на практике заключается вчто модель вашего домена (ваши классы) не совпадает с классами Swing Model.Таким образом, вопрос в том, кто синхронизирует модель домена и свинга: контроллер или просмотр?

  1. Контроллер синхронизирует их.Когда данные домена изменяются (список воспроизведения пуст или нет), контроллер переводит изменения в вид.В этом случае Controller является более сложным и зависит как от модели предметной области, так и от модели Swing.Также эта модель становится сложной, если у вас есть одна модель домена и несколько представлений (дерево и таблица, показывающие одни и те же базовые данные).

  2. Представление адаптируется к модели домена.Когда данные модели домена изменяются, контроллер просто указывает View, что он должен обновить себя.В этом случае View зависит от классов домена, но Controller не зависит от модели Swing или View, за исключением того, что он запрашивает обновление.

Как я вижу, вы реализовали опцию 1.

Лично я бы использовал вариант 2., где контроллеры работают с бизнес-логикой и моделью домена, а View - с синхронизацией с моделью домена и построением иерархии представления.

...