Java MVC何时/何时获取我对EDT的看法以及我的控制器如何在EDT上执行操作?

时间:2014-02-23 23:12:10

标签: java swing model-view-controller event-dispatch-thread

所以对于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);
        }
    });
}

如果您理解,请指出正确的方向,如果需要,请提供简短的示例代码。谢谢。

1 个答案:

答案 0 :(得分:3)

任何相互交互或可以改变UI的东西都必须在事件调度线程的上下文中这样做。

Swing,按设计,不是线程安全的。也就是说,默认库中没有检查来确定执行各种模型和组件的线程,假设开发人员已经做出了这些确定。

  

所以问题1-什么时候把我的Gui放在edt上。什么时候创建View?

立即。您无法知道组件何时可以实现(显示在屏幕上和/或连接到本地对等方)

  

问题2-我是否必须从我的控制器那样做更新?每次? -

不,事实上,如果我发现自己一直这样编码,我会非常担心。确定模型和组件必须在EDT的上下文中执行,并使与这些模型和组件交互的任何内容满足这些要求。

这意味着,如果您要从单独的Thread加载数据,则需要确保在他们更新模型时,他们正在将这些更新同步到EDT,以确保在模型通知时UI,这一切都发生在EDT的背景下。

不要对模型的状态做出假设,像“我知道......”这样的陈述会回来困扰你,特别是当其他人使用你的API时。

除非你自己(在EDT之外)自己创建模型并保证它在被加载时是隔离的,否则不要假设任何给你的东西没有以某种方式连接到UI。

更简单的解决方案是在您希望执行EDT操作时使用SwingWorker,因为它通过publish / process / done方法提供此同步