2015-05-06 79 views
7

我有一個多線程的Java Swing應用程序。Java Swing多線程訪問JTextArea

有幾個線程會通過textArea.append("something")寫入JTextArea來調用該方法。我應該這樣包裝它:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     textArea.append("something"); 
    } 
}); 

或者它只是一個內容更新和Swing會做正確的線程本身?

+3

對'JTextArea#append(...)'的調用應排隊到Swing事件線程上,以最安全,最好地工作。 –

+1

你的方法是一個好的開始。問題是,你關心更新發生的順序嗎?如果你這樣做,那麼你手上有一個大問題;) – MadProgrammer

+0

其實沒有。我有一個相反的問題 - 你是指擺動順序或方法調用的順序嗎?該方法有一個計數器,它標記消息(日誌)。但是,你的意思是Swing能否以錯誤的順序顯示編號的消息?那麼,我應該使用這種包裝? – Luo

回答

1

通常,絕對任何對Swing所做的更新,特別是改變控件狀態或佈局的任何更新都應該從Swing線程完成。

在這種情況下,您是絕對正確的,將每個更新包裝到invokeLater是正確的方法。你可以嘗試更新你自己的隊列或類似的東西,但是當Swing已經提供了你需要的功能時,那麼使用它就很有意義。

JTextArea文檔: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html

凡說

警告:Swing不是線程安全的。有關更多信息,請參閱Swing的線程策略。

凡說:

一般Swing不是線程安全的。除非另有說明,否則必須在事件派發線程上訪問所有Swing組件和相關類。

JTextArea#append方法沒有任何記錄,說它可以安全地從其他線程使用。