From 4b5bf7dca9b2824f939ab121ff0d92da126f8953 Mon Sep 17 00:00:00 2001 From: sk89q Date: Thu, 19 Feb 2015 22:11:07 -0800 Subject: [PATCH] Fix memory leak with old launcher window. --- .../launcher/dialog/LauncherFrame.java | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/launcher/src/main/java/com/skcraft/launcher/dialog/LauncherFrame.java b/launcher/src/main/java/com/skcraft/launcher/dialog/LauncherFrame.java index c7b071e..b39c941 100644 --- a/launcher/src/main/java/com/skcraft/launcher/dialog/LauncherFrame.java +++ b/launcher/src/main/java/com/skcraft/launcher/dialog/LauncherFrame.java @@ -28,7 +28,7 @@ import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; -import java.net.URL; +import java.lang.ref.WeakReference; import static com.skcraft.launcher.util.SharedLocale.tr; @@ -324,22 +324,38 @@ public class LauncherFrame extends JFrame { boolean permitUpdate = updateCheck.isSelected(); Instance instance = launcher.getInstances().get(instancesTable.getSelectedRow()); - launcher.getLaunchSupervisor().launch(this, instance, permitUpdate, new LaunchListener() { - @Override - public void instancesUpdated() { - instancesModel.update(); - } + launcher.getLaunchSupervisor().launch(this, instance, permitUpdate, new LaunchListenerImpl(this)); + } - @Override - public void gameStarted() { - dispose(); - } + private static class LaunchListenerImpl implements LaunchListener { + private final WeakReference frameRef; + private final Launcher launcher; - @Override - public void gameClosed() { - new LauncherFrame(launcher).setVisible(true); + private LaunchListenerImpl(LauncherFrame frame) { + this.frameRef = new WeakReference(frame); + this.launcher = frame.launcher; + } + + @Override + public void instancesUpdated() { + LauncherFrame frame = frameRef.get(); + if (frame != null) { + frame.instancesModel.update(); } - }); + } + + @Override + public void gameStarted() { + LauncherFrame frame = frameRef.get(); + if (frame != null) { + frame.dispose(); + } + } + + @Override + public void gameClosed() { + new LauncherFrame(launcher).setVisible(true); + } } }