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