有没有办法以不锁定swing线程的方式调用JXTable.packAll()?

时间:2011-03-17 18:15:11

标签: java swing event-dispatch-thread swingx jxtable

我在SwingX项目的JXTable中显示了大量数据。加载数据后,我在表上调用packAll()但是有200列和30,000条记录可能需要5秒或更长时间。我从swing线程中调用它,这意味着UI被锁定了5秒钟。我尝试在后台线程上调用packAll并且我怀疑这样做会产生奇怪的副作用。在调用packAll()之后,当我将鼠标悬停在表格上时,表格中的所有数字似乎都在不断更新为不同的数字。有什么方法可以在打包这么大的表的列时在JXTable中获得合理的用户体验。

4 个答案:

答案 0 :(得分: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);
}

您应该自己设置列宽,或者只是加载一行,打包表,然后加载其余数据。

答案 1 :(得分:2)

杰伊,不知道你标记的答案的哪一部分你的意思是“优秀的想法” - 它至少有点不清楚。这两个建议是:

a)自己动手:留下关于何时,何地以及如何准确的问题 b)两步加载,最终归结为仅测量第一个加载的行。这已在ColumnFactory中提供,请阅读getRowCount(JXTable)的api文档。

即使您的上下文不是通过简单覆盖getRowCount()来解决,也可以使用自定义ColumnFactory:您可以实现您选择的任何测量策略: - )

@ z7sg:什么都没有“杀死”任何东西 - 你可能已经注意到如果你已经阅读了api doc ;-)细胞测量并不是完全无关紧要的,默认实现不能适应所有这些,这就是为什么ColumnFactory是为扩展而设计的:子类并根据您的需要进行调整。

干杯 珍妮特

答案 2 :(得分:1)

200列和30,000行将花费一些时间来渲染。除非你做一些激烈的事情,否则我认为你不会消除等待时间。您最好的选择可能是在加载数据之前不显示表格。

答案 3 :(得分:1)

你说你有200列?好吧,我怀疑所有200个一次都可见。那么如果你只打包10-20列呢?这应该将时间延迟减少1/10或1/20。

如果JXTable不允许您打包单个列,那么您可以尝试使用我认为在常规JTable上提供相同功能的Table Column Adjuster。它允许您打包单个列。