我希望使用组合框在javafx中制作一个自动完成的组合框。我有能够过滤项目,但我遇到的一个问题是,如果用户使用箭头键通过过滤列表,组合框编辑器将填充该项目,即使他们实际不想选择该项目。有没有人知道如何从组合框中禁用此功能,或者我必须自己制作自定义组件。
这是我到目前为止所拥有的。
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);
}
非常感谢在组合框中禁用此功能的任何帮助。
答案 0 :(得分:0)
问题似乎是当在组合框中选择一个项目时,组合框有一个默认的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);
*我说解决方法,因为如果您的自动完成功能在每次击键时从服务器获取数据,这可能不是最好/最有效的方法。但对我来说,这解决了编辑器在选择组合框列表中的项目时调用我的对象的字符串方法的问题。