我一直试图找到有关我的错误的一些信息,但过去几个小时都找不到相关内容。
我在控制器类中使用此键事件处理方法。 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方法并跳过以下代码。我想我应该以某种方式将这个过程从最后一个大括号转回到 键 - > {部分。但是如何?
答案 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);
}