
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 � 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.