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.

SommaireSceneGraph (388)
précédent sommaire suivant
 

Un SceneGraph (littéralement, graphe de scène) est une arborescence d'objets graphiques, des nœuds graphiques. Chaque nœud disposant de ses propres propriétés graphiques (couleur, forme, position, etc.). Stocker ainsi les éléments à afficher permet de détecter plus facilement les zones de l’écran qui sont activées et doivent être rafraichies en cas de modification (déplacement, changement de couleur, etc. ) d'un noeud ou d'un groupe de nœuds. Il devient également plus facile d'arriver à déterminer au-dessus de quel élément se trouve le curseur de la souris et de réagir en conséquence en cas de clic ou de saisie tactile.

En JavaFX, le SceneGraph forme une API publique constituée de nœuds graphiques (rectangle, bouton, sphère, etc.) ou des gestionnaires de mise en page que le programmeur peut manipuler pour composer l'interface graphique de son application. Modifier une propriété graphique d'un de ces nœuds provoquera automatiquement la réactualisation de la partie de l'affichage concernée sans que le programmeur ait besoin d'invoquer quoi que ce soit.

Derrière le SceneGraph reposent le moteur de dessin Prism, le moteur de rendu Pisces et le moteur d'effets Decora auxquels le programmeur n'a pas directement accès. Le gestionnaire de fenêtrage utilisé par JavaFX se nomme Glass tandis que le port de Glass pour systèmes embarqués se nomme Monocle.

Mis à jour le 6 octobre 2014 bouye

Un pulse (littéralement, une impulsion) est un événement qui indique au SceneGraph qu'il doit se synchroniser avec le moteur de rendu sous-jacent Prism de manière à changer l'affichage à l’écran. En cas d'affichage passif, une impulsion a lieu quand un objet graphique voit une de ses propriétés visuelles modifiée. A contrario, les impulsions ont lieu de manière continue lorsque des animations ont lieu ou lors de lecture de médias vidéo.

JavaFX essaie de cibler un taux d'impulsions constant d'au maximum 60 images par seconde (60fps), en cas d'animations.

Mis à jour le 6 octobre 2014 bouye

Vous devez inclure un objet de type javafx.scene.Scene dans votre Stage. Vous placerez ensuite des objets de type javafx.scene.Node dans cette scène pour créer votre interface graphique. Ces nœuds graphiques peuvent contenir du texte, des formes vectorielles, des images, des composants Swing, un design fait dans un logiciel externe…

Reprenons le code de notre application de base et ajoutons-y un contrôle :

Code Java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main extends Application { 
  
    @Override 
    public void start(Stage primaryStage) { 
        final Button helloButton = new Button(); 
        helloButton.setText("Dire \"Bonjour le monde !\""); 
        helloButton.setOnAction(actionEvent -> System.out.println("Bonjour le monde !")); 
        final StackPane root = new StackPane(); 
        root.getChildren().add(helloButton); 
        final Scene scene = new Scene(root, 300, 250); 
        primaryStage.setTitle("Ma première application JavaFX"); 
        primaryStage.setScene(scene); 
        primaryStage.show(); 
    } 
  
    public static void main(String[] args) { 
        launch(args); 
    } 
}

Ici, nous avons créé un contrôle bouton de type javafx.scene.control.Button que nous avons inclus dans un gestionnaire de mise en page de type javafx.scene.layout.StackPane. Nous avons positionné ce gestionnaire en tant que nœud racine de notre scène et nous avons inclus la scène dans la fenêtre avant de rendre la fenêtre visible.

Mis à jour le 5 septembre 2014 bouye

Si le Stage est une scène d'une salle de théâtre (au sens de la zone physique sur laquelle se joue une pièce de théâtre), la Scene est quant à elle est la scène du moment, l'action de la pièce qui est en train d’être jouée sur la scène physique devant vos yeux et avec tous les décors, ainsi que les acteurs en train de réciter leur texte du moment. L'agencement des décors, des acteurs et des accessoires forme le graphe de scène (SceneGraph).

