上下文: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/