2013-05-17 69 views
0

我需要以固定的時間間隔在事件分派線程的單獨線程中更新JTable的某些單元。其他單元只能由事件分派線程更新,以便兩個線程永遠不會更新同一個單元。在非事件調度線程中調用fireTableRowsUpdated()是否安全?

一旦更改JTable的數據,常用的方法是調用fireTableRowsUpdated()來重新繪製JTable。通常情況下,您在事件派發線程內調用fireTableRowsUpdated(),但我可以在另一個線程內調用它嗎?如果是這樣,那麼fireTableRowsUpdated()也是線程安全的嗎?有機會同時更新JTable

+0

你不應該叫fireTableRowsUpdated()。這是TableModel的工作。 – camickr

+0

你也可以使用Swing Timer。 –

回答

3

從文檔JTable

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

links以下幾點:

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

還有更多你的問題點:

此限制也適用於連接到Swing組件模型。例如,如果將TableModel附加到JTable,則只應在事件派發線程上修改TableModel。

現在,恰好碰巧你會做很多違反這一政策的事情。但爲什麼當它很容易創建一個SwingWorker保證您的代碼線程安全?

2

使用SwingUtilities.invokeLater(),而不是SwingWorker如果你只是想通過執行到事件調度線程進行

更多關於直接SwingUtilities.invokeLater

相關問題