在 JavaFX 中为 TextField 设置 KeyPressed 事件

Posted

技术标签:

【中文标题】在 JavaFX 中为 TextField 设置 KeyPressed 事件【英文标题】:Set KeyPressed event for a TextField in JavaFX 【发布时间】: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 将(在被认为是默认行为的平台上)关闭对话框。 【参考方案1】:

TextFieldsetOnAction 文档指出:

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

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

使用setOnKeyPressed 而不是setOnAction

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

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

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

【讨论】:

以上是关于在 JavaFX 中为 TextField 设置 KeyPressed 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaFX 中设置占位符?

如何在 Scenebuilder 中为空的 TextField 输入添加错误弹出窗口

JavaFX TextField 在焦点上将填充更改为 0

是否可以为 javafx textField/Area 中的不同行设置不同的颜色?

在 CSS (JavaFX) 中为 TableView 设置样式

在 Javafx 中为新的 ListView 条目设置动画