- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我阅读了很多关于 Java、Swing、MVC 和 SwingWorker 的文章,但我对模型在 MVC 中的作用感到非常困惑。
我正在构建一个有两个按钮的应用:
还有一个用于记录的文本框。
我现在在做什么:
我的第一个问题:我应该将状态存储在模型中吗?即,与操作顺序相关的信息:首先必须选择一个文件,然后才能读取它。那么我的模型将成为一个状态机。
我的第二个问题:让 Controller 显示 OptionPane 是否正确?
然后乐趣就开始了。用户单击“读取文件”按钮。我所做的或多或少与“选择文件”按钮相同。 View 调用 Controller ,但 Controller 使用 SwingWorker 读取文件,因为这不应该在 EDT 上完成。 SwingWorker 发布中间日志消息,这些消息通过对 View 的引用(SwingWorker.process() 方法)添加到文本框。 Controller 监听来自 SwingWorker 的“状态”属性更改。当“状态”为“完成”时, Controller 将调用“get()”函数。如果一切正常,结果将在模型中设置。如果不是,则处理异常。
我的第三个也是最重要的问题:模型不应该读取文件吗?! MVC 的全部要点是关注点分离,以及所有好处(可测试性等)。如果我想要一个新 View (例如 CLI)怎么办?那么我的模型现在只是一个数据模型。它不知道如何读取文件!那么线程问题呢?
希望您能给我一些好的建议。 Internet 上有大量关于 SwingWorker、MVC 等的示例。但我的问题不是如何针对它们进行编码,而是如何设计。
最佳答案
我认为您已经步入正轨。一一回答您的问题:
<强>1。我应该将状态存储在模型中吗?是的,您可以而且应该在模型中存储状态——模型是状态和改变该状态的行为。
<强>2。我让 Controller 显示 OptionPane 是否正确?是的 - 应用程序设计(逻辑流程)决定文件的来源 - 模型当然不关心如何获取要读取的文件名,只关心它获取文件名。 flow 是 Controller 的域。
<强>3。模型不应该读取文件吗?是的,文件读取是模型的一部分。即使 Controller 正在调用 swing worker,swing worker 在概念上也是模型的一部分,至少是 swing worker 执行的主要逻辑。理想情况下,加载文件的所有逻辑都位于模型类中。然后 Controller 可以安排使用 swing worker 调用它。 Controller 决定文件加载应该在后台线程上进行,并指示模型从后台加载文件。 Controller 的 swing worker 从模型接收加载进度事件并通过调用 publish() 处理这些事件,然后 process() 更新 UI。
原则上,您应该能够将整个应用程序重写为控制台应用程序,而无需更改模型。当然, View 会发生变化,但这是因为它现在必须使用标准输出而不是 Swing 来呈现模型。最大的变化发生在 Controller 中——应用程序流程会有所不同(文件选择来自程序参数), Controller 不再监听按钮点击以引导流程,而是具有固定流程,或通过标准输入与用户交互。并且 Controller 中的线程模型不同——无需担心 EDT,因此无需 swing worker。
所以你看,模型负责状态和状态的改变, View 负责呈现状态, Controller 负责其他所有事情,特别是将模型连接到 View 。
关于java - 在MVC中,model是干什么的,和SwingWorker有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587733/
我的主函数中有这两个函数。正如您将看到的,它们两者之间的唯一区别在于它们附加/编辑 html 的方式。我认为最好提出两个新函数,一个执行前半部分,另一个执行后半部分。我不确定这是否可以用 jQuery
我是编码新手,但一直在阅读有关 DRY - 不要重复自己的内容。 我有一个不适合 DRY 方法的 JavaScript if/else 语句,但我无法练习如何编写 JavaScript if/else
我的情况很简单: $("#check-in").dateDropper({ years_multiple: "10", format: "d-m-Y", minYear: "2
我想要一个方法在很多地方创建以下 json 字符串: {"daily_calendar":{"search":{"print_date":"2014-06-30"}}} 我有以下四行代码来制作散列:
我有这个正则表达式来检查字符串的格式是否为date, two or three dots ,date /\A(\d{1,2}-\d{1,2}-\d{4})...?(\d{1,2}-\d{1,2}-\d
我正在试验一些代码来创建我自己的 DOM 方法,但没有扩展实际的 DOM,类似于 jQuery 的工作方式。到目前为止,这是我的原型(prototype): function Lib( selecto
我是 Java 编程的新手。这里有人可以帮我让我的代码保持干燥吗? Button level01 = (Button) findViewById(R.id.level01); level01.setO
我正在通过一个数组来根据外部设置的状态应用不同的类。这就是我现在的做法,但我觉得我在重复自己很多次。有干燥机的方法吗?如果有帮助,类名可以是其他名称。 var children2 = Array.fr
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我正在尝试构建一个搜索页面,使用户能够找到满足特定阈值标准的模型的任何实例,并且在避免严重冗余代码方面遇到困难。我希望有更好的方法来做到这一点。这是一个稍微做作的示例,应该说明我正在尝试做什么,并在最
我是一名优秀的程序员,十分优秀!