JavaFX自动完成ComboBox下拉大小 [英] JavaFX autocomplete ComboBox drop-down size

查看:326
本文介绍了JavaFX自动完成ComboBox下拉大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须根据用户输入创建一个自动填充 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