2013-11-20 119 views
3

让我们假设我们有一个简单的Java MVC应用程序与类ModelViewControllerView类直接继承JFrame。如在classic MVC setup,视图具有对模型的引用,并且控制器具有到视图和所述模型的引用。 正如我刚才了解到,所有的GUI相关的东西应该被包裹在一个类似SwingUtilities.invokeLater什么的。现在什么是正确的方式来初始化/启动这个应用程序?我认为模型和控制器的创建不应该在EDT内部,对吧?所以我会想出这样的事情:如何启动一个Java MVC应用程序与Swing GUI的

final Model model = new Model(); 
SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     final View view = new View(model); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       new Controller(model, view); 
      } 
     }).start(); 
    } 
}); 

这是正确的方式和一个好主意或有更好的可能性吗?

编辑: 正如@trashgod所述,我们检查了一个相关示例here。然后,我延长我的问题:什么是基本做到有以下几点:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     Model model = new Model(); 
     View view = new View(model); 
     new Controller(model, view); 
    } 
}); 

不过,是不是错了运行在EDT整个应用程序?

+1

我“猜”控制器将需要一些方法来“启动”或“表演”的观点......还有,你不应该使用第二个' Thread'对于这一点,只要你粘贴到'SwingUtilities.invokeLater'了'Runnable'的'run'方法的上下文中执行的更新,让你的所有UI交互的EDT的范围内发生... – MadProgrammer

+1

一个相关的实施例,检查在[此处](http://stackoverflow.com/a/3072979/230513)。 – trashgod

+0

查看更新的问题。 @MadProgrammer:该视图已设置并在其构造函数调用中变为可见。然后通过模型事件更新(模型扩展了Observable,视图观察模型)。 – Simon

回答

3

创建或交互的所有代码与Swing组件必须在事件派发线程上运行。所以你的代码的第二种形式,即下面的代码是正确的。

`SwingUtilities.invokeLater(new Runnable() { 
     @Override 
    public void run() { 
     Model model = new Model(); 
     View view = new View(model); 
     new Controller(model, view); 
    } 
});` 

所有必须通过EDT或工作线程运行的UI代码的原因是为了避免多线程问题。您可能会看到许多挥杆程序可能无法在EDT中初始化代码。这非常好。但是当你的挥杆得到分配时,就有可能出现错误。我的自我在简单的摆动应用程序从主线程开始,我没有面临死锁是竞赛条件。快速任务使用EDT,长时间运行的任务使用工作线程。 Here is link on multithreaded problem on ui

请让我知道,如果我出了问题

相关问题