IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

FXML - Récupérer le contrôleur d'un sous contrôleur


Sujet :

JavaFX

  1. #1
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut FXML - Récupérer le contrôleur d'un sous contrôleur
    Bonjour,

    Je commence à faire une IHM en Javafx en utilisant le FXML. J'ai découpé l'IHM en plusieurs morceaux et j'ai un FXML inclus dans un FXML lui même inclus dans un FXML. Je cherche à récupérer le controlleur du FXML du troisième niveau.
    Pour être plus précis, le premier FXML est chargé par une classe Java (qui sert également de contrôleur à ce FXML) grâce à FXMLLoader. Donc il est facile de récupérer le contrôleur du second FXML (déclaré dans le FXML) grâce à l'annotation @FXML. Par contre, je ne sais pas comment récupérer le contrôleur déclaré dans le troisième FXML qui est inclus dans le second. Est-ce possible ?

    Bien sûr ça serait possible en chargeant les trois FXML dans leur contrôleur en utilisant un FXMLLoader, mais il me faudrait également ajouter à la main tous les actionListener. Cette façon de faire rajouterait beaucoup de code et rendrait le code plus lourd.


    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Non, à ma connaissance pas directement. Le 2nd est injecté implicitement dans le 1er, le 3ème est injecté implicitement dans le 2nd. Pour récupérer le 3ème dans le 1er il faut que le 2nd te fournisse une méthode pour le récupérer.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    Je suis bien d'accord, mon souci c'est que lors de l'appel de la méthode "@FXML initialize" du premier contrôleur, je cherche à propager une initialisation dans les autres contrôleurs, hors la référence du contrôleur du troisième FXML est à NULL (alors que celle du second est correctement initialisée).
    Je m'attendais à un mécanisme fonctionnant comme des poupées russes : appel au constructeur et initialize du troisième, puis constructeur et initialize du second, et enfin du premier et donc une fois dans l'initialize du premier, tout ce qui est en dessous est déjà chargé.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Normalement, lorsque la méthode initialize() du 1er contrôleur est invoquée, toutes les variables ont déjà été injectées et donc initialisées. Donc le 2nd contrôleur est déjà initialisé.
    De la même manière, lorsque la méthode initialize() du 2nd contrôleur est invoquée, toutes les variables ont déjà été injectées et donc initialisées. Donc le 3ème contrôleur est déjà initialisé.

    Si la référence est encore null vérifie que tu n'as pas une faute d'orthographe dans le nom du contrôleur.
    Je ferai un prog de test à l'occasion quand le JDK 9 arrêtera de m'embêter.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Comme prevu ca marche impec...


    a.fxml
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?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 id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.AController">
            <fx:include fx:id="b" source="b.fxml"/>
    </AnchorPane>

    b.fxml
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?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 id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.BController">
        <fx:include fx:id="c" source="c.fxml"/>
    </AnchorPane>

    c.fxml
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?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 id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.CController">
    </AnchorPane>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package test;
     
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.Node;
     
    public class AController implements Initializable {
     
        @FXML    
        private Node b;
        @FXML    
        private BController bController;
     
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            System.out.println("A controller initialized.");
            assert (b != null);
            assert (bController != null);
            assert (bController.getSubController() != null);
        }        
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package test;
     
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.Node;
     
    public class BController implements Initializable {
     
        @FXML    
        private Node c;
        @FXML    
        private CController cController;
     
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            System.out.println("B controller initialized.");
            assert (c != null);
            assert (cController != null);
        }
     
        public CController getSubController() {
            return cController;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test;
     
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.fxml.Initializable;
     
    public class CController implements Initializable {
     
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            System.out.println("C controller initialized.");
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package test;
     
    import java.io.IOException;
    import java.util.Optional;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
     
    public class Main extends Application {
     
        @Override
        public void start(Stage primaryStage) {
            Optional.ofNullable(getClass().getResource("a.fxml"))
                    .ifPresent(url -> {
                        try {
                            final Parent root = new FXMLLoader(url).load();
                            final Scene scene = new Scene(root);
                            primaryStage.setScene(scene);
                        } catch (IOException ex) {
                            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    });
            primaryStage.setTitle("Hello World!");
            primaryStage.show();
        }
     
        public static void main(String[] args) {
            launch(args);
        }
    }
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C controller initialized.
    B controller initialized.
    A controller initialized.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    En effet... et c'est même rassurant ! Merci pour l'exemple.
    Me reste plus qu'à chercher où se trouve mon erreur...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/06/2013, 12h30
  2. Récupérer une variable de session côté contrôleur
    Par daydream123 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 09/05/2012, 19h14
  3. Récupérer la date du jour sous forme d'int...
    Par Empty_body dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 28/03/2007, 10h38
  4. [CR]Récupérer un résumé d'un sous état dans l'état principal
    Par sylviefrfr dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/03/2006, 11h58
  5. récupérer dans 1 menu le sous menu séléctionner
    Par vincedjs dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 02/03/2006, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo