JavaFX, фильтрующий просмотр списка с использованием нескольких блоков выбора - PullRequest
0 голосов
/ 21 мая 2019

В настоящее время я пытаюсь отфильтровать мой список списков FXML, используя несколько ящиков выбора, созданных через конструктор сцен.

Ну, во-первых, я попытался внедрить в свою работу только функцию фильтра, используя текстовое поле вместо использования поля выбора, просто чтобы проверить, работает ли он с моим пользовательским списком и работает ли он.

Но теперь у меня возникают проблемы с выяснением, как реализовать его с несколькими вариантами выбора, а не просто с помощью текстового поля.

Надеюсь, кто-то здесь может дать мне некоторое представление о том, как это сделать, и спасибо.

Это те поля выбора, которые у меня есть

@FXML
private ChoiceBox choiceBox1;
@FXML
private ChoiceBox choiceBox2;
@FXML
private ChoiceBox choiceBox3;
@FXML
private ChoiceBox choiceBox4;

Здесь я реализую фильтр

@Override
    public void initialize(URL location, ResourceBundle resources) {
        filterField.textProperty().addListener((observable, oldValue, newValue) -> {
            filteredData.setPredicate(student -> {
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }
                String lowerCaseFilter = newValue.toLowerCase();
                if (student.getName().toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                } else if (student.getStatus().toLowerCase().contains(lowerCaseFilter)) {
                    return true;
                }
                return false;
            });
        });
        listView.setItems(filteredData);
        listView.setCellFactory(studentListView -> new StudentListViewCell());
}

1 Ответ

1 голос
/ 21 мая 2019

Проще говоря, вы можете связать свойство предиката списка с новым значением предиката, которое генерируется при изменении значения любого ChoiceBox:

filteredData.predicateProperty().bind(Bindings.createObjectBinding(() -> (Predicate<Student>) student -> {
    // comparisons go here...
    String studentName = student.getName().toLowerCase();
    return choiceBox1.getValue().contains(studentName) || choiceBox2.getValue() == student.getStatus();
}, choiceBox1.valueProperty(), choiceBox2.valueProperty(), choiceBox3.valueProperty(), choiceBox4.valueProperty()));
...