15

Recently I was programming a software with JavaFx2.0,but I met with a big problem,that is - How can I access a Controller class? For every controller class with the same class type,they may act different because of the model it depends on,so I want to get the view's Controller class and provide it with the specified model,can I do this? I have tried to get the controller by the FXMLLoader,but the method getController() returns null!why?

1.LightView.java

FXMLLoader loader = new FXMLLoader();
anchorPane = loader.load(LightView.class.getResource(fxmlFile));//fxmlFile = "LightView.fxml"
//controller = (LightViewController) loader.getController();//fail to get controller!it is null
//I want to -> controller.setLight(light);

2.LightView.fxml

<AnchorPane ... fx:controller="light.LightViewController" >

3.LightViewController.java

....
private Light light;
public void initialize(URL arg0, ResourceBundle arg1)

4.Light.java

.... a simple pojo

so,what I want to do is provide every LightViewController with a specified Light Object(they are from a List). Can anyone helps me?Thanks a lot!

yinger090807
  • 161
  • 1
  • 1
  • 5
  • 1
    possible duplicate of [JavaFX 2.0 + FXML. Updating scene values from a different Task](http://stackoverflow.com/questions/10107829/javafx-2-0-fxml-updating-scene-values-from-a-different-task) –  Jul 23 '12 at 01:33
  • 1
    Maybe this answer could be helpful: [http://stackoverflow.com/a/10108788/682495](http://stackoverflow.com/a/10108788/682495). – Uluk Biy Apr 20 '12 at 08:52

4 Answers4

49

I use the following :

URL location = getClass().getResource("MyController.fxml");

FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());

Parent root = (Parent) fxmlLoader.load(location.openStream());

In this way fxmlLoader.getController() is not null

blo0p3r
  • 6,790
  • 8
  • 49
  • 68
Alf
  • 2,291
  • 1
  • 28
  • 34
5

In addition to Alf's answer, I want to note, that the code can be shorter:

URL location = getClass().getResource("MyController.fxml");

FXMLLoader fxmlLoader = new FXMLLoader();

Parent root = (Parent) fxmlLoader.load(location.openStream());

This works as well.

Matthias Braun
  • 32,039
  • 22
  • 142
  • 171
ITurchenko
  • 1,828
  • 2
  • 17
  • 24
0

Use getResourceAsStream instead :

anchorPane = loader.load(LightView.class.getResourceAsStream(fxmlFile));

Its simple, work well.

panoet
  • 3,608
  • 1
  • 16
  • 27
0

You can try this...

    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("LightView.fxml"));
    loader.load();
    Parent parent = loader.getRoot();
    Scene Scene = new Scene(parent);
    Stage Stage = new Stage();
    LightViewController lv = loader.getController();
    lv.setLight(light);
    Stage.setScene(Scene);
    Stage.show();
JustJ
  • 1
  • 3