JavaFX控制器始终为null

时间:2014-04-07 11:07:01

标签: java javafx

我将尝试使用JavaFX 2并使用一个简单的演示应用程序。 该项目包含3个文件,Main.java,Controller.java和sample.fxml。

在Sample.fxml中,我声明了控制器:

<GridPane fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

在我的Main.java中,我尝试访问控制器

    FXMLLoader loader = new FXMLLoader();
    Parent root = loader.load(getClass().getResource("sample.fxml"));
    System.out.println(loader.getController()); //prints always null

所以我的第一个想法是映射不起作用。所以我在控制器中添加了一个初始化方法。

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    System.out.println("init");
}

输出现在是:

  

初​​始化

     

所以现在我的问题是如何访问给定fxml文件的控制器?

2 个答案:

答案 0 :(得分:3)

FXMLLoader.load(URL)方法是一种静态方法。所以当你执行

  FXMLLoader loader = new FXMLLoader();
  Parent root = loader.load(getClass().getResource("sample.fxml"));

您没有从您构建的FXMLLoader实例加载FXML文件(&#34; loader&#34;)。 (您实际上是通过对象引用调用静态方法。)因此,加载器的控制器永远不会被初始化。

你需要

  FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
  Parent root = loader.load();

这构造了一个指定了位置的加载器,然后在FXMLLoader实例上正确调用了load()方法,该方法不是静态方法。然后

System.out.println(loader.getController());

会给出正确的结果。

答案 1 :(得分:2)

除了James_D的回答,我建议使用fx:root构造。然后,您可以使用@FXML注释将自定义控件(由控制器实现)注入另一个控制器。