我需要保留一个不确定大小的字符串列表。我认为最好的方法是通过一个组合框来获取用户输入,然后在检测到ComboBox项目列表的“Enter”键击时添加该用户输入,并允许用户删除这些项目通过“删除”按键。
我曾希望这将是一个非常简单的任务:
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”就好了,这很令人抓狂)。
还试过
If(E.getCode().Equals(KeyCode.ENTER)){
...
} else if (E.getCode().equals(KeyCode.DELETE)){
...
}
没有爱。
基于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;
}
}
});
答案 0 :(得分:4)
您是否希望拥有一个可编辑的组合框,当用户键入不存在的项目时,会将项目添加到其弹出列表中?
如果是,请尝试:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class UpdatingComboBox extends Application {
@Override
public void start(Stage primaryStage) {
ComboBox<String> combo = new ComboBox<>();
combo.setEditable(true);
combo.valueProperty().addListener((obs, oldValue, newValue) -> {
if (newValue != null && ! combo.getItems().contains(newValue)) {
combo.getItems().add(newValue);
}
});
HBox root = new HBox(combo);
root.setAlignment(Pos.TOP_CENTER);
primaryStage.setScene(new Scene(root, 350, 150));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
对于删除,我要问的第一件事是你真的想要你所描述的功能。用户通常希望在可编辑的组合框中按删除以删除下一个字符,而不是从列表中完全删除项目。如果你想这样做,你必须让你的手更脏一些,并使用一个关键的听众。出于某种原因,直接将键监听器添加到组合框似乎有一些不可预测的结果;但是,如果将它添加到可编辑组合框底层的文本字段中,它可以工作:
combo.getEditor().addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode() == KeyCode.DELETE) {
combo.getItems().remove(combo.getValue());
event.consume();
}
});