【问题标题】:Filtering ListView with multiple controls JavaFX使用多个控件 JavaFX 过滤 ListView
【发布时间】:2021-04-06 14:09:06
【问题描述】:

我正在开发一个项目,它有一个窗格来在我的程序中创建一个事件(会议)。

此窗格有一个房间列表视图,需要使用界面中的可用过滤器列表(TextView、CheckBox、DateTimePicker、Spinner)不断更新,例如,如果我在名称 textview 中写“1”并将容量设置为 10,它应该将这 2 个过滤器应用于列表视图,并且只显示名称包含“1”且容量=10 的房间。

这是我的窗格的图片。

我所做的是为每个控件的 text 或 value 属性添加一个侦听器,但问题是当我应用超过 1 个过滤器时,它不会同时应用 2 个过滤器,我需要应用多个过滤器。

这是我为 2 个过滤器编写的代码,但就像我说的那样,我需要更多。

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

【问题讨论】:

标签: java list listview javafx filtered


【解决方案1】:

制作一个生成谓词的方法。收集那里的所有过滤条件,无论哪一项更改:

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

【讨论】:

  • 谢谢!我真的不明白 setPredicate() 方法是如何工作的,我需要阅读一些关于它的文档,并且可能也会睡一会儿;)
  • 关于过滤列表谓词要记住的是,只有当谓词更改为新谓词时才会重新计算列表 - 如果单个谓词使用的变量以某种方式更改过滤不同,没有事件触发过滤列表的重新计算。使用新的谓词实例调用 setPredicate 是触发它的一种方法。此外,只能有一个谓词集,因此它必须包含您需要的所有条件。任何先前的谓词都被遗忘了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2016-08-17
相关资源
最近更新 更多