gpt4 book ai didi

java - 在MVC中,model是干什么的,和SwingWorker有什么关系?

转载 作者:搜寻专家 更新时间:2023-11-01 01:57:24 25 4
gpt4 key购买 nike

我阅读了很多关于 Java、Swing、MVC 和 SwingWorker 的文章,但我对模型在 MVC 中的作用感到非常困惑。

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

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

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

我现在在做什么:

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

我的第一个问题:我应该将状态存储在模型中吗?即,与操作顺序相关的信息:首先必须选择一个文件,然后才能读取它。那么我的模型将成为一个状态机。

我的第二个问题:让 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com