我有一段代码可以在按下某个键时执行某些功能:
scene.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.F1) {
doSomething();
}
});
它可以工作,但前提是没有焦点组件,例如按钮或文本字段。
我注意到,如果我按 CTRL+F1、ALT+F1 或 SHIFT+F1,它就会起作用,但如果没有焦点组件,则只有 F1 才起作用。
有办法避免这种情况吗?
- - -更新 - - -正如@James_D所说,我可以使用 eventFilter 而不是 eventHandler 来做到这一点:
scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode().equals(KeyCode.ESCAPE)) {
try {
FXMLLoader fxmlLoader = new FXMLLoader(TelaPrincipalController.class.getResource("/br/com/atualy/checkout/layout/telaoperacoescaixa.fxml"));
Parent parent = fxmlLoader.load();
Scene scene = new Scene(parent, 600,400);
Stage stage = new Stage();
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.initOwner(this.stage);
stage.showAndWait();
System.out.println("----> THIS IS BEING PRINTED TWICE ! <----");
} catch (IOException e) {
e.printStackTrace();
}
}
});
每按一次 ESC 键,此代码中的第 12 行就会打印两次。这意味着当我按 esc 时,它会打开一个新窗口,当我关闭它时,该窗口会再次打开。
我可以解决吗?
请改用事件过滤器。某些控件会消耗按键事件,因此使用事件过滤器可以让您在控件消耗它们之前对其进行处理。
scene.addEventFilter(KeyEvent.KEY_PRESSED,
event -> System.out.println("Pressed: " + event.getCode()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)