java swing vs mvc: действительно ли этот шаблон возможен? - PullRequest
10 голосов
/ 13 сентября 2010

Я новичок в качелях, но мне удалось создать графический интерфейс пользователя.
Однако моя проблема в том, что я не смог применить шаблоны, предложенные в ссылках / руководствах, в основном шаблон MVC.

Это я, или в JTree и использующем SwingWorker, невозможно четко разделить контроллер / вид / модель?
Например, я использую Swingworker, но тогда я не могу «подогнать» контроллер в дизайне.

т.е. действие элемента управления по существу заключается в методе doBackground, который находится, например, в выполнении действия кнопки.
Так что нет класса контроллера.

Результатом действия в Swing worker является обновление Jtree, поэтому я передаю результат классу с именем model, но этот класс должен иметь доступ к treeModel Jtree, который находится внутри JFrame, то есть к представлению , поэтому нет четкого разделения взгляда и модели.

Я посмотрел много учебных пособий, но у всех, представляющих MVC, был тривиальный пример, и в большинстве случаев представление (которое было всего лишь несколькими метками!) Обновляло все. Я полностью сбит с толку, или невозможно или, по крайней мере, легко интегрировать шаблон MVC в свинг-приложение, в котором используются свинг-работники и jtrees?

Я говорю о реальных данных домена, а не о MVC, который реализован в компонентах Swing.

Может ли кто-нибудь помочь мне (и избавить меня от этой ужасной головной боли), либо с обзором того, как можно подходить к этому проекту, либо, по крайней мере, с помощью учебника, который будет полезен, с нетривиальным примером?

Спасибо

Ответы [ 4 ]

7 голосов
/ 13 сентября 2010

Когда я собираю более крупные приложения (человеко-годы разработки), мы часто абстрагируем архитектуру MVC над отдельными компонентами до контроллера / модели и представления верхнего уровня и принимаем, что отдельные компоненты будут их собственными персонализированными MVC. Джеффри Чжэн абсолютно прав в своих оценках, и это то, что я действительно любил в разработке со средой Swing. При этом, если вам нужен настоящий MVC, вам, вероятно, нужно абстрагироваться от отдельных компонентов и поговорить о представлении в более абстрактной терминологии.

5 голосов
/ 13 сентября 2010

Swing не является строго MVC, поскольку компания, ранее известная как Sun , открыто признает это :

(Традиционное разделение MVC) не работать хорошо в практическом плане, потому что части представления и контроллера компонент требует жесткой связи (например, это было очень трудно написать общий контроллер, который не сделал знать конкретику о представлении). Итак, мы свернул эти две сущности в один объект пользовательского интерфейса (*).

Для JTree у вас есть TreeModel в качестве модели. Некоторые простые компоненты, такие как JLabel, даже не имеют модели.

Как поясняет ссылка, вы получаете определенный уровень разделения с классами пользовательского интерфейса, предоставляемыми LAF. Однако сами компоненты Swing должны поддерживать и контролировать множество свойств, связанных с пользовательским интерфейсом.

4 голосов
/ 13 сентября 2010

Тем не менее, во многих случаях это предпочтительно и возможно: конечно, контроллер должен знать о компоненте, который отвечает за действие, но все же представление не нуждается в какой-либо конкретной реализации действия. Вы просто не реализуете действие в классе представления, вместо этого вы используете контроллер (который знает о представлении и модели). Поэтому добавьте туда прослушиватель действий, обновив некоторые детали модели, например, даже в SwingWorker.

Практически в каждом примере, который я видел, пока не узнал, что он реализован подобным образом, я не вижу, где это отличается от любого другого компонента, такого как jtree.

Может быть, с учетом различий между MVC и MVP (что я предпочитаю) легче понять: MVC или MVP

1 голос
/ 13 сентября 2010

Не уверен, поможет ли это, но попробуйте Swing Application Framework (SAF) (JSR 296).Насколько я читаю или пробую это, это помогает отделить представление от обработки событий.Но я не настолько детален с более сложными примерами (как с JTree)

http://java.sun.com/developer/technicalArticles/javase/swingappfr/

https://appframework.dev.java.net/

Удачи!

...