
FAQ JavaFXConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 507, derni�re mise � jour : 2 novembre 2016 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur le forum JavaFX de http://java.developpez.com ainsi que l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
9.15.1.1. Inclure SceneGraph dans Swing (3)
9.15.1.2. Inclure Swing dans SceneGraph (4)
- Comment tester si l'int�gration avec Swing est support�e sur ma plateforme ?
- Comment convertir une image Swing en image JavaFX ?
- Comment convertir une image JavaFX en image Swing ?
- Comment sauvegarder une image dans un fichier ?
- Est-ce que les composants Swing peuvent recevoir des �v�nements tactiles de JavaFX ?
- Est-il possible d'utiliser Java2D dans SceneGraph ?
Pour tester si l'int�gration avec Swing est support�e par votre plateforme, vous pouvez invoquer la m�thode isSupported() de la classe javafx.application.Platform en lui passant en param�tre la valeur javafx.application.ConditionalFeature.SWING :
Code Java : | S�lectionner tout |
Platform.isSupported(ConditionalFeature.SWING);
Note : lorsqu'il retourne true, ce test indique que l�int�gration est possible, mais aussi que les runtimes de Swing sont bien pr�sents sur la plateforme.
Cette conversion peut se faire en invoquant la m�thode statique toFXImage() de la classe utilitaire javafx.embed.swing.SwingFXUtils.
Code Java : | S�lectionner tout |
final WritableImage imageFX = SwingFXUtils.toFXImage(imageSwing, null);
Le second param�tre de la m�thode peut �tre une instance de WritableImage pr�allou�e qui recevra le contenu de l'image source. Quand la valeur pass�e est null, une nouvelle image aux dimensions appropri�es est cr��e.
Cette conversion peut se faire en invoquant la m�thode statique fromFXImage() de la classe utilitaire javafx.embed.swing.SwingFXUtils.
Code Java : | S�lectionner tout |
final BufferedImage imageSwing = SwingFXUtils.fromFXImage(imageFX, null);
Le second param�tre de la m�thode peut �tre une instance de BufferedImage pr�allou�e qui recevra le contenu de l'image source. Quand la valeur pass�e est null, une nouvelle image aux dimensions appropri�es est cr��e.
� l'heure actuelle (JDK8_u20), pour sauvegarder une Image JavaFX sur le disque dur, vous devez tout d'abord la convertir en BufferedImage de Swing pour ensuite la sauvegarder en invoquant ImageIO.
Code Java : | S�lectionner tout |
1 2 | final BufferedImage imageSwing = SwingFXUtils.fromFXImage(imageFX, null); ImageIO.write(imageSwing, "png", fichierDestination); |
Non, Swing n'a jamais �t� con�u pour recevoir des �v�nements tactiles. Int�grer des composants Swing dans une IU JavaFX ou des contr�les JavaFX dans une IU Swing n'est pas suffisant pour que les composants Swing puissent r�agir correctement aux �v�nements tactiles. La gestion monopoint peut �tre simul�e par les �v�nements souris, mais pour prendre en charge la gestion multipoint, il faut continuer � utiliser des biblioth�ques tierces.
Oui, c'est possible. Object Refinery Limited, la compagnie qui �dite la biblioth�que de graphes statistiques JFreeChart pour Swing a publi� en OpenSource la biblioth�que FXGraphics2D (sous licence BSD). Cette biblioth�que permet de recevoir des appels Java2D et de convertir l'affichage sur un Canvas JavaFX. Cela permet d'utiliser avec JavaFX des biblioth�ques tierces qui reposent sur Java2D telles que Batik, iText, JFreeSVG, JFreeChart, JGraphX, JLaTeXMath et plein d'autres encore�
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | public class Main extends Application { @Override public void start(Stage primaryStage) { final Canvas canvas = new Canvas() { private final FXGraphics2D g2d; { g2d = new FXGraphics2D(getGraphicsContext2D()); widthProperty().addListener(observable -> draw()); heightProperty().addListener(observable -> draw()); } private void draw() { final double width = getWidth(); final double height = getHeight(); // Nettoyage de la surface avant dessin. getGraphicsContext2D().clearRect(0, 0, width, height); // Dessin en Java2D ! g2d.setColor(java.awt.Color.RED); g2d.setStroke(new java.awt.BasicStroke(5)); g2d.drawLine(0, 0, (int) width, (int) height); // g2d.setColor(java.awt.Color.BLUE); g2d.fillRect(50, 50, (int) (width - 100), (int) (height - 100)); // final java.awt.geom.Ellipse2D ellipse = new java.awt.geom.Ellipse2D.Double(75, 75, (int) (width - 150), (int) (height - 150)); final java.awt.LinearGradientPaint fill = new java.awt.LinearGradientPaint(0, 75, 0, (int) (height - 150), new float[]{0f, 1f}, new java.awt.Color[] { java.awt.Color.RED, java.awt.Color.ORANGE}); g2d.setPaint(fill); g2d.fill(ellipse); } }; final StackPane root = new StackPane(); root.getChildren().add(canvas); // Le canevas sera toujours � la taille du n�ud racine. // On aurait pu aussi surcharger layoutChildren() sur le n�ud racine. canvas.widthProperty().bind(root.widthProperty()); canvas.heightProperty().bind(root.heightProperty()); final Scene scene = new Scene(root, 350, 300); primaryStage.setTitle("Test de canevas Java2D"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Ici, nous dessinons une ligne rouge de deux pixels d��paisseur, un rectangle bleu et une ellipse remplie par un gradient vertical allant du rouge � l'orange en utilisant des m�thodes propres � Java2D et non plus celles de la classe Canvas.
�tant donn� que la classe FXGraphics2D h�rite de la classe java.awt.Graphics2D, nous pouvons dessiner en invoquant les m�mes m�thodes que celles utilis�es en Java2D. De plus, nous pouvons fournir cette r�f�rence aupr�s des biblioth�ques tierces utilisant Java2D de mani�re � avoir leur sortie graphique directement affich�e dans le canevas JavaFX.
Note : contrairement � un contexte graphique directement issu de Java2D qui dessine imm�diatement dans son tampon de pixels, le contexte graphique du canevas JavaFX conserve une pile des instructions de dessin qui lui ont �t� soumises. Cette pile d'appels ne cesse de grandir au fil du temps ce qui peut entrainer une surconsommation de la m�moire. C'est pourquoi il est important de nettoyer r�guli�rement le canevas, c'est � dire, ici, � chaque nouvelle phase d'affichage. Cela peut �tre fait en invoquant la m�thode clearRect() sur l�int�gralit� de sa surface :
Code Java : | S�lectionner tout |
getGraphicsContext2D().clearRect(0, 0, width, height);
�tant donn� que la zone sp�cifi�e recouvre l�int�gralit� de la surface du canevas, la pile d'instruction de dessins sera enti�rement vid�e ce qui permet � la fois de disposer d'une surface de dessin vierge et de lib�rer les r�f�rences des instructions pr�c�dentes qui seront alors mise � disposition du GC.
Site de FXGraphics2D
Page GitHub de FXGraphics2D
A Bridge from Java2D to JavaFX, article dans le num�ro de novembre d�cembre 2014 du magazine Java d'Oracle .
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes 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 � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.