子控制器没有被注入主控制器

问题描述:

我有一个BorderPane(与MainController关联),FXML为BorderPane使用<fx:include>在BorderPane的底部区域包含一个Label(带有控制器StatusBarController)。不幸的是,StatusBarController没有注入到MainController类的实例中,我不明白为什么。子控制器没有被注入主控制器

main.fxml:BorderPane使用附带的状态栏

<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:标签和它的相关联的控制器

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

的MainController与用于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 
    } 
} 

和应用程序的启动:

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

我的样品的完整的源代码可在http://codestefan.googlecode.com/svn/trunk/SubcontrollerAccess/

所以现在的问题是:为什么StatusBarController未注入statusbarController变量MainController的?

感谢您的任何提示!

要使用@FXML标记你必须提供fx:id

更新您的main.fxml

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

后,您可以使用下一个常量在MainController.java

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

注意,这statusbarController不是partialy小写的类名,但fx:id + Controller字。

+1

谢谢,我意识到控制器变量的命名方案,但是我错过了将fx:id直接添加到fx:include(bb显然,这对于从具体ID中去除一般FXML代码也是有意义的)。它现在可以工作:-) – 2013-02-11 18:48:29

+0

@Sergey,我遇到了同样的问题,并且我的问题修复程序在您的NOTE fx:id + Controller中。一个很好的抓住!请回答这个问题与您的笔记,因为它解决了我的问题。 https://开头计算器。com/questions/45475209/null-exception-when-i-try-to-access-a-controller-that-i-passed-using-javafx – Moe 2017-08-04 11:30:15

+0

@当然,感谢提示:) – 2017-08-04 13:51:48

netbeans 8.0中也有嵌套fxmls的错误。不能指望netbeans为你创建嵌套的fxml的控制器对象,它必须手动插入到你的MainController中。每当netbeans中的控制器更新时,控制器都会被清除,所以它可能会很乏味。对于这个例子,将插入

@FXML private StatusBarController statusbarController;

在这种情况下手动插入主控制器,然后工作正常。对于组织大型fxmls /控制器非常有用。