【问题标题】:Where should I invoke my swingworker in a Java MVC pattern在 Java MVC 模式中我应该在哪里调用我的 swingworker
【发布时间】:2013-03-15 04:23:25
【问题描述】:

我有一个程序,基本上就像这个 MVC 示例中的一样:http://www.leepoint.net/notes-java/GUI/structure/40mvc.html

在我的程序中,有一个进程需要相当长的时间来冻结我的 GUI。我希望 GUI 在进程运行时不断更新。为此,我相信我需要使用 SwingWorker。我不知道应该在我的 MVC 模式中的哪个位置调用这个 SwingWorker。

我的想法是我应该在控制器的 MultiplyListener actionlistener 中运行它。这是正确的吗?

【问题讨论】:

  • afaics,该链接没有描述 MVC:它缺少模型通知更改的责任 - 或者我缺少什么?
  • @kleopatra:好评;我试图在下面详细说明。

标签: java swing model-view-controller swingworker


【解决方案1】:

在这种情况下,模型是一种随着时间演变的数学运算,可能是通过迭代。显然,worker 属于模型,如here 所示。 setProgress() 方法会通知任何PropertyChangeListenerprocess() 可以通知任何其他正在监听的view,如图here

附录:在第二个example 中,工作人员更新了一个不同的模型:图表的数据集名为collection。反过来,图表会监听数据集并根据变化进行自我更新。

example cited 中,控制器 代表模型视图 安装动作监听器。在这个相关的example 中,GUI 操作侦听器位于其各自的视图 本地。在任何一种情况下,Action 都是封装的合适选择。当其内部状态响应用户发起的操作而发生变化时,模型会通知其观察者。

【讨论】:

  • example cited 似乎更传统,而 Swing 则更以 模型 为中心。从概念上讲,我将用户视为 GUI 控制器。
【解决方案2】:

我认为你的SwingWorker 属于Control,我会告诉你原因。我觉得 Model 应该尽可能地与 View 无关,并且应该在创建时考虑到它可以与不同的视图和控件一起使用,甚至可以与完全不同的视图和控件一起使用。 GUI 库,如果需要。例如,您当前想在 Swing GUI 中使用 Model,但如果以后想在 Android 应用程序中使用它怎么办?为了允许尽可能少的修改使用它,大多数 Swing 特定的代码,例如 SwingWorker 应该驻留在 ControlView .

例如,请查看this answer

【讨论】:

  • 我同意模型应该尽可能与视图无关。不过我很好奇——如果该进程不是专门为SwingWorker,而是从Thread 继承,您是否会提供使用控制器封装长时间运行进程的相同建议?我的理解是SwingWorker 是一个与Swing 紧密集成的便利类。如果他自己构建这样一个与Swing 没有紧密集成的构造,他可能会考虑将其存储在其他地方(模型),对吧?
猜你喜欢
  • 2011-04-12
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2018-10-04
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多