2013-02-09 7 views
8

eingespeist Ich habe einen BorderPane (einem MainController zugeordnet), der FXML für BorderPane verwendet <fx:include>, um ein Label (mit einem Controller StatusBarController) in den unteren Bereich des BorderPane einzubinden. Leider wird der StatusBarController nicht in die MainController-Klasseninstanz eingefügt und ich kann nicht verstehen warum.Subcontroller wird nicht in den Hauptregler

main.fxml: BorderPane mit dem mitgelieferten statusbar

<fx:root type="javafx.scene.layout.BorderPane" fx:id="borderPane" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.controllers.MainController"> 
    <bottom> 
    <fx:include source="statusbar.fxml" /> 
    </bottom> 
</fx:root> 

statusbar.fxml: das Etikett und es zugehörige Steuerung

<Label fx:id="statusbar" text="A label simulating a status bar" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.controllers.StatusBarController" /> 

Die MainController mit einem Feld für die StatusBarController :

public class MainController 
{ 
    @FXML 
    private StatusBarController statusbarController; // PROBLEM HERE: I would expect the StatusBarController to be injected but this does not happen! 


    // Implementing Initializable Interface no longer required on JavaFX 2.2 according to 
    // http://docs.oracle.com/javafx/2/fxml_get_started/whats_new2.htm 
    // (I also tested this, the initialize() method is being called) 
    @SuppressWarnings("unused") // only called by the FXMLLoader 
    @FXML // This method is called by the FXMLLoader when initialization is complete 
    private void initialize() { 
     // initialize your logic here: all @FXML variables will have been injected 
     assert borderPane != null : "fx:id=\"borderPane\" was not injected: check your FXML file 'main.fxml'."; 
     System.out.println("MainController initialize()"); 

     //statusbarController.setStatusText("Hello from MainController"); // PROBLEM HERE: this fails because statusbarController is not injected as expected 
    } 
} 

Und der Start der Anwendung:

public void start(Stage primaryStage) 
    {  
     Parent root = null; 

     try { 
      root = FXMLLoader.load(getClass().getResource("/resources/main.fxml")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     primaryStage.setTitle("Demo"); 
     primaryStage.setScene(new Scene(root, 800, 600)); 
     primaryStage.show(); 
    } 

Der vollständige Quellcode meiner Probe bei http://codestefan.googlecode.com/svn/trunk/SubcontrollerAccess/ verfügbar ist

Die Frage ist also: Warum ist der StatusBarController nicht in die statusbarController Variable injiziert des MainControllers?

Danke für jeden Hinweis!

Antwort

15

Um @FXML zu verwenden, müssen Sie fx:id angeben.

Aktualisieren Sie Ihre main.fxml:

<bottom> 
    <fx:include fx:id="statusbar" source="statusbar.fxml" /> 
</bottom> 

Danach können Sie neben Konstanten in Ihrem MainController.java verwenden können:

@FXML 
Label statusbar; // node itself 
@FXML 
private StatusBarController statusbarController; // controller 

Hinweis, dass statusbarController kein partialy klein geschrieben Klassenname ist, aber fx:id + Controller Wort .

+1

Danke, mir war das Benennungsschema für die Controllervariable bekannt, aber ich vermisste das Hinzufügen von fx: id direkt zum fx: include (das macht natürlich auch Sinn, einen allgemeinen FXML-Code von einer konkreten ID zu entkoppeln). Es funktioniert jetzt :-) –

+0

@Sergey, hatte ich das gleiche Problem, und meine Problembehebung war in Ihrem NOTE fx: ID + Controller. ein schöner Fang !!!! Bitte beantworte diese Frage mit deiner Notiz, da sie mein Problem behoben hat. https: // Stapelüberlauf.com/questions/45475209/null-ausnahme-wenn-ich-versuchen-zu-ein-controller-das-ich-übergeben-using-javafx – Moe

+0

@Meine sicher, danke für den Hinweis :) –

0

Es scheint einen Fehler in netbeans 8.0 mit verschachtelten fxmls zu geben. Kann nicht auf Netbeans zählen, um das Controllerobjekt des verschachtelten fxml für Sie zu erstellen, es muss manuell in Ihren MainController eingefügt werden. Jedes Mal, wenn der Controller in Netbeans aktualisiert wird, wird er gelöscht, so dass es etwas mühsam sein kann. Für dieses Beispiel würde das Einfügen der

@FXML privaten StatusBarController statusbarController;

Zeile manuell in den Hauptcontroller in diesem Fall, dann funktioniert es normal. Sehr nützlich für die Organisation großer Fxmls/Controller.