IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

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.

SommaireSceneGraphUtilisation avanc�eAvec Swing et Java2DInclure SceneGraph dans Swing (3)
pr�c�dent sommaire suivant
 

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.

Mis � jour le 3 septembre 2014 bouye

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

Mis � jour le 17 septembre 2014 bouye

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.

Mis � jour le 17 septembre 2014 bouye

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


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

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