В настоящее время я пытаюсь отфильтровать данные в моем TableView
с использованием FilteredList
с predicate
. У меня есть 2 ComboBoxes
для фильтрации значений.Фильтрация JFX TableView с несколькими значениями
Мой стол содержит Result
. Каждый Result
имеет Student
, что Student
имеет номер Classroom
, в который он входит. Это значения, которые я хочу отфильтровать.
У меня нет проблем при фильтрации данных, используя только 1 ComboBox
. Однако я не знаю, как отфильтровать его на основе обоих одновременно. Единственное реальное решение, которое я мог бы придумать, - это много if
операторов как в changeListeners
на каждом ComboBox
, и это похоже на нерегулярно сложный способ сделать это.
Значения в моем TableView
отображаются несколько раз, если я использую следующий код.
private void filterData(){
ObservableList<Result> observableList = FXCollections.observableList(view.getResultTableView().getAllResultsList());
FilteredList<Result> filteredData = new FilteredList<>(observableList, p -> true);
view.getClassroomComboBox().getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
filteredData.setPredicate(result -> {
if (newValue.equals(view.getAllClassroomsChoice()) || newValue.equals(result.getStudent().getClassroom())) {
return true;
}
else
return false;
});
if(newValue.equals(view.getAllClassroomsChoice())){
view.getStudentComboBox().setAllStudents();
}
else{
view.getStudentComboBox().setStudentsByClassroom((Classroom) newValue);
}
});
view.getStudentComboBox().getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
filteredData.setPredicate(result -> {
if (newValue.equals(view.getAllClassroomsChoice()) || newValue.equals(result.getStudent())) {
return true;
}
else
return false;
});
});
SortedList<Result> sortedData = new SortedList<>(filteredData);
sortedData.comparatorProperty().bind(view.getResultTableView().comparatorProperty());
view.getResultTableView().setItems(sortedData);
}
Большое спасибо, это работает безупречно. –