我有一个JFace TableViewer(大约有1k行),它是通过以下方式创建的:
TableViewer tableViewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI | SWT.VIRTUAL);
我已经设置了内容和标签提供程序:
tableViewer.setContentProvider(new SampleTableContentProvider());
tableViewer.setLabelProvider(new SampleTableLabelProvider());
tableViewer.setInput(inputObject);
tableViewer.setComparator(sorter);
我还通过覆盖getImage(Object element,int colNumber)方法将图像设置为两列。
加载表需要花费大量时间。如何提高性能?
(请注意,这可能不一定能回答问题,但注释字段没有格式和足够的空间。
虽然SWT Table和JFace TableViewer并不以其性能而闻名,但显示1000个元素应该不会造成性能上的打击。
下面的代码片段创建了一个包含 5000 个元素的(甚至不是虚拟的)TableViewer,并且不需要花费明显的时间来呈现:
public class TableViewerPerformance {
public static void main( String[] args ) {
Display display = new Display();
Shell shell = new Shell( display );
shell.setLayout( new FillLayout() );
TableViewer tableViewer = new TableViewer( shell, SWT.NONE );
tableViewer.setLabelProvider( new LabelProvider() );
tableViewer.setContentProvider( ArrayContentProvider.getInstance() );
tableViewer.setInput( createModel() );
shell.open();
while( !shell.isDisposed() ) {
if( !display.readAndDispatch() )
display.sleep();
}
display.dispose();
}
private static Collection<Object> createModel() {
Collection<Object> elements = new ArrayList<Object>();
for( int i = 0; i < 5000; i++ ) {
elements.add( new Object() );
}
return elements;
}
}
如果您使用类似上述内容作为基础,则可以逐渐从应用程序代码中添加功能,并查看性能何时下降。
此外,以下是一些需要注意的常见事项,以提高 TableViewer 的性能
尝试使用哈希查找。 在设置查看器输入之前必须调用
TableViewer#setUseHashlookup( true )
尝试使您的桌子是虚拟的。虚拟表仅在
TableItem
可见时创建它们。因此,当最初显示表时,创建了 20 个左右的 TableItems(与您实际看到的数量一样多),而不是 1000 个。排序不受影响,您可以使用没有 VIRTUAL 标志的TableViewer#setComparator()
。尝试将
ILazyContentProvider
与VIRTUAL
结合使用。这需要自己对元素进行排序。这意味着,您需要在内容提供程序返回模型元素之前对模型元素进行排序,而不是在 TableViewer 上设置比较器。如果您还没有这样做,请尝试缓冲图像,而不是在每次
ILabelProvider#getImage()
调用时重新创建它们如果是您的模型需要时间来加载,请尝试在后台线程中运行此操作。因此,UI 线程不会被阻止,应用程序保持响应。
最终,我建议使用探查器,而不是猜测代码的哪一部分导致了性能不佳。