我需要保留一个大小不确定的字符串列表。我认为最好的方法是通过组合框来实现,该组合框将接受用户输入,并在检测到“Enter”按键时将该用户输入添加到ComboBox项目列表中,并允许用户通过“Delete”按键删除这些项目。
我曾希望这将是一个非常简单的任务,处理方式如下:
我曾希望这将是一个非常简单的任务,处理方式如下:
this.cbx.setOnKeyTyped((KeyEvent E) -> {
switch(E.getCode()){
case ENTER:
this.cbx.getItems().add(this.cbx.valueProperty().get());
this.cbx.valueProperty().set("");
E.consume();
break;
case DELETE:
if (this.cbx.getItems().contains(
this.cbx.valueProperty().get()
)) this.cbx.getItems().remove(this.cbx.valueProperty().get());
this.cbx.valueProperty().set("");
E.consume();
break;
}
});
不幸的是,按下“Enter”键不会触发事件。所以我显然是错了。
我还尝试使用onKeyPressed
,但也没有起作用。
我需要做什么才能捕捉到按下“Enter”和“Delete”键(它可以很好地捕捉到“Shift”键,这让人疯狂)。
编辑1:
也尝试过
If(E.getCode().Equals(KeyCode.ENTER)){
...
} else if (E.getCode().equals(KeyCode.DELETE)){
...
}
没有爱。
编辑2:
根据下面James_D的答案,它让我找到了正确的方向,为了实现我想要做的事情,我采用了以下方法:
ComboBox<String> cb = new ComboBox<>();
cb.setEditable(true);
cb.getEditor().addEventFilter(KeyEvent.KEY_PRESSED, (KeyEvent E) -> {
switch(E.getCode()){
case ENTER:{
if (cb.getItems().contains(cb.getEditor().getText()))
E.consume();
else{
cb.getItems().add(cb.getEditor().getText());
cb.getEditor().clear();
E.consume();
}
break;
}
case DELETE:{
if (E.isControlDown() && cb.getItems().contains(cb.getEditor().getText()))
cb.getItems().remove(cb.getEditor().getText());
else if (E.isAltDown()) cb.getItems().clear();
if (E.isControlDown() || E.isAltDown()){
cb.getEditor().clear();
E.consume();
}
break;
}
}
});