2015-04-01 38 views
1

我想编程一个swing应用程序,并学习一些关于mvc模式。另外我想保持我的Swing代码清洁,所以我将我的GUI分成不同的类。 该类结构的一部分是这样的:swing和mvc - 听听者的地方

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

MainMenuElement包含MainMenuBar,菜单的和的MenuItems。现在,不同的MenuItem需要不同的ActionListeners。

这里是我的问题:这个ActionListener的来自哪里?我应该在视图中创建EntireControlElement,我传递一个HashMap并将所有元素传递给MainMenuElement。如果我有很多类都需要一堆动作侦听器,我会传递一个侦听器地图列表?这将是非常丑陋的代码,不是吗?

另一种解决方案是将模型作为模型接口传递给视图,并从动作侦听器中调用模型方法,这将在视图类中创建......这是一种更好的方法吗?

谢谢!

+1

的模型和视图,一般来说,应该不知道对方的存在,并应通过控制器进行桥接,这意味着控制器应扮演观察者的角色并回应适当的事件。你可以做的一件事就是在视图和控制器之间定义一个契约,它描述了视图可以执行的操作(甚至是一个通用的“菜单事件”),控制器可以对该操作作出反应。您可以直接在视图中将'ActionListener'附加到您的组件中,然后将适当的事件触发回控制器。 – MadProgrammer 2015-04-01 22:59:00

+1

类型的展示了这个想法[这里](http://stackoverflow.com/questions/26517856/java-swing-where-do-actionlisteners-belong-according-to-mvc-pattern/26518274#26518274) – MadProgrammer 2015-04-01 22:59:23

回答

2

作为@ MadProgrammer在他的评论中的一个很好的例子的替代品,有一个叫做MVP(Model-View-Presenter)的鲜为人知的模式。它是传统MVC的一个变体,其目标是使视图尽可能愚蠢(没有关于模型,控制器或任何其他应用程序代码的知识或引用),以便所有要测试的代码都不在GUI中。

要使用MVP回答您的问题,该模型是“独立”的,并且对视图或演示者/控制器一无所知。同样,视图也是“独立的”,对模型或演示者/控制器一无所知。 Presenter是将观察者逻辑注入视图的桥梁。

对于比较/对比,有一个MVP示例可以是seen here, ,它是对MVC示例seen here的重写。

参见:

Wiki: Model-View-Presenter

ObjectMentor: The Humble Dialog Box