I. Démonstrations avec Java Web Start

Prérequis : Pour essayer ces démonstrations vous devez disposer de Java Web Start (compris avec le JRE et le JDK).
Pour la seconde, vous devez aussi installer Java3D via l'implémentation fournie par JogAmp, téléchargeable ici.

Image non disponible Lancez la démonstration (Splash screen avec ombre)

Image non disponible Lancez la démonstration (Splash screen avec Java3D)

II. Splash Screen avec ombre

OK, ce n'est pas un effet vraiment innovant, mais j'ai voulu l'implémenter depuis que j'ai découvert la classe java.awt.Robot. Ça m'a pris des années, mais finalement je l'ai fait :). Quoi qu'il en soit, la classe ShadowedWindow vous permet d'afficher un splash screen avec une ombre derrière lui. L'astuce, comme vous le savez peut-être, est de capturer une partie de l'écran avec la classe Robot et de dessiner le splash screen par-dessus cette capture. Cette façon de faire est très efficace et facile à implémenter, mais vous ne pouvez pas l'utiliser si votre splash screen doit rester longtemps à l'écran. Après que le « screenshot » soit fait, le splash ne peut pas refléter les changements qui arrivent derrière lui.

Image non disponible

Ce n'est qu'un premier essai, je suis toujours en train de jouer avec la distance, l'opacité, la transparence et la forme de l'ombre. L'ombre montrée ici est à 4 pixels du splash, avec une transparence de 30% et utilise une forme rectangulaire. J'ai essayé avec un rectangle aux coins arrondi, le résultat semble un peu meilleur (voir ci-dessous). Si je finis par rajouter ceci à SwingFX, je permettrais au développeur de configurer toutes ses propriétés. :)

Image non disponible

III. Splash Screen avec Java3D

Je viens de vous montrer comment créer un splash screen personnalisé en créant une ombre sur le bureau. Je vous ai aussi montré, dans une de mes premières démos, comment intégrer étroitement Swing et Java3D. Maintenant, j'ai décidé de combiner ces deux astuces afin de créer un splash screen 3D animé surprenant :

Image non disponible

Voici le code source de ce nouveau composant :

 
Sélectionnez
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
public class SplashScreen3D extends JWindow {
    public SplashScreen3D(BranchGroup scene, int width, int height) {
        setSize(new Dimension(width, height));
        createCanvas3D(scene);
    }
    protected void createCanvas3D(BranchGroup scene) {
        Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        canvas3D.setSize(getWidth(), getHeight());
        BufferedImage backgroundImage = createBackground();
        if (backgroundImage != null) {
            Background background = new Background(
                  new ImageComponent2D(ImageComponent2D.FORMAT_RGB,
                                       backgroundImage));
            BoundingSphere bounds = new BoundingSphere();
            bounds.setRadius(100.0);
            background.setApplicationBounds(bounds);
            scene.addChild(background);
        }
        SimpleUniverse universe = new SimpleUniverse(canvas3D);
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph(scene);
        View view = universe.getViewer().getView();
        view.setSceneAntialiasingEnable(true);
        getContentPane().add(canvas3D);
    }
    protected BufferedImage createBackground() {
        setLocationRelativeTo(null);
        Rectangle windowRect = getBounds();
        try {
            Robot robot = new Robot(getGraphicsConfiguration().getDevice());
            BufferedImage capture = robot.createScreenCapture(
                                      new Rectangle(windowRect.x,
                                                    windowRect.y,
                                                    windowRect.width,
                                                    windowRect.height));
            return capture;
        } catch (AWTException e) { }
        return null;
    }
}

IV. Téléchargements