Hi,
jede halbwegs reale Application hat heutzutage einen Splashscreen. Ich habe heute nacht mal einen Splashscreen geschrieben der sich einblendet und wieder ausblendet. Hierbei kann man die Zeit die benötigt wird angeben. Das ganze ist bis jetzt nur auf einem Desktop mit 32 Bit farbtiefe getestet, sollte unter Linux (meist nur 24 bit) etc aber laufen denke ich. Evtl hat ja jemand daran interresse. Ich habe das ganze mit einem .png bild getestet, jedes andere bildformat sollte ebenfalls funktionieren, aber gerade png’s oder gif bilder sind interresant da der desktop hintergrund weiterhin durchscheint.
Die Klasse SplashScreen braucht im Konstruktor einfach den relativen pfad zu dem Bild welches eingeblendet werden soll. Bei mir hier liegt das bild im resourcen verzeichniss unter „de/nicedezigns/musicbox/gui/resources/logo_big.png“.
Für das eigendliche zeichnen des Splashscreen benutze ich einfach ein JLabel welches das aktuelle Bild kennt und dieses zeichnet. bei der übergabe des Bildes an das JLabel wird auch immer dessen grösse gesetzt sonst würde man das JLabel nicht sehen da es sonst eine grösse von 0,0 pixeln hätte was eher schlecht wäre
Falls ihr das ganze nutzen wollt solltet ihr es folgendermassen anwenden:
``` public MeineApplication()
{
SplashScreen splashScreen = null;
try
{
splashScreen = new SplashScreen("de/nicedezigns/musicbox/gui/resources/logo_big.png");
}
catch(Exception e)
{
e.printStackTrace();
}
// hier startet ihr eure Application
doSomething();
// Die Application ist bereit zum anzeigen, also Splashscreen ausblenden
splashScreen.blendOut();
// Zeige Application
setVisible(true);
}```
…hier aus eclipse herausgestartet sieht man den Editor durscheinen.
Anbei die beiden Klassen die ihr braucht:
import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
/**
* <p>
* Title: SplashScreen
* </p>
* <p>
* Description: Animated Splashscreen
* </p>
* <p>
* Copyright: Copyright (c) 2006
* </p>
* <p>
* Company: Nice Dezigns
* </p>
*
* @author Jens Hohl
* @date 05.08.2006
* @time 01:14:25
*/
public class SplashScreen implements ActionListener
{
// desktop
private final BufferedImage background;
// Your logo
private final BufferedImage image;
// actual image
private BufferedImage currentImage;
private SplashPainter label;
private final int speed = 1000 / 20;
/**
* Duration in Time Mills
*/
private float duration = 3000.0f;
private long startTime = 0;
private boolean isBlendIn = true;
private final Timer timer;
public SplashScreen(String path) throws IOException, AWTException
{
final URL url = this.getClass().getClassLoader().getResource(path);
image = ImageIO.read(url);
currentImage = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(image.getWidth(null), image.getHeight(null));
final Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
final int x = (int) (screenDimension.getWidth() / 2 - image.getWidth(null) / 2);
final int y = (int) (screenDimension.getHeight() / 2 - image.getHeight(null) / 2);
final int w = image.getWidth(null);
final int h = image.getHeight(null);
final Robot robot = new Robot();
final Rectangle rectangle = new Rectangle(x, y, w, h);
background = robot.createScreenCapture(rectangle);
drawImage(0f);
label = new SplashPainter();
label.setImage(background);
final JWindow f = new JWindow(new JFrame());
f.getContentPane().add(label);
f.pack();
f.setLocationRelativeTo(null);
timer = new Timer(speed, this);
timer.setCoalesce(true);
timer.start();
startTime = System.currentTimeMillis();
f.setVisible(true);
}
public void blendOut()
{
isBlendIn = false;
startTime = System.currentTimeMillis();
timer.start();
}
public void actionPerformed(ActionEvent e)
{
float percent;
if (isBlendIn)
{
percent = (System.currentTimeMillis() - startTime) / duration;
percent = Math.min(1.0f, percent);
}
else
{
percent = (System.currentTimeMillis() - startTime) / duration;
percent = Math.min(1.0f, percent);
percent = 1.0f - percent;
}
float alphaValue = percent;
if (percent >= 1.0)
{
timer.stop();
// blendOut(); // Einkommentieren damit die animation sofort wieder
// ausgeblendet wird
}
else if (alphaValue <= 0.0f)
{
timer.stop();
SwingUtilities.getWindowAncestor(label).dispose();
}
drawImage(alphaValue);
label.setImage(currentImage);
label.repaint();
}
/**
* Draws Background, then draws image over it
*
* @param alphaValue
*/
private void drawImage(float alphaValue)
{
final Graphics2D g2d = (Graphics2D) currentImage.getGraphics();
g2d.drawImage(background, 0, 0, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alphaValue));
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
}
public static void main(String[] args) throws Exception
{
new SplashScreen("de/nicedezigns/musicbox/gui/resources/logo_big.png");
}
}
Und das JLabel:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JLabel;
/**
* <p>
* Title: SplashPainter
* </p>
* <p>
* Description: Displays Spashimage
* </p>
* <p>
* Copyright: Copyright (c) 2006
* </p>
* <p>
* Company: Nice Dezigns
* </p>
*
* @author Jens Hohl
* @date 05.08.2006
* @time 03:36:39
*/
public class SplashPainter
extends JLabel
{
private Image image;
public void setImage(Image image)
{
this.image = image;
setPreferredSize(new Dimension(image.getWidth(null),image.getHeight(null)));
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponents(g);
g.drawImage(image,0,0,this);
}
}
Den code könnt ihr frei verwenden, ohne anspruch auf korrektheit. Verbesserungsvorschläge sind jederzeit willkommen.
mfg,
Jens