Java 将输入过滤器添加到文本字段会阻止ESC键的默认处理
上下文:jdk8和JavaFX 我有一个对话框中使用的TextField控件。它是第一个编辑控件,因此当对话框打开时,它将获得焦点。该对话框有一个配置为取消按钮的按钮(button.setCancelButton(true)) 对于纯文本字段,如果在对话框打开后立即按ESC键,则对话框将关闭(如预期) 但是,一旦我将带有输入过滤器的TextFormatter添加到TextField,ESC按键似乎正在被输入控件使用,并且ESC不再关闭对话框 TextFormatter只有一个输入过滤器(将输入控件限制为仅数字),但在ESC按键上不会调用输入过滤器,因为字段的内容没有更改 这是一个相当小的问题,但是没有一致的行为,不能直接按ESC键来关闭对话框,这是令人恼火的。关于如何确保ESC按键被传播/不被使用,以便由对话框处理,有何想法 编辑:Java 将输入过滤器添加到文本字段会阻止ESC键的默认处理,java,javafx,Java,Javafx,上下文:jdk8和JavaFX 我有一个对话框中使用的TextField控件。它是第一个编辑控件,因此当对话框打开时,它将获得焦点。该对话框有一个配置为取消按钮的按钮(button.setCancelButton(true)) 对于纯文本字段,如果在对话框打开后立即按ESC键,则对话框将关闭(如预期) 但是,一旦我将带有输入过滤器的TextFormatter添加到TextField,ESC按键似乎正在被输入控件使用,并且ESC不再关闭对话框 TextFormatter只有一个输入过滤器(将输入控
我的问题似乎与此问题重复:。当然,尽管在发布之前我在谷歌搜索了一下,但还是没能找到。。。太长,读不下去了TextFormatter类无法在上转发ESC按键事件。我认为最简单的方法是避免尝试“修复”TextField和TextFormatter,只需添加一个键侦听器:
textField.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ESCAPE) {
dialog.setResult(ButtonType.CANCEL);
}
});
如果该对话框不是警报(或者更准确地说,不是对话框
),您可以找到按钮并自己激活它:
textField.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ESCAPE) {
Button cancelButton = (Button)
dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
cancelButton.fire();
}
});
这样做很有效,并且避免了在自定义TextField类中放入特定于对话框的处理代码。