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

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

Display.getDefault().asyncExec(new Runnable() { public void run() { List 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()); ..... } }); 

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

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

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(); } 

你想在桌面显示器上进行延迟加载。 基本上,您将所有这些对象保留在内存中,然后只创建一些实际的GUI表行。 当用户滚动时,您使用该滚动位置处的对象重新渲染这些行。

对于JFace示例,请参阅此文章 ( 编辑:oops我的意思是本文 )。

1 – 使用setText(String [])而不是setText(int,String)一次调用而不是几次调用。

2 – 在进程之后使用myTable.setRedraw(false)和myTable.setRedraw(true)以在加载数据期间停止所有重绘操作。

它更简单,可以提高性能!

祝你好运。

在我这边使用这个我在标准的今天PC上加载2500行20列,不到300毫秒…..