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