content: package rabbitescape.ui.swing;
  
  import rabbitescape.engine.config.Config;
  import rabbitescape.render.BitmapCache;
  
  public class SwingGameInit implements Runnable
  {
      public class WaitForUi
      {
          private synchronized void notifyUiReady()
          {
              assert whenUiReady != null;
              notify();
          }
  
          public synchronized WhenUiReady waitForUi()
          {
              while ( whenUiReady == null )
              {
                  //noinspection EmptyCatchBlock
                  try
                  {
                      synchronized( this )
                      {
                          wait();
                      }
                  }
                  catch ( InterruptedException e )
                  {
                  }
              }
  
              return whenUiReady;
          }
      }
  
      /**
       * Stuff we have made by the time we notify that the UI is ready
       */
      public static class WhenUiReady
      {
          public final GameUi jframe;
          public final BitmapCache<SwingBitmap> bitmapCache;
  
          public WhenUiReady(
              GameUi jframe, BitmapCache<SwingBitmap> bitmapCache )
          {
              this.jframe = jframe;
              this.bitmapCache = bitmapCache;
          }
      }
  
      public final WaitForUi waitForUi = new WaitForUi();
      private WhenUiReady whenUiReady = null;
  
      private final BitmapCache<SwingBitmap> bitmapCache;
      private final Config uiConfig;
      public final MainJFrame frame;
      private final MenuUi menuUi;
  
      public SwingGameInit(
          BitmapCache<SwingBitmap> bitmapCache,
          Config uiConfig,
          MainJFrame frame,
          MenuUi menuUi
      )
      {
          this.bitmapCache = bitmapCache;
          this.uiConfig = uiConfig;
          this.frame = frame;
          this.menuUi = menuUi;
      }
  
      @Override
      public void run()
      {
          //noinspection UnnecessaryLocalVariable
          GameUi jframe = new GameUi( uiConfig, bitmapCache, frame, menuUi );
  
          // Populate the cache with images in a worker thread?
  
          this.whenUiReady = new WhenUiReady( jframe, bitmapCache );
  
          waitForUi.notifyUiReady();
      }
  }
  