使用多控件javafx筛选listview

4ioopgfo  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(448)

我正在开发一个项目,它有一个窗格,可以在我的程序中创建一个事件(会议)。
此窗格有一个房间列表视图,需要使用界面中的可用筛选器列表(textview、checkbox、datetimepicker、spinner)不断更新,例如,如果我在名称textview中写入“1”,并将capacity设置为10,则应该将这2个过滤器应用于listview,并且只显示名称包含“1”且capacity=10的房间。
这是我的窗格的照片。

我所做的是为每个控件的text或value属性添加一个侦听器,但问题是当我应用多个过滤器时,它不会同时应用这两个过滤器,我需要应用多个。
这是我为其中两个过滤器编写的代码,但正如我所说,我还需要更多。

listRooms = new ListView<>();
    FilteredList<Room> filteredList= new FilteredList<>(roomsList, data -> true);

    txtRoomName.textProperty().addListener(obs->{
        String filter = txtRoomName.getText();
        if(filter == null || filter.length() == 0) {
            filteredList.setPredicate(s -> true);
        }
        else {
            filteredList.setPredicate(s -> s.getName().contains(filter));
        }
    });

    spCapacity.valueProperty().addListener(obs->{
        int filter = spCapacity.getValue();
        if(filter == 0) {
            filteredList.setPredicate(s -> true);
        }
        else {
            filteredList.setPredicate(s -> s.getCapacity() == filter);
        }
    });
g0czyy6m

g0czyy6m1#

创建一个方法来生成 predicate 。收集此处的所有筛选条件,无论更改了哪一个:

txtRoomName.textProperty().addListener(obs->{
    calculatePredicate();
});
spCapacity.valueProperty().addListener(obs->{
    calculatePredicate();
});

private void calculatePredicate() {
    String filterTxt = txtRoomName.getText();
    int filterCap = spCapacity.getValue();

    filteredList.setPredicate(s -> {
        boolean txtMatch = filterTxt == null || filterTxt.isEmpty() || s.getName().contains(filterTxt);
        boolean capMatch = filterCap == 0 || s.getCapacity() == filterCap;
        return txtMatch && capMatch;
    });
}

相关问题