Я ищу, чтобы сделать автоматическое полное поле со списком в 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);
}
Любая помощь в отключении этой функции в поле со списком будет с большой благодарностью.
Проблема заключается в том, что, когда элемент выбран в блоках 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 при выборе элемента в списке со списком.