我有一个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)方法将图像设置为两列。
加载表需要花费大量时间。我如何提高绩效?
答案 0 :(得分:2)
(请注意,这可能不一定会回答问题,但注释字段没有格式和足够的空间。)
虽然SWT表和JFace TableViewer并不以其性能而闻名,但显示1000个元素不应导致性能损失。
下面的代码片段创建了一个(甚至不是虚拟的)TableViewer,其中包含5000个元素,并且不需要花费大量时间进行渲染:
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;
}
}
如果您使用上述内容作为基础,您可以逐渐添加应用程序代码中的功能,并查看性能下降的时间。
此外,还有一些常见的事情需要注意,以提高TableViewers的性能
尝试使用哈希查找。在设置查看器输入
TableViewer#setUseHashlookup( true )
尝试让您的桌子是虚拟的。虚拟表仅在可见时创建TableItem
。因此,当最初显示表时,创建了大约20个TableItem(实际看到的数量),而不是1000.排序不受影响,您可以在没有VIRTUAL标志的情况下使用TableViewer#setComparator()
。
尝试将ILazyContentProvider
与VIRTUAL
结合使用。这需要sort elements yourself。这意味着您不需要在TableViewer上设置比较器,而是需要在内容提供程序返回模型元素之前对其进行排序。
如果您不这样做,请尝试缓冲图片,而不是在每次ILabelProvider#getImage()
来电时重新创建
如果您的模型需要时间加载,请尝试在后台线程中运行此操作。因此,UI线程未被阻止,应用程序仍保持响应。
最终,我建议使用分析器,而不是猜测代码的哪一部分是造成性能不佳的原因。