我读了很多关于Java、Swing、MVC和SwingWorker的内容,但是我对MVC中Model的作用完全感到困惑。
我正在构建一个应用程序,其中包含两个按钮:
- 选择文件
- 读取文件
还有一个用于记录日志的文本框。
我目前正在做的事情:
- 视图包含小部件但不包含逻辑
- 按钮的actionPerformed()方法调用控制器上的一个方法
- 控制器将获取所需数据(包括显示OptionPane.showOpenDialog())以获取文件
- 文件引用存储在模型中。
- 模型通过PropertyChangeSupport、观察者模式通知视图新文件的情况。
- 视图启用“读取文件”按钮
我的第一个问题:我应该在模型中存储状态吗?也就是说,与操作序列相关的信息:必须先选择文件,然后才能读取文件。那么我的模型将变成一个状态机。
我的第二个问题:让控制器显示OptionPane是否正确?
然后就开始有趣了。用户点击“读取文件”按钮。我做的事情与“选择文件”按钮大致相同。视图调用控制器,但是控制器使用SwingWorker读取文件,因为这不应该在EDT上完成。SwingWorker通过对视图的引用(SwingWorker.process()方法)发布中间日志消息,并将其添加到文本框中。控制器侦听来自SwingWorker的“状态”属性更改。当“状态”为“完成”时,控制器调用“get()”函数。如果一切正常,则结果设置在模型中。如果不行,则处理异常。
我的第三个问题,也是最重要的问题:难道不应该由模型来读取文件吗?MVC的整个重点是关注点分离,具有所有好处(可测试性等)。如果我想要一个新的视图(例如CLI),那么我的模型现在只是一个数据模型。它对如何读取文件毫无头绪!线程问题怎么办?
希望你能给我一些好的建议。互联网上有大量关于SwingWorker、MVC等的示例。但我的问题不在于如何针对它们进行编码,而在于如何进行设计。