Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将输入过滤器添加到文本字段会阻止ESC键的默认处理_Java_Javafx - Fatal编程技术网

Java 将输入过滤器添加到文本字段会阻止ESC键的默认处理

Java 将输入过滤器添加到文本字段会阻止ESC键的默认处理,java,javafx,Java,Javafx,上下文:jdk8和JavaFX 我有一个对话框中使用的TextField控件。它是第一个编辑控件,因此当对话框打开时,它将获得焦点。该对话框有一个配置为取消按钮的按钮(button.setCancelButton(true)) 对于纯文本字段,如果在对话框打开后立即按ESC键,则对话框将关闭(如预期) 但是,一旦我将带有输入过滤器的TextFormatter添加到TextField,ESC按键似乎正在被输入控件使用,并且ESC不再关闭对话框 TextFormatter只有一个输入过滤器(将输入控

上下文:jdk8和JavaFX

我有一个对话框中使用的TextField控件。它是第一个编辑控件,因此当对话框打开时,它将获得焦点。该对话框有一个配置为取消按钮的按钮(button.setCancelButton(true))

对于纯文本字段,如果在对话框打开后立即按ESC键,则对话框将关闭(如预期)

但是,一旦我将带有输入过滤器的TextFormatter添加到TextField,ESC按键似乎正在被输入控件使用,并且ESC不再关闭对话框

TextFormatter只有一个输入过滤器(将输入控件限制为仅数字),但在ESC按键上不会调用输入过滤器,因为字段的内容没有更改

这是一个相当小的问题,但是没有一致的行为,不能直接按ESC键来关闭对话框,这是令人恼火的。关于如何确保ESC按键被传播/不被使用,以便由对话框处理,有何想法

编辑:


我的问题似乎与此问题重复:。当然,尽管在发布之前我在谷歌搜索了一下,但还是没能找到。。。太长,读不下去了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类中放入特定于对话框的处理代码。