La scène est donc l'objet qui est destiné à afficher (on dit aussi « rendre ») le contenu du SceneGraph. Généralement cet objet est attaché à une fenêtre (Stage, Window, etc.), mais ce n'est pas toujours le cas (par exemple, quand on imprime).

La scène dispose d'un unique nœud racine accessible par la propriété root. Cette propriété ne peut jamais avoir la valeur null. Pour construire une interface utilisateur, il suffit d'ajouter et de positionner des nœuds et contrôles dans cette racine.

Pour changer complètement et rapidement le contenu de la scène, il suffit de changer son nœud racine en remplaçant l'ancienne racine par une nouvelle qui contient un tout autre graphe de scène.

Une autre manière de changer l'affichage de la fenêtre est de remplacer la scène par une nouvelle.

Attention : le code qui modifie le contenu de la scène ou la scène elle-même doit être exécuté sur le JavaFX Application Thread. Si un nœud est rattaché à une scène directement ou via l'arborescence de ses parents, veillez à ne pas le modifier dans des threads externes. Si vous ne respectez pas cette règle, des exceptions seront levées.

Mis à jour le 5 septembre 2014 bouye

En théorie, oui, il est possible de créer et manipuler des nœuds graphiques sur un thread autre que le JavaFX Application Thread. Cela permet entre autres de générer des nœuds graphiques complexes dans des tâches de fond sans pour autant bloquer l'affichage.

MAIS, une fois que le nœud a été attaché dans une arborescence qui fait partie d'une scène, vous ne devez y accéder que depuis le JavaFX Application Thread.

De plus, à l'heure actuelle (JDK8_u20), suite à des bogues dans l'API, certains nœuds qui gèrent leur affichage via des fenêtres popup secondaires (ex. : Tooltip) ne peuvent pas être instanciés depuis d'autres threads.

Mis à jour le 1er octobre 2014 bouye

Il est possible de savoir si votre code s’exécute dans le JavaFX Application Thread en invoquant la méthode statique isFxApplicationThread() de la classe javafx.application.Platform.

Cette méthode retourne true quand le code s’exécute dans le JavaFX Application Thread. Elle retourne false dans le cas contraire.

Par exemple :

Code Java : Sélectionner tout
1
2
3
if (Platform.isFxApplicationThread()) { 
    [...] 
}

Mis à jour le 1er octobre 2014 bouye

Il est possible de forcer du code à s’exécuter dans le JavaFX Application Thread en invoquant la méthode statique runLater() de la classe javafx.application.Platform et lui passant en paramètre un objet de type java.lang.Runnable.

Par exemple :

Code Java : Sélectionner tout
1
2
3
4
5
6
7
Platform.runLater(new Runnable() { 
  
    @Override 
    public void run() { 
        myButton.setText(text); 
    } 
});

Ou :

Code Java : Sélectionner tout
Platform.runLater(() -> myButton.setText(text));

Mis à jour le 1er octobre 2014 bouye

Oui, Jonathan Giles, de l’équipe de développement JavaFX chez Oracle, a mis à disposition l'outil Scenic View qui permet d'inspecter le contenu d'une scène ou d'une arborescence SceneGraph.

Une fois le fichier JAR de Scenic View ajouté à votre projet, suivant les versions de l'outil, pour le lancer il faudra faire :

Code Java : Sélectionner tout
1
2
3
ScenicView.show(scene); 
// ou 
// ScenicView.show(unNœudParent);

ou

Code Java : Sélectionner tout
1
2
3
ScenicViewBooter.show(scene); 
// ou 
// ScenicViewBooter.show(unNœudParent);

Ce qui nous donne :



Vous pouvez utiliser l'arborescence sur le côté gauche de l’écran pour naviguer dans l'arborescence et sélectionner vos nœuds graphiques, ce qui aura pour effet de les mettre en surbrillance dans votre application. La partie droite de l'affichage vous donnera des informations sur la mise en page du nœud sélectionné ainsi que sur ses propriétés qu'il est possible d’éditer.

Note : la version 1.x de Scenic View est destinée à JavaFX 2.x, tandis que la version 8.x de Scenic View est destinée à JavaFX 8.x.

Mis à jour le 3 octobre 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 © 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.