package iiuf.awt; import java.awt.Image; import java.awt.Toolkit; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Canvas; import java.awt.Color; import java.awt.MediaTracker; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.lang.reflect.InvocationTargetException; import javax.swing.JWindow; /** A splash screen with classloader. (c) 2001, DIUF<p> @author $Author: ohitz $ @version $Name: $ $Revision: 1.1 $ */ public class SplashScreen extends JWindow { static SplashScreen screen; static String infoStr; static int infoX; static int infoY; boolean painted; ImageCanvas imgCanvas; class ImageCanvas extends Canvas { Image img; ImageCanvas(Image img_) throws InterruptedException { img = img_; MediaTracker mt = new MediaTracker(this); mt.addImage(img, 0); mt.waitForAll(); setSize(img.getWidth(this), img.getHeight(this)); } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.drawImage(img, 0, 0, this); g.setColor(Color.black); g.drawRect(getX(), getY(), getWidth() - 1, getHeight() - 1); g.drawRect(getX() + 1, getY() + 1, getWidth() - 3, getHeight() - 3); if(infoStr != null) g.drawString(infoStr, infoX, infoY); synchronized(SplashScreen.this) { painted = true; SplashScreen.this.notify(); } } } void showLoadAndRun(Image img, String cls, String[] argv) throws Exception { Toolkit tk = Toolkit.getDefaultToolkit(); Dimension d = tk.getScreenSize(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { dispose(); System.exit(0); }}); imgCanvas = new ImageCanvas(img); getContentPane().add(imgCanvas); pack(); setLocation((d.width - getWidth()) / 2, (d.height - getHeight()) / 2); setVisible(true); synchronized(this) { if(!painted) wait(); } Class.forName(cls).getMethod("main", new Class[] {String[].class}).invoke(null, new Object[] {argv}); dispose(); } public static void setInfo(String info, int x, int y) { infoStr = info; infoX = x; infoY = y; if(screen != null) screen.imgCanvas.repaint(screen.imgCanvas.getX() + 2, screen.imgCanvas.getY() + 2, screen.imgCanvas.getWidth() - 5, screen.imgCanvas.getHeight() - 5); } protected static void splash(String cls, String img, String[] argv) { screen = new SplashScreen(); try { screen.showLoadAndRun(Toolkit.getDefaultToolkit().createImage(ClassLoader.getSystemResource(img)), cls, argv); } catch(Exception e) { screen.dispose(); e.printStackTrace(); System.exit(1); } } public static void main(String[] argv) { if(argv.length < 2) { System.out.println("usage: " + SplashScreen.class.getName() + " <class to load> <image resource> [args...]"); System.exit(1); } String[] argv2 = new String[argv.length - 2]; System.arraycopy(argv, 2, argv2, 0, argv2.length); splash(argv[0], argv[1], argv2); } } /* $Log: SplashScreen.java,v $ Revision 1.1 2002/07/11 09:20:36 ohitz Initial checkin Revision 1.2 2001/02/27 21:43:36 schubige Switch to new SoundEngine interface Revision 1.1 2001/02/26 16:02:22 schubige Added splash screen */