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