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.

SommaireSceneGraphFXML et SceneBuilderContr�leur (8)
pr�c�dent sommaire suivant
 

Un contr�leur est une classe externe au fichier FXML, g�n�ralement �crite en Java, qui est charg�e par le chargeur FXML en m�me temps que le fichier FXML. Cette classe permet de manipuler les entit�s nomm�es d�crites dans le fichier FXML, d'y acc�der depuis le reste de votre application ou m�me de modifier le contenu de l'arborescence d�crite dans le FXML.

Un contr�leur doit �tre d�clar� dans une classe publique disposant du constructeur par d�faut ou d'un constructeur public sans param�tre.

Par exemple :

Code Java : S�lectionner tout
1
2
public class MyController { 
}

Ce code d�finit un contr�leur vide.

Mis � jour le 3 septembre 2014 bouye

Pour d�clarer un contr�leur dans un fichier FXML, il faut ajouter l'attribut fx:controller sur l��l�ment racine du document FXML. Cet attribut doit contenir le chemin complet vers la classe servant de contr�leur pour ce FXML.

Par exemple :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>  
  
<?import java.lang.*?>  
<?import java.util.*?>  
<?import javafx.scene.*?>  
<?import javafx.scene.layout.*?>  
  
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="test.TestController"/>

Une exception sera lev�e lors du chargement du FXML si la classe n'est pas pr�sente sur le CLASSPATH ou n'est pas accessible.

Mis � jour le 30 septembre 2014 bouye

Pour acc�der au contr�leur d'un fichier FXML, apr�s chargement de ce fichier, il faut invoquer la m�thode getController() du chargeur.

Par exemple, soit le fichier FXML suivant :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>  
  
<?import java.lang.*?>  
<?import java.util.*?>  
<?import javafx.scene.*?>  
<?import javafx.scene.layout.*?>  
  
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="test.TestController"/>

Pour acc�der � son contr�leur, il suffit de faire :

Code Java : S�lectionner tout
1
2
3
4
final URL fxmlURL = getClass().getResource("monFXML.fxml");  
final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);  
final Node node = fxmlLoader.load(); 
final TestController controler = fxmlLoader.getController();

Mis � jour le 30 septembre 2014 bouye

L'interface javafx.fxml.Initializable est une interface optionnelle que votre contr�leur peut impl�menter si besoin. Cette interface d�finit la m�thode initialize() qui sera invoqu�e au chargement du FXML apr�s l'injection des ressources du FXML dans le contr�leur.

Par exemple :

Code Java : S�lectionner tout
1
2
3
4
5
6
public class MyController implements Initializable { 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
        // Faire les initialisations avant affichage ici. 
    } 
}

Mis � jour le 30 septembre 2014 bouye

Pour injecter des ressources dans un contr�leur, chaque ressource doit avoir, dans sa d�finition dans le fichier FXML, un nom unique d�clar� avec l'attribut fx:id. Il vous faut ensuite d�clarer des variables �quivalentes, avec les types appropri�s, dans le contr�leur en les annotant javafx.fxml.FXML (@FXML). Au chargement du FXML, les r�f�rences des objets cr��s seront inject�es dans le contr�leur.

Par exemple :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?> 
  
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
  
<AnchorPane fx:id="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="test.MyController">  
    <children> 
        <Label fx:id="label"/> 
    </children> 
</AnchorPane>

Il est alors possible d'utiliser un contr�leur similaire au code suivant :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
public class MyController implements Initializable {  
    @FXML 
    private AnchorPane root; 
    @FXML 
    private Label label; 
  
    @Override  
    public void initialize(URL location, ResourceBundle resources) {  
        // Faire les initialisations avant affichage ici.  
    }  
}

La m�thode initialize() sera invoqu�e apr�s l'injection des valeurs dans le contr�leur.

Si un �l�ment dans le fichier FXML est d�clar� avec un attribut fx:id qui n'a pas d��quivalent dans les variables annot�es par @FXML dans le contr�leur, alors le n�ud graphique ne sera pas directement accessible depuis le code du contr�leur.

Si le contr�leur dispose d'une variable annot�e par @FXML qui n'a pas d��quivalent dans les �l�ments disposant d'attributs fx:id dans le fichier FXML, alors cette variable restera � la valeur null apr�s injection.

Mis � jour le 30 septembre 2014 bouye

Lorsqu'on inclut un fichier FXML (le fichier secondaire) dans un autre fichier FXML (le fichier principal), il est possible de lui donner �galement un attribut fx:id. Cette valeur permet de d�clarer implicitement une r�f�rence vers le contr�leur du FXML inclus (le contr�leur secondaire) depuis le contr�leur du FXML maitre (le contr�leur principal).

Prenons ce simple fichier FXML qui sera le fichier secondaire, test.fxml :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?> 
  
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.layout.*?> 
  
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="test.TestController"/>

Et disposant du contr�leur secondaire suivant :

Code Java : S�lectionner tout
1
2
public class TestController {  
}

