|
31 | 31 | import com.sun.javafx.scene.control.LabeledImpl;
|
32 | 32 | import com.sun.javafx.scene.control.skin.Utils;
|
33 | 33 | import javafx.application.Platform;
|
| 34 | +import javafx.beans.value.ChangeListener; |
34 | 35 | import javafx.collections.ListChangeListener;
|
35 | 36 | import javafx.event.ActionEvent;
|
36 | 37 | import javafx.scene.Node;
|
@@ -73,7 +74,7 @@ public class MenuButtonSkinBase<C extends MenuButton> extends SkinBase<C> {
|
73 | 74 | */
|
74 | 75 | boolean behaveLikeButton = false;
|
75 | 76 | private ListChangeListener<MenuItem> itemsChangedListener;
|
76 |
| - |
| 77 | + private final ChangeListener<? super Scene> sceneChangeListener; |
77 | 78 |
|
78 | 79 |
|
79 | 80 | /***************************************************************************
|
@@ -146,15 +147,18 @@ public MenuButtonSkinBase(final C control) {
|
146 | 147 | if (getSkinnable().getScene() != null) {
|
147 | 148 | ControlAcceleratorSupport.addAcceleratorsIntoScene(getSkinnable().getItems(), getSkinnable());
|
148 | 149 | }
|
149 |
| - control.sceneProperty().addListener((scene, oldValue, newValue) -> { |
| 150 | + |
| 151 | + sceneChangeListener = (scene, oldValue, newValue) -> { |
150 | 152 | if (oldValue != null) {
|
151 | 153 | ControlAcceleratorSupport.removeAcceleratorsFromScene(getSkinnable().getItems(), oldValue);
|
152 | 154 | }
|
153 | 155 |
|
| 156 | + // FIXME: null skinnable should not happen |
154 | 157 | if (getSkinnable() != null && getSkinnable().getScene() != null) {
|
155 | 158 | ControlAcceleratorSupport.addAcceleratorsIntoScene(getSkinnable().getItems(), getSkinnable());
|
156 | 159 | }
|
157 |
| - }); |
| 160 | + }; |
| 161 | + control.sceneProperty().addListener(sceneChangeListener); |
158 | 162 |
|
159 | 163 | // Register listeners
|
160 | 164 | registerChangeListener(control.showingProperty(), e -> {
|
@@ -214,6 +218,16 @@ public MenuButtonSkinBase(final C control) {
|
214 | 218 |
|
215 | 219 | /** {@inheritDoc} */
|
216 | 220 | @Override public void dispose() {
|
| 221 | + // FIXME : JDK-8244112 - backout if we are already disposed |
| 222 | + // should check for getSkinnable to be null and return |
| 223 | + |
| 224 | + // Cleanup accelerators |
| 225 | + if (getSkinnable().getScene() != null) { |
| 226 | + ControlAcceleratorSupport.removeAcceleratorsFromScene(getSkinnable().getItems(), getSkinnable().getScene()); |
| 227 | + } |
| 228 | + |
| 229 | + // Remove listeners |
| 230 | + getSkinnable().sceneProperty().removeListener(sceneChangeListener); |
217 | 231 | getSkinnable().getItems().removeListener(itemsChangedListener);
|
218 | 232 | super.dispose();
|
219 | 233 | if (popup != null ) {
|
|
0 commit comments