Supposons que j'ai deux fichiers FXML: principal et celui avec le composant personnalisé. Je veux avoir accès aux principaux composants de fichier du contrôleur personnalisé, comme celui-ci:Comment accéder aux composants de différents contrôleurs de fichiers?
Main.fxml:
<FlowPane>
<children>
<TextField fx:id="source" />
<CustomBox fx:id="cbox" />
</children>
</FlowPane>
Custom.fxml:
<fx:root type="HBox">
<children>
<Button fx:id="showButton" onAction="#show" text="Show" />
</children>
</fx:root>
CustomBox.java:
public class CustomBox extends HBox {
@FXML
private TextField source;
public CustomBox() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Custom.fxml"));
loader.setRoot(this);
loader.setController(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@FXML
protected void show() {
System.out.println(source.getText());
}
}
Mais la méthode show() me donne NPE. Comment puis-je lier des composants et des contrôleurs à partir de différents fichiers?
Vous ne pouvez pas injecter des contrôles définis dans un fichier FXML dans le contrôleur pour un autre fichier FXML - et en général c'est une mauvaise pratique d'exposer les contrôles en dehors du contrôleur pour le FXML dans lequel ils sont définis. Au lieu de cela, passez une référence au contrôleur principal au composant personnalisé et appelez une méthode sur le contrôleur principal pour extraire le texte (ou utilisez une approche MVC et définissez une classe de modèle et partagez une instance du modèle avec les deux contrôleurs). –