Java 在MVC中,模型做什么?与SwingWorker有什么关系?

Java 在MVC中,模型做什么?与SwingWorker有什么关系?,java,model-view-controller,swing,swingworker,Java,Model View Controller,Swing,Swingworker,我读了很多关于Java、Swing、MVC和SwingWorker的书,但是我完全搞不清模型在MVC中的作用 我正在构建一个有两个按钮的应用程序: 选择文件 读取文件 还有一个用于记录日志的文本框 我目前正在做的事情: 视图包含小部件,但没有逻辑 按钮的actionPerformed()方法调用控制器上的方法 控制器将获取获取文件所需的数据(包括显示OptionPane.showOpenDialog()) 文件引用存储在模型中 模型通知(PropertyChangeSupport,观察者模式)新

我读了很多关于Java、Swing、MVC和SwingWorker的书,但是我完全搞不清模型在MVC中的作用

我正在构建一个有两个按钮的应用程序:

  • 选择文件
  • 读取文件
  • 还有一个用于记录日志的文本框

    我目前正在做的事情:

  • 视图包含小部件,但没有逻辑
  • 按钮的actionPerformed()方法调用控制器上的方法
  • 控制器将获取获取文件所需的数据(包括显示OptionPane.showOpenDialog())
  • 文件引用存储在模型中
  • 模型通知(PropertyChangeSupport,观察者模式)新文件的视图
  • 视图启用“读取文件”按钮
  • 我的第一个问题:我应该在模型中存储状态吗?也就是说,与操作顺序相关的信息:首先必须选择一个文件,然后才能读取它。因此,我的模型将成为一个状态机

    我的第二个问题:我让控制器显示选项窗格是否正确

    然后,乐趣开始了。用户单击“读取文件”按钮。我所做的和“选择文件”按钮差不多。视图调用控制器,但控制器使用SwingWorker读取文件,因为这不应该在EDT上完成。SwingWorker发布中间日志消息,这些消息通过对视图的引用(SwingWorker.process()方法)添加到文本框中。控制器侦听SwingWorker的“状态”属性更改。当“状态”为“完成”时,控制器调用“get()”函数。如果一切正常,则在模型中设置结果。否则,将处理异常

    我的第三个也是最重要的问题:模型不应该读取文件吗?!MVC的整个要点是关注点的分离,以及所有的好处(可测试性等)。如果我想要一个新视图(例如CLI),该怎么办?那么我的模型现在将只是一个数据模型。它没有关于如何读取文件的线索!那么线程问题呢


    希望你能给我一些好的建议。互联网上有很多关于SwingWorker、MVC等的例子,但我的问题不在于如何针对它们进行编码,而在于如何进行设计。

    我认为你已经走上正轨了。逐一回答您的问题:

    1。我应该在模型中存储状态吗? 是的,您可以而且应该在模型中存储状态——模型是改变状态的状态和行为

    2。我让控制器显示选项窗格是否正确? 是的-应用程序设计(逻辑流)决定文件来自何处-模型当然不关心如何获得要读取的文件名,只关心它获得一个文件名。流是控制器的域

    3。模型不应该读取文件吗? 是的,文件读取也是模型的一部分。即使控制器正在调用swing worker,swing worker在概念上也是模型的一部分,至少是由swing worker执行的主要逻辑。理想情况下,加载文件的所有逻辑都存在于模型类中。然后,控制器可以安排使用swing worker调用它。控制器决定在后台线程上加载文件,并指示模型从后台加载文件。控制器的swing worker从模型接收加载进度事件,并通过调用publish()处理这些事件,然后process()更新UI

    原则上,您应该能够将整个应用程序重写为控制台应用程序,而无需更改模型。当然,视图会发生变化,但这是因为它现在必须使用stdout而不是Swing来显示模型。最大的变化发生在控制器中——应用程序流将有所不同(文件选择来自程序参数),控制器不再侦听按钮单击以引导流,而是具有固定流,或者通过stdin与用户交互。控制器中的线程模型不同-不需要担心EDT,因此不需要swing worker


    因此,您可以看到,模型负责状态和对该状态的更改,视图负责显示状态,控制器执行其他所有操作,特别是将模型连接到视图

    我在MVC和Swing上看到的最简洁的帖子之一——谢谢!