首页 > 解决方案 > 向 TextField 添加输入过滤器会阻止对 ESC 键的默认处理

问题描述

上下文: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。当然,尽管在发布之前通过谷歌搜索,我还是没有找到…… TLDR;TextFormatter 类无法转发 ESC 按键事件。

标签: javajavafx

解决方案


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

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

如果 Dialog 不是 Alert (或更准确地说,不是Dialog<ButtonType>),您可以找到该按钮并自己激活它:

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

推荐阅读