当我在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是组合框
cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
if(event.getCode() == KeyCode.SPACE){
filter += " ";
event.consume();}
});
答案 0 :(得分:0)
我能够解决我的问题。该事件代码必须是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();}
});
}