删除过滤器后,添加的行移动到最后一个位置
Posted
技术标签:
【中文标题】删除过滤器后,添加的行移动到最后一个位置【英文标题】:Added row moves to last position once filter is removed 【发布时间】:2022-01-14 00:53:56 【问题描述】:在 NatTable 中,我在过滤表中添加一行。删除过滤器后,新添加的行将移至表格中的最后一个位置。
但我希望它保持在相同的位置,即在过滤表格时添加的行旁边。
我目前正在使用RowInsertCommand
。我不想通过用于填充表格的模型或列表添加行。我只想通过 NatTable 命令来实现。有可能吗?
【问题讨论】:
【参考方案1】:如果没有示例代码,总是很难理解解释和问题。但我假设您只是从 NatTable 示例中复制代码,因此我将根据此解释您的问题。
首先,RowInsertCommand
有几个构造函数。如果您使用的构造函数没有 rowIndex
或 rowPosition
参数,则新对象将始终添加到列表末尾。
在将 NatTable 中的过滤器功能与 GlazedLists 一起使用时,包裹在正文 DataLayer
中的列表是 FilterList
。如果您在FilterList
上操作以计算应添加新对象的rowIndex
,并且将FilterList
作为RowInsertCommandHandler
中的基本列表,则添加新对象的位置在@ 之间转换987654330@ 和基数 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));
那么执行加法操作的动作当然需要根据基数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));
【讨论】:
感谢您的回复。抱歉,我没有提供我正在使用的构造函数。我正在使用'new RowInsertCommand(ILayer layer, int rowPosition, T... objects)' 我尝试了代码,它按预期工作。谢谢先生。以上是关于删除过滤器后,添加的行移动到最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章