So, nachdem schon ein paar mal nach dem SplashScrenn gesucht worden ist und es eigentlich hier eine gute Anleitung dazu gibt, habe ich das ganze etwas gepackt und aus 2 Klassen 1 Klasse gemacht.
Dann habe ich noch ein paar Fehlerabfragen eingebaut und ein Defaultbild gemacht.
Der Code ist eigentlich leicht zu verstehen und wo man ihn ändern kann/muss sag ich gleich nebenbei:
Code:
Weiter mit dem Code
Code Ende
Hier sind auf ein paar Dinge zu achten (fett gekennzeichnet):
1. der try/catch Block ist nur dann notwendig, wenn man es mit new File("/home/splash.JPG").toURL(); macht
2. die if Abfrage mit dem exists(), funktioniert nur dann, wenn man die Datei mit new File() holt (sonst könnte es zu Fehlern in der relativen Pfadangabe kommen!)
3. Beispiele:
Sagt man das Bild ist eine Datei, dann kommt dieser Code:
Sagt man aber, dass das Bild aus den Resourcen geladen werden soll, so kommt dies
So und nun muss man dem SplashLoader noch sagen, welche Klasse er zu laden hat und dies geschieht hier:
Statt MyApp einfach deine Hauptklasse mit dem "eigentlichen" main reinschreiben.
Falls du Packages hast, dann einfach den Packagenamen.Hauptklasse reinschreiben.
Bsp.:
Oder mit Packages
So hoffe das keine Fragen offen bleiben und das nirgends Fehler geliefert werden (bei mir funktionierts )
Dann habe ich noch ein paar Fehlerabfragen eingebaut und ein Defaultbild gemacht.
Der Code ist eigentlich leicht zu verstehen und wo man ihn ändern kann/muss sag ich gleich nebenbei:
Code:
Code:
import java.awt.Window;
import java.awt.Image;
import java.awt.Frame;
import java.awt.MediaTracker;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.EventQueue;
import java.net.URL;
import java.io.File;
import java.net.MalformedURLException;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
public class SplashLoader extends Window
{
private boolean paintCalled = false; //ob paint Methode schon ausgeführt worden ist
private Image splashImage; //Das Bild
/***************************************************************************
* Standardkonstruktor der Defaultklasse
* @param owner owner
* @param splashImage image
*************************************************************************/
public SplashLoader(Frame owner, Image splashImage)
{
super(owner);
if(splashImage != null) //wenn es nicht null ist
this.splashImage = splashImage;
else //wenn es null ist, erstelle dir selbst ein bild
{
BufferedImage bfImage = new BufferedImage(100,100,1);
Graphics g = bfImage.getGraphics(); //holt Graphics
g.setColor(java.awt.Color.RED); //setzt Farbe auf Rot
g.drawLine(0,0,100,100); //zeichnet linie von links oben nach rechts unten
g.drawLine(0,99,99,0); //zeichnet linie von rechts obne nach links unten
splashImage = bfImage;
this.splashImage = bfImage; //speichert das Image ab
}
// Load the image
MediaTracker mt = new MediaTracker(this);
mt.addImage(splashImage,0);
try {
mt.waitForID(0);
} catch(InterruptedException ex)
{
ex.printStackTrace();
}
//setzt die Größe
setSize(splashImage.getWidth(this), splashImage.getHeight(this));
setLocationRelativeTo(null); //zentriert das Bild/Frame
//MausAdapter hinzugefügt, sodass wenn man auf das Bild klickt das Bild verschwindet
MouseAdapter disposeOnClick = new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
// Note: To avoid that method splash hangs, we
// must set paintCalled to true and call notifyAll.
// This is necessary because the mouse click may
// occur before the contents of the window
// has been painted.
synchronized (SplashLoader.this)
{
SplashLoader.this.paintCalled = true;
SplashLoader.this.notifyAll();
}
dispose(); //Frame disablen
}
};
addMouseListener(disposeOnClick); //hängt den Mauslistener dazu
}
Hier konstruiere ich das Defaultbild, falls ein falscher Pfad gesetzt wurde oder das Bild nicht existiert!else //wenn es null ist, erstelle dir selbst ein bild
{
BufferedImage bfImage = new BufferedImage(100,100,1);
Weiter mit dem Code
Code:
/**************************************************************************
* Update Mehtode fürs Zeichnen
* @param g Graphics
*************************************************************************/
public void update(Graphics g) {
// Note: Since the paint method is going to draw an
// image that covers the complete area of the component we
// do not fill the component with its background color
// here. This avoids flickering.
g.setColor(getForeground());
paint(g);
}
/**************************************************************************
* Zeichnet das Fenster/Image
* @param g Graphics
*************************************************************************/
public void paint(Graphics g) {
g.drawImage(splashImage, 0, 0, this); //zeichnet da Bild auf 0,0 Koordinate
// Notify method splash that the window
// has been painted.
if (! paintCalled)
{
paintCalled = true;
synchronized (this) { notifyAll();
}
}
}
/**************************************************************************
* Erzeugt das SplashImage
* @param splashImage image
* @return Frame
*************************************************************************/
public static Frame splash(Image splashImage)
{
Frame f = new Frame();
SplashLoader w = new SplashLoader(f, splashImage);
// Show the window.
w.toFront(); //setzt es nach vorne
w.show(); //zeigt es an
// Note: To make sure the user gets a chance to see the
// splash window we wait until its paint method has been
// called at least once by the AWT event dispatcher thread.
if (! EventQueue.isDispatchThread()) {
synchronized (w) {
while (! w.paintCalled) {
try {
w.wait();
} catch (InterruptedException e) {}
}
}
}
return f; //Frame zurückgeben
}
/**************************************************************************
* Main Methode des SplasLoaders
* @param args Argumente
*************************************************************************/
public static void main(String[] args)
{
//holt sich das Image und ruft
Frame splashFrame = null;
URL imageURL = null;
try
{
imageURL = SplashLoader.class.getResource("splash.gif"); //entweder aus der Klasse laden
imageURL = new File("C:\\splash.JPG").toURL(); //oder mit direkter Angabe, oder
}
catch (MalformedURLException ex)
{
ex.printStackTrace();
}
//wenn die angegebene Datei nicht existiert oder ImageUrl null ist
if(!new File(imageURL.getFile()).exists() || imageURL == null)
{
try
{
splashFrame = splash(null); //Lädt es mit dem DefaultIcon
throw new FileNotFoundException("Fehler beim Laden von " +
imageURL.getFile() +
" !!\nDefaultbild wird geladen!!");
}
catch (FileNotFoundException ex)
{
ex.printStackTrace();
}
}
else if (imageURL != null) //wenn es nicht null ist
splashFrame = splash(Toolkit.getDefaultToolkit().createImage(imageURL));
// Call the main method of the application using Reflection
// --------------------------------------------------------
try {
//sucht sich die Klasse raus und danach das main und lädt es mit den Argumenten
Class.forName("MyApp").getMethod("main", new Class[] {String[].class})
.invoke(null, new Object[] {args});
//statt MyApp einfach eure alte Hauptklasse reinmachen
} catch (Exception ex) //hier werden viele Exceptions geworfen
{
ex.printStackTrace();
System.exit(10); //mit ErrCode beenden
}
//Nachdem es fertig geladen ist, das LadeBild nicht mehr anzeigen
// Dispose the splash screen
// -------------------------
if (splashFrame != null)
splashFrame.dispose();
}
}
Code Ende
try
{
imageURL = SplashLoader.class.getResource("splash.gif"); //entweder aus der Klasse laden
imageURL = new File("/home/splash.JPG").toURL(); //oder mit direkter Angabe, oder
}
catch (MalformedURLException ex)
{
ex.printStackTrace();
}
//wenn die angegebene Datei nicht existiert oder ImageUrl null ist
if(!new File(imageURL.getFile()).exists() || imageURL == null)
{
Hier sind auf ein paar Dinge zu achten (fett gekennzeichnet):
1. der try/catch Block ist nur dann notwendig, wenn man es mit new File("/home/splash.JPG").toURL(); macht
2. die if Abfrage mit dem exists(), funktioniert nur dann, wenn man die Datei mit new File() holt (sonst könnte es zu Fehlern in der relativen Pfadangabe kommen!)
3. Beispiele:
Sagt man das Bild ist eine Datei, dann kommt dieser Code:
Code:
try
{
imageURL = new File("/home/splash.JPG").toURL(); //oder mit direkter Angabe, oder
}
catch (MalformedURLException ex)
{
ex.printStackTrace();
}
//wenn die angegebene Datei nicht existiert oder ImageUrl null ist
if(!new File(imageURL.getFile()).exists() || imageURL == null)
{ .......
Sagt man aber, dass das Bild aus den Resourcen geladen werden soll, so kommt dies
Code:
imageURL = SplashLoader.class.getResource("splash.gif"); //entweder aus der Klasse laden
if(imageURL == null)
{ ....
So und nun muss man dem SplashLoader noch sagen, welche Klasse er zu laden hat und dies geschieht hier:
// Call the main method of the application using Reflection
// --------------------------------------------------------
try {
//sucht sich die Klasse raus und danach das main und lädt es mit den Argumenten
Class.forName("MyApp").getMethod("main", new Class[] {String[].class})
.invoke(null, new Object[] {args});
//statt MyApp einfach eure alte Hauptklasse reinmachen
Statt MyApp einfach deine Hauptklasse mit dem "eigentlichen" main reinschreiben.
Falls du Packages hast, dann einfach den Packagenamen.Hauptklasse reinschreiben.
Bsp.:
Code:
try {
//sucht sich die Klasse raus und danach das main und lädt es mit den Argumenten
Class.forName("ServCtrl").getMethod("main", new Class[] {String[].class})
.invoke(null, new Object[] {args});
Oder mit Packages
Code:
try {
//sucht sich die Klasse raus und danach das main und lädt es mit den Argumenten
Class.forName("at.dstore.LoginProc").getMethod("main", new Class[] {String[].class})
.invoke(null, new Object[] {args});
So hoffe das keine Fragen offen bleiben und das nirgends Fehler geliefert werden (bei mir funktionierts )