2010-07-27 25 views
1

我有一個GUI,其中有textarea和按鈕等.........Java界面和線程

我有一個不同的類,它是一個不斷運行的線程。我想在線程類中滿足特定條件時將文本附加到textarea。

在包含textarea的類中,我爲textarea設置了getter方法。我也已經將該類(包含textarea)聲明爲線程類中的一個變量。

我嘗試調用變量上的textarea的get方法,之後調用append()方法,但textarea不會自行更新。

我在做什麼錯?

感謝您的幫助。

+0

嘗試將標題更改爲與問題更相關的內容。這樣,查看商家信息的人就會知道問題所在。 – helios 2010-07-27 11:50:43

+0

「附加」方法是線程安全的。因此,如果您在GUI中看不到文本,那麼您沒有對可見文本區域的適當引用。也許你錯誤地創建了兩個文本區域。嘗試添加一個System.out.println(textArea.getText()),以便您可以查看是否將文本附加到可見文本區域。 – camickr 2010-07-27 14:35:35

回答

5

重點是您必須關心以下由Sun根據Swing的線程管理給出的指導方針,您可以看看here

您將瞭解的是,您必須根據您的具體情況,使用SwingUtilities.invokeLater(..)SwingUtilities.invokeAndWait(..)調度GUI相關事件。這是因爲GUI事件由事件調度線程管理,您不應該在您自己的線程中管理它們。

+0

某些Swing文檔(在JDK 7中較少...)指出某些方法是線程安全的。這些評論通常不同意實施或任何可能的實施。此外,嘗試以線程方式使用此類方法的代碼可能會有自己的線程錯誤。 – 2010-07-27 14:12:55

1

您不能從非UI線程調用UI方法。要從非UI線程調用方法,您必須使用一個UI特定的方法,該方法稱「將一段代碼發送到UI線程以供執行」。在SWT中,這是Display.getDefault().asyncExec(Runnable)。對於Swing,請使用SwingUtilities.invokeLater()

查看this article瞭解更多信息。