gui: code cleanup
authorNiki Roo <niki@nikiroo.be>
Thu, 21 Mar 2019 16:20:50 +0000 (17:20 +0100)
committerNiki Roo <niki@nikiroo.be>
Thu, 21 Mar 2019 16:20:50 +0000 (17:20 +0100)
src/be/nikiroo/fanfix/reader/ui/GuiReader.java

index 9f2fd3dad1056c6ba4635a70856e2983f330fad0..55701b1ad7b727d94470c449c368569e2aac3c5f 100644 (file)
@@ -9,6 +9,7 @@ import java.io.IOException;
 import java.net.URISyntaxException;
 
 import javax.swing.JEditorPane;
+import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.event.HyperlinkEvent;
@@ -109,7 +110,6 @@ class GuiReader extends BasicReader {
                // TODO: improve presentation of update message
                final VersionCheck updates = VersionCheck.check();
                StringBuilder builder = new StringBuilder();
-               final Boolean[] done = new Boolean[] { false };
 
                final JEditorPane updateMessage = new JEditorPane("text/html", "");
                if (updates.isNewVersionAvailable()) {
@@ -168,29 +168,12 @@ class GuiReader extends BasicReader {
                                try {
                                        GuiReaderFrame gui = new GuiReaderFrame(GuiReader.this,
                                                        typeFinal);
-                                       gui.addWindowListener(new WindowAdapter() {
-                                               @Override
-                                               public void windowClosing(WindowEvent e) {
-                                                       super.windowClosing(e);
-                                                       done[0] = true;
-                                               }
-                                       });
-
-                                       gui.setVisible(true);
+                                       sync(gui);
                                } catch (Exception e) {
                                        Instance.getTraceHandler().error(e);
-                                       done[0] = true;
                                }
                        }
                });
-
-               // This action must be synchronous, so wait until the frame is closed
-               while (!done[0]) {
-                       try {
-                               Thread.sleep(100);
-                       } catch (InterruptedException e) {
-                       }
-               }
        }
 
        @Override
@@ -327,4 +310,47 @@ class GuiReader extends BasicReader {
                        Instance.getTraceHandler().error(e);
                }
        }
+
+       /**
+        * Start a frame and wait until it is closed before returning.
+        * 
+        * @param frame
+        *            the frame to start
+        */
+       static private void sync(final JFrame frame) {
+               final Boolean[] done = new Boolean[1];
+               done[0] = false;
+
+               try {
+                       EventQueue.invokeLater(new Runnable() {
+                               @Override
+                               public void run() {
+                                       try {
+                                               frame.addWindowListener(new WindowAdapter() {
+                                                       @Override
+                                                       public void windowClosing(WindowEvent e) {
+                                                               super.windowClosing(e);
+                                                               done[0] = true;
+                                                       }
+                                               });
+
+                                               frame.setVisible(true);
+                                       } catch (Exception e) {
+                                               done[0] = true;
+                                       }
+                               }
+                       });
+               } catch (Exception e) {
+                       Instance.getTraceHandler().error(e);
+                       done[0] = true;
+               }
+
+               // This action must be synchronous, so wait until the frame is closed
+               while (!done[0]) {
+                       try {
+                               Thread.sleep(100);
+                       } catch (InterruptedException e) {
+                       }
+               }
+       }
 }