JavaFX不过滤FilteredList

时间:2017-07-05 08:15:23

标签: java javafx filter

我有一个ObservableList,我将其链接到多个CheckMenuItem,它显示在TableView中,我可以过滤掉一个谓词。

我使用.filter(Predicate p)并将TableView更新为其返回值。当我想要不过滤时,我只需将其设置回ObservableList

但我无法解决如何删除多个filteres到ObservableList的问题。如果我继续在返回的列表上使用.filter(Predicate p)不同的谓词,我可以应用它们,但是如何删除特定的过滤器?

迎接

1 个答案:

答案 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);

并且表格数据将自动更新。