删除过滤器后,添加的行将移动到最后一个位置

Added row moves to last position once filter is removed

在 NatTable 中,我在过滤 table 中添加一行。删除过滤器后,新添加的行移至 table.

中的最后一个位置

但我希望它保持在同一位置,即我在过滤 table 时添加的行的旁边。

我目前正在使用RowInsertCommand。我不想通过用于填充 table 的模型或列表添加行。我只想通过 NatTable 命令来实现。可能吗?

如果没有示例代码,总是很难理解解释和问题。但我假设您只是从 NatTable 示例中复制了代码,因此我将基于此解释您的问题。

首先,RowInsertCommand 有几个构造函数。如果您使用的构造函数没有 rowIndexrowPosition 参数,则新对象将始终添加到列表的末尾。

在 NatTable 中使用带有 GlazedLists 的过滤器功能时,包裹在正文 DataLayer 中的列表是 FilterList。如果您在 FilterList 上操作以计算应该添加新对象的 rowIndex 并将 FilterList 作为 RowInsertCommandHandler 中的基础列表,新对象所在的位置添加的对象在 FilterList 和基础 EventList 之间转换,这可能不是所需的结果。

要解决此问题,您需要使用基础 EventList.

创建 RowInsertCommandHandler
EventList<T> eventList = GlazedLists.eventList(values);
TransformedList<T, T> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
SortedList<T> sortedList = new SortedList<>(rowObjectsGlazedList, null);
this.filterList = new FilterList<>(sortedList);

this.baseList = eventList;
bodyDataLayer.registerCommandHandler(new RowInsertCommandHandler<>(this.baseList));

那么执行add操作的action当然需要根据EventList的基数计算索引。以下代码是 IMenuItemProviderSelectionAdapter 的一部分:

int rowPosition = MenuItemProviders.getNatEventData(event).getRowPosition();
int rowIndex = natTable.getRowIndexByPosition(rowPosition);

Object relative = bodyLayerStack.filterList.get(rowIndex);
int baseIndex = bodyLayerStack.baseList.indexOf(relative);

Object newObject = new ...;
natTable.doCommand(new RowInsertCommand<>(baseIndex + 1, newObject));