2010-06-10 48 views
9

在Java中,創建並顯示一個新的JFrame,我只是這樣做:爲什麼人們對事件隊列運行Java GUI的

public static void main(String[] args) { 
    new MyCustomFrameClass().setVisible(true); 
} 

不過,我看到很多人在做這樣的:

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new MyCustomFrameClass().setVisible(true); 
     } 
    }); 
} 

爲什麼?有什麼優勢嗎?

回答

8

在Java的整個生命週期中,管理EDT上需要執行的操作的規則(我看到「事件隊列」比「事件隊列」更常使用「EDT」)。每當「規則」發生變化時,Sun都建議在美國東區執行越來越多的「與GUI相關」工作。

爲什麼人們在EDT上運行Java GUI?

  • 因爲官方指南建議這樣做。

  • 因爲這樣做將有助於躲避很多與GUI相關的線程錯誤。

注意,這是不是很出名,那實際上EDT確實在一段時間崩潰一次,因爲鞦韆本身有一些缺陷。每個非平凡的Swing應用程序都使用Swing API,它們具有缺陷,因此美國東部時間有時會消失。

你從來沒有看到它,它不是一個擔心的原因,因爲當EDT死亡時它會自動重新啓動。

基本上,在EDT上做所有與GUI相關的東西,並在EDT之外執行所有的長操作(至於不阻止EDT)。

編輯你問了一個例子,說明如何在美國東部時區以外的地方開展一項長期的行動。有幾種方法可以做到這一點。在最簡單的情況下,您只需從EDT創建並啓動一個新線程。這裏有一個例子:當一個用戶點擊按鈕,我們知道這將在美國東部時間發生的偵聽器回調應被稱爲...

JButton jb = ... 
    jb.addActionListener(new ActionListener() { 
     public void actionPerformed(final ActionEvent e) { 
      final Thread t = new Thread(new Runnable() { 
      public void run() { 
      // this shall get executed, after start() has been called, outside the EDT  
      } 
      }); 
      t.start(); 
     } 
    }); 

對於更復雜的例子,你想在的SwingWorker閱讀等

+0

如果需要從我的GUI啓動,我如何在EDT之外進行操作? (按鈕事件等)另外,我是否需要僅將EDT用於主框架?如果用戶從主框架打開另一個JFrame(例如選項窗口),是否需要在EDT上啓動它? – asmo 2010-06-10 21:35:55

+0

@asmo:我將編輯我的問題以舉例 – NoozNooz42 2010-06-10 21:38:40

+0

@asmo:您需要在EDT上處理與GUI相關的* everything *(因此在您的*「選項窗口」*例如yup中需要也可以在EDT上完成)。 – NoozNooz42 2010-06-10 21:45:15

4

這條線被修改Swing組件,因爲你自定義的框架是JFrame一個子類:

new MyCustomFrameClass().setVisible(true); 

一般情況下,你永遠不應該修改Swing組件,除非你是在事件調度線程(EDT)。

以下代碼將運行EDT上的Runnable中的任何內容。

EventQueue.invokeLater(Runnable); 

現在,setVisible(true)電話將在美國東部時間,因爲它應該。

+0

我打算創建一個JFrame子類的實例,而不是直接JFrame。對困惑感到抱歉。(我更新了我原來的帖子) – asmo 2010-06-10 21:25:26

+0

這同樣適用於任何swing組件的任何子類。它不會改變任何東西。 (@asmo) – jjnguy 2010-06-10 21:29:32

+0

感謝您的澄清。 – asmo 2010-06-10 21:39:44

相關問題