Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX组合框在使用箭头键时自动填充编辑器文本_Java_Javafx 2_Javafx 8 - Fatal编程技术网

JavaFX组合框在使用箭头键时自动填充编辑器文本

JavaFX组合框在使用箭头键时自动填充编辑器文本,java,javafx-2,javafx-8,Java,Javafx 2,Javafx 8,我希望通过使用组合框在javafx中创建一个自动完成的组合框。我可以过滤项目,但我遇到的一个问题是,如果用户使用箭头键浏览过滤列表,组合框编辑器将填充该项目,即使他们实际上不想选择该项目。是否有人知道如何从组合框中禁用此功能,或者我必须创建自己的自定义组件 这是我到目前为止所拥有的 public abstract class AutoComplete<T> extends ComboBox<T> { public AutoComplete() { setEdit

我希望通过使用组合框在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);
}
公共抽象类自动完成扩展组合框{
公共自动完成(){
可编辑设置(真);
getEditor().setOnKeyReleased(此::handleKeyPressed);
}
private void handleKeyPressed(按键事件){
event.consume();
if(event.getCode().isArrowKey()){
moveCaretToEnd();
show();
}else if(event.getCode().isleterkey()&&!event.isControlDown()){
moveCaretToEnd();
show();
handleTextInputChanged();
}else if(getItems().size()==0){
隐藏();
}else if(event.getCode()==KeyCode.ESCAPE){
隐藏();
}else if(event.getCode()==KeyCode.BACK\u空格){
show();
handleTextInputChanged();
}
}
私有void moveCaretToEnd(){
getEditor().positionCaret(getText().length());
}
受保护的无效handleTextInputChanged(){
}
受保护的抽象字符串显示(T项);
}

在组合框中禁用此功能的任何帮助都将不胜感激。

问题似乎是,当在组合框中选择一个项目时,组合框有一个默认的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);
公共自动完成(){
setConverter(新的StringConverter(){
@凌驾
公共字符串到字符串(T项){
返回项==null?null:显示(项);
}
@凌驾
公共T fromString(字符串){
返回getFromString(字符串);
}
});
}
受保护的抽象T getFromString(字符串输入);
受保护的抽象字符串显示(T项);
*我之所以说变通方法,是因为如果auto complete每次按键都从服务器获取数据,那么这可能不是最好/最有效的方法。但对我来说,这解决了编辑器在选择组合框列表中的项目时调用我的对象的to string方法的问题