MVC - 具有长时间运行进程的SwingWorker,应该更新视图

vol*_*ing 6 java model-view-controller swing design-patterns swingworker

如何在使用具有长时间运行进程的SwingWorker时将View与模型分离,该进程应将更新发送回控制器?

  • 我可以使用它SwingWorkers doInBackground()来保持EDT响应,通过调用例如model.doLongProcess()从那里伟大!

  • 我遇到的问题是在流程完成之前尝试获取数据,以便根据进度更新视图.

  • 我知道我可以通过使用SwingWorkers publish()方法来获取数据,但我认为这迫使我在其中编写doLongProcess()方法 的代码doInBackground().


作为MVC实现的参考我看起来有点像这样:

http://www.leepoint.net/notes-java/GUI/structure/40mvc.html

/ structure/calc-mvc/CalcMVC.java -- Calculator in MVC pattern.
// Fred Swartz -- December 2004

import javax.swing.*;

public class CalcMVC {
    //... Create model, view, and controller.  They are
    //    created once here and passed to the parts that
    //    need them so there is only one copy of each.
    public static void main(String[] args) {

        CalcModel      model      = new CalcModel();
        CalcView       view       = new CalcView(model);
        CalcController controller = new CalcController(model, view);

        view.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个Model Class,它将许多其他类包装在一起,形成一个简单的控制器接口.

我真的不想将这些类中的所有/部分/任何代码移动到控制器中 - 它不属于那里.


更新:

这是我采取的方法 - 它不是最干净的解决方案,它可能被视为PropertyChangeSupport在语义层面上滥用..

基本上所有具有长时间运行方法的低级类都将有一个propertyChangeSupport字段.长时间运行的方法会firePropertyChange()定期调用方法的状态来更新,而不一定要报告属性的更改 - 这就是我所说的语义滥用!

然后包装低级类的Model类捕获这些事件并发出它自己的高级firePropertyChange...它controller可以监听...

编辑:

澄清一下,当我调用firePropertyChange(propertyName,oldValue,newValue)时;

  • propertyName --->我滥用propertyName来表示topicname
  • oldValue = null
  • newValue =我要播放的消息

然后是模型中的PropertyChangeListener或哪里可以根据topicname识别消息.

所以我基本上弯曲系统使用它像发布 - 订阅....


我想代替上面的方法,我可以将一个进度字段添加到更新的低级类,然后基于它的firePropertyChange ......这将与它应该如何使用的方式一致.

Hov*_*els 4

我认为发布/处理对是数据从 SwingWorker 推送到 GUI 中。传递信息的另一种方法是让 GUI 或控件使用 PropertyChangeSupport 和 PropertyChangeListener 从 SwingWorker 中提取信息。考虑

  • 为您的模型提供 PropertyChangeSupport 字段,
  • 给它添加和删除 PropertyChangeListener 方法
  • 让它通知支持对象状态的变化。
  • 让 SwingWorker 将 PropertyChangeListener 添加到模型中。
  • 然后让 SwingWorker 通知控件或视图模型状态的变化。
  • SwingWorker 甚至可以使用发布/处理模型中更改的信息。

编辑
关于您的更新:

基本上所有具有长时间运行方法的低级类都会有一个 propertyChangeSupport 字段。长时间运行的方法定期调用 firePropertyChange() 来更新方法的状态,而不一定报告属性的更改 - 这就是我所说的语义滥用!。

我不建议您这样做。了解如果正在侦听的绑定属性没有更改,则即使调用 firePC(),也不会通知任何 PropertyChangeListeners (PCL)。如果您需要轮询属性,那么我不会使用 PCL 来执行此操作。我会简单地进行投票,可能是从被投票的班级之外进行投票。