小编典典

JavaFX控制器始终为null

java

我将尝试使用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

所以我的第一个想法是映射不起作用。因此,我在控制器中添加了一个initialize方法。

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

现在的输出是:

在里面

空值

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


阅读 395

收藏
2020-11-26

共1个答案

小编典典

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

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

您不是从构造的FXMLLoader实例(“
loader”)中加载FXML文件。(实际上,您是通过对象引用调用静态方法的。)因此,加载程序的控制器永远不会初始化。

你需要

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

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

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

会给出正确的结果。

2020-11-26