在SWT/JFace RCP应用程序中填充巨大的表

Dim*_*ima 11 java swt jface eclipse-rcp

您如何在SWT表中显示大量行?巨大的是20K行,20列.不要问我为什么需要显示那么多数据,这不是重点.关键是如何让它尽可能快地工作,以便最终用户不会感到无聊等待.每行显示一些对象的实例,列是其属性(一些).我想使用JFace内容/标签提供程序模式,但担心它会比直接用数据命中表更慢.这是怎么回事:

    Display.getDefault().asyncExec(new Runnable() {
       public void run() {
           List<MyObject> objects = model.getViewData();
           for(MyObject object: objects){
           TableItem item = new TableItem(table, SWT.NULL);
           item.setImage(0, img1);
           item.setBackground(color1);
               item.setText(0, object.getProperty0());
               item.setText(1, object.getProperty1());
               item.setText(2, object.getProperty2());
               ..... 
            }
       });
Run Code Online (Sandbox Code Playgroud)

在我的计算机上绘制20k记录大约需要20秒.我在Windows中遇到的最大性能问题是由新建表项创建和填充文本时由SWT发送的大量本机窗口消息引起的.我找到了很好的解决方法 - 在填充之前隐藏表,然后在完成后显示它.只需在循环之前调用table.setVisible(false),在循环之后调用table.setVisible(true)就可以了 - 速度上升了六七倍!

我想加快速度.你会建议什么?另外,我想知道隐藏小部件的这个技巧如何在SWT(又称Linux)的非Windows实现上起作用?

ral*_*stx 19

SWT可以为您做到这一点.使用SWT.VIRTUAL样式标志时,仅在滚动到视图时创建项目.这是怎么做的:

  1. 使用样式SWT.VIRTUAL创建表
  2. 使用Table#setItemCount()设置行计数
  3. 添加一个SWT.SetData侦听器,按需填充TableItems.

这是一段代码片段:

public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    final Table table = new Table( shell, SWT.VIRTUAL );
    table.setItemCount( 10000 );
    table.addListener( SWT.SetData, new Listener() {
        public void handleEvent( Event event ) {
            TableItem item = (TableItem)event.item;
            item.setText( "Item " + table.indexOf( item ) );
        }
    } );
    shell.setSize( 300, 500 );
    shell.open();
    while( !shell.isDisposed() ) {
        if( !display.readAndDispatch() ) {
            display.sleep();
        }
    }
    display.dispose();
}
Run Code Online (Sandbox Code Playgroud)