使用多个控件过滤 ListView JavaFX
Filtering ListView with multiple controls JavaFX
我正在开发一个项目,它有一个窗格可以在我的程序中创建一个事件(会议)。
此窗格有一个房间列表视图,需要使用界面中的可用过滤器列表(TextView、CheckBox、DateTimePicker、Spinner)不断更新,例如,如果我写“1”在名称 textview 中将 capacity 设置为 10,应该将 2 个过滤器应用于 listview,并且只显示名称包含“1”且 capacity=10 的房间。
这是我的窗格的图片。
我所做的是为每个控件的文本或值添加一个侦听器 属性,但问题是当我应用超过 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);
}
});
创建一个方法来生成谓词。在那里收集所有的过滤条件,不管哪一个发生了变化:
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;
});
}
我正在开发一个项目,它有一个窗格可以在我的程序中创建一个事件(会议)。
此窗格有一个房间列表视图,需要使用界面中的可用过滤器列表(TextView、CheckBox、DateTimePicker、Spinner)不断更新,例如,如果我写“1”在名称 textview 中将 capacity 设置为 10,应该将 2 个过滤器应用于 listview,并且只显示名称包含“1”且 capacity=10 的房间。
这是我的窗格的图片。
我所做的是为每个控件的文本或值添加一个侦听器 属性,但问题是当我应用超过 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);
}
});
创建一个方法来生成谓词。在那里收集所有的过滤条件,不管哪一个发生了变化:
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;
});
}