--- old/modules/base/src/main/java/javafx/beans/property/IntegerPropertyBase.java 2015-08-03 13:37:37.926059700 +0300 +++ new/modules/base/src/main/java/javafx/beans/property/IntegerPropertyBase.java 2015-08-03 13:37:37.678045500 +0300 @@ -171,10 +171,7 @@ newObservable = (ObservableIntegerValue)rawObservable; } else if (rawObservable instanceof ObservableNumberValue) { final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable; - newObservable = new IntegerBinding() { - { - super.bind(rawObservable); - } + newObservable = new ValueWrapper(rawObservable) { @Override protected int computeValue() { @@ -182,10 +179,7 @@ } }; } else { - newObservable = new IntegerBinding() { - { - super.bind(rawObservable); - } + newObservable = new ValueWrapper(rawObservable) { @Override protected int computeValue() { @@ -214,6 +208,9 @@ if (observable != null) { value = observable.get(); observable.removeListener(listener); + if (observable instanceof ValueWrapper) { + ((ValueWrapper)observable).dispose(); + } observable = null; } } @@ -270,4 +267,19 @@ return wref.get() == null; } } + + private abstract class ValueWrapper extends IntegerBinding { + + private ObservableValue observable; + + public ValueWrapper(ObservableValue observable) { + this.observable = observable; + bind(observable); + } + + @Override + public void dispose() { + unbind(observable); + } + } }