2014-09-21 40 views
0

在Oracle站點閱讀last paragraph擺動:這是安全的,不使用EDT來創建GUI?

爲什麼初始線程不是簡單地創建GUI本身?因爲 幾乎所有創建或與Swing組件交互的代碼都必須在事件分派線程上運行 。

因此main()不應該在初始線程中創建Swing JFrame,但應至少使用SwingUtilities.invokeLater(),直到Java 7。這也在this Q/A中解釋過)。

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     createAndShowGUI(); 
    } 
}); 

雖然這是很合乎邏輯的,我們必須指出,這是近教程從未。 我在其他地方看過,現代編譯器會自己插入invokeLater()而不告訴程序員。這是真的,例如使用Eclipse時的例子?

有沒有一些參考來證實這種行爲?是否有不同的情況需要考慮?

+3

不,它是* GUI構建工具*,它會生成這樣的代碼。編譯器不敢:它會使它不符合JLS。 – 2014-09-21 13:23:25

+0

這是Oracle推薦的,但通常在主線程啓動GUI時不會遇到任何問題。這只是確保你在右側的力量;) – 2014-09-21 13:46:49

+0

@SergiyMedvynskyy:沒有_apparent_問題,建議[這裏](http://stackoverflow.com/a/7158505/230513)。 – trashgod 2014-09-21 15:47:46

回答

1

我認爲這些例子不使用invokeLater(),因爲他們不想讓這個例子複雜化(至少在那時他們不想解釋invokeLater())。

使用事件分派線程的問題僅適用於已經有UI正在運行的情況;大多數這些例子都是從頭開始創建一個UI,因此當Swing的東西被調用時它並沒有運行,直到屏幕上出現了某些東西,那麼就沒有用戶生成的事件要擔心了。我想還是可以搞定的,但他們幾乎不得不這樣做。

所以我猜從頭創建的UI是它自己的特殊情況。

+0

我同意你關於爲什麼教程不顯示這個內容的說明,但是GUI構建代碼可能是偶然發生的,因爲它通常不會進行JIT優化。否則,您至少會期望一些內存可見性問題。 – 2014-09-21 18:10:36