建筑MVC和Swing

Dra*_*mon 7 model-view-controller swing design-patterns

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

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

我有两个问题

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

我敢肯定这个问题以前已经解决了很多次,但我找不到一个真实世界的例子,它是一个体面大小的基于MVC的摇摆应用程序.

更新 - 我忘了一个问题

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

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

有答案吗?

oxb*_*kes 6

摇摆组件JButton是控制器.视图类JButtonUI等.

至于将事件处理逻辑与"视图"代码分离,最简单的方法是在Controller所有面板中注入特定的类.这样,事件处理可能看起来像:

doStuffButton.addActionListener( new ActionListener() {
    public void actionPerformed(ActionEvent e) {
       controller.doStuff(); // logic in controller
    }
});
Run Code Online (Sandbox Code Playgroud)

您的面板类可以提供Model给控制器,例如:

public void doStuff() {
    MyData data = ...
    dataModel.setData(data)
}
Run Code Online (Sandbox Code Playgroud)

这样控制器就会知道模型,并且视图知道控制器,但控制器不知道视图(实现)