我正在开发一个RCP应用程序,并为此使用了Nebula的NatTable。当涉及到选择,我没有理解我应该如何使用它。
我想要的是:
RowOnlySelectionConfiguration和RowOnlySelectionBindings做到这一点。我已经看到,文档中提到了一个可以用于此目的的PreserveSelectionModel:
如果您在以前的版本中使用
PreserveSelectionStructuralChangeEventHandler解决方案来不清除结构更改上的选择,您将注意到此解决方案将不再起作用。如果仍然需要这种行为,现在可以通过配置和设置如下的SelectionModel实例来实现相同的目标: SelectionModel模型=新的SelectionModel(selectionLayer);//配置为不明确结构变化的选择--model.setClearSelectionOnChange(假);selectionLayer.setSelectionModel(模型); 如果您期望选择应该与结构更改(例如排序)一起更新和移动,请尝试使用PreserveSelectionModel。
所以我想我得用PreserveSelectionModel了?但在那里我不能叫setClearSelectionOnChange(false)。默认情况下,它会这样做吗?
我如何使用PreserveSelectionModel呢?构造函数中传递什么?
我在一个名为BodyLayerStack的类中实现了自己的TableBodyLayerStack,在构造函数中尝试了这样的方法:
public TableBodyLayerStack(IUniqueIndexLayer underlyingLayer) {
super(underlyingLayer);
columnReorderLayer = new ColumnReorderLayer(underlyingLayer);
columnHideShowLayer = new ColumnHideShowLayer(columnReorderLayer);
selectionLayer = new SelectionLayer(columnHideShowLayer, null, true, false);
PreserveSelectionModel<?> selectionModel = new PreserveSelectionModel<>(
selectionLayer, null, null);
selectionLayer.setSelectionModel(selectionModel);
selectionLayer.registerEventHandler(new SelectEventHandler(selectionLayer));
viewportLayer = new ViewportLayer(selectionLayer);
setUnderlyingLayer(viewportLayer);
registerCommandHandler(new CopyDataCommandHandler(selectionLayer));
}然后,在我实现GridLayer的构造器中,我这样做:
// ...
bodyLayer = new TableBodyLayerStack(eventLayer);
// register different selection move command handler that always moves by row
bodyLayer.getSelectionLayer().addConfiguration(new RowOnlySelectionConfiguration<T>());
// register selection bindings that will perform row selections instead of cell selections
// registering the bindings on a layer that is above the SelectionLayer will consume the
// commands before they are handled by the SelectionLayer
bodyLayer.addConfiguration(new RowOnlySelectionBindings());
// ...但这给了我NullPointerExceptions在PreserveSelectionModel。
Error while painting table: null
java.lang.NullPointerException
at org.eclipse.nebula.widgets.nattable.selection.preserve.PreserveSelectionModel.getRowPositionByRowObject(PreserveSelectionModel.java:520)
at org.eclipse.nebula.widgets.nattable.selection.preserve.PreserveSelectionModel.createMarkerPoint(PreserveSelectionModel.java:559)
at org.eclipse.nebula.widgets.nattable.selection.preserve.PreserveSelectionModel.getSelectionAnchor(PreserveSelectionModel.java:531)
at org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.getSelectionAnchor(SelectionLayer.java:276)
at org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.getConfigLabelsByPosition(SelectionLayer.java:415)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform.getConfigLabelsByPosition(AbstractLayerTransform.java:316)
at org.eclipse.nebula.widgets.nattable.layer.AbstractIndexLayerTransform.getConfigLabelsByPosition(AbstractIndexLayerTransform.java:318)
at org.eclipse.nebula.widgets.nattable.layer.CompositeLayer.getConfigLabelsByPosition(CompositeLayer.java:553)
at org.eclipse.nebula.widgets.nattable.layer.cell.AbstractLayerCell.getConfigLabels(AbstractLayerCell.java:48)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.getCellPainter(AbstractLayer.java:354)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform.getCellPainter(AbstractLayerTransform.java:336)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform.getCellPainter(AbstractLayerTransform.java:336)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform.getCellPainter(AbstractLayerTransform.java:336)
at org.eclipse.nebula.widgets.nattable.layer.AbstractIndexLayerTransform.getCellPainter(AbstractIndexLayerTransform.java:340)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform.getCellPainter(AbstractLayerTransform.java:336)
at org.eclipse.nebula.widgets.nattable.layer.AbstractIndexLayerTransform.getCellPainter(AbstractIndexLayerTransform.java:340)
at org.eclipse.nebula.widgets.nattable.layer.CompositeLayer.getCellPainter(CompositeLayer.java:586)
at org.eclipse.nebula.widgets.nattable.painter.layer.CellLayerPainter.paintCell(CellLayerPainter.java:171)
at org.eclipse.nebula.widgets.nattable.painter.layer.CellLayerPainter.paintLayer(CellLayerPainter.java:81)
at org.eclipse.nebula.widgets.nattable.painter.layer.GridLineCellLayerPainter.paintLayer(GridLineCellLayerPainter.java:106)
at org.eclipse.nebula.widgets.nattable.selection.SelectionLayerPainter.paintLayer(SelectionLayerPainter.java:95)
at org.eclipse.nebula.widgets.nattable.layer.CompositeLayer$CompositeLayerPainter.paintLayer(CompositeLayer.java:913)
at org.eclipse.nebula.widgets.nattable.painter.layer.NatLayerPainter.paintLayer(NatLayerPainter.java:43)
at org.eclipse.nebula.widgets.nattable.NatTable.paintNatTable(NatTable.java:408)
at org.eclipse.nebula.widgets.nattable.NatTable.paintControl(NatTable.java:403)
...我想这是因为我在PreserveSelectionModel的构造函数中传递空值。但我该怎么用呢?作为构造函数的参数,我必须传递什么?我从哪里得到的值?
任何帮助都是非常感谢的。
发布于 2015-03-24 12:53:17
为了实现你的目标,你走错了路。首先,我将回答你们的问题:
不,PreserveSelectionModel的目的是保留单元格选择的选择。您希望为整行保留所选内容。所以您需要使用RowSelectionModel。
是
是
第二个参数是IRowDataProvider<T>,所以它是主体的IDataProvider。第三个参数是IRowIdAccessor<T>。您需要创建一个提供唯一id的实现,这样就可以在不知道基础集合中的位置或索引的情况下识别行。
所以你需要做的是这样的事情:
selectionLayer.setSelectionModel(new RowSelectionModel<Person>(
selectionLayer, bodyDataProvider, new IRowIdAccessor<Person>() {
@Override
public Serializable getRowId(Person rowObject) {
return rowObject.getId();
}
}));但是,如果您想保持IDataProvider的通用性,当然还需要向您的TableBodyLayerStack提供它和IRowIdAccessor。
还请注意,您不必自己调用SelectionLayer#registerEventHandler()!这是通过调用SelectionLayer#setSelectionModel()在内部完成的。
您可以在NatTable示例应用程序https://www.eclipse.org/nattable/中找到几个示例(尝试一下!右边的按钮)。对于您的问题,教程示例->层、->选择、-> RowSelectionExample --似乎就是要看的。
https://stackoverflow.com/questions/29212455
复制相似问题