2010-03-30 117 views
3

我有一個關於「事件調度線程」的問題。我有一個也是JFrame的Main類。它初始化代碼中的其餘組件,其中一些不涉及Swing,其中一些組件。它是足夠使用EDT這樣簡單地初始化主階級?......處理事件調度線程

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new Main(); 
     } 
    }); 
} 

這樣一切都會在事件調度線程上運行。

+0

正確的名稱是Event Dispatch Thread。請修改您的標題和帖子。 – 2010-09-30 18:15:53

回答

6

也就是說,直到你開始利用後臺線程計算,數據採集等,通常是足夠的。然後,你需要開始小心,以驗證您是在美國東部時間之前改變一個Swing組件或它的模型。

無論你是在美國東部時間與執行,您可以測試:

if (SwingUtilities.isEventDispatchThread()) { 
     // Yes, manipulate swing components 
    } else { 
     // No, use invokeLater() to schedule work on the EDT 
    } 

此外,請參閱SwingWorker類如何工作移交給後臺線程和處理結果在EDT

細節
+0

我相信我會需要它以備將來參考。現在我的應用程序是單線程的,所以我應該沒問題。謝謝! – bcoughlan 2010-03-30 20:09:14

2

這是要走的路。唯一需要注意的是如果一個你使用Swing組件註冊的監聽器會產生一個新的Thread(通常用於執行一些長時間的計算)。如果要執行GUI操作,這些新線程將需要使用invokeLater

2

這就是Sun教程中所有示例的工作方式。請閱讀Swing教程Concurrency中的部分,以獲取更多關於這種方式的原因。

1

Devon_C_Miller的答案是正確的。我只想指出調用事件派發線程的快捷方式。

下面是我如何啓動我所有的Swing應用程序。

import javax.swing.SwingUtilities; 

import com.ggl.source.search.model.SourceSearchModel; 
import com.ggl.source.search.view.SourceSearchFrame; 

public class SourceSearch implements Runnable { 

    @Override 
    public void run() { 
     new SourceSearchFrame(new SourceSearchModel()); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new SourceSearch()); 
    } 

} 

只需更改名稱即可將其複製到每個Swing項目中。