2015-04-01 2 views
1

Я пытаюсь запрограммировать приложение поворота и узнать что-то о шаблоне mvc. Также я хочу, чтобы мой Swing Code был чистым, поэтому я разделил свой графический интерфейс в разных классах. Часть этой структуры класса выглядит следующим образом:swing и mvc - где разместить слушателя

//all classes extending BasicGuiElement 
-EntireContentElement has: 
---ControlElement has: 
------MainMenuElement 

MainMenuElement содержит MainMenuBar, меню, а в качестве MenuItems. Теперь различным функциям MenuItems нужны разные ActionListeners.

И вот моя проблема: Откуда должен появиться этот ActionListener? Должен ли я создать EntireControlElement в представлении, к которому я передаю HashMap, а также передать эту карту через все элементы MainMenuElement? И если у меня много классов, которым все нужны кучу слушателей, я бы передал список карт слушателей? Это был бы действительно уродливый код, не так ли?

Другим решением было бы передать модель как ModelInterface для представления, а методы вызова модели из прослушивателей действий, которые будут созданы в классах представлений ... было бы более приятным подходом?

Спасибо!

+1

модель и вид, вообще говоря, не должны знать друг о друге и должны быть преодолены с помощью контроллера, это означает, что контроллер должен быть выступая в качестве наблюдателя на эту точку зрения и реагируя на соответствующие события. Одна вещь, которую вы можете сделать, это определить контракт между представлением и контроллером, который описывает действия, которые может выполнять представление (или даже общее «событие меню»), к которому контроллер может реагировать. Вы должны подключить 'ActionListener' к вашим компонентам в представлении напрямую, а затем запустить соответствующие события обратно в контроллер. – MadProgrammer

+1

Вид продемонстрировал идею [здесь] (http://stackoverflow.com/questions/26517856/java-swing-where-do-actionlisteners-belong-according-to-mvc-pattern/26518274#26518274) – MadProgrammer

ответ

2

В качестве альтернативы приятному примеру @ MadProgrammer в его комментарии имеется менее известный шаблон под названием MVP (Model-View-Presenter). Это вариант традиционного MVC, целью которого является сделать представление настолько глупым, насколько это возможно (отсутствие знаний или ссылок на модели, контроллеры или любой другой код приложения), чтобы весь тестируемый код вышел из графического интерфейса.

Чтобы ответить на ваш вопрос с помощью MVP, модель является «автономной» и ничего не знает о представлениях или презентаторах/контроллерах. Аналогично, представление также «автономно» и ничего не знает о моделях или презентаторах/контроллерах. Ведущий - это мост между тем, кто вводит логику слушателя в представление.

Для сравнения/контраста есть пример MVP, который может быть seen here, , который является переписью примера MVC seen here.

Смотрите также:

Wiki: Model-View-Presenter

ObjectMentor: The Humble Dialog Box

Смежные вопросы