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)时;
然后是模型中的PropertyChangeListener或哪里可以根据topicname识别消息.
所以我基本上弯曲系统使用它像发布 - 订阅....
我想代替上面的方法,我可以将一个进度字段添加到更新的低级类,然后基于它的firePropertyChange ......这将与它应该如何使用的方式一致.
我认为发布/处理对是将数据从 SwingWorker 推送到 GUI 中。传递信息的另一种方法是让 GUI 或控件使用 PropertyChangeSupport 和 PropertyChangeListener 从 SwingWorker 中提取信息。考虑
编辑
关于您的更新:
基本上所有具有长时间运行方法的低级类都会有一个 propertyChangeSupport 字段。长时间运行的方法定期调用 firePropertyChange() 来更新方法的状态,而不一定报告属性的更改 - 这就是我所说的语义滥用!。
我不建议您这样做。了解如果正在侦听的绑定属性没有更改,则即使调用 firePC(),也不会通知任何 PropertyChangeListeners (PCL)。如果您需要轮询属性,那么我不会使用 PCL 来执行此操作。我会简单地进行投票,可能是从被投票的班级之外进行投票。