Et incluons-le dans un autre FXML, le fichier principal, master.fxml :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?> 
  
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.layout.*?> 
  
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="test.MasterController"> 
    <children> 
        <fx:include fx:id="test" source="test.fxml"/> 
    </children> 
</AnchorPane>

Alors il est possible d'injecter implicitement une r�f�rence vers le contr�leur secondaire dans notre contr�leur principal en utilisant l'identifiant <identifiant du FXML secondaire>Controller. Par exemple :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
public class MasterController{  
    // Le n�ud racine de notre FXML secondaire sera inject� dans cette variable. 
    @FXML 
    private AnchorPane test; 
    // Le contr�leur de notre FXML secondaire sera inject� dans cette variable. 
    @FXML 
    private TestController testController; 
}

Mis � jour le 30 septembre 2014 bouye

Il est possible d'invoquer une m�thode du contr�leur depuis le document FXML, par exemple en r�action au clic d'un bouton, en sp�cifiant le nom de la m�thode pr�fix� du caract�re #.

Par exemple :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>  
  
<?import java.lang.*?>  
<?import java.util.*?>  
<?import javafx.scene.*?>  
<?import javafx.scene.control.*?>  
<?import javafx.scene.layout.*?>  
  
<StackPane fx:id="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="test.MyController">   
    <children>  
        <Button fx:id="button" onAction="#onButtonActivated"/>  
    </children>  
</StackPane >

Il faut ensuite d�clarer la m�thode dans le corps du contr�leur. On prendra soin d�annoter la m�thode par @FXML.

Par exemple :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
public class MyController { 
  
    @FXML 
    private void onButtonActivated() { 
        System.out.println("Salut le monde !"); 
    } 
}

Il est �galement possible de d�finir une m�thode recevant un param�tre de type ActionEvent :

Code Java : S�lectionner tout
1
2
3
4
@FXML 
private void onButtonActivated(final ActionEvent actionEvent) { 
    System.out.println("Salut le monde !"); 
}

Dans le cas o� deux m�thodes seraient d�clar�es dans le contr�leur avec des noms identiques, c'est la m�thode acceptant un param�tre de type ActionEvent qui sera invoqu�e en priorit�.

Une exception sera lev�e au chargement du fichier FXML si aucune m�thode portant ce nom n'est d�finie ou si elle n'est pas annot�e par l'annotation @FXML.

Mis � jour le 3 octobre 2014 bouye

Il est possible d'injecter un contr�leur dans un FXML qui n'en a pas de d�fini. Pour cela, il suffit d'invoquer la m�thode setController() du chargeur FXMLLoader avant l'appel � sa m�thode load().

Prenons le fichier FXML suivant :

Code XML : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?> 
  
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
  
<VBox id="VBox" spacing="10" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
    <Button fx:id="button1" text="Button1" onAction="#handleButton1"/> 
    <Button fx:id="button2" text="Button2" onAction="#handleButton2"/> 
    <Button fx:id="button3" text="Button3" onAction="#handleButton3"/> 
    <Button fx:id="button4" text="Button4" onAction="#handleButton4"/> 
    <Button fx:id="button5" text="Button5" onAction="#handleButton5"/> 
</VBox>

En temps normal, il n'est pas possible de charger ce fichier FXML. En effet, nous r�f�ren�ons des m�thodes sur les propri�t�s onAction des boutons, mais n'avons nulle part de contr�leur dans lequel ces m�thodes sont d�finies : une exception sera donc lev�e si nous essayons de le charger.

Prenons la classe suivante qui va nous servir de contr�leur :

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
43
public final class TestInjectionController implements Initializable { 
  
    @FXML 
    private Button button1; 
    @FXML 
    private Button button2; 
    @FXML 
    private Button button3; 
    @FXML 
    private Button button4; 
    @FXML 
    private Button button5; 
  
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
        System.out.println("Initialize !"); 
    } 
  
    @FXML 
    private void handleButton1() { 
        System.out.println("Bouton 1"); 
    } 
  
    @FXML 
    private void handleButton2() { 
        System.out.println("Bouton 2"); 
    } 
  
    @FXML 
    private void handleButton3() { 
        System.out.println("Bouton 3"); 
    } 
  
    @FXML 
    private void handleButton4() { 
        System.out.println("Bouton 4"); 
    } 
  
    @FXML 
    private void handleButton5() { 
        System.out.println("Bouton 5"); 
    } 
}

Nous pouvons injecter cette classe en tant que contr�leur de notre fichier FXML en faisant :

Code Java : S�lectionner tout
1
2
3
4
final URL fxmlURL = getClass().getResource("testinjection.fxml"); 
final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL); 
fxmlLoader.setController(new TestInjectionController()); 
final Node node = fxmlLoader.load();

D�sormais, nous pouvons charger le FXML sans lever d'exception et notre contr�leur prend en charge les actions des boutons. Nous pouvons voir �galement que la m�thode initialize() du contr�leur est correctement invoqu�e.

Mis � jour le 16 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 � 2025 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.