Mixer Java3D et Swing

Par Romain Guy (home)
 

Tutoriel d'introduction sur l'utilisation de l'API Java3D avec la librairie graphique Swing.


I. Démonstration avec Java Web Start
II. Explications
III. Téléchargements


I. Démonstration avec Java Web Start

info Prérequis : Pour essayer cette démonstration vous devez disposer de Java Web Start (compris avec le JRE et le JDK).
Vous devez aussi installer Java3D, téléchargeable ici.
./images/java.png Lancez la démonstration

II. Explications

Vous êtes vous jamais demandé comment utiliser de jolis composants 3D avec Swing ? Java3D est la solution. Soit, à première vue, Java3D ne vous permet pas d'intégrer facilement des scènes 3D dans vos UI. Si vous avez vu les videos de démonstration du produit Avalon de Microsoft, vous voyez de quoi je parle. Avalon ne sera pas disponible avant pplusieurs mois, mais Java et Java3D, eux, sont déjà là.

Grâce à une simple astuce, vous pouvez créer des applications Swing stupéfiantes. Voici un exemple :

Capture d'écran numéro 1
AmazonPick (cliquez pour voir l'image)
Notez le dégradé du background, que j'ai mis afin de montrer l'union entre Swing et Java3D. Avant de rentrer dans les détails, regardons ce dont est capable cette application. Je l'ai appelée AmazonPick car elle serait une superbe interface pour une application de recherche de livres. Les livres correspondant à votre recherche seraient affichés sous forme de boutons en bas de la fenêtre (dans cet exemple, les boutons sont codés en dur). Quand vous cliquez sur l'un d'entre eux, le livre en 3D tourne pour montrer la nouvelle couverture sur l'autre face. Du plus bel effet.

Capture d'écran 2
Pour réaliser celà, j'ai simplement créé une texture Java3D sur laquelle j'ai dessiné le background de la fenêtre. Voici le code source, xpanel étant le content pane de la fenêtre et c3d le Canvas3D sur lequel la scène est dessinée :

BufferedImage image = new BufferedImage(xpanel.getWidth(),
                                        xpanel.getHeight(),
                                        BufferedImage.TYPE_INT_RGB);
getContentPane().paint(image.getGraphics());
BufferedImage subImage = new BufferedImage(CANVAS3D_WIDTH,
                                           CANVAS3D_HEIGHT,
                                           BufferedImage.TYPE_INT_RGB);
((Graphics2D) subImage.getGraphics()).drawImage(image, null,
                                                -c3d.getX(), -c3d.getY());
Background bg = new Background(new ImageComponent2D(ImageComponent2D.FORMAT_RGB, subImage));
BoundingSphere bounds = new BoundingSphere();
bounds.setRadius(100.0);
bg.setApplicationBounds(bounds);
BranchGroup objRoot = new BranchGroup();
objRoot.addChild(bg);
Bien que cette astuce soit facile à implémenter, elle requiert qu'une texture du background soit réalisée. Dans notre cas, celà veuut dire que l'on doit d'abord montrer la fenêtre. L'utilisateur verra donc un rectangle gris pendant un instant.

L'utilisation de Java3D a beaucoup d'avantages mais requiert quelques astuces pour fonctionner parfaitement. Un Canvas Java3D est un composant lourd (heavyweight) alors que Swing contient des composants légers (lightweight). Le résultat est que les composants Swing seront dessinés sous le canvas Java3D. Les équipes Swing et Java3D sont au courant de ce problème et il existe une en solution simple.

Avec Java3D 1.3.1 une meilleure solution existe. Vous pouvez utiliser un Canvas3D pour réaliser le rendu offscreen. C'est à dire que vous pouvez faire tout le travail de rendu dans un buffer et dessiner directement le résultat dans un composant Swing (avec un JComponent personnalisé ou une ImageIcon). Naturellement, celà nécessite un peu plus de travail.

Vous pouvez télécharger cette démonstartion et ses sources afin de voir comment réaliser celà. Vos aurez besoin de Java3D 1.3 et J2SE 1.4 (peut-être moins, une version supérieure est bien aussi). Si vous avez seulement J2SE 1.4, vous pouvez changer une ou deux lignes de code dans BooksDemo.java pour vous débarasser des generics et recompiler le tout tranquillement.

Faites moi savoir si vous avez utilisé cette astuce avec succès.


III. Téléchargements



Articles et tutoriels Java
L'essentiel de Java en une heure
L'API java.nio du JDK 1.4
Inversion de contrôle en Java
L'introspection
Le Java Community Process
Conception de tests unitaires avec JUnit
Les Strings se déchaînent
Présentation de SWT
La programmation réseau en Java avec les sockets
Du bon usage de l'héritage et de la composition
Les références et la gestion de la mémoire en Java
Constructeurs et méthodes exportées en Java
Les membres statiques, finaux et non immuables en Java
Les classes et objets immuables en Java
Comprendre et optimiser le Garbage Collector
Les principes de la programmation d'une interface graphique
Les opérateurs binaires en Java
Prenez le contrôle du bureau avec JDIC
Les Java Data Objects (JDO version 1.0.1)
La persistance des données avec Hibernate 2.1.8
Journalisation avec l'API Log4j
Java 5.0 et les types paramétrés
Les annotations de Java 5
Java 1.5 et les types paramétrés
Créer un moteur de recherche avec Lucene
Articles et tutoriels Swing
Threads et performance avec Swing
Rechercher avec style en utilisant Swing
Splash Screen avec Swing et Java3D
Drag & Drop avec style en utilisant Swing
Attendre avec style en utilisant Swing
Mixer Java3D et Swing
Articles et tutoriels Java Web
Redécouvrez le web avec Wicket

Valid XHTML 1.1!Valid CSS!

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 oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Java - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2009 www.developpez.com - Legal informations.