上下文: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按键事件。
答案 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();
}
});