建筑MVC和Swing

时间:2009-07-16 09:53:37

标签: design-patterns swing model-view-controller

我想使用MVC来构建我的Swing应用程序,但似乎存在冲突。

据我了解MVC,控制器应处理输入并更新模型。该模型应通知其观察者视图是哪一个。

我有两个问题

  • Swing是所有视图的一部分。组件具有自己的模型的事实是实现细节。我想保留控制器/型号中特定于摆动的代码不是吗?
  • 我的控制器需要接收用户触发的事件,但这些事件来自视图中的swing组件,控制器不应该知道该视图。

我确信这个问题以前已经解决过很多次了,但是我找不到一个真实世界的基于MVC的摇摆应用程序的例子。

更新 - 我忘记了一个问题

MVC没有直接满足的是应用程序层次结构中各种MVC组件的结构。例如,主显示器可以具有“销售”和“购买”标签,每个标签可以具有“新”和“查询”面板。最重要的是,可能会有一个“修改选定”按钮,可以根据要求创建(可能是多个)窗口。

必须根据请求为这些子组件创建模型,视图和控制器。它不能是控制器或模型的控制器,因为它们不知道要创建哪个视图,因为它是应用程序逻辑并且它响应事件(这是控制器的工作),所以它不应该是视图。

有答案吗?

2 个答案:

答案 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后,它将调用ActionListenerActionListener仅取决于其他型号。它使用一些模型作为输入,其他模型作为结果或输出。它就像方法参数和返回值。模型在更新时通知ui。因此,控制器逻辑不需要知道ui组件。甚至模型对象也不知道ui通知是由观察者模式完成的。因此,模型对象只知道有人想要在模型更改时得到通知。

查看以下来自https://www.link-intersystems.com/bin/view/Blog/The+MVC+pattern+implemented+with+java+swing

的示例

这是我在java swing中解释MVC模式的方法。

  • 红色=型号
  • 绿色=查看
  • 蓝色=控制器

enter image description here

在java swing中,有一些组件也实现了模型和控制器。例如。 javax.swing.Action。它实现了一个ui模型(属性:启用,小图标,名称等)并且是一个控制器,因为它扩展了ActionListener