如何在onfocus和outfocus上对javaFX TextField执行任务?

jav*_*aba 45 java javafx javafx-2 javafx-8

我正在研究JavaFX项目.我需要在JavaFX上执行一些任务TextField.

例如,TextField我要打印的"焦点上"事件

System.out.println("Textfield on focus");
Run Code Online (Sandbox Code Playgroud)

它应该打印出"焦点"事件

System.out.println("Textfield out focus");
Run Code Online (Sandbox Code Playgroud)

Bre*_*dan 80

我认为看一个将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");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我希望这个答案有用!

  • 这是在焦点实际改变之前还是之后执行的? (4认同)

DVa*_*rga 10

您可以使用focusedPropertyNode附加一个ChangeListener.

扩展Brendan的答案:来自JavaFX8(与Java 8一起提供),lambda表达式与三元运算符相结合可以使其非常紧凑:

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "Focused" : "Unfocused"));
Run Code Online (Sandbox Code Playgroud)


sco*_*ttb 8

您需要将ChangeListener附加到要监视的TextField的FocusProperty.

在JavaFX中,只要属性满足JavaFX bean的最小定义,就可以将通知事件(更改或失效侦听器)附加到对象可能拥有的任何JavaFX属性.

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

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

txtDx.focusedProperty().addListener(m_txtDxListener);
Run Code Online (Sandbox Code Playgroud)

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

  • java baba,只需在TextField的focusedProperty()上添加一个简单的更改侦听器,并检查它现在是哪种聚焦状态(true/false). (2认同)