2012-11-27 68 views
1

我正在看Java中的GUI的一些示例代碼,我想知道顯示GUI的正確方式。假設爲某些GUI編寫了createAndShowGUI()方法。我看到這樣的事情:顯示Java GUI是否需要特殊處理?

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

難道是錯的只是在沒有javax.swing中的東西的主要方法的最後調用createAndShowGUI()?或者我想我真正的問題是關於這裏發生了什麼。我對線程很熟悉,但我不確定爲什麼有必要創建一個新線程(這是怎麼回事?)來顯示GUI。

+0

採取措施在Swing事件線程上顯示GUI更爲安全。您可能只能在主要中顯示它,但是再一次,您可能會遇到問題,而且我也看到它也發生了。 –

+2

*「我對線程很熟悉,但我不確定爲什麼有必要創建一個新線程(就是這裏發生了什麼?)來顯示GUI。」*該代碼並沒有太多'創建一個新線程'確保在事件調度線程上完成GUI的構建。 –

回答

2

所有與UI(Swing或AWT)的交互都必須從事件分派線程的上下文中執行。 Swing(和AWT)組件不是線程安全的,將其中的任何一個從其他任何線程更改爲EDT可能導致損壞的更新,繪製工藝,死鎖並可能導致VM崩潰。他們也很難調試。

你可能想通過

我還要補充,在執行main方法有讀,它在運行的曾經爲它創建的虛擬機。這是保證不是美國東部時間,因爲它不會開始啓動,直到它需要。

這就是爲什麼好的Swing程序總是以EventQueue.invokeLater之類的東西開始。你也可以使用SwingUtilities.invokeLater,但它通常是一樣的東西。

1

因爲與GUI有關的所有事情都應該通過Event Dispatch ThreadEDT)來完成,所以Java就是這樣管理整個接口的。基本上,該方法將傳遞的Runnable對象的run()方法的執行委託給正確的線程。

介意Runnable不是Thread,它只是一個接口,以提供做一些事情的方法(因此類是可運行)。但是這裏沒有涉及線程,ThreadRunnable延伸的事實僅僅是因爲線程也是可以執行某事的意義上的Runnable對象。

+0

謝謝您的澄清! – CowZow

相關問題