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 @@ -47,6 +47,8 @@ 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,10 +221,32 @@ private ReadOnlyObjectWrapper tabPanePropertyImpl() { if (tabPane == null) { - tabPane = new ReadOnlyObjectWrapper(this, "tabPane"); + tabPane = new ReadOnlyObjectWrapper(this, "tabPane") { + private TabPane oldParent; + + @Override + protected void invalidated() { + if( oldParent != null ) { + oldParent.disabledProperty().addListener(parentDisabledChangedListener); + } + updateDisabled(); + TabPane newParent = get(); + if( newParent != null ) { + newParent.disabledProperty().addListener(parentDisabledChangedListener); + } + oldParent = 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,21 @@ assertTrue(tab.isDisable()); } - + @Test public void setDisableAndSeeDisabledValue() { + tab.setDisable(true); + assertTrue(tab.isDisabled()); + } + + @Test public void setDisableOnTabPaneAndSeeValue() { + assertFalse(tab.isDisable()); + assertFalse(tab.isDisabled()); + + dummyTabPane.setDisable(true); + assertFalse(tab.isDisable()); + assertTrue(tab.isDisabled()); + + dummyTabPane.setDisable(false); + assertFalse(tab.isDisable()); + assertFalse(tab.isDisabled()); + } }