有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX取消过滤器过滤器过滤器列表

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

我使用.filter(Predicate p)并将我的TableView更新为它的返回值。当我想取消筛选时,我只需将其设置回我的ObservableList

但是我不知道如何将多个过滤器删除到我的ObservableList。如果我在返回的列表上继续使用.filter(Predicate p)和不同的谓词,我就可以应用它们,但是如何删除一个特殊的过滤器呢

问候


共 (1) 个答案

  1. # 1 楼答案

    代码

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

    表格数据将自动更新