FXML - Récupérer le contrôleur d'un sous contrôleur
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:
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:
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:
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
Comme prevu ca marche impec...
a.fxml
Code:
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:
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:
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:
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:
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:
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:
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:
1 2 3
| C controller initialized.
B controller initialized.
A controller initialized. |