From 107ae1009f2e4e1b34b2a7c56d8cd47ba8de5093 Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Mon, 21 May 2012 10:45:07 +0000 Subject: [PATCH] Bugfix: Race condition at startup, resulting in "Cannot instantiate SplashFrame" error. --- src/main/java/forge/control/FControl.java | 3 +- src/main/java/forge/gui/toolbox/FSkin.java | 4 ++- src/main/java/forge/view/FView.java | 9 +----- src/main/java/forge/view/Main.java | 32 +++++++++++++--------- src/main/java/forge/view/SplashFrame.java | 4 +-- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 33f37631c53..ab70d685cc1 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -92,6 +92,8 @@ public enum FControl { public void windowClosing(final WindowEvent e) { Singletons.getView().getFrame().setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE); + + System.exit(0); } }; @@ -131,7 +133,6 @@ public enum FControl { FView.SINGLETON_INSTANCE.getLpnDocument().addMouseListener(SOverflowUtil.getHideOverflowListener()); FView.SINGLETON_INSTANCE.getLpnDocument().addComponentListener(SResizingUtil.getWindowResizeListener()); - Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); } /** After view and model have been initialized, control can start. */ diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java index 41134208c77..7345eb0153a 100644 --- a/src/main/java/forge/gui/toolbox/FSkin.java +++ b/src/main/java/forge/gui/toolbox/FSkin.java @@ -2,7 +2,9 @@ * Forge: Play Magic: the Gathering. * Copyright (C) 2011 Forge Team * - * This program is free software: you can redistribute it and/or modify + * +import forge.view.SplashFrame; + This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. diff --git a/src/main/java/forge/view/FView.java b/src/main/java/forge/view/FView.java index b774d2ae2c0..a20b2d08174 100644 --- a/src/main/java/forge/view/FView.java +++ b/src/main/java/forge/view/FView.java @@ -11,7 +11,6 @@ import java.util.List; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; -import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; @@ -49,13 +48,7 @@ public enum FView { // private FView() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - try { splash = new SplashFrame(); } - catch (Exception e) { e.printStackTrace(); } - } - }); + splash = new SplashFrame(); } /** */ diff --git a/src/main/java/forge/view/Main.java b/src/main/java/forge/view/Main.java index 48ec3ac5c21..0e88c1772cc 100644 --- a/src/main/java/forge/view/Main.java +++ b/src/main/java/forge/view/Main.java @@ -21,7 +21,6 @@ import javax.swing.SwingUtilities; import forge.Singletons; import forge.control.FControl; -import forge.error.ErrorViewer; import forge.error.ExceptionHandler; import forge.model.FModel; @@ -45,20 +44,27 @@ public final class Main { */ public static void main(final String[] args) { ExceptionHandler.registerErrorHandling(); + + Singletons.setModel(FModel.SINGLETON_INSTANCE); + try { - Singletons.setModel(FModel.SINGLETON_INSTANCE); - Singletons.setView(FView.SINGLETON_INSTANCE); - Singletons.setControl(FControl.SINGLETON_INSTANCE); - - // Use splash frame to initialize everything, then transition to core UI. - Singletons.getControl().initialize(); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { Singletons.getView().initialize(); } }); - - } catch (final Throwable exn) { - ErrorViewer.showError(exn); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + Singletons.setView(FView.SINGLETON_INSTANCE); + } + }); + } catch (Exception e) { + e.printStackTrace(); } + + Singletons.setControl(FControl.SINGLETON_INSTANCE); + + // Use splash frame to initialize everything, then transition to core UI. + Singletons.getControl().initialize(); + + SwingUtilities.invokeLater(new Runnable() { @Override + public void run() { Singletons.getView().initialize(); } }); } /** @throws Throwable */ diff --git a/src/main/java/forge/view/SplashFrame.java b/src/main/java/forge/view/SplashFrame.java index 35eb2d8c0a1..7be6fa640d4 100644 --- a/src/main/java/forge/view/SplashFrame.java +++ b/src/main/java/forge/view/SplashFrame.java @@ -63,10 +63,8 @@ public class SplashFrame extends JFrame { * Create the frame; this must be called from an event * dispatch thread. * - * @throws Exception {@link IllegalStateException} if not called from an - * event dispatch thread. */ - public SplashFrame() throws Exception { + public SplashFrame() { super(); if (!SwingUtilities.isEventDispatchThread()) {