在JavaFX中为TextField设置KeyPressed事件

Dan*_*ifa 4 java javafx stage event-handling

TextField在弹出窗口中有多个对象,名为dialog(type :) Stage.

我正在尝试为它们定义一个动作处理程序,目的是在键盘上单击转义按钮后关闭舞台.

这是我关闭阶段的功能:

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

以下是我称之为的地方:

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 );});
Run Code Online (Sandbox Code Playgroud)

问题是函数没有被调用.

知道怎么解决这个问题?值得一提的是,如果我将调用者替换掉,函数本身就能正常工作setOnAction();

DVa*_*rga 5

各州的setOnAction文件TextField:

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

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

使用setOnKeyPressed而不是setOnAction:

定义当此节点或其子节点具有输入焦点并且已按下某个键时要调用的函数.

而不是通过KeyCode.ESCAPE,传递你可以得到KeyCodeKeyEvent东西getCode():

textUsername.setOnKeyPressed(event -> escapeKeyPressed(event.getCode(), dialog));
Run Code Online (Sandbox Code Playgroud)