在MVC中,模型做了什么以及与SwingWorker的关系是什么?

Rob*_*Rob 4 java model-view-controller swing swingworker

我读了很多关于Java,Swing,MVC和SwingWorker的内容,但我对模型在MVC中的作用感到困惑.

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

  1. 选择文件
  2. 读取文件

还有一个用于记录的文本框.

我目前在做什么:

  1. 视图包含小部件,但没有逻辑
  2. 按钮的actionPerformed()方法调用Controller上的方法
  3. Controller将获取所需数据(包括显示OptionPane.showOpenDialog())以获取文件
  4. 文件引用存储在模型中.
  5. 模型通知(PropertyChangeSupport,Observer模式)新文件的视图.
  6. View启用"读取文件"按钮

我的第一个问题:我应该将状态存储在模型中吗?也就是说,与操作顺序有关的信息:首先必须在可以读取文件之前选择文件.那么我的模型将成为状态机.

我的第二个问题:我让Controller显示OptionPane是否正确?

然后开始有趣.用户单击"读取文件"按钮.我做的与"选择文件"按钮大致相同.View调用Controller,但Controller使用SwingWorker读取文件,因为这不应该在EDT上完成.SwingWorker发布中间日志消息,这些消息通过对View(SwingWorker.process()方法)的引用添加到文本框中.Controller从SwingWorker中侦听"状态"属性更改.当'state'为'DONE'时,Controller调用'get()'函数.如果一切正常,结果将在模型中设置.如果不是,则处理异常.

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

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

mdm*_*dma 7

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

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

2.让控制器显示OptionPane是否正确? 是 - 应用程序设计(逻辑流程)决定文件的来源 - 模型当然不关心如何获取要读取的文件名,只是它获取文件名.flow是控制器的域.

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

原则上,您应该能够将整个应用程序重写为控制台应用程序,而无需更改模型.当然,视图会发生变化,但这是因为它现在必须使用stdout而不是Swing来呈现模型.最大的变化发生在控制器中 - 应用程序流程将不同(文件选择来自程序参数),控制器不再监听按钮点击以直接流程,但要么具有固定流程,要么通过stdin与用户交互.并且控制器中的线程模型是不同的 - 无需担心EDT,因此不需要摆动工作者.

所以你看,模型处理状态并改变状态,视图负责呈现状态,控制器执行其他所有操作,特别是将模型连接到视图.