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.
Depuis JavaFX 2.0, il est possible d'inclure des nœuds SceneGraph dans un composant ou une UI Swing. Cette solution est destinée à permettre d’étendre les fonctions RIA de Swing qui sont assez limitées de base ou encore de lui ajouter le support de HTML5 plus moderne ou de permettre d'utiliser la bibliothèque de graphiques statistiques fournie avec JavaFX.
Vous devez insérer vos nœuds dans une scène comme à l'ordinaire, puis insérer cette scène dans un JComponent de type javafx.embed.swing.JFXPanel.
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 | public class Test { public static void main(String[] args) { // Création de l'UI Swing sur le thead EDT de AWT/Swing. SwingUtilities.invokeLater(Test::initAndShowGUI); } // Cette méthode est invoquée sur le thread EDT de AWT/Swing. private static void initAndShowGUI() { final JFXPanel fxPanel = new JFXPanel(); final JFrame frame = new JFrame(); frame.setTitle("Test de JavaFX dans Swing"); frame.getContentPane().setLayout(new BorderLayout()); frame.add(fxPanel, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(new Dimension(350, 300)); frame.setVisible(true); // Création de la scène sur le JavaFX Application Thread. Platform.runLater(() -> createScene(fxPanel)); } // Cette méthode est invoquée sur le JavaFX Application Thread. private static void createScene(final JFXPanel fxPanel) { final Rectangle rectangle = new Rectangle(100, 100, 150, 100); rectangle.setFill(Color.RED); final Pane root = new Pane(rectangle); final Scene scene = new Scene(root); fxPanel.setScene(scene); } } |
Ici, nous avons pris soin de deux choses :
- nous avons créé notre UI Swing sur l'EDT (Event Dispatch Thread) qui est le thread de Swing. Cela fait partie des bonnes recommandations de Swing même si tout le monde oublie de le faire ;
- nous avons créé notre scène JavaFX sur le JavaFX Application Thread. Si nous ne l'avions pas fait, une exception de type IllegalStateException contenant le message « Not on FX application thread » aurait été levée.
Durant les dialogues entre composants de notre UI, il faudra faire attention de notre UI à :
- mettre à jour les composants Swing en appelant la méthode statique invokeLater() de la classe utilitaire javax.swing.SwingUtilities pour que cette mise à jour se déroule dans l'EDT ;
- mettre à jour les nœuds et contrôles JavaFX en appelant la méthode statique runLater() de la classe utilitaire javafx.application.Platform pour que cette mise à jour se déroule dans le JavaFX Application Thread.
À partir du JDK8, il est possible de fusionner l'EDT et le JavaFX Application Thread en un seul thread de gestion d’événements.
Si nous ajoutons au code précédent :
Code Java : | Sélectionner tout |
1 2 3 4 | rectangle.setOnMouseClicked(actionEvent -> { System.out.printf("JavaFX Application Thread ? %b", Platform.isFxApplicationThread()).println(); System.out.printf("EDT ? %b", SwingUtilities.isEventDispatchThread()).println(); }); |
Lorsque nous cliquons sur notre rectangle rouge, nous obtenons comme résultat :
Code : | Sélectionner tout |
1 2 | JavaFX Application Thread ? true EDT ? false |
L'EDT et le JavaFX Application Thread sont toujours distincts.
Cependant, depuis le JDK8, il est possible de lancer le programme en spécifiant l’option suivante sur la JVM : -Djavafx.embed.singleThread=true
Le résultat du clic sur le rectangle rouge devient alors :
Code : | Sélectionner tout |
1 2 | JavaFX Application Thread ? true EDT ? true |
Lorsque cette option de démarrage de la JVM est utilisée, l'EDT et le JavaFX Application Thread se fondent en un seul thread événementiel, ce qui permet de grandement réduire le code nécessaire pour la communication entre les composants Swing et les contrôles JavaFX.
Note : le code de création de la scène en invoquant Platform.runLater() reste identique cependant.
Vous avez décidé d'utiliser MediaPlayer pour lire de la musique ou des MP3 dans une application Swing, mais vous obtenez une erreur contenant ce message. C'est simple : comme vous n'avez pas créé de composant graphique JavaFX, les runtimes ne sont pas initialisés correctement.
À l'heure actuelle (JDK8_u20), instancier un MediaPlayer n'est en effet pas suffisant pour effectuer cette initialisation. Pour pallier ce problème, vous devez instancier un objet de type JFXPanel. Même si vous ne l'ajoutez pas dans votre interface graphique, cela suffira pour initialiser correctement les runtimes.
Code Java : | Sélectionner tout |
1 2 | final JFXPanel fxPanel = new JFXPanel(); // Procéder ensuite comme à l'ordinaire. |
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.