我有一个TableView
由一个支持SortedList
包裹一个FilteredList
包裹一个ObservableList
。过滤列表中的项目可以重复。也就是说,有可能是这样的情况list.get(5) == list.get(10)
.
用户可以选择行TableView
并按删除。当他们这样做时,所选择的项目应该被删除,而不是其他项目。
我尝试了两种解决方案,但都存在问题:
在底层 ObservableList 上使用 list.remove (Object)- 由于列表可能包含重复的项目,因此将删除对象的所有副本,而不仅仅是选定的副本。
public void removeItemsAtIndices ( List <Integer> indices ) {
List <Item> removeMe = new ArrayList<Item> ();
for ( int index : indices ) {
removeMe.add( currentListSorted.get( index ) );
}
items.removeAll( removeMe );
}
在 SortedList 上使用 list.remove (index)- 过滤后的列表会抛出一个UnsupportedOperationException
.
public void removeItemsAtIndices ( List <Integer> indices ) {
Collections.sort( indices, Collections.reverseOrder() );
for( int index : indices ) {
currentListSorted.remove( index ); //Exception here
}
}
以下是我设置列表的方法:
private final ObservableList <Item> items = FXCollections.observableArrayList();
private final FilteredList <Item> currentListFiltered = new FilteredList <Item>( items, p -> true );
private final SortedList <Item> currentListSorted = new SortedList <CurrentListTrack>( currentListFiltered );
有没有办法删除项目:
- 从排序列表中
- 按过滤和排序列表的索引定位
- 不删除非目标重复项?
目前我能想到的唯一解决方案是使每个项目都是唯一的(即不可能list.get(5) == list.get(10)
)。我希望通过寻找另一种解决方案来避免这种情况。
附:如果由于某种原因它有用,下面是确定所选索引的代码:
removeMenuItem.setOnAction( new EventHandler <ActionEvent>() {
@Override
public void handle ( ActionEvent event ) {
ObservableList <Integer> selectedIndexes = currentListTable.getSelectionModel().getSelectedIndices();
List <Integer> removeMe = new ArrayList<> ( selectedIndexes );
removeItemsAtIndices ( removeMe );
}
});