您如何在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());
.....
}
});
在我的电脑上绘制20k记录大约需要20秒。 我在Windows中遇到的最大性能问题是由新建表项创建和填充文本时由SWT发送的大量本机窗口消息引起的。我找到了很好的解决方法 - 在填充之前隐藏表,然后在完成后显示它。只需在循环之前调用table.setVisible(false),在循环之后调用table.setVisible(true)就可以了 - 速度上升了六七倍!
我想加快速度。 你会建议什么?另外,我想知道隐藏小部件的这个技巧如何在SWT(又称Linux)的非Windows实现上起作用?
答案 0 :(得分:19)
SWT可以为您做到这一点。使用SWT.VIRTUAL样式标志时,仅在滚动到视图时创建项目。这是如何做到的:
以下是代码段:
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();
}
答案 1 :(得分:2)
你想在桌面显示器上进行延迟加载。基本上,您将所有这些对象保留在内存中,然后只创建少量实际的GUI表行。当用户滚动时,您使用该滚动位置处的对象重新渲染这些行。
有关JFace示例,请参阅this article(编辑:oops我的意思this article )。
答案 2 :(得分:2)
1 - 使用setText(String [])而不是setText(int,String)一次调用而不是几次。
2 - 在进程之后使用myTable.setRedraw(false)和myTable.setRedraw(true)以在加载数据期间停止所有重绘操作。
它更简单,可以提高性能!!
祝你好运。在我身边使用这个我在不到300ms的时间内在标准的今天PC上加载2500行20列......