java - 向 TextField 添加输入过滤器会阻止 ESC 键的默认处理

标签 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 。尽管在发布之前通过谷歌进行了搜索,但我当然没能找到……TLDR; TextFormatter 类无法转发 ESC 按键事件。

最佳答案

我认为最简单的方法是避免尝试“修复”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();
    }
});

关于java - 向 TextField 添加输入过滤器会阻止 ESC 键的默认处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56599336/

相关文章:

java - 为什么 Css 特定的边框样式(如脊线、凹槽、起点、插图)在 javafx 中不起作用?

java - 如果一个方法属于另一个扩展Thread的类,但从主线程调用,那么它会由主线程还是子线程执行? ( java )

java - 使用 Java 首选项 API 序列化对象

java - 使用正则表达式替换某个字符串 - Java

java - 在 javafxports android 项目中查找配置文件时出现问题

JavaFX用lambda实现call方法的回调

JavaFX 操作两个 FXML 中的标签

JavaFX:将属性绑定(bind)到 Pane 时遇到问题

java - 我可以在 Spring 中注入(inject)接口(interface)子类型吗?

java - 重构泛型