2013-11-20 49 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

請讓我知道,如果我出了問題

相關問題