首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NatTable的PreserveSelectionModel?

如何使用NatTable的PreserveSelectionModel?
EN

Stack Overflow用户
提问于 2015-03-23 14:11:29
回答 1查看 941关注 0票数 0

我正在开发一个RCP应用程序,并为此使用了Nebula的NatTable。当涉及到选择,我没有理解我应该如何使用它。

我想要的是:

  • 我希望选择整行。我能够使用RowOnlySelectionConfigurationRowOnlySelectionBindings做到这一点。
  • 如果我选择了一行,我希望选择留在那里,并且在更新该行中的某些数据时不会被清除。我该怎么做?
  • 如果选择了一行,并且元素在该行中的位置发生了变化(例如,删除了前面的元素之一,并且位置更改为index - 1),我希望选择的位置与元素一起更改,以便在更改后选择相同的元素。我该怎么做?

我已经看到,文档中提到了一个可以用于此目的的PreserveSelectionModel

如果您在以前的版本中使用PreserveSelectionStructuralChangeEventHandler解决方案来不清除结构更改上的选择,您将注意到此解决方案将不再起作用。如果仍然需要这种行为,现在可以通过配置和设置如下的SelectionModel实例来实现相同的目标: SelectionModel模型=新的SelectionModel(selectionLayer);//配置为不明确结构变化的选择--model.setClearSelectionOnChange(假);selectionLayer.setSelectionModel(模型); 如果您期望选择应该与结构更改(例如排序)一起更新和移动,请尝试使用PreserveSelectionModel

120.php

所以我想我得用PreserveSelectionModel了?但在那里我不能叫setClearSelectionOnChange(false)。默认情况下,它会这样做吗?

我如何使用PreserveSelectionModel呢?构造函数中传递什么?

我在一个名为BodyLayerStack的类中实现了自己的TableBodyLayerStack,在构造函数中尝试了这样的方法:

代码语言:javascript
复制
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的构造器中,我这样做:

代码语言:javascript
复制
// ...

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

代码语言:javascript
复制
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的构造函数中传递空值。但我该怎么用呢?作为构造函数的参数,我必须传递什么?我从哪里得到的值?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2015-03-24 12:53:17

为了实现你的目标,你走错了路。首先,我将回答你们的问题:

  1. 所以我想我得用PreserveSelectionModel了?

不,PreserveSelectionModel的目的是保留单元格选择的选择。您希望为整行保留所选内容。所以您需要使用RowSelectionModel

  1. 但在那里,我不能叫setClearSelectionOnChange(假)。默认情况下,它会这样做吗?

  1. 但这给了我NullPointerExceptions在PreserveSelectionModel。我想这是因为我在PreserveSelectionModel的构造函数中传递空值。

  1. 作为构造函数的参数,我必须传递什么?我从哪里得到的值?

第二个参数是IRowDataProvider<T>,所以它是主体的IDataProvider。第三个参数是IRowIdAccessor<T>。您需要创建一个提供唯一id的实现,这样就可以在不知道基础集合中的位置或索引的情况下识别行。

所以你需要做的是这样的事情:

代码语言:javascript
复制
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 --似乎就是要看的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29212455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档