我有一个ObservableList
,我将其链接到多个CheckMenuItem
,它显示在TableView
中,我可以过滤掉一个谓词。
我使用.filter(Predicate p)
并将TableView
更新为其返回值。当我想要不过滤时,我只需将其设置回ObservableList
。
但我无法解决如何删除多个filteres到ObservableList
的问题。如果我继续在返回的列表上使用.filter(Predicate p)
不同的谓词,我可以应用它们,但是如何删除特定的过滤器?
迎接
答案 0 :(得分:4)
代码
ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(data.filter(predicate));
相当于
ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(new FilteredList<DataType>(data, predicate));
和代码
ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(data.filter(predicate1).filter(predicate2));
在逻辑上等同于
ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(new FilteredList<DataType>(data, predicate1.and(predicate2)));
因此,您可以通过保留对已过滤列表的引用并更新其谓词来实现您的需求:
ObservableList<DataType> data = FXCollections.observableArrayList();
FilteredList<DataType> filteredData = new FilteredList<>(data, x -> true);
table.setItems(filteredData);
现在,您只能将predicate1
用于:
filteredData.setPredicate(predicate1);
添加predicate2
:
filteredData.setPredicate(predicate1.and(predicate2));
删除predicate1
:
filteredData.setPredicate(predicate2);
删除所有过滤器:
filteredData.setPredicate(x -> true);
如果你想要一个非常深奥的解决方案(这几乎肯定是矫枉过正的),你可以保留一个ObservableList<Predicate<DataType>>
:
ObservableList<Predicate<DataType>> filters = FXCollections.observableArrayList();
然后将筛选列表的谓词绑定到将所有筛选器与逻辑and
组合在一起:
filteredList.predicateProperty().bind(Bindings.createObjectBinding(() ->
filters.stream().reduce(x -> true, Predicate::and),
filters));
然后你可以在filters
列表中添加和删除谓词,例如
filters.add(predicate1);
filters.add(predicate2);
filters.remove(predicate1);
并且表格数据将自动更新。