如何在 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】:您可以使用Node
的focusedProperty
附加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 -> 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 的标签?