删除过滤器后,添加的行将移动到最后一个位置
Added row moves to last position once filter is removed
在 NatTable 中,我在过滤 table 中添加一行。删除过滤器后,新添加的行移至 table.
中的最后一个位置
但我希望它保持在同一位置,即我在过滤 table 时添加的行的旁边。
我目前正在使用RowInsertCommand
。我不想通过用于填充 table 的模型或列表添加行。我只想通过 NatTable 命令来实现。可能吗?
如果没有示例代码,总是很难理解解释和问题。但我假设您只是从 NatTable 示例中复制了代码,因此我将基于此解释您的问题。
首先,RowInsertCommand
有几个构造函数。如果您使用的构造函数没有 rowIndex
或 rowPosition
参数,则新对象将始终添加到列表的末尾。
在 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
的基数计算索引。以下代码是 IMenuItemProvider
的 SelectionAdapter
的一部分:
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));
在 NatTable 中,我在过滤 table 中添加一行。删除过滤器后,新添加的行移至 table.
中的最后一个位置但我希望它保持在同一位置,即我在过滤 table 时添加的行的旁边。
我目前正在使用RowInsertCommand
。我不想通过用于填充 table 的模型或列表添加行。我只想通过 NatTable 命令来实现。可能吗?
如果没有示例代码,总是很难理解解释和问题。但我假设您只是从 NatTable 示例中复制了代码,因此我将基于此解释您的问题。
首先,RowInsertCommand
有几个构造函数。如果您使用的构造函数没有 rowIndex
或 rowPosition
参数,则新对象将始终添加到列表的末尾。
在 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
的基数计算索引。以下代码是 IMenuItemProvider
的 SelectionAdapter
的一部分:
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));