如何在 AutoComplete JavaFX 不可编辑的 ComboBox 中允许 "SPACE" 字符?

How do I allow a "SPACE" character in an AutoComplete JavaFX uneditable ComboBox?

当我在自动完成组合框中键入 SPACE 字符时,我可以让 space 字符被接受,除了我用来管理它的 addEventFilter 代码乘以并插入 space 对于之前在 space 之前键入的每个字符。您可以在下面看到一个屏幕截图示例,其中在 3 个字符 (ive) 之后添加了 3 space,然后在我添加了一个额外的字符 (t) 之后添加了 4 space,每个字符都是在键入单个字符之后SPACE,而 space 仅在我键入下一个字符后出现(例如 'm')。

我确实使用 ContolsFX AutoComplete 进行了尝试,但它无法处理不可编辑的 ComboBox - 并且找不到任何相反的东西。在我研究的在线案例中,建议使用ComboBox的弹出皮肤-addEventFilter来管理SPACE字符事件。在几乎所有情况下,它都是 consume() 并阻止 space 选择和关闭。我没有找到任何严格允许输入 space 的内容。我已尝试在此事件代码之前和之后的代码中添加 SPACE,但 addEventFilter event.consume() 会将其删除。 SPACE 字符只有在我在 addEventFilter 方法中管理它的添加时才会出现。我尝试了不同的事件,例如 KeyEvent.ANY、KeyEvent.KEY_TYPED 和 KeyEvent.KEY_RELEASE,并阅读了有关 KeyEvent 的文档,但似乎只有 KeyEvent.KEY_PRESSED 允许 SPACE字符,它只是乘以 space 的数量,直到下一个文本字符才插入。

ComboBoxListViewSkin cbSkin = cbSkin = new ComboBoxListViewSkin(cmb);

// cmb 是组合框

    cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
        if(event.getCode() == KeyCode.SPACE){
            filter += " ";
            event.consume();}
    });

我能够解决我的问题。事件代码需要是 ComboBoxAutoComplete 构造函数的一部分,而不是 onKeyPressed 事件的一部分。

private ComboBoxListViewSkin cbSkin;

public ComboBoxAutoComplete(ComboBox<T> cmb) {
    this.cmb = cmb;
    cbSkin = new ComboBoxListViewSkin(cmb);
    originalItems = FXCollections.observableArrayList(cmb.getItems());
    cmb.setOnKeyPressed(this::handleOnKeyPressed);
    cmb.setOnHidden(this::handleOnHiding);
    cmb.setSkin(cbSkin);
    cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
        if(event.getCode() == KeyCode.SPACE){
            filter += " ";
            event.consume();}
    });
}