所以对于MVC结构来说还是一个新手。我真的很困惑在哪里/什么时候在EDT上添加我的Gui部分。 这是我真正困惑的地方:
public class ECPS_MVC {
//edt?
EcpsView view =new EcpsView();//shoud i put it on edt here?? SwingUtilities... etc
//edt?
EcpsModel model =new EcpsModel();
EcpsController controler=new EcpsController(view,model);
}
我在使用mvc时遇到过如何在edt上启动gui的问题 How to Start a Java MVC Application With a Swing GUI
回答让我很惊讶。为什么我们也应该把模特放在edt上?这真的是对的吗?我不这么认为。
所以问题1- 什么时候才能把我的Gui放在edt上。什么时候创建View? 问题2- 我是否必须从我的控制器那样做更新?每次? -
public void setIconLabel(final Icon icon) {
SwingUtilities.invokeLater(new Runnable() {//with swingutil on each method where i work with gui?
@Override
public void run() {
myLabel.setIcon(icon);
}
});
}
如果您理解,请指出正确的方向,如果需要,请提供简短的示例代码。谢谢。
答案 0 :(得分:3)
任何相互交互或可以改变UI的东西都必须在事件调度线程的上下文中这样做。
Swing,按设计,不是线程安全的。也就是说,默认库中没有检查来确定执行各种模型和组件的线程,假设开发人员已经做出了这些确定。
所以问题1-什么时候把我的Gui放在edt上。什么时候创建View?
立即。您无法知道组件何时可以实现(显示在屏幕上和/或连接到本地对等方)
问题2-我是否必须从我的控制器那样做更新?每次? -
不,事实上,如果我发现自己一直这样编码,我会非常担心。确定模型和组件必须在EDT的上下文中执行,并使与这些模型和组件交互的任何内容满足这些要求。
这意味着,如果您要从单独的Thread
加载数据,则需要确保在他们更新模型时,他们正在将这些更新同步到EDT,以确保在模型通知时UI,这一切都发生在EDT的背景下。
不要对模型的状态做出假设,像“我知道......”这样的陈述会回来困扰你,特别是当其他人使用你的API时。
除非你自己(在EDT之外)自己创建模型并保证它在被加载时是隔离的,否则不要假设任何给你的东西没有以某种方式连接到UI。
更简单的解决方案是在您希望执行EDT操作时使用SwingWorker
,因为它通过publish
/ process
/ done
方法提供此同步