2012-09-22 5 views
21

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.Contrôleurs imbriqués JavaFx (FXML <include>)

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 est inclus une seule fois, cela fonctionne très bien. Si le même composant est inclus deux fois, les contrôleurs ne sont pas initialisés. Les deux contrôleurs sont NULL.

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 me aider à résoudre le problème? merci

Ceci est mon code de chargement FXML. Il est exécuté dans le principal mode d'application:

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(); 
} 
+0

La deuxième réponse est la bonne solution pour cette question, il devrait être marqué "Accepté" –

+0

@AmirArad Lequel est le "second"? – glglgl

Répondre

29

Merci à Daniel (de OTN) J'ai trouvé l'erreur dans mon code, les noms de mes variables du contrôleur ont eu tort. Ils devraient être <fx:id>Controller. En d'autres termes, il 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 l'étude de la changes introduit dans la version 2.2, je trouve que tout peut être facilement résolu en utilisant <fx:root> étiquette (like this tutorial). je suis entré dans mon élément en FXML déclarant simplement comme ceci:

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

J'espère être utile

+16

En outre, marquer votre propre réponse comme acceptée, pour le rendre plus visible comme la solution à votre problème. Cliquez simplement sur la coche à côté de cette réponse. –

1

Il semble y avoir un bug dans NetBeans 8.0 avec fxmls imbriqués ainsi. Vous ne pouvez pas compter sur netbeans pour créer l'objet contrôleur fxml imbriqué pour vous, il doit être inséré manuellement dans votre MainController. Chaque fois que le contrôleur est mis à jour dans netbeans, il est effacé, ce qui peut être fastidieux. Pour cet exemple qui serait l'insertion des

@FXML private DialogController dialog1Controller; 

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