我在我的 RCP 应用程序中使用 Nebula Grid 小部件。我在我的 Grid 中添加了一个 controlListener,每当调整 Grid Control 的大小时,它将调整每个 Grid 行高的大小。代码片段如下:
@Override
public void controlResized(ControlEvent e) {
GridColumn []cols = grid.getColumns();
for (GridItem item : grid.getItems()) {
GC gc = new GC(item.getDisplay());
int max = 0;
Point tb=null;
for(GridColumn col : cols){
tb = col.getCellRenderer().computeSize(gc, col.getWidth(), SWT.DEFAULT, item);
max = Math.max(max, tb.y);
if(max > hmax){
break;
}
}
if(hmax==-1){
}else if(max > hmax){
max=hmax;
}
gc.dispose();
item.setHeight(max);
}
}
这工作正常,即每次用户调整任何列的大小时都会调整高度。但是每当网格行数很大时,比如几百到几千,调整大小就不顺畅。UI 有几秒钟没有响应。在进行一些分析后,我可以缩小对造成这种延迟的陈述的范围。也就是下面的语句:
tb = col.getCellRenderer().computeSize(gc, col.getWidth(), SWT.DEFAULT, item);
我能理解这其中的原因。为每一行和每一列调用上述语句,这似乎就是原因。对于 2000 行 5 列的 Grid,此语句被调用 10000 次。我怎样才能使这个过程高效?