JavaFX取消过滤器FilteredList

Dan*_*iel 0 java javafx filter

我有一个,ObservableList并且将它链接到CheckMenuItema中显示的多个它TableView,我可以过滤出一个谓词。

我通过使用将其.filter(Predicate p)更新TableView为返回值来做到这一点。当我想取消过滤时,只需将其重新设置为即可ObservableList

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

招呼

Jam*_*s_D 5

代码

ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(data.filter(predicate));
Run Code Online (Sandbox Code Playgroud)

相当于

ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(new FilteredList<DataType>(data, predicate));
Run Code Online (Sandbox Code Playgroud)

和代码

ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(data.filter(predicate1).filter(predicate2));
Run Code Online (Sandbox Code Playgroud)

在逻辑上等同于

ObservableList<DataType> data = FXCollections.observableArrayList();
table.setItems(new FilteredList<DataType>(data, predicate1.and(predicate2)));
Run Code Online (Sandbox Code Playgroud)

因此,您可以通过保留对过滤列表的引用并更新其谓词来实现所需的功能:

ObservableList<DataType> data = FXCollections.observableArrayList();
FilteredList<DataType> filteredData = new FilteredList<>(data, x -> true);
table.setItems(filteredData);
Run Code Online (Sandbox Code Playgroud)

现在,您只能使用predicate1

filteredData.setPredicate(predicate1);
Run Code Online (Sandbox Code Playgroud)

添加predicate2

filteredData.setPredicate(predicate1.and(predicate2));
Run Code Online (Sandbox Code Playgroud)

删除predicate1

filteredData.setPredicate(predicate2);
Run Code Online (Sandbox Code Playgroud)

删除所有过滤器:

filteredData.setPredicate(x -> true);
Run Code Online (Sandbox Code Playgroud)

如果您想要一个真正深奥的解决方案(几乎可以肯定是矫kill过正),则可以保留ObservableList<Predicate<DataType>>

ObservableList<Predicate<DataType>> filters = FXCollections.observableArrayList();
Run Code Online (Sandbox Code Playgroud)

然后将过滤列表的谓词绑定到将所有过滤器与逻辑组合and

filteredList.predicateProperty().bind(Bindings.createObjectBinding(() ->
    filters.stream().reduce(x -> true, Predicate::and),
    filters));
Run Code Online (Sandbox Code Playgroud)

然后,您可以在filters列表中添加和删​​除谓词,例如

filters.add(predicate1);
filters.add(predicate2);
filters.remove(predicate1);
Run Code Online (Sandbox Code Playgroud)

表格数据将自动更新。