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.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 @@ 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); + } } }