diff --git a/javafx-ui-controls/src/javafx/scene/control/Tab.java b/javafx-ui-controls/src/javafx/scene/control/Tab.java --- a/javafx-ui-controls/src/javafx/scene/control/Tab.java +++ b/javafx-ui-controls/src/javafx/scene/control/Tab.java @@ -43,10 +43,14 @@ import com.sun.javafx.css.Styleable; import com.sun.javafx.event.EventHandlerManager; + +import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashMap; import java.util.List; import javafx.beans.DefaultProperty; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; import javafx.beans.property.BooleanPropertyBase; import javafx.beans.property.ReadOnlyBooleanProperty; import javafx.beans.property.ReadOnlyBooleanWrapper; @@ -219,11 +223,33 @@ private ReadOnlyObjectWrapper tabPanePropertyImpl() { if (tabPane == null) { - tabPane = new ReadOnlyObjectWrapper(this, "tabPane"); + tabPane = new ReadOnlyObjectWrapper(this, "tabPane") { + private WeakReference oldParent; + + @Override + protected void invalidated() { + if( oldParent != null && oldParent.get() != null ) { + oldParent.get().disabledProperty().removeListener(parentDisabledChangedListener); + } + updateDisabled(); + TabPane newParent = get(); + if( newParent != null ) { + newParent.disabledProperty().addListener(parentDisabledChangedListener); + } + oldParent = new WeakReference<>(newParent); + super.invalidated(); + } + }; } return tabPane; } + private final InvalidationListener parentDisabledChangedListener = new InvalidationListener() { + @Override public void invalidated(Observable valueModel) { + updateDisabled(); + } + }; + private StringProperty text; /** diff --git a/javafx-ui-controls/test/javafx/scene/control/TabTest.java b/javafx-ui-controls/test/javafx/scene/control/TabTest.java --- a/javafx-ui-controls/test/javafx/scene/control/TabTest.java +++ b/javafx-ui-controls/test/javafx/scene/control/TabTest.java @@ -429,5 +429,22 @@ assertTrue(tab.isDisable()); } - + @Test public void setDisableAndSeeDisabledValue() { + tab.setDisable(true); + assertTrue(tab.isDisabled()); + } + + @Test public void setDisableOnTabPaneAndSeeValue() { + dummyTabPane.getTabs().add(tab); + assertFalse(tab.isDisable()); + assertFalse(tab.isDisabled()); + + dummyTabPane.setDisable(true); + assertFalse(tab.isDisable()); + assertTrue(tab.isDisabled()); + + dummyTabPane.setDisable(false); + assertFalse(tab.isDisable()); + assertFalse(tab.isDisabled()); + } }