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 © 2024 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.