在JavaFX中为TextField设置KeyPressed事件

时间:2016-09-05 10:13:43

标签: java javafx event-handling stage

我在一个名为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 );});

问题是函数没有被调用。

知道如何解决这个问题?如果我将调用者替换为setOnAction();

,它会提到函数本身可以正常工作。

1 个答案:

答案 0 :(得分:5)

TextField州的setOnAction文档:

  

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

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

使用setOnKeyPressed而不是setOnAction

  

定义此Node或其子节点具有的函数   输入焦点和键已被按下。

不是传递KeyCode.ESCAPE,而是通过KeyCode传递getCode()的{​​{1}}:

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