2010-02-08 103 views
2

我正在編寫一個能夠處理頻繁更新的JTable。通常情況下,這個JTable有大約1000行數據,其中一些列會經常更新,因爲它們的值來自股票價格,這些價格在上市時間內移動很多。Java JTable頻繁更新?

我面臨的問題是,當大量行(例如80%)正在更新時,JTable會變得非常緩慢,持續20-30秒左右,其中探查器顯示EDT線程非常繁忙,處理tableChanged調用。

我嘗試通過 1)抑制fireTableCellUpdated 2)如果有< = 50行的變化,呼叫fireTableRowUpdate上各個行 3)摺疊的變化如果有> 50行的變化,要求fireTableDataChanged整個表。

它更好,但頻繁更新時仍然很慢,我的理解是fireTableDataChanged也很慢。因此,如果數據更新頻繁,fireTableDataChanged將被頻繁調用,並且GUI會感覺遲緩。

有人可以在這個問題上有經驗的人推薦使用fireTableRowsUpdate, fireTableDataChanged和fireTableStructureChanged來提高GUI的活力和性能的最佳實踐?如果你有解決這個問題的示例代碼的指針,它會更好。

非常感謝

安東尼硅

+0

@Anthony Si:除了我的回答,我想指出,頻繁的事件不是唯一的問題。可怕的,非常慢的默認JTable/header/cells(再)繪畫表演是你遇到的問題的一個重要部分,這一切都在我給出的答案中解釋。 – SyntaxT3rr0r 2010-02-08 07:07:29

回答

6

我做到了這一點,事實上,即使是健壯的設置默認的JTable perfs是非常糟糕的。但是所有的希望都不會丟失:使用(相當)一些技巧可以獲得可接受的表現。

基本上,Oracle有一個教程正是爲了這個目的而被稱爲「聖誕樹」。

在這裏你走「執行以及如何頻繁地創建更新的JTable」:

http://www.oracle.com/technetwork/java/christmastree-138396.html

其中之一,我發現真的很神奇的是不斷地顯示所使用的內存的東西:你可能想去做。

您會驚訝於默認的JTable生成了多少不必要的垃圾,使所有東西變慢,並且使GC觸發方式更加頻繁。

然後開始實施我給你的鏈接中給出的所有技巧,你會發現一切都應該運行更順暢。我現在運行非常複雜和「不斷更新」的JTable,現在一切都很好:)

但是,除了最簡單的情況和少量的數據,默認的JTable實現真的非常糟糕。

+0

@WizardOfOdds,感謝您的鏈接。我發現跳過不可見單元格的概念非常聰明,會嘗試在我的應用中實現這些技巧。 – 2010-02-08 07:48:01