在 JavaFX 中为 TextField 设置 KeyPressed 事件

Set KeyPressed event for a TextField in JavaFX

我在名为对话框的弹出 window 中有 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();

中替换调用者,该函数本身就可以正常工作

TextFieldsetOnAction 文档指出:

The action handler associated with this text field, or null if no action handler is assigned. The action handler is normally called when the user types the ENTER key.

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

使用setOnKeyPressed而不是setOnAction:

Defines a function to be called when this Node or its child Node has input focus and a key has been pressed.

而不是传递 KeyCode.ESCAPE,传递 KeyEventKeyCode 你可以用 getCode():

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