我想使用MVC来构建我的Swing应用程序,但似乎存在冲突。
据我了解MVC,控制器应处理输入并更新模型。该模型应通知其观察者视图是哪一个。
我有两个问题
我确信这个问题以前已经解决过很多次了,但是我找不到一个真实世界的基于MVC的摇摆应用程序的例子。
更新 - 我忘记了一个问题
MVC没有直接满足的是应用程序层次结构中各种MVC组件的结构。例如,主显示器可以具有“销售”和“购买”标签,每个标签可以具有“新”和“查询”面板。最重要的是,可能会有一个“修改选定”按钮,可以根据要求创建(可能是多个)窗口。
必须根据请求为这些子组件创建模型,视图和控制器。它不能是控制器或模型的控制器,因为它们不知道要创建哪个视图,因为它是应用程序逻辑并且它响应事件(这是控制器的工作),所以它不应该是视图。
有答案吗?
答案 0 :(得分:6)
像JButton
等的摇摆组件是控制器。视图类是JButtonUI
等。
至于将事件处理逻辑与“视图”代码分离,最简单的方法是在所有面板中注入特定的Controller
类。这样,事件处理可能看起来像:
doStuffButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.doStuff(); // logic in controller
}
});
您的小组课程可以向您的控制器提供Model
,例如:
public void doStuff() {
MyData data = ...
dataModel.setData(data)
}
这样控制器就会知道模型,并且视图知道控制器,但控制器不知道视图(实现)
答案 1 :(得分:0)
在java swing中,控制器不需要知道ui组件。您可以在ActionListener
中实现控制器代码。然后绑定ActionListener
,例如到JButton
。单击JButton
后,它将调用ActionListener
。 ActionListener
仅取决于其他型号。它使用一些模型作为输入,其他模型作为结果或输出。它就像方法参数和返回值。模型在更新时通知ui。因此,控制器逻辑不需要知道ui组件。甚至模型对象也不知道ui通知是由观察者模式完成的。因此,模型对象只知道有人想要在模型更改时得到通知。
查看以下来自https://www.link-intersystems.com/bin/view/Blog/The+MVC+pattern+implemented+with+java+swing
的示例这是我在java swing中解释MVC模式的方法。
在java swing中,有一些组件也实现了模型和控制器。例如。 javax.swing.Action。它实现了一个ui模型(属性:启用,小图标,名称等)并且是一个控制器,因为它扩展了ActionListener。