2010-02-08 91 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