将输入过滤器添加到TextField会阻止ESC键的默认处理

时间:2019-06-14 13:36:06

标签: java javafx

上下文:JDK 8和JavaFX

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

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

但是,一旦我将带有输入过滤器的TextFormatter添加到TextField,则ESC按键似乎已被输入控件占用,而ESC不再关闭对话框。

TextFormatter仅具有一个输入过滤器(以将输入控件限制为仅数字),但是由于该字段的内容未更改,因此在ESC按键上未调用该输入过滤器。

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

编辑:

我的问题似乎是以下问题的重复:Escape from a Number TextField in a JavaFX dialog。尽管在发布前通过Google进行了拖网搜索,但我当然找不到哪个... TLDR; TextFormatter类无法继续转发ESC按键事件。

1 个答案:

答案 0 :(得分:3)

我认为最简单的方法是避免尝试“修复” TextField和TextFormatter,而只需添加一个键侦听器:

textField.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.ESCAPE) {
        dialog.setResult(ButtonType.CANCEL);
    }
});

如果对话框不是警报(或更准确地说,不是Dialog<ButtonType>),则可以找到该按钮并自己激活它:

textField.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.ESCAPE) {
        Button cancelButton = (Button)
            dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
        cancelButton.fire();
    }
});