【问题标题】:Set KeyPressed event for a TextField in JavaFX在 JavaFX 中为 TextField 设置 KeyPressed 事件
【发布时间】:2017-01-12 16:38:40
【问题描述】:

我在名为对话框的弹出窗口中有多个 TextField 对象(类型:Stage)。

我正在尝试为他们定义一个动作处理程序,旨在在单击键盘上的退出按钮后关闭舞台。

这是我的舞台关闭功能:

public void escapeKeyPressed(KeyCode keyCode , Stage dialog){
    if (keyCode == KeyCode.ESCAPE ){
        dialog.close();
        System.out.println("escape got called");
    }
} 

以下是我所说的:

textUsername.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog );});
textAddress.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog );});
textwp.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog );});
textState.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog );});
textloginName.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog );});

问题是函数没有被调用。

知道如何解决这个问题吗?值得一提的是,如果我将调用者替换为 setOnAction();

【问题讨论】:

  • 如果您有一个对话框,您应该考虑使用带有 ButtonType.CANCEL 的 Alert (javafx.scene.control.Alert) 类。这样,您将按照应用程序运行的操作系统的正确顺序获得一个正确标记的按钮,并且 Esc 将(在被认为是默认行为的平台上)关闭对话框。

标签: java javafx event-handling stage


【解决方案1】:

TextFieldsetOnAction 文档指出:

与此文本字段关联的操作处理程序,如果未分配操作处理程序,则为 null。 通常调用动作处理程序 当用户键入 ENTER 键时。

因此,escapeKeyPressed 将在Enter 按键时执行。现在会发生什么:如果你按Enter键,它会用KeyCode.ESCAPE调用这个方法,因此它会关闭对话框。

使用setOnKeyPressed 而不是setOnAction

定义当此节点或其子节点有时要调用的函数 输入焦点并按下了一个键。

与其传递KeyCode.ESCAPE,不如传递KeyEvent 中的KeyCode,你可以用getCode() 得到什么:

textUsername.setOnKeyPressed(event -> escapeKeyPressed(event.getCode(), dialog));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2020-11-30
    • 2016-12-22
    • 2018-05-04
    • 2015-08-21
    相关资源
    最近更新 更多