JavaFX自动完成ComboBox下拉大小 [英] JavaFX autocomplete ComboBox drop-down size
问题描述
我必须根据用户输入创建一个自动填充 ComboBox
I have to create an auto fill ComboBox
based on user input.
我的代码如下:
public class JavaFXApplication1 extends Application {
@Override
public void start(Stage primaryStage) {
ComboBox<String> combo = new ComboBox<>();
ObservableList<String> list = FXCollections.observableArrayList();
list.add("A");
list.add("AND");
list.add("ANDR");
list.add("ANDRE");
list.add("B");
list.add("BP");
list.add("BPO");
combo.setItems(list);
new AutoCompleteComboBoxListener(combo);
StackPane root = new StackPane();
root.getChildren().add(combo);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
AutoCompleteComboBoxListener
取自此回答。
使用此自动完成功能很好。我在列表大小上遇到了问题,
With this autocomplete works fine. I faced a problem in list size,
运行应用程序,然后点击 ComboBox
Run the application and click on the ComboBox
drop down to see popup size.
- 在组合框中键入ANDRE(将在弹出窗口中显示ANDRE选项).Now删除所有字符(由backspace) li>
- 现在,用滚动条将填充的列表缩小到一个条目大小。
- 再次单击组合框下拉菜单以获取完整大小列表。 li>
- Type ANDRE in the combo box(which will show ANDRE option in popup).Now delete all characters.(by backspace)
- Now the populated list shrinked to one entry size with scroll bar.
- Click on the combo box drop down again to get the full size list.
如何根据内容制作列表大小?
How can I make the list size according to content?
推荐答案
这是因为 comboBox.hide();
方法未被调用(下拉列表在显示时自动更新)。
This is because the comboBox.hide();
method is not called (the drop-down list is automatically updated on show).
您可以将侦听器改进为:
You can improve the listener as:
public class AutoCompleteComboBoxListener<T> implements EventHandler<KeyEvent> {
private ComboBox<T> comboBox;
private ObservableList<T> data;
private boolean moveCaretToPos = false;
private int caretPos;
public AutoCompleteComboBoxListener(final ComboBox<T> comboBox) {
this.comboBox = comboBox;
data = comboBox.getItems();
this.comboBox.setEditable(true);
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;
}
if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT
|| event.isControlDown() || event.getCode() == KeyCode.HOME
|| event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {
return;
}
comboBox.hide();
if(event.getCode() == KeyCode.BACK_SPACE) {
moveCaretToPos = true;
caretPos = comboBox.getEditor().getCaretPosition();
} else if(event.getCode() == KeyCode.DELETE) {
moveCaretToPos = true;
caretPos = comboBox.getEditor().getCaretPosition();
}
ObservableList<T> 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;
}
}
此更新将确保下拉列表将被隐藏,并在每次搜索 String
时被重新显示。
This update will ensure, that the drop-down list will be hidden and re-shown every time the search String
has been changed.
这篇关于JavaFX自动完成ComboBox下拉大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!