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