web-dev-qa-db-fra.com

Contrôleurs imbriqués JavaFx (FXML <include>)

Dans this tutotial, est un exemple de la façon d'inclure des composants personnalisés et d'utiliser leurs contrôleurs à partir du contrôleur du conteneur.

main_window_content.fxml

<VBox fx:controller="com.foo.MainController">
   <fx:include fx:id="dialog" source="dialog.fxml"/>
   ...
</VBox>

MainController.Java

public class MainController extends Controller {
    @FXML private Window dialog;
    @FXML private DialogController dialogController;

    ..

Si le composant n'est inclus qu'une seule fois, il fonctionne correctement. Si le même composant est inclus deux fois, les contrôleurs ne sont pas initialisés. Les deux contrôleurs sont nuls.

main_window_content.fxml

    <VBox fx:controller="com.foo.MainController">
       <fx:include fx:id="dialog1" source="dialog.fxml"/>
       <fx:include fx:id="dialog2" source="dialog.fxml"/>
       ...
    </VBox>

MainController.Java

    public class MainController extends Controller {
        @FXML private Window dialog1;
        @FXML private DialogController dialogController1;
        @FXML private Window dialog2;
        @FXML private DialogController dialogController2;

Quelqu'un pourrait-il m'aider à résoudre le problème? Merci

Ceci est mon code de chargement FXML. Il est exécuté dans la méthode d'application principale:

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("main_window_content.fxml"));
    stage.setTitle("FXML Welcome"); 
    stage.setScene(new Scene(root, 300, 275));
    stage.show(); 
}
27
Antonello

Grâce à Daniel (d'OTN), j'ai trouvé l'erreur dans mon code, les noms de mes variables de contrôleur étaient faux. Ils devraient être <fx:id>Controller. En d'autres termes, cela devrait être:

MainController.Java

public class MainController extends Controller {
@FXML private Window dialog1;
@FXML private DialogController dialog1Controller;
@FXML private Window dialog2;
@FXML private DialogController dialog2Controller;

Mais en étudiant les changements introduits dans la version 2.2, j'ai trouvé que tout peut être facilement résolu en utilisant <fx:root> tag ( comme ce tutoriel ). J'ai entré mon composant dans FXML en le déclarant simplement comme ceci:

<HBox>
    <Dialog id="dialog1" text="Hello World!"/>
    <Dialog id="dialog2" text="Hello World!"/>
</HBox>

J'espère être utile

36
Antonello

Il semble y avoir un bogue dans netbeans 8.0 avec des fxml imbriqués également. Impossible de compter sur les netbeans pour créer l'objet contrôleur du fxml imbriqué pour vous, il doit être inséré manuellement dans votre MainController. Chaque fois que le contrôleur est mis à jour dans les netbeans, il est effacé, ce qui peut être fastidieux. Pour cet exemple, ce serait insérer le

@FXML private DialogController dialog1Controller;

ligne manuellement dans le contrôleur principal dans ce cas, alors cela fonctionne normalement. Très utile pour organiser de grands fxml/contrôleurs.

2
SamHuman