2.2Découvrir Scene Builder
2.2.1 – Interface : hiérarchie, propriétés, inspecteur
Scene Builder est un outil visuel qui permet de créer et modifier des fichiers FXML en glissant-déposant des composants. Avant de commencer à créer des interfaces, il est important de comprendre l'organisation de l'interface de Scene Builder.
🖥️ Vue d'ensemble de l'interface
L'interface de Scene Builder est divisée en plusieurs panneaux principaux :
- Panneau de la bibliothèque (Library) : Contient tous les composants disponibles
- Vue hiérarchique (Hierarchy) : Affiche la structure arborescente de votre interface
- Zone de conception (Content) : Zone principale où vous créez visuellement votre interface
- Panneau des propriétés (Properties) : Permet de modifier les propriétés du composant sélectionné
- Inspecteur (Inspector) : Affiche les propriétés, les mises en page et le code du composant sélectionné
📚 Panneau de la bibliothèque (Library)
Le panneau de la bibliothèque, généralement situé à gauche, contient tous les composants JavaFX disponibles, organisés par catégories :
- Containers : VBox, HBox, BorderPane, GridPane, etc. (layouts)
- Controls : Button, Label, TextField, CheckBox, etc. (composants interactifs)
- Menu : MenuBar, Menu, MenuItem, etc.
- Charts : LineChart, BarChart, PieChart, etc.
- Shapes : Rectangle, Circle, Line, etc.
- 3D : Composants 3D (avancé)
🌳 Vue hiérarchique (Hierarchy)
La vue hiérarchique affiche la structure arborescente de votre interface. Elle montre :
- L'élément racine : Le conteneur principal (VBox, BorderPane, etc.)
- Les éléments enfants : Tous les composants contenus dans le conteneur
- La hiérarchie : Comment les composants sont imbriqués les uns dans les autres
BorderPane├─
top → MenuBar├─
center → VBox├─
Label└─
Button└─
bottom → HBox
🎨 Zone de conception (Content)
La zone de conception est la zone principale au centre de l'écran où vous créez visuellement votre interface :
- Glisser-déposer : Glissez des composants depuis la Library vers cette zone
- Prévisualisation : Voyez immédiatement le résultat de vos modifications
- Sélection : Cliquez sur un composant pour le sélectionner et modifier ses propriétés
⚙️ Panneau des propriétés (Properties)
Le panneau des propriétés, généralement situé à droite, permet de modifier les propriétés du composant sélectionné. Il est divisé en plusieurs onglets :
1. Onglet Properties
Contient les propriétés principales du composant :
- Text : Le texte affiché (pour Label, Button, etc.)
- Pref Width / Pref Height : Taille préférée du composant
- Min Width / Min Height : Taille minimale
- Max Width / Max Height : Taille maximale
- Visible : Si le composant est visible
- Disable : Si le composant est désactivé
2. Onglet Layout
Contient les propriétés de mise en page :
- Alignment : Alignement du composant dans son conteneur
- Margin : Marges autour du composant
- Padding : Espacement interne
3. Onglet Code
Contient les propriétés liées au code :
- fx:id : Identifiant pour référencer le composant dans le contrôleur
- onAction : Méthode à appeler lors d'un événement (pour les boutons)
- onKeyPressed : Méthode à appeler lors d'une pression de touche
🔍 Inspecteur (Inspector)
L'inspecteur est un panneau qui regroupe toutes les informations sur le composant sélectionné. Il combine :
- Les propriétés : Toutes les propriétés modifiables
- La mise en page : Les propriétés de positionnement
- Le code : Les identifiants et événements
📋 Navigation dans l'interface
Voici quelques raccourcis et techniques utiles pour naviguer dans Scene Builder :
- Sélectionner un composant : Cliquez dessus dans la zone de conception ou dans la vue hiérarchique
- Sélectionner le parent : Cliquez sur le composant parent dans la vue hiérarchique
- Supprimer un composant : Sélectionnez-le et appuyez sur
SupprouDelete - Dupliquer un composant :
Ctrl+CpuisCtrl+V - Annuler / Refaire :
Ctrl+Z/Ctrl+Y
🎯 Workflow typique dans Scene Builder
Voici le workflow typique pour créer une interface dans Scene Builder :
- Choisir un conteneur racine : Sélectionnez un layout (VBox, BorderPane, etc.) comme élément racine
- Ajouter des composants : Glissez-déposez des composants depuis la Library
- Configurer les propriétés : Sélectionnez chaque composant et modifiez ses propriétés dans l'inspecteur
- Organiser la hiérarchie : Utilisez la vue hiérarchique pour réorganiser les composants
- Prévisualiser : Utilisez le bouton "Preview" pour voir le résultat final
- Sauvegarder : Enregistrez le fichier FXML
2.2.2 – Ajouter et configurer des éléments simples
Maintenant que vous connaissez l'interface de Scene Builder, apprenons à ajouter et configurer des composants simples. Nous allons créer une interface étape par étape avec des composants de base : Label, TextField et Button.
📝 Étape 1 : Créer un nouveau fichier FXML
Pour commencer, créez un nouveau fichier FXML dans Scene Builder :
- Ouvrez Scene Builder
- Fichier → New (ou
Ctrl+N) - Choisissez un conteneur racine (par exemple
VBox)
🏷️ Étape 2 : Ajouter un Label
Commençons par ajouter un Label qui affichera un texte :
- Dans le panneau Library, trouvez la catégorie Controls
- Glissez-déposez un Label dans la zone de conception
- Sélectionnez le Label (il sera surligné)
- Dans l'onglet Properties de l'inspecteur, modifiez la propriété Text : entrez "Bienvenue !"
📝 Étape 3 : Ajouter un TextField
Ajoutons maintenant un champ de texte pour que l'utilisateur puisse saisir du texte :
- Dans le panneau Library, trouvez TextField dans Controls
- Glissez-déposez le TextField dans la zone de conception, sous le Label
- Sélectionnez le TextField
- Dans l'onglet Properties, modifiez Prompt Text : entrez "Entrez votre nom"
- Modifiez Pref Width : entrez
200pour définir une largeur
• Text : Le texte déjà présent dans le champ (visible)
• Prompt Text : Le texte d'aide qui s'affiche quand le champ est vide (gris, disparaît quand on tape)
🔘 Étape 4 : Ajouter un Button
Ajoutons un bouton pour valider la saisie :
- Dans le panneau Library, trouvez Button dans Controls
- Glissez-déposez le Button dans la zone de conception, sous le TextField
- Sélectionnez le Button
- Dans l'onglet Properties, modifiez Text : entrez "Valider"
- Modifiez Pref Width : entrez
200pour correspondre au TextField
⚙️ Étape 5 : Configurer le conteneur VBox
Maintenant, configurons le conteneur VBox pour organiser les composants :
- Sélectionnez le VBox (cliquez sur un espace vide ou dans la vue hiérarchique)
- Dans l'onglet Properties :
- Spacing : entrez
20(espacement entre les composants) - Alignment : sélectionnez
CENTER(centrer les composants)
- Spacing : entrez
- Dans l'onglet Layout :
- Padding : cliquez sur les flèches pour définir
20sur tous les côtés
- Padding : cliquez sur les flèches pour définir
👁️ Étape 6 : Prévisualiser l'interface
Avant de sauvegarder, prévisualisez votre interface pour voir le résultat final :
- Cliquez sur le bouton Preview en haut de Scene Builder (ou
Ctrl+P) - Une fenêtre de prévisualisation s'ouvre
- Testez l'interface : cliquez sur le TextField, tapez du texte, etc.
- Fermez la prévisualisation
💾 Étape 7 : Sauvegarder le fichier FXML
Une fois satisfait de votre interface, sauvegardez le fichier :
- Fichier → Save (ou
Ctrl+S) - Choisissez l'emplacement (dans le package
applicationou dans un dossierresourcessi vous l'avez créé) - Donnez un nom au fichier (par exemple
formulaire.fxml) - Cliquez sur Save
📋 Résumé : Structure FXML créée
Voici à quoi ressemble le fichier FXML que vous avez créé :
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox spacing="20.0" alignment="CENTER" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1">
<padding>
<Insets top="20.0" right="20.0" bottom="20.0" left="20.0"/>
</padding>
<children>
<Label text="Bienvenue !" />
<TextField promptText="Entrez votre nom" prefWidth="200.0" />
<Button text="Valider" prefWidth="200.0" />
</children>
</VBox>
🎨 Personnalisation avancée
Vous pouvez personnaliser davantage vos composants :
Personnaliser un Label
- Font : Dans Properties, cliquez sur "Font" pour changer la police, la taille, le style
- Text Fill : Choisissez la couleur du texte
- Alignment : Alignement du texte dans le Label
Personnaliser un Button
- Graphic : Ajoutez une icône au bouton
- Style : Dans l'onglet Properties, section "Style", ajoutez du CSS inline
- Default Button : Cochez cette case pour que le bouton soit activé avec Entrée
2.2.3 – Associer des fx:id et gérer les événements
Pour que votre interface FXML puisse interagir avec le code Java, vous devez associer des fx:id aux composants et définir les gestionnaires d'événements. Cette section vous montre comment faire cela dans Scene Builder.
🏷️ Qu'est-ce qu'un fx:id ?
Un fx:id est un identifiant unique qui permet au contrôleur Java de référencer un composant du FXML. C'est l'équivalent d'un id en HTML/CSS.
fx:id est différent du id CSS. Le fx:id est utilisé pour la liaison avec le contrôleur, tandis que l'id CSS est utilisé pour le style.
📝 Étape 1 : Définir un fx:id dans Scene Builder
Pour définir un fx:id pour un composant :
- Sélectionnez le composant dans la zone de conception (ou dans la vue hiérarchique)
- Ouvrez l'onglet Code dans l'inspecteur (à droite)
- Dans le champ fx:id, entrez un nom unique (par exemple
labelMessage,champNom,btnValider)
• Utilisez des noms descriptifs :
labelMessage plutôt que label1• Utilisez camelCase :
btnValider, champNom• Préfixez avec le type :
btn pour Button, label pour Label, champ pour TextField
💻 Étape 2 : Associer le fx:id dans le contrôleur
Une fois le fx:id défini dans Scene Builder, vous devez créer un champ correspondant dans votre contrôleur Java :
Dans Scene Builder :
Vous avez défini fx:id="labelMessage" pour un Label.
Dans le contrôleur Java :
package application;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class MonController {
@FXML
private Label labelMessage; // Le nom doit correspondre au fx:id
// Maintenant vous pouvez utiliser labelMessage dans votre code
}
fx:id défini dans Scene Builder. JavaFX fait la correspondance automatiquement.
🎯 Étape 3 : Définir un gestionnaire d'événement
Pour qu'un bouton (ou autre composant) déclenche une action quand on clique dessus, vous devez définir un gestionnaire d'événement :
- Sélectionnez le composant (par exemple un Button)
- Ouvrez l'onglet Code dans l'inspecteur
- Dans le champ onAction, entrez le nom de la méthode (par exemple
handleValider)
# dans Scene Builder. Scene Builder l'ajoute automatiquement dans le FXML généré.
💻 Étape 4 : Créer la méthode dans le contrôleur
Une fois le gestionnaire d'événement défini dans Scene Builder, créez la méthode correspondante dans votre contrôleur :
Dans Scene Builder :
Vous avez défini onAction="handleValider" pour un Button.
Dans le contrôleur Java :
package application;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class MonController {
@FXML
private Label labelMessage;
@FXML
private TextField champNom;
@FXML
private Button btnValider;
// Méthode appelée quand on clique sur le bouton
@FXML
private void handleValider() {
String nom = champNom.getText();
if (!nom.trim().isEmpty()) {
labelMessage.setText("Bonjour, " + nom + " !");
} else {
labelMessage.setText("Veuillez entrer un nom");
}
}
}
@FXML et doit être private (ou public). Le nom doit correspondre exactement à celui défini dans onAction.
📋 Exemple complet : Formulaire avec fx:id et événements
Voici un exemple complet d'une interface créée dans Scene Builder avec des fx:id et des gestionnaires d'événements :
1. Interface dans Scene Builder
Créez une interface avec :
- Un Label avec
fx:id="labelMessage"ettext="Bienvenue !" - Un TextField avec
fx:id="champNom"etpromptText="Entrez votre nom" - Un Button avec
fx:id="btnValider",text="Valider"etonAction="handleValider"
2. Fichier FXML généré
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox spacing="20.0" alignment="CENTER" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="application.MonController">
<padding>
<Insets top="20.0" right="20.0" bottom="20.0" left="20.0"/>
</padding>
<children>
<Label fx:id="labelMessage" text="Bienvenue !" />
<TextField fx:id="champNom" promptText="Entrez votre nom" prefWidth="200.0" />
<Button fx:id="btnValider" text="Valider" prefWidth="200.0" onAction="#handleValider" />
</children>
</VBox>
3. Contrôleur Java
package application;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class MonController {
@FXML
private Label labelMessage;
@FXML
private TextField champNom;
@FXML
private Button btnValider;
@FXML
private void initialize() {
// Code d'initialisation exécuté après le chargement du FXML
btnValider.setDisable(true);
// Activer le bouton seulement si le champ n'est pas vide
champNom.textProperty().addListener((obs, oldVal, newVal) -> {
btnValider.setDisable(newVal.trim().isEmpty());
});
}
@FXML
private void handleValider() {
String nom = champNom.getText();
if (!nom.trim().isEmpty()) {
labelMessage.setText("Bonjour, " + nom + " !");
champNom.clear();
}
}
}
🎯 Autres types d'événements
En plus de onAction, Scene Builder permet de définir d'autres gestionnaires d'événements :
- onKeyPressed : Quand une touche est pressée
- onKeyReleased : Quand une touche est relâchée
- onMouseClicked : Quand on clique avec la souris
- onMouseEntered : Quand la souris entre dans le composant
- onMouseExited : Quand la souris sort du composant
onAction, la méthode dans le contrôleur doit accepter un paramètre de type événement. Par exemple : @FXML private void handleKeyPress(KeyEvent event) { }
⚠️ Erreurs courantes
Voici les erreurs les plus courantes et comment les éviter :
1. fx:id ne correspond pas au nom du champ
<!-- FXML : fx:id="labelMessage" -->
// ❌ Erreur : nom différent
@FXML
private Label message;
// ✅ Correct
@FXML
private Label labelMessage;
2. Méthode d'événement introuvable
<!-- FXML : onAction="handleValider" -->
// ❌ Erreur : méthode non annotée @FXML ou nom incorrect
private void valider() { }
// ✅ Correct
@FXML
private void handleValider() { }
3. Contrôleur non déclaré dans le FXML
<!-- ❌ Erreur : pas de fx:controller -->
<VBox xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1">
<!-- ✅ Correct -->
<VBox xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="application.MonController">
• Le
fx:controller est défini dans le FXML• Les
fx:id correspondent exactement aux noms des champs• Les méthodes d'événement sont annotées
@FXML et ont le bon nom• Le package du contrôleur est correct