第一个关键事件跳过进程

时间:2016-05-28 12:34:30

标签: java javafx-8 keyevent

我一直试图找到有关我的错误的一些信息,但过去几个小时都找不到相关内容。

我在控制器类中使用此键事件处理方法。 onKeyPressed位于根BorderPane上的fxml文件中。主要课程是标准的。

此方法是我的计算器应用程序的一部分,它从keyCode中提取一个字符并将其传递给其他方法。

问题是,正如在调试过程中看到的那样,在第一次按键时,它甚至不会尝试生成返回的String,而是直接跳到方法的末尾。按下的所有其他键都会正常处理。

如果我在最后一个花括号之前打印一些东西,它只会在第一次按键时打印在控制台上。

以下是问题方法:

    public void handleKeys() {
    container.setOnKeyPressed(key -> {
        String returned = key.getCode().toString().toLowerCase();
        char chr = '0';
        switch (returned) {
            case "add":
                chr = '+';
                break;
            default:
                if (Character.toString(returned.charAt(returned.length() - 1)).matches("\\d") && returned.charAt(returned.length() - 2) != 'f') {
                    chr = returned.charAt(returned.length() - 1);
                    break;
                }
        }
        handleSymbols(chr);
    });
}

据我所知,在第一次按键时,初始化setOnKeyPressed方法并跳过以下代码。我想我应该以某种方式将这个过程从最后一个大括号转回到 键 - > {部分。但是如何?

1 个答案:

答案 0 :(得分:0)

如果您在FXML中注册处理程序,大概是(您没有发布代码),例如

<BorderPane fx:id="container" onKeyPressed="#handleKeys" ... >

然后处理程序已经注册:您不需要在控制器代码中再次注册它。发生事件时,将调用您指定的方法。因此,您只需要该方法来实现所需的功能:

public void handleKeys(KeyEvent key) {
    String returned = key.getCode().toString().toLowerCase();
    char chr = '0';
    switch (returned) {
        case "add":
            chr = '+';
            break;
        default:
            if (Character.toString(returned.charAt(returned.length() - 1)).matches("\\d") && returned.charAt(returned.length() - 2) != 'f') {
                chr = returned.charAt(returned.length() - 1);
                break;
            }
    }
    handleSymbols(chr);
}