加载大表时的性能问题(SWT / JFace)

时间:2014-11-20 06:14:23

标签: java eclipse swt jface

我有一个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)方法将图像设置为两列。

加载表需要花费大量时间。我如何提高绩效?

1 个答案:

答案 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()

    < / LI>
  • 尝试将ILazyContentProviderVIRTUAL结合使用。这需要sort elements yourself。这意味着您不需要在TableViewer上设置比较器,而是需要在内容提供程序返回模型元素之前对其进行排序。

  • 如果您不这样做,请尝试缓冲图片,而不是在每次ILabelProvider#getImage()来电时重新创建

  • 如果您的模型需要时间加载,请尝试在后台线程中运行此操作。因此,UI线程未被阻止,应用程序仍保持响应。

最终,我建议使用分析器,而不是猜测代码的哪一部分是造成性能不佳的原因。