【问题标题】:How to make all buttons having ActionEvent handler handle Enter key in JavaFX?如何使所有具有 ActionEvent 处理程序的按钮处理 JavaFX 中的 Enter 键?
【发布时间】:2018-02-22 17:23:45
【问题描述】:

我的应用程序中有大约 50 个按钮。对于我以这种方式创建处理程序的所有按钮:

@FXML
protected void handleFooButtonActionEvent(ActionEvent actionEvent) {
    ...
}

这样用户可以使用鼠标左键或空格键按下按钮。但是,通常的做法(据我所知)允许用户使用 Enter 键按下按钮。是否可以让所有具有 ActionEvent 处理程序(见上文)的按钮也处理 JavaFX 中的 Enter 键,例如,如果我们引用了 Stage stageScene sceneParent root

【问题讨论】:

  • 你的意思是当按钮被选中时,还是一直被选中?
  • @jrtapsell 我的意思是当按钮具有焦点并且用户按下 Enter 键时。
  • 这和你想做的类似吗? > stackoverflow.com/questions/25758782/…
  • 通常的标准是空格键触发焦点按钮,而不是回车键;改变这可能会让用户感到困惑。如果你真的想使用回车键,你需要在每个按钮上都有一个键事件处理程序。最好的选择可能是子类化按钮并在构造函数中注册键处理程序。但我不建议像那样更改标准行为。
  • @James_D 感谢您的评论。但是,我不能同意你的看法。我检查了几个应用程序 - LibreOffice、FireFox、Ubuntu 所有这些都可以使用 Enter 来按下焦点按钮。

标签: javafx


【解决方案1】:

您可以配置场景来做到这一点:

scene.getAccelerators().put(
    KeyCombination.valueOf("Enter"), () -> {
        Node focusOwner = scene.getFocusOwner();
        if (focusOwner instanceof Button) {
            ((Button) focusOwner).fire();
        }
    });

您也可以使用事件处理程序来做到这一点:

scene.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
    if (e.getCode() == KeyCode.ENTER) {
        Node focusOwner = scene.getFocusOwner();
        if (focusOwner instanceof Button) {
            ((Button) focusOwner).fire();
        }
    }
});

通常我同意 James_D 的观点,即更改按钮的标准行为不是一个好主意,但我发现所有 GTK 应用程序都允许 Enter 触发按钮按下,正如您提到的 Firefox 一样。

【讨论】:

  • 我使用了您的第二个解决方案。有用。唯一的问题是,当我按下按钮上的 Space 时,按钮颜色会发生变化(因为按下时),但是当我按下 enter 按钮颜色不会改变。是否可以使按钮颜色对 Enter 键做出反应?
  • 这是 Java 9 中已修复的错误。Java 9 将于今年 9 月 21 日(即从今天起一周)发布。
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多