// display a splash screen during program load.
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;

import javax.swing.JWindow;
import javax.swing.Timer;

/**
 * Splash screen shown during program load.
 * To use it, just use new Splash() early in program load.
 */
public class Splash extends JWindow
   {
   // splash image to display
   static final String SPLASH_IMAGE = "splash.png";

   // how long to display the splash in milliseconds
   static final int SPLASH_TIME = 10000;

   /**
    * constructor
    */
   Splash()
      {
      // get Image as a resource, from jar or from classpath
      URL url = this.getClass().getResource( SPLASH_IMAGE );
      Image image = Toolkit.getDefaultToolkit().getImage( url );

      // see http://mindprod.com/jgloss/image.html for ImageViewer source
      ImageViewer imageViewer = new ImageViewer( image );
      this.getContentPane().add( imageViewer, BorderLayout.CENTER );

      // Allow user to close splash window with just a click
      // A fancier version would also also support programmatic stop.
      this.addMouseListener(new MouseAdapter()
                               {
                               public void mousePressed( MouseEvent e )
                                  {
                                  setVisible( false );
                                  dispose();
                                  }
                               });

      this.pack();
      this.setLocation( 150, 150 );
      this.setVisible( true );

      final ActionListener splashCloser = new ActionListener()
         {
         public void actionPerformed( ActionEvent evt )
            {
            // shutdown Splash
            setVisible( false );
            dispose();
            }
         };
      Timer splashTimer =  new Timer( SPLASH_TIME, splashCloser );
      splashTimer.setRepeats( false );
      splashTimer.start();
      }
   } // end class Splash.