
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.
- Qu'est-ce qu'un contr�leur ?
- Comment d�clarer un contr�leur dans un fichier FXML ?
- Comment acc�der au contr�leur d'un fichier FXML ?
- Qu'est-ce que l'interface Initializable ?
- Comment injecter des ressources dans un contr�leur ?
- Comment acc�der au contr�leur d'un fichier FXML inclus dans un autre fichier FXML ?
- Comment invoquer une m�thode du contr�leur depuis le document FXML ?
- Comment injecter un contr�leur dans le document FXML ?
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.
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.
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(); |
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. } } |
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.
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; } |
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.
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.
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 �aLes 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.