如何在 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();}
});
}
当我在自动完成组合框中键入 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();}
});
}