2014-09-25 53 views
0

我想了解此線程的真正目的。 我已閱讀書籍,文章,但沒有明確說明EventQueue線程負責的內容。我見過很多例子,有時候會用到,有時候不會。據我所知,這個線程負責所有的GUI操作,比如創建窗口,組件,從OS API調用本地函數等等。所以每次我改變GUI的一部分時,我都應該把這個動作傳遞給隊列。 所以使用隊列應用程序默認有兩個線程主線程和事件分派線程。所以我所有的bussines邏輯都應該在主線程中執行(或者從main創建新線程)以及EventQueue中的所有GUI操作(例如向表中添加新項目,更改標籤更新列表中的文本)。還有,我應該在EventQueue中創建主窗口的實例(class extends jframe)?Java Swing中的EventQueue.invokeLater

我對不對?如果沒有請解釋。謝謝大家提前。

+2

在事件處理程序線程中調用所有事件_handlers_。所以,如果你爲一個按鈕編寫一個動作監聽器,那麼actionPerformed()方法將在點擊按鈕時在事件處理線程中被調用。如果按鈕的操作不需要很長時間,則可以直接在actionPerformed()內調用Swing方法。在這種情況下無需「invokeLater()」。 – 2014-09-25 17:35:54

回答

2

這聽起來像你有它的要點,是的。如果您的應用程序本質上是「純粹的GUI」,那麼您可以在EDT上執行所有操作(Event Dispatch Thread,它是運行您傳遞給EventQueue.invokeLater的任何內容的線程),但是您必須在EDT上創建窗口,這意味着您的main()方法必須使用EventQueue.invokeLater至少一次。

因爲GUI對象上的所有偵聽器都會在EDT上得到通知,所以您通常不需要在處理程序中使用EventQueue.invokeLater

+0

因此,例如,如果我在EDT中創建JFrame,則可以在不將任何操作傳遞給隊列的情況下執行其他所有操作,例如添加項目?由於主框架是在EDT中創建的,所有未來的操作都將在EDT中執行? – ketazafor 2014-09-25 16:46:42

+0

只要你的'其他東西'作爲GUI回調運行,那麼是的,你很好。 – davmac 2014-09-26 09:27:37