55

我正在从事 JavaFX 项目。我需要在 JavaFX 上执行一些任务TextField

例如在TextField我想打印的“焦点”事件上

System.out.println("Textfield on focus");

在“out focus”事件上它应该打印

System.out.println("Textfield out focus");
4

4 回答 4

104

我认为查看将 ChangeListener 指定为匿名内部类的示例可能会有所帮助,例如提到的 scottb。

TextField yourTextField = new TextField();
yourTextField.focusedProperty().addListener(new ChangeListener<Boolean>()
{
    @Override
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
    {
        if (newPropertyValue)
        {
            System.out.println("Textfield on focus");
        }
        else
        {
            System.out.println("Textfield out focus");
        }
    }
});

我希望这个答案有帮助!

于 2013-06-06T20:05:05.143 回答
16

您可以使用focusedPropertyofNode来附加一个ChangeListener.

扩展 Brendan 的答案:从 JavaFX8(Java 8 附带)开始,结合三元运算符的 lambda 表达式可以使其非常紧凑:

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "Focused" : "Unfocused"));
于 2017-09-26T11:02:52.997 回答
9

您需要将 ChangeListener 附加到您希望监视的 TextField 的 FocusProperty。

在 JavaFX 中,您可以将通知事件(更改或无效侦听器)附加到对象可能拥有的任何 JavaFX 属性,只要该属性符合 JavaFX bean 的最低定义即可。

如果您的事件处理程序将执行其他操作,例如修改取消或默认按钮设置,请参阅此帖子:JavaFX 2 -- 设置 defaultButton 属性:互斥?

以下是将更改侦听器附加到文本框的一些代码:

txtDx.focusedProperty().addListener(m_txtDxListener);

Listener 对象已存储在实例字段中,因此它可以与 addListener() 和 removeListener() 一起使用。对于短暂的 TextField,您可以使用匿名内部类指定侦听器对象。

这是我为我的焦点听众写的私人课程:

private class FocusPropertyChangeListener implements ChangeListener<Boolean> {

    FocusPropertyChangeListener() { System.out.println("New FPCL instance"); }

    @Override
    public void changed(ObservableValue<? extends Boolean> ov, 
        Boolean oldb, Boolean newb) {
        System.out.println("Focus change triggered");

        if (ancEncEditor.isVisible() && !ancEncEditor.isDisabled()) {
            boolean b = (newb != null && newb.booleanValue() == true);
            System.out.println("txtDx focus change event triggered: DxAdd = " + b);

            if (b) { btnDxAdd.setDefaultButton(true); }
            else { btnWindowCommit.setDefaultButton(true); }
            btnWindowCommit.setCancelButton(true);
            btnDxAdd.setDefaultButton(b);
        }
    }
}
于 2013-05-14T17:41:12.213 回答
0
yourTextField.focusedProperty().addListener(new ChangeListener<Boolean>()
{
    @Override
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
    {
        if (newPropertyValue)
        {
            System.out.println("Textfield on focus");
        }
        else
        {
            System.out.println("Textfield out focus");
        }
    }
});

或者您可以在 java 8 或更高版本中使用

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "textfield on focus" : "Textfield out focus"));
于 2020-12-13T04:48:04.940 回答