diff --git a/modules/javafx.swing/src/main/java/com/sun/javafx/embed/swing/newimpl/SwingNodeInteropN.java b/modules/javafx.swing/src/main/java/com/sun/javafx/embed/swing/newimpl/SwingNodeInteropN.java index 41c3fa7803..78359c01fc 100644 --- a/modules/javafx.swing/src/main/java/com/sun/javafx/embed/swing/newimpl/SwingNodeInteropN.java +++ b/modules/javafx.swing/src/main/java/com/sun/javafx/embed/swing/newimpl/SwingNodeInteropN.java @@ -223,6 +223,7 @@ public class SwingNodeInteropN { } public void disposeFrame(Object frame) { + System.out.println("SwingNodeInteropN: disposeFrame"); LightweightFrameWrapper lwFrame = (LightweightFrameWrapper)frame; lwFrame.dispose(); } @@ -232,6 +233,11 @@ public class SwingNodeInteropN { lwFrame.addWindowFocusListener(l); } + public void removeWindowFocusListener(Object frame, WindowFocusListener l) { + LightweightFrameWrapper lwFrame = (LightweightFrameWrapper)frame; + lwFrame.removeWindowFocusListener(l); + } + private static class SwingNodeDisposer implements DisposerRecord { LightweightFrameWrapper lwFrame; diff --git a/modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java b/modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java index 461b1fbae1..5230ad96fe 100644 --- a/modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java +++ b/modules/javafx.swing/src/main/java/javafx/embed/swing/SwingNode.java @@ -360,14 +360,15 @@ public class SwingNode extends Node { */ private void setContentImpl(JComponent content) { if (lwFrame != null) { + swNodeIOP.removeWindowFocusListener(lwFrame, snfListener); swNodeIOP.disposeFrame(lwFrame); + snfListener = null; lwFrame = null; } if (content != null) { lwFrame = swNodeIOP.createLightweightFrame(); - SwingNodeWindowFocusListener snfListener = - new SwingNodeWindowFocusListener(this); + snfListener = new SwingNodeWindowFocusListener(this); swNodeIOP.addWindowFocusListener(lwFrame, snfListener); if (getScene() != null) { @@ -380,7 +381,7 @@ public class SwingNode extends Node { swNodeIOP.setContent(lwFrame, swNodeIOP.createSwingNodeContent(content, this)); swNodeIOP.setVisible(lwFrame, true); - Disposer.addRecord(this, swNodeIOP.createSwingNodeDisposer(lwFrame)); + Disposer.addRecord(swNodeIOP, swNodeIOP.createSwingNodeDisposer(lwFrame)); if (getScene() != null) { notifyNativeHandle(getScene().getWindow()); @@ -563,6 +564,7 @@ public class SwingNode extends Node { } }; + private final ChangeListener windowVisibleListener = (observable, oldValue, newValue) -> { if (!newValue) { disposeLwFrame(); @@ -583,6 +585,7 @@ public class SwingNode extends Node { } }; + private SwingNodeWindowFocusListener snfListener = null; private void removeSceneListeners(Scene scene) { Window window = scene.getWindow(); if (window != null) { @@ -733,11 +736,14 @@ public class SwingNode extends Node { } private void disposeLwFrame() { + System.out.println("disposeLwFrame"); if (lwFrame == null) { return; } SwingNodeHelper.runOnEDT(() -> { if (lwFrame != null) { + swNodeIOP.removeWindowFocusListener(lwFrame, snfListener); + snfListener = null; swNodeIOP.disposeFrame(lwFrame); lwFrame = null; }