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

modifier
 
Ordre d'appel des méthodes

Application 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éthode main(String[] args), soit directement par la JVM. Le premier argument est la classe implémentant la classe abstraite Application 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 de Application 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

modifier

Quel 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

modifier
package 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);
	}
}

Une 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

modifier

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

 
Example de scene contenant des nœuds 2D

Une 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

modifier

JavaFX 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)

modifier

Un 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 classe Image ;
  • MeshView pour les objets de classe Mesh (notamment la sous-classe TriangleMesh) ;
  • ...

Exemple : afficher une image

modifier
package 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();
	}
}