2012-09-22 13 views
21

Nel tutoriale this, è un esempio di come includere componenti personalizzati e utilizzare i relativi controller dal controller del contenitore.Controllori nidificati 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; 

    .. 

Se il componente è incluso solo una volta, funziona benissimo. Se lo stesso componente è incluso due volte, i controller non sono inizializzati. Entrambi i controller sono nulli.

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; 

Qualcuno potrebbe aiutarmi a risolvere il problema? grazie

Questo è il mio codice di caricamento FXML. Esso viene eseguito nel metodo di applicazione 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(); 
} 
+0

La seconda risposta è la soluzione giusta per questa domanda, dovrebbe essere contrassegnata come "Accettata" –

+0

@AmirArad Qual è il "secondo"? – glglgl

risposta

29

Grazie a Daniel (da OTN) ho trovato l'errore nel mio codice, i nomi dei miei variabili controllore erano sbagliate. Dovrebbero essere <fx:id>Controller. In altre parole, dovrebbe essere:

MainController.java

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

Ma studiando il changes introdotto nella versione 2.2 ho scoperto che tutto può essere facilmente risolto utilizzando <fx:root> tag (like this tutorial). ho inserito il mio componente FXML semplicemente dichiarando in questo modo:

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

spero di essere utile

+16

Inoltre, contrassegna la tua risposta come accettata, per renderla più visibile come soluzione al tuo problema. Basta fare clic sul segno di spunta accanto a questa risposta. –

1

Sembra che ci sia un bug in NetBeans 8.0 con fxmls nidificate pure. Non posso contare su netbeans per creare per te l'oggetto controller fxml annidato, deve essere inserito manualmente nel tuo MainController. Ogni volta che il controllore viene aggiornato in netbeans viene spazzato via in modo che possa essere un po 'noioso. Per questo esempio che sarebbe inserendo manualmente la riga

@FXML private DialogController dialog1Controller; 

nel controller principale in questo caso, quindi funziona normalmente. Molto utile per organizzare fxml/controller di grandi dimensioni.

Problemi correlati