Reputation: 161
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!
Upvotes: 15
Views: 20383
Reputation: 1
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();
Upvotes: 0
Reputation: 3714
Use getResourceAsStream
instead :
anchorPane = loader.load(LightView.class.getResourceAsStream(fxmlFile));
Its simple, work well.
Upvotes: 0
Reputation: 1848
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.
Upvotes: 5
Reputation: 2321
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
Upvotes: 49