Выбор клавиши со стрелкой не работает для поля со списком автозаполнения, когда значения поля со списком перезагружаются

В первый раз загружается программа выбора клавиши со стрелкой в ​​автозаполнении комбобокса. Но после того, как я очистил и перезагрузил значения в нем, используя метод под клавишей со стрелкой, навигация и выбор элементов комбинированного списка не работает. Я использую метод TextFields.bindAutoCompletion из ControlsFx 8, чтобы связать комбинированный список.

// load Auto Compleat nic,fname,lname,id values for search Combo Box
private void loadValuesToComboSearchBox() {
    try {
        // clear elements of Search Combo Box
        comboSearch.getItems().clear();

        // Disable Search Combo Box
        comboSearch.setEditable(false);

        // load Auto Compleat nic,fname,lname,id values for search Text Field
        ResultSet getsearchElements = employeDao.getSearchemployeeByNicFnameLnmeId();
        LinkedHashSet<String> addElements = new LinkedHashSet<>();

        while (getsearchElements.next()) {
            addElements.add(getsearchElements.getString("id"));
            addElements.add(getsearchElements.getString("firstname"));
            addElements.add(getsearchElements.getString("lastname"));
            addElements.add(getsearchElements.getString("nic"));
        }

        // Add elements to Auto Compleat Text Field
        TextFields.bindAutoCompletion(comboSearch.getEditor(), addElements);

        // Enable Search Combo Box
        comboSearch.setEditable(true);
    } catch (Exception e) {
        new Alert(Alert.AlertType.INFORMATION, e + "", ButtonType.OK).showAndWait();
        e.printStackTrace();
    }
}

1 ответ

Я считаю, что эта проблема возникает из-за нескольких перекрывающихся AutoCompletionBindings. Чтобы исправить это, вы должны сохранить ссылку на предыдущую привязку и утилизировать ее при перезагрузке. Также обратите внимание, что для очистки выделения в выпадающем списке JavaFX необходимо выполнить больше шагов.

private AutoCompletionBinding<String> completion;
....
private void loadValuesToComboSearchBox() {
    try {
        // clear selection
        comboSearch.getItems().clear();
        comboSearch.valueProperty().set(null);
        comboSearch.getEditor().clear();

        comboSearch.setEditable(false);
        ResultSet getSearchElements = employeDao.getSearchemployeeByNicFnameLnmeId();
        Set<String> addElements = new LinkedHashSet<>();
        while (getSearchElements.next()) {
            addElements.add(getSearchElements.getString("id"));
            addElements.add(getSearchElements.getString("firstname"));
            addElements.add(getSearchElements.getString("lastname"));
            addElements.add(getSearchElements.getString("nic"));
        }

        if (completion != null) {
            completion.dispose();
        }
        completion = TextFields.bindAutoCompletion(comboSearch.getEditor(), addElements);
        comboSearch.setEditable(true);
    } catch (Exception e) {
        new Alert(Alert.AlertType.INFORMATION, e + "", ButtonType.OK).showAndWait();
        e.printStackTrace();
    }
}
Другие вопросы по тегам