--- old/modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java 2015-08-03 13:37:32.547748500 +0300 +++ new/modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java 2015-08-03 13:37:32.287733600 +0300 @@ -165,17 +165,7 @@ } final ObservableBooleanValue newObservable = (rawObservable instanceof ObservableBooleanValue) ? (ObservableBooleanValue) rawObservable - : new BooleanBinding() { - { - super.bind(rawObservable); - } - - @Override - protected boolean computeValue() { - final Boolean value = rawObservable.getValue(); - return (value == null)? false : value; - } - }; + : new ValueWrapper(rawObservable); if (!newObservable.equals(observable)) { unbind(); @@ -196,6 +186,9 @@ if (observable != null) { value = observable.get(); observable.removeListener(listener); + if (observable instanceof ValueWrapper) { + ((ValueWrapper)observable).dispose(); + } observable = null; } } @@ -252,4 +245,24 @@ return wref.get() == null; } } + + private class ValueWrapper extends BooleanBinding { + private ObservableValue observable; + + public ValueWrapper(ObservableValue observable) { + this.observable = observable; + bind(observable); + } + + @Override + protected boolean computeValue() { + final Boolean value = observable.getValue(); + return (value == null) ? false : value; + } + + @Override + public void dispose() { + unbind(observable); + } + } }