JavaFX:绑定和弱侦听器

时间:2017-10-11 03:58:26

标签: java javafx

来自Javadoc for bind()

  

请注意,JavaFX具有通过weak实现的所有绑定调用   听众。这意味着绑定属性可以被垃圾收集   停止更新。

现在考虑我有两个属性ObjectProperty<Foo> shortLived驻留在ShortLivedObjectObjectProperty<Foo> longLived驻留在LongLivedObject

我这样绑定他们:

longLivedObject.longLivedProperty().bind(shortLivedObject.shortLivedProperty());

因为绑定使用弱侦听器,所以如果shortLivedObject被垃圾收集,shortLived属性也会被垃圾收集。那么,这是否意味着longLived属性仍然受约束,但永远不会更新?是否会使longLived属性处于绑定状态(无法进一步绑定),但什么都不做?

1 个答案:

答案 0 :(得分:0)

  

那么,这是否意味着longLived属性仍然绑定,但它   永远不会更新?

假设shortLivedProperty已被垃圾收集,shortLivedProperty将永远不会再次失效。因此,longLived的监听器将永远不会再被调用和更新。

  

是否将longLived属性保留在绑定状态(进一步做法)   绑定不可能),但什么都不做?

无论绑定状态如何,您都应始终bind属性为 new observable,因为旧的observable属性将被移除/解除绑定:

public void bind(final ObservableValue<? extends T> newObservable) {
    if (newObservable == null) {
        throw new NullPointerException("Cannot bind to null");
    }

    if (!newObservable.equals(this.observable)) {
        unbind();
        observable = newObservable;
        if (listener == null) {
            listener = new Listener(this);
        }
        observable.addListener(listener);
        markInvalid();
    }
}