JavaFX controller is always null

2020-04-30 01:52发布

I'll try to get in JavaFX 2 and used a simple demo app. The Project consists of 3 Files, the Main.java, the Controller.java and the sample.fxml.

In Sample.fxml i declared the controller:

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

And in my Main.java I try to access the controller

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

So my first idea was that the mapping doesn't work. So I added a initialize method in the controller.

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

The output is now:

init

null

So my Question now is how can i access the controller of a given fxml file?

标签: java javafx
2条回答
我命由我不由天
2楼-- · 2020-04-30 02:25

In addition to James_D's answer, I recommend to use the fx:root construct. Then you can inject the custom control (implemented by a controller) in another controller using the @FXML annotation.

查看更多
神经病院院长
3楼-- · 2020-04-30 02:30

The FXMLLoader.load(URL) method is a static method. So when you execute

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

you are not loading the FXML file from the instance of the FXMLLoader that you constructed ("loader"). (You're actually invoking the static method through an object reference.) Hence the loader's controller never gets initialized.

You need

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

This constructs a loader with a location specified, and then the load() method, which is not a static method, is properly invoked on the FXMLLoader instance. Then

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

will give the correct result.

查看更多
登录 后发表回答