Splash Screen avec Swing et Java3D

Romain Guy

Deux démonstrations de Splash Screens avec Swing et Java3D ♪

- Titre : Splash Screen avec Swing et Java3D

- Auteur : Romain Guy

- Parution : 16 janvier 2013

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Romain Guy. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Démonstrations avec Java Web Start

- II. Splash Screen avec ombre

- III. Splash Screen avec Java3D

- IV. Téléchargements

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.

Lancez la démonstration (Splash screen avec ombre)

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.

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 arrondis, 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. :)

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 :

Voici le code source de ce nouveau composant :

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

Version PDF

Version HTML/ZIP

Code source (Splash Screen avec ombre)

Code source (Splash Screen avec Java3D)