JavaFX ComboBox автоматически заполняет текст редактора при использовании клавиш со стрелками

1

Я ищу, чтобы сделать автоматическое полное поле со списком в javafx, используя поле со списком. У меня есть возможность фильтровать элементы, но одна из проблем, которые у меня возникают, заключается в том, что если пользователь использует клавиши со стрелками для прохождения через отфильтрованный список, редактор combo box заполняется этим элементом, даже если они на самом деле не " t хотите выбрать этот элемент. Кто-нибудь знает, как отключить эту функцию из поля со списком или мне придется создать свой собственный компонент.

Вот что я до сих пор.

public abstract class AutoComplete<T> extends ComboBox<T> {

public AutoComplete() {
    setEditable(true);
    getEditor().setOnKeyReleased(this::handleKeyPressed);
}
private void handleKeyPressed(KeyEvent event) {
    event.consume();
    if (event.getCode().isArrowKey()) {
            moveCaretToEnd();
            show();
    } else if (event.getCode().isLetterKey() && !event.isControlDown()) {
        moveCaretToEnd();
        show();
        handleTextInputChanged();
    } else if (getItems().size() == 0) {
        hide();
    } else if (event.getCode() == KeyCode.ESCAPE) {
        hide();
    } else if (event.getCode() == KeyCode.BACK_SPACE) {
        show();
        handleTextInputChanged();
    }
}

private void moveCaretToEnd(){
    getEditor().positionCaret(getText().length());
}

protected void handleTextInputChanged(){

}

protected abstract String display(T item);
}

Любая помощь в отключении этой функции в поле со списком будет с большой благодарностью.

Теги:
javafx-8
javafx-2

1 ответ

0
Лучший ответ

Проблема заключается в том, что, когда элемент выбран в блоках Combo, в поле со списком есть StringConverter по умолчанию, который вызывает T.toString() при изменении модели выбора.

* Обходной путь - это настроить собственный StringConverter.

public AutoComplete() {
    setConverter(new StringConverter<T>(){
        @Override
        public String toString(T item) {
            return item == null ? null : display(item);
        }
        @Override
        public T fromString(String string) {
            return getFromString(string);
        }
    });
}

protected abstract T getFromString(String input);

protected abstract String display(T item);

* Я говорю обходной путь, потому что это, вероятно, не самый лучший/наиболее эффективный способ, если ваш автозаполнение получает данные с сервера при каждом нажатии клавиши. Но для меня это решает проблему редактора, вызывающего мой объект, на метод string при выборе элемента в списке со списком.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню