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:
Post a Comment