在JavaFX中为TextField设置KeyPressed事件

问题描述 投票:4回答:1

我在一个名为dialog的弹出窗口中有许多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 );});

问题是函数没有被调用。

知道怎么解决这个问题?值得一提的是,如果我用qazxsw poi替换衣领,这个功能本身就能正常工作

java javafx event-handling stage
1个回答
5
投票

setOnAction();setOnAction文档指出:

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

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

使用KeyCode.ESCAPE而不是setOnKeyPressed

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

而不是通过setOnAction,传递KeyCode.ESCAPEKeyCode你可以用KeyEvent获得:

getCode()
© www.soinside.com 2019 - 2024. All rights reserved.