JavaFX中的自动完成组合框

我正在寻找一种将自动完成功能添加到JavaFX的方法ComboBox。经过大量搜索之后,该在这里提问了。

这AutoFillBox是已知的,但不是我要搜索的内容。我想要的是一个可编辑的组合框,在键入列表时应进行过滤。但是我也想打开列表而不输入并查看整个项目。

任何想法?

回答:

我找到了一个对我有用的解决方案:

public class AutoCompleteComboBoxListener<T> implements EventHandler<KeyEvent> {

private ComboBox comboBox;

private StringBuilder sb;

private ObservableList<T> data;

private boolean moveCaretToPos = false;

private int caretPos;

public AutoCompleteComboBoxListener(final ComboBox comboBox) {

this.comboBox = comboBox;

sb = new StringBuilder();

data = comboBox.getItems();

this.comboBox.setEditable(true);

this.comboBox.setOnKeyPressed(new EventHandler<KeyEvent>() {

@Override

public void handle(KeyEvent t) {

comboBox.hide();

}

});

this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);

}

@Override

public void handle(KeyEvent event) {

if(event.getCode() == KeyCode.UP) {

caretPos = -1;

moveCaret(comboBox.getEditor().getText().length());

return;

} else if(event.getCode() == KeyCode.DOWN) {

if(!comboBox.isShowing()) {

comboBox.show();

}

caretPos = -1;

moveCaret(comboBox.getEditor().getText().length());

return;

} else if(event.getCode() == KeyCode.BACK_SPACE) {

moveCaretToPos = true;

caretPos = comboBox.getEditor().getCaretPosition();

} else if(event.getCode() == KeyCode.DELETE) {

moveCaretToPos = true;

caretPos = comboBox.getEditor().getCaretPosition();

}

if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT

|| event.isControlDown() || event.getCode() == KeyCode.HOME

|| event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {

return;

}

ObservableList list = FXCollections.observableArrayList();

for (int i=0; i<data.size(); i++) {

if(data.get(i).toString().toLowerCase().startsWith(

AutoCompleteComboBoxListener.this.comboBox

.getEditor().getText().toLowerCase())) {

list.add(data.get(i));

}

}

String t = comboBox.getEditor().getText();

comboBox.setItems(list);

comboBox.getEditor().setText(t);

if(!moveCaretToPos) {

caretPos = -1;

}

moveCaret(t.length());

if(!list.isEmpty()) {

comboBox.show();

}

}

private void moveCaret(int textLength) {

if(caretPos == -1) {

comboBox.getEditor().positionCaret(textLength);

} else {

comboBox.getEditor().positionCaret(caretPos);

}

moveCaretToPos = false;

}

}

你可以用

new AutoCompleteComboBoxListener<>(comboBox);

基于此,我根据自己的需要对其进行了自定义。

随时使用它,如果有人可以改进它,请告诉我。

以上是 JavaFX中的自动完成组合框 的全部内容, 来源链接: utcz.com/qa/411876.html

回到顶部