JAVA Swing MVC - главный контроллер?
У меня возникли некоторые проблемы при разработке архитектуры приложения, которое я пытаюсь разработать. Я работаю над JAVA, и я начал работать над этим приложением, потому что я хочу углубить свои общие знания о JAVA, архитектурах и шаблонах. Я хочу следовать рекомендациям, чтобы создать многоразовое приложение с низкой связью, каким оно и должно быть. Приложение имеет только один JFrame, но внутри него есть несколько JPanels, каждый из которых представляет модуль приложения.
Вопрос в том, как в JAVA Swing реализовать соответствующий шаблон MVC? Я борюсь за то, чтобы понять, как это должно быть сделано.
Должен ли я иметь основной класс контроллера, который содержит ссылки на все другие контроллеры? (У меня есть изображение, чтобы продемонстрировать это, здесь: https://docs.google.com/file/d/0B7tBdn5slIFeY2FoSmxESTREQ1k/edit?usp=sharing)
И в этом случае, все ли события, требующие смены представляемого модуля, должны перенаправляться на основной контроллер?
Или я должен просто соединить JFrame с контроллерами приложения и напрямую связаться с ними?
По сути, я хотел бы знать, нужен ли мне класс, который "управляет" всеми остальными. Я уже прочитал несколько объяснений и разных мнений, но я считаю, что это немного более конкретно.
Надеюсь, я ясно дал понять (и надеюсь, что мое объяснение лучше моего рисунка:)).
РЕДАКТИРОВАТЬ: пример использования приложения:
- Один (единственный) JFrame на протяжении всего жизненного цикла приложения;
- меню будет слева, как в BorderLayout.WEST;
- текущий модуль приложения будет в центре, как в BorderLayout.CENTER;
- когда пользователь нажимает одну кнопку меню, соответствующий модуль загружается в BorderLayout.CENTER;
Должно ли меню (Вид) иметь свой собственный Контроллер, и этот Контроллер связывается с JFrame? И JFrame загружает новый модуль в его макет? Или у JFrame должен быть свой собственный контроллер (или модель, как сказал Гилберт Ле Блан)?
Я знаю, что это может показаться конкретным или простым для понимания, но каждый раз, когда я думаю о настольном приложении, я изо всех сил пытаюсь это понять.
2 ответа
Когда у вас есть приложение с графическим интерфейсом, модель графического интерфейса становится представлением приложения. Приложение взаимодействует с GUI через модель GUI.
Или я должен просто соединить JFrame с контроллерами приложения и напрямую связаться с ними?
Это то, что я сделал. Я упаковал классы контроллера вместе, но я никогда не создавал один основной класс контроллера.
Я храню классы контроллера GUI в отдельном пакете от любых других классов контроллеров приложений, таких как объекты доступа к данным.
Я обычно помещаю каждый JPanel в свой собственный класс, но я бы не назвал это требованием. JFrame имеет свой собственный класс, хотя экземпляр JFrame и экземпляр модели GUI передаются практически всем компонентам GUI. Это делает возможными действия в меню.
Эта статья о графическом интерфейсе Traffic Signal посвящена основам написания очень простого графического интерфейса.
Отредактировано, чтобы ответить на изменения в вопросе.
Контроллер GUI отделен от модели GUI. Модель GUI содержит все элементы данных, которые составляют ваш GUI. Строки для JTextFields, DefaultTableModels для JTables.
Основываясь на дизайне вашего приложения, я бы порекомендовал вам создать класс Java для каждой JPanel, которую вы хотите поместить в центр вашего приложения. Ваш JFrame будет управлять отображением JPanel на основе меню. Я бы также посоветовал вам взглянуть на JTabbedPane, который использует другой пользовательский интерфейс для выполнения задачи выбора панели для работы.
Предполагая, что вы идете с меню слева, каждый пункт меню (переключение JButton?) Будет иметь свой собственный метод контроллера или класс. Эти контроллеры должны иметь экземпляр JFrame, чтобы контроллер мог вызывать метод в классе JFrame, который помещает соответствующую панель в центр дисплея. Контроллер решает, какой метод вызывать, но сами методы являются частью класса JFrame.
Я говорил о классах JFrame и JPanel. Для построения этих классов важно использовать композицию, а не наследование. Класс JFrame содержит JFrame. Это не расширяет JFrame. Единственный раз, когда вы расширяете компонент Swing, это когда вы хотите переопределить метод компонента.
Как обсуждалось здесь, компоненты Swing используют разделяемую архитектуру модели с моделью и представление, слабо связанное с использованием шаблона наблюдателя. Не каждый элемент управления GUI должен быть частью контроллера вашего приложения. Используя ActionListener
, такие как Action
, особенно удобно для инкапсуляции функциональности приложения.
Приложение: я бы использовал CardLayout
Здесь показано переключение панелей. Обратите внимание, как Action
обработчики могут использоваться с кнопками, меню, комбо, панелями инструментов и т. д. Содержимое каждой карты может иметь свою собственную реализацию шаблона MVC, отдельную от других. Использовать PropertyChangeEvent
видно здесь, для связи между компонентами.
В целом, компоненты Swing, например кнопки и таблицы, уже прослушивают свои соответствующие модели, что позволяет вам сосредоточиться на модели данных вашего приложения и его представлениях прослушивания. Удобно, модель Swing, например ComboBoxModel
или же Table
Model`, может иметь более одного слушателя.