如何在 onfocus 和 outfocus 时在 JavaFX TextField 上执行任务?

Posted

技术标签:

【中文标题】如何在 onfocus 和 outfocus 时在 JavaFX TextField 上执行任务?【英文标题】:How perform task on JavaFX TextField at onfocus and outfocus? 【发布时间】:2013-05-09 02:16:57 【问题描述】:

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

例如关于我要打印的TextField 的“焦点”事件

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

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

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

【问题讨论】:

【参考方案1】:
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"));

【讨论】:

与接受的答案相比没有什么新的,是吗?实际上是其代码的普通(尽管不完整)c&p ..【参考方案2】:

您可以使用NodefocusedProperty 附加ChangeListener

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

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

【讨论】:

如果第三个参数是一个布尔值,它告诉您TextField 是否在焦点上,为什么这里的每个人都将它命名为newValue 的名称?我错过了什么? 第三个参数是属性的新值。真:现在聚焦,假:现在不聚焦。 我现在明白了。我以为是指TextField中文字的值。【参考方案3】:

我认为查看一个将 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");
        
    
);

希望这个回答对你有帮助!

【讨论】:

这个是在焦点实际改变之前还是之后执行? 值得注意的是,即使在yourTextField 获得焦点时关闭应用程序,changed 仍然会被调用。这对我来说是非常不可取的,我通过按照primaryStage.setOnCloseRequest(event -&gt; removeListeners(); ); 的方式做一些事情来解决它【参考方案4】:

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

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

如果您的事件处理程序将执行其他操作(例如修改取消或默认按钮设置),请参阅此帖子:JavaFX 2 -- Setting the defaultButton property: mutually exclusive?

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

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);
        
    

【讨论】:

java baba,只需在 TextField 的focusedProperty() 上添加一个简单的更改监听器,然后检查它现在是哪种聚焦状态(真/假)。

以上是关于如何在 onfocus 和 outfocus 时在 JavaFX TextField 上执行任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中使用 onFocus 更改一个 Textinput 的边框颜色?

如何使 jQuery 自动完成列表显示所有选项 onfocus 并在选择选项后隐藏?

如何在Android中突出显示自定义菜单项onFocus状态

如何在 Material-ui 中的 onFocus 上隐藏 Autocomplete 的标签?

当在 jquery 中触发文本字段 onfocus 事件时,标题不固定

如何在 React 中使用 Material-UI 在 onFocus 事件的 Textfield 中选择部分文本?