Programmation JavaFX/Composants d'une application
Ce chapitre est important car il présente les classes de bases communes aux applications JavaFX. Un exemple illustre ce chapitre, complété au fur et à mesure des notions introduites dans les sections du chapitre.
Application
modifierApplication est le nom de la classe Abstraite à implémenter par la sous-classe représentant l'application JavaFX.
Cette sous-classe ne comporte pas obligatoirement une méthode statique main
car la JVM peut lancer directement un JAR contenant une application JavaFX en utilisant certains attributs particuliers du fichier de manifeste.
Elle suit un cycle particulier :
- La méthode statique
launch(Class c, String[] args)
est appelée soit par une méthodemain(String[] args)
, soit directement par la JVM. Le premier argument est la classe implémentant la classe abstraiteApplication
et peut être omis, auquel cas la méthode utilise la classe à partir de laquelle elle a été appelée. Le second argument est un tableau des arguments de la ligne de commande (voir section « Récupération des arguments de la ligne de commande » ci-dessous). - Cette méthode initialise l'environnement JavaFX et appelle ensuite la méthode
init()
. - La méthode
start(Stage stage)
est ensuite appelée pour démarrer l'application : créer l'interface et les scènes à afficher dans la fenêtre (stage) donnée en argument. La sous-classe deApplication
doit implémenter cette méthode. - La méthode
stop()
est appelée pour arrêter l'application, généralement quand la fenêtre de l'application est fermée. L'implémentation par défaut ne fait rien.
Récupération des arguments de la ligne de commande
modifierQuel que soit le mode de lancement de l'application, la méthode getParameters()
de la classe Application retourne un objet de classe Parameters
:
Parameters params = getParameters();
Les méthodes de la classe Parameters
permettent de récupérer les arguments de la ligne de commande :
List<String> getRaw()
- Cette méthode retourne une liste contenant tous les arguments de la ligne de commande.
Map<String,String> getNamed()
- Cette méthode retourne un dictionnaire de tous les arguments nommés de la forme suivante :
--name=value
List<String> getUnnamed()
- Cette méthode retourne une liste contenant les autres arguments (non nommés) de la ligne de commande.
Exemple
modifierpackage org.wikibooks.fr.javafx;
import java.util.*;
import javafx.application.Application;
import javafx.stage.Stage;
public class FirstExample extends Application
{
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage stage)
{
Group root = new Group();
Scene scene = new Scene(root, 400, 200); // Fenêtre 400x200 pixels
stage.setScene(scene);
stage.setTitle("Exemple de scene vide"); // Titre de la fenêtre
stage.show();
// Afficher tous les arguments passés à l'application
// Exemple: test --limit=20 example --out=file.dat
// Paramètre limit = 20
// Paramètre out = file.dat
// Autre paramètre: test
// Autre paramètre: example
Parameters params = getParameters();
for(Map.Entry<String, String> named_parameter : params.getNamed().entrySet())
System.out.println(" Paramètre "+named_parameter.getKey()+" = "+named_parameter.getValue());
for(String p : params.getUnnamed())
System.out.println(" Autre paramètre: "+p);
}
}
Stage
modifierUne instance de la classe Stage
représente une fenêtre d'application JavaFX.
Les principales méthodes sont les suivantes:
setTitle(String title)
- Définir le titre de la fenêtre.
setScene(Scene scene)
- Définir la scène à afficher.
show()
- Afficher la fenêtre.
Il est également possible d'ajouter une ou plusieurs icônes en modifiant la liste observable retournée par la méthode getIcons()
.
Liste observable
modifierUne liste observable est une liste générique dont les modifications sont notifiés aux instances des classes implémentant l'interface ListChangeListener enregistrées sur la liste par la méthode addListener
.
Les listes observables sont très utilisées dans l'API JavaFX.
Scene
modifierUne scène est composée de nœuds (Node). Une scène comporte des nœuds 2D (composants : boutons, labels...) ou 3D (formes : sphères, boîtes, cylindres...).
package org.wikibooks.fr.javafx;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.shape.Box;
import javafx.scene.shape.Cylinder;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;
public class First3DScene extends Application
{
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage stage)
{
// Create a Box
Box box = new Box(100, 100, 100);
box.setTranslateX(150);
box.setTranslateY(0);
box.setTranslateZ(400);
// Create a Sphere
Sphere sphere = new Sphere(50);
sphere.setTranslateX(300);
sphere.setTranslateY(-5);
sphere.setTranslateZ(400);
// Create a Cylinder
Cylinder cylinder = new Cylinder(40, 120);
cylinder.setTranslateX(500);
cylinder.setTranslateY(-25);
cylinder.setTranslateZ(600);
// Create a Light
PointLight light = new PointLight();
light.setTranslateX(350);
light.setTranslateY(100);
light.setTranslateZ(300);
// Create a Camera to view the 3D Shapes
PerspectiveCamera camera = new PerspectiveCamera(false);
camera.setTranslateX(100);
camera.setTranslateY(-50);
camera.setTranslateZ(300);
// Add the Shapes and the Light to the Group
Group root = new Group(box, sphere, cylinder, light);
// Create a Scene with depth buffer enabled
Scene scene = new Scene(root, 400, 200, true);
// Add the Camera to the Scene
scene.setCamera(camera);
// Add the Scene to the Stage
stage.setScene(scene);
// Set the Title of the Stage
stage.setTitle("An Example with Predefined 3D Shapes");
// Display the Stage
stage.show();
}
}
Classes similaires à AWT et Swing
modifierJavaFX a été conçu pour remplacer Swing et AWT à long terme. Le framework est donc indépendant et possède des classes spécifiques, nommées comme celles de Swing et AWT et jouant à peu près le même rôle mais sont différentes. Ce qui veut dire qu'il n'est pas possible d'utiliser directement les classes de JavaFX en Swing/AWT et vice-versa.
La spécificité des classes de JavaFX permet leur utilisation en 2D et en 3D.
- Color
- Représente une couleur, modélisée par les composantes RVB (Rouge, Vert, Bleu) dont les valeurs sont de type
double
et comprises entre 0.0 et 1.0. - Image
- Représente une image.
Nœud (Node)
modifierUn nœud représenté un élément affichable dans une scène.
Certaines classes d'objet ne sont pas des nœuds ; leurs instances doivent alors être encapsulées dans une vue (View) gérant le type d'objet :
ImageView
pour les objets de classeImage
;MeshView
pour les objets de classeMesh
(notamment la sous-classeTriangleMesh
) ;- ...
Exemple : afficher une image
modifierpackage org.wikibooks.fr.javafx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ShowImage extends Application
{
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage stage)
{
StackPane sp = new StackPane();
Image im = new Image("image.jpg"); // Chemin local relatif
// Image im = new Image("file://///E:/Images/image_8.jpg"); // ou chemin local absolu : URL
// Image im = new Image(getClass().getResourceAsStream("logo.png")); // ou resource du package
// Image im = new Image("http://www.monserveur.com/images/example.png"); // ou URL internet
ImageView im_view = new ImageView(im);
sp.getChildren().add(im_view);
Scene scene = new Scene(sp);
stage.setScene(scene);
stage.setTitle("Afficher une image");
stage.show();
}
}