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 Swing dans SceneGraph (4)
précédent sommaire suivant
 

Depuis JavaFX 8, il est à nouveau possible d'inclure des composants Swing dans une scène de rendu SceneGraph. Cette solution est destinée à permettre le port rapide d'applications Swing vers JavaFX à moindre coût ou encore de capitaliser sur l'immense vivier de composants Swing et Java2D déjà prêts à l'emploi compte tenu de l'âge de cette bibliothèque.

Le nœud javafx.embed.swing.SwingNode peut être utilisé pour inclure un composant Swing dans une arborescence SceneGraph. 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
public class Main extends Application { 
  
    @Override 
    public void start(Stage primaryStage) { 
        final SwingNode swingNode = new SwingNode(); 
        // Création de l'UI Swing sur le thead EDT de AWT/Swing. 
        SwingUtilities.invokeLater(() -> initSwingUI(swingNode)); 
        final StackPane root = new StackPane(swingNode); 
        final Scene scene = new Scene(root, 300, 300); 
        primaryStage.setTitle("Test d'intégration de Swing"); 
        primaryStage.setScene(scene); 
        primaryStage.show(); 
    } 
  
    // Cette méthode est invoquée sur le thread EDT de AWT/Swing.   
    private void initSwingUI(final SwingNode swingNode) { 
        final JButton button = new JButton("Cliquez moi !"); 
        button.setToolTipText("Un bouton Swing dans une IU JavaFX !"); 
        final JToolBar toolBar = new JToolBar(); 
        toolBar.add(button); 
        toolBar.setFloatable(false); 
        button.addActionListener(actionEvent -> System.out.println("Salut le monde, depuis Swing !")); 
        final DefaultTableModel tableModel = new DefaultTableModel(new String[]{"Nom", "Prénom", "Âge", "Sexe"}, 0); 
        tableModel.addRow(new Object[]{"Henri", "Martin", 28, 'M'}); 
        tableModel.addRow(new Object[]{"Jeanette", "Dupond", 32, 'F'}); 
        tableModel.addRow(new Object[]{"Amedh", "Rehan", 26, 'M'}); 
        tableModel.addRow(new Object[]{"Sylvie", "Durant", 18, 'F'}); 
        tableModel.addRow(new Object[]{"Petelo", "Seasifi", 20, 'M'}); 
        final JTable table = new JTable(tableModel); 
        final JScrollPane tableScroll = new JScrollPane(table); 
        final BorderLayout borderLayout = new BorderLayout(); 
        final JPanel pane = new JPanel(borderLayout); 
        pane.add(toolBar, BorderLayout.NORTH); 
        pane.add(tableScroll, BorderLayout.CENTER);         
        // Ajout des composant Swing dans SceneGraph. 
        swingNode.setContent(pane); 
    } 
  
    public static void main(String[] args) { 
        launch(args); 
    } 
}

Et nous obtenons le résultat suivant :


Mis à jour le 3 septembre 2014 bouye

Vous pouvez appliquer n'importe quel effet, transformation ou animation sur le nœud SwingNode, car ce dernier est un nœud SceneGraph comme un autre.

Par exemple, le code suivant affecte d'une rotation le nœud SwingNode contenant notre affichage Swing précédent :

Code Java : Sélectionner tout
1
2
3
4
5
final RotateTransition rotate = new RotateTransition(Duration.seconds(25), swingNode); 
rotate.setCycleCount(RotateTransition.INDEFINITE); 
rotate.setInterpolator(Interpolator.LINEAR); 
rotate.setByAngle(360); 
rotate.play();

Cependant, il reste tout à fait possible d’interagir avec les composants Swing contenus dans l'affichage, même quand ces derniers ont la tête à l'envers !



Par contre, il est impossible d'appliquer des effets, transformations ou animations JavaFX sur les composants Swing de notre affichage (JPanel, JButton, JTable) directement : le nœud SwingNode marque une frontière entre le monde JavaFX et le monde Swing.

Note : on notera cependant que l'affichage de l'infobulle du bouton n'est pas affecté par la rotation et a lieu à sa position non transformée puisque cet affichage est géré en interne par Swing dans une fenêtre séparée.

Mis à jour le 5 septembre 2014 bouye

Actuellement une telle intégration est possible, mais reste du domaine de l'expérimental et nécessite de recompiler plusieurs classes du moteur de rendu Prism. Il faut de plus forcer Prism à utiliser OpenGL via un paramètre de la JVM.

Mis à jour le 13 octobre 2014 bouye

Pour intégrer World Wind, l'outil SIG de la NASA basé sur Swing dans JavaFX, il faut utiliser la classe gov.nasa.worldwind.awt.WorldWindowGLJPanel au lieu de la classe gov.nasa.worldwind.awt.WorldWindowGLCanvas.

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
public class Main extends Application { 
  
    @Override 
    public void start(Stage primaryStage) { 
        final SwingNode swingNode = new SwingNode(); 
        final StackPane root = new StackPane(); 
        root.getChildren().add(swingNode); 
        final Scene scene = new Scene(root, 300, 250); 
        primaryStage.setTitle("Test de WorldWind"); 
        primaryStage.setScene(scene); 
        primaryStage.show(); 
        SwingUtilities.invokeLater(() -> initializeWorldWind(swingNode)); 
    } 
  
    private void initializeWorldWind(final SwingNode swingNode) { 
//        final WorldWindowGLCanvas wwd = new WorldWindowGLCanvas(); 
        final WorldWindowGLJPanel wwd = new WorldWindowGLJPanel(); 
        wwd.setPreferredSize(new java.awt.Dimension(300, 250)); 
        wwd.setModel(new BasicModel()); 
        swingNode.setContent(wwd); 
    } 
  
    /** 
     * @param args the command line arguments 
     */ 
    public static void main(String[] args) { 
        launch(args); 
    } 
}

Ce qui nous donne :

Mis à jour le 15 mars 2015 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 © 2017 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.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -