Monday, May 07, 2007

How to make a Splash Screen

Theres no doubting that using Java Swing is time consuming on load times. So heres a demo splash screen to keep your users captivated.

You will need two classes for this example

i.e. Splash.java and SplashWindow.java

(remember line: 8 change this to match your splash image)

just change the class name to match your entry class and bobs your uncle.

Splash.java

import java.awt.Frame;
import java.awt.Toolkit;
import java.net.URL;

public class Splash {
    public static void main(String[] args) {
        Frame splashFrame = null;
        URL imageURL = Splash.class.getResource("img.png");
        if (imageURL != null) {
            splashFrame = SplashWindow.splash(
            Toolkit.getDefaultToolkit().createImage(imageURL) );
        } else {
            System.err.println("Splash image not found");
        }
        try { // Change the class name to match your entry class
            Class.forName("MainApp").getMethod("main", new Class[]
        {String[].class}).invoke(null, new Object[] {args});
        } catch (Throwable e) {
            e.printStackTrace();
            System.err.flush();
            System.exit(10);
        }
        if (splashFrame != null) {
            splashFrame.dispose();
        }
    }
}
SplashWindow.java
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.Window;

public class SplashWindow extends Window {
    private static final long serialVersionUID = 1L;
    private Image splashImage;
    private boolean paintCalled = false;

    public SplashWindow(Frame owner, Image splashImage) {
        super(owner);
        this.splashImage = splashImage;
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(splashImage,0);
        try {
            mt.waitForID(0);
        } catch(InterruptedException ie) {}
        int imgWidth = splashImage.getWidth(this);
        int imgHeight = splashImage.getHeight(this);
        setSize(imgWidth, imgHeight);
        Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation( (screenDim.width - imgWidth) / 2,
        (screenDim.height - imgHeight) / 2 );
    }

    @Override
    public void update(Graphics g) {
        g.setColor(getForeground());
        paint(g);
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(splashImage, 0, 0, this);
        if (! paintCalled) {
            paintCalled = true;
            synchronized (this) { notifyAll(); }
        }
    }

    @SuppressWarnings("deprecation")
    public static Frame splash(Image splashImage) {
        Frame f = new Frame();
        SplashWindow w = new SplashWindow(f, splashImage);
        w.toFront();
        w.show();
        if (! EventQueue.isDispatchThread()) {
            synchronized (w) {
            while (! w.paintCalled) {
                try {
                    w.wait();
                } catch (InterruptedException e) {}
                }
            }
        }
        return f;
    }
}

0 comments:

 
Blogger Template Layout Design by [ METAMUSE ] : Code Name Gadget 1.1 Power By freecode-frecode.blogger.com & blogger.com Programming Blogs - BlogCatalog Blog Directory