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.
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;
}
}





