我正在显示JXTable
来自SwingX项目的大量数据。加载数据后,我packAll()
在表上调用,但有 20000 列和 30,000 条记录可能需要 5 秒或更长时间。我从 swing 线程中调用它,这意味着 UI 被锁定了 5 秒。我尝试调用packAll
后台线程,正如我所怀疑的那样,这样做会产生奇怪的副作用。调用后packAll()
,当我将鼠标悬停在表格上时,表格中的所有数字似乎都在不断更新为不同的数字。在打包如此大表的列时,有什么方法可以让我在 JXTable 中获得合理的用户体验。
4 回答
这个循环ColumnFactory
正在杀死你:
for (int r = 0; r < getRowCount(table); r++) {
Component comp = renderer.getTableCellRendererComponent(table, table
.getValueAt(r, column), false, false, r, column);
width = Math.max(width, comp.getPreferredSize().width);
}
您可能应该自己设置列宽,或者只加载一行,打包表格,然后加载其余数据。
杰伊,不知道您标记为正确的答案的哪一部分是“好主意”的意思-至少有点不清楚。这两个建议是:
a) 自己动手:留下关于何时、何地以及如何精确的问题 b) 两步加载,最终归结为仅测量第一个加载的行。ColumnFactory 已经提供了,请阅读 getRowCount(JXTable) 的 api 文档。
即使您的上下文不像通过简单覆盖 getRowCount() 来解决的那样统一,自定义 ColumnFactory 也是可行的方法:您可以实施您选择的任何测量策略 :-)
@z7sg:没有什么会“杀死”任何东西 - 如果您阅读过 api 文档,您可能已经注意到 ;-) 单元测量并非完全微不足道,默认实现不能满足所有需求,这就是为什么 ColumnFactory 是为扩展而设计的:子类和根据您的需要进行调整。
干杯珍妮特
200 列和 30,000 行将需要一些时间来渲染。我认为除非您做一些激烈的事情,否则您将无法消除等待时间。您最好的选择可能是在加载数据之前不显示表格。
你说你有200列?好吧,我怀疑所有 200 个都一次可见。那么,如果您只包装前 10-20 列呢?这应该将时间延迟减少 1/10 或 1/20。
如果 JXTable 不允许您打包单个列,那么您可以尝试使用Table Column Adjuster,我认为它在常规 JTable 上提供了相同的功能。它允许您打包单个列。