JavaFX中如何获取触发focus listener的TextField实例
解决TextField焦点监听时获取对应组件引用的问题
你可以通过JavaFX属性的getBean()方法,从监听的observable对象反向获取对应的TextField实例,这样就能在同一个监听器里针对性操作目标组件。
具体实现代码
ChangeListener<Boolean> textFieldFocusListener = (observable, oldValue, newValue) -> { // 从Observable属性中获取所属的TextField对象 TextField targetTextField = (TextField) ((ReadOnlyBooleanProperty) observable).getBean(); // 当TextField获取焦点时,恢复黑色边框 if (newValue) { // 直接设置边框样式为黑色实线 targetTextField.setBorder(new Border( new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT) )); } }; // 为三个TextField绑定同一个焦点监听器 keyWord.focusedProperty().addListener(textFieldFocusListener); date.focusedProperty().addListener(textFieldFocusListener); location.focusedProperty().addListener(textFieldFocusListener);
补充说明
getBean()方法是JavaFX属性的通用方法,会返回该属性所属的组件实例,这里因为我们绑定的都是TextField的focusedProperty,所以强转成TextField是安全的。- 如果你的错误边框是通过CSS样式类实现的(比如给无效TextField添加
error-border类),可以改成操作样式类更灵活:if (newValue) { targetTextField.getStyleClass().remove("error-border"); // 确保默认样式生效,可根据需要添加默认样式类 // targetTextField.getStyleClass().add("text-field"); }
内容的提问来源于stack exchange,提问作者Starnec
相关产品推荐
相关产品推荐

