2017-09-14 106 views
0

我使用下面的代码片段来清除NatTable数据并在刷新操作上完成重新加载。NatTable在清除数据时保留行选择并重新加载

natTable.getBodyDataProvider().getList().clear(); 
natTable.getBodyDataProvider().getList().addAll(inputList); 
natTable.refresh(); 

因为数据被清除并重置,所以我无法在刷新前将行选择设置回先前选择的行。

不过,我现在用的是RowSelectionModel成功恢复选择的排序

final RowSelectionModel<T> rowSelectionModel = new RowSelectionModel<T>(bodyLayer.getSelectionLayer(),bodyDataProvider, rowIdAccessor); 
bodyLayer.getSelectionLayer().setSelectionModel(rowSelectionModel); 

是否有可能恢复行选择时,数据将被清除并重新加载?

我看到PreserveModel上存在的问题:How to use Nebula NatTable's PreserveSelectionModel?但它没有回答我的问题。

感谢有人能提供更多关于此的指针。

问候, SDS

回答

1

IIRC当您清除基础列表(我假设你正在使用GlazedLists所以当你做这样的活动发射),该RowSelectionModel清除内部存储选择。这是一致的,因为保留对已被移除的对象的选择是没有意义的。

所以你需要实现一个解决这个事实的解决方法。例如,可以实现一个自定义的ISelectionModel,它扩展了RowSelectionModel并以不同的方式确保与基础列表的一致性。或者在清除基础列表之前记住选择,然后再次应用选择。但要做到这一点,您需要在NatTable上注册PaintListener以延迟应用选择,否则内部事件将延迟清除选择。

下面的代码片段将总是选择NatTable的主体区域中的第5行,这是NatTable中第6行,因为列标题行。

natTable.addPaintListener(new PaintListener() { 

    @Override 
    public void paintControl(PaintEvent e) { 
     // use column 1 as column 0 in NatTable is the row header 
     // insert the rows to select that you previously cached 
     natTable.doCommand(
       new SelectRowsCommand(natTable, 1, 5, false, false)); 
    } 
}); 
+0

谢谢你的回复Dirk。我正在缓存选择对象,并清除并重新加载我使用rowSelectionProviderNatTable.setSelection(新的StructuredSelection(previousSelectedObj))设置选择;这不会将选择设置回表格。既然NatTable已经拥有了Paintlistener,那么我可以使用DefaultPaintListner吗? – SDS

+0

不明白这个问题。为什么不能添加另一个PaintListener? –

+0

我是NatTable和SWT PaintListener的新手。感谢您是否可以共享代码段来设置行选择。谢谢。 – SDS

相关问题