JavaFX:按下“Enter”键

时间:2014-10-22 16:14:24

标签: combobox javafx keyevent enter

我需要保留一个不确定大小的字符串列表。我认为最好的方法是通过一个组合框来获取用户输入,然后在检测到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”就好了,这很令人抓狂)。

编辑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;
            }
        }
    });

1 个答案:

答案 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();
        }
    });