【问题标题】:JavaFX KeyEvent when Stage inactive舞台不活动时的 JavaFX KeyEvent
【发布时间】:2017-05-08 18:59:18
【问题描述】:

当我最小化我的舞台时,JavaFX 不会触发我的 KeyPressed 事件。 最小化 Stage 时如何收听 KeyEvent?

这里我称之为我的舞台:

public void start(Stage primaryStage) throws IOException {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Gui.fxml"));
    Parent root = fxmlLoader.load();
    primaryStage.setTitle("KillSwitch");
    primaryStage.setScene(new Scene(root));
    primaryStage.getScene().getRoot().requestFocus();
    primaryStage.show();
}

这就是事件处理器:

public void handleKeyInput(javafx.scene.input.KeyEvent event) throws InterruptedException, SerialPortException, IOException {
    if (event.getCode() == KeyCode.UP) {
        handletriggerButton();
    }
}

【问题讨论】:

  • 你不能,至少不使用某种挂钩到本机代码。例如,如果用户将其最小化并开始在他们的文字处理器中输入,您是否真的希望您的应用程序能够响应?
  • @James_D 你有本地代码的例子吗?用户应该使用 Gui 校准程序,而不是最小化它并使用键控制它。
  • 不:我从来没有这样做过。但是让一个视觉上不活动的程序响应任意按键对我来说听起来很危险——在许多情况下,用户可能完全没有意识到他们正在控制这个应用程序。

标签: events javafx keyevent stage minimized


【解决方案1】:

包括 JavaFX 在内的大多数用户界面工具包将关键事件传递到当前关注的用户界面元素,并向上传播它们直到它们到达根节点。

如果您的窗口被最小化,它的任何元素都不会获得键盘焦点,因此没有人会收到按键事件。

因此,正如@James_D 评论的那样,您需要在操作系统中使用本机挂钩来拦截系统范围的键盘事件,例如键盘记录器可以。

对于集成原生,您可以采用Java Native Interface 的方式,或者通过Java Native Access 之类的库去除一些粗糙的边缘。

关于如何在您的目标操作系统中执行此操作,您可能应该针对操作系统本身进行研究。

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2017-12-17
    • 2018-09-06
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多