java - 向 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 按键事件。
解决方案
我认为最简单的方法是避免尝试“修复”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();
}
});
推荐阅读
- elasticsearch - Elasticsearch:如何使用 OR 条件查询数组字段?
- r - 从 451 个观测值的数据框中构建时间序列对象,这些观测值不规则地间隔 3 个变量
- php - 如何在 php 中设置连续的 kafka 消费者,而不会出现连接超时
- python - 通过 exec() 使用其他变量名称中的变量
- c++ - 如何使用OpenGL渲染到一个QMainWindow的两个QWidget?
- javascript - TypeError:store.getState 不是函数 React-redux
- awk - 使用 awk 删除重复值和排序值
- java - 标准verticle和worker verticle的区别
- javascript - 如何映射此状态的连接值,而不将其作为字符串传递?
- javascript - 引号转义以正确地将参数从 HTML 输入值传递到 PHP 回显中的 javascript 函数