当我在AutoComplete ComboBox中键入一个SPACE字符时,我可以获得要接受的空格字符,除了我用来管理它的addEventFilter代码乘以并为之前在空格之前键入的每个字符插入一个空格。您可以看到下面的屏幕截图示例,其中在3个字符(ive)之后添加了3个空格,然后在我包含其他字符(t)之后添加了4个空格,每个空格在键入单个SPACE之后添加,并且空格仅在我输入后出现下一个字符(例如'm')。
我使用ContolsFX AutoComplete尝试了这个,但它无法处理不可编辑的ComboBox - 并且无法找到任何相反的内容。在我研究的在线案例中,建议使用ComboBox的弹出皮肤 - addEventFilter来管理SPACE角色事件。几乎在所有情况下,消耗()并阻止选择和关闭空间。我没有发现任何严格允许输入空间的内容。我已尝试在此事件代码之前和之后的代码中添加SPACE,但addEventFilter event.consume()将删除它。仅当我在addEventFilter方法中管理其添加时,才会出现SPACE字符。我尝试了不同的事件,如KeyEvent.ANY,KeyEvent.KEY_TYPED和KeyEvent.KEY_RELEASE,并阅读KeyEvent上的文档,但只有KeyEvent.KEY_PRESSED似乎允许SPACE字符,它只是乘以空格的数量,并且没有插入直到下一个文本字符。
ComboBoxListViewSkin cbSkin = cbSkin = new ComboBoxListViewSkin(cmb);
// cmb是ComboBox
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();}
});
}