Bonjour,

Je travaille avec Java11 et JavaFX11 (avec IntelliJ version Octobre 2019).

Je cherche à construire une IG respectant MVC. Pour cela, je construis une trame de la fenêtre principale, incluant des composants xml. Chacun de ces composants indépendant a un contrôleur, à qui j'aimerais pouvoir transmettre le modèle pour qu'il puisse travailler.

Le code repris en bas de cette page, posté il y a 2 ans, fonctionne sans problème. Il montre comment imbriquer des composants et récupérer le contrôleur par injection. Je cherche à l'adapter pour pouvoir transmettre le modèle à tous les contrôleurs. J'ai donc adapté le main en écrivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
        MonModele monModele = ...  ;
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("a.fxml"));
        AController ac = new AController(monModele);
        loader.setControllerFactory(instanciatedClass -> { return ac; });
        Parent root = loader.load();
J'ai bien sûr changé le code de la classe AControlleur en conséquence, pour la doter d'un constructeur adéquat.
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
 
package test;
import java.net.URL;
import java.util.ResourceBundle;
 
import modele.MonModele;
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;
 
    public AController(MonModele m) {
        System.out.println("A création avec modèle.");
    }
 
    public AController() {
        System.out.println("A création.");
    }
 
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        assert (b != null);
        assert (bController != null);
        assert (bController.getSubController() != null);
    }
}
A l'exécution, la trace indique
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
A création avec modèle.
A controller initialized.
et l'exécution s'arrête avec violation de l'assertion assert (b != null);

Quelque chose m'échappe sûrement, mais je ne trouve pas laquelle.
Quelqu'un a une idée ?
Merci

Citation Envoyé par bouye Voir le message
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.