在加载到FXML中时,start方法中的控制器类的JavaFx可选参数

时间:2018-01-19 10:33:37

标签: javafx javafx-8 fxml scenebuilder

使用ScheneBuilder我定义了我的fxml的控制器类,我的AnchorPane标签内的代码是:

fx:controller="demo.SplashController"

现在我想如果我在main中有args,使用适当的构造来加载新版本的控制器。我在Application.start中尝试了这段代码:

FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
PageController controller;
if(!dir.equals("")){ //attribute coming from args
  controller = new PageController(dir);
}else{
  controller = new PageController();  
}
loader.setController(controller);
AnchorPane root = loader.load();
Scene scene = new Scene(root,480,414);
primaryStage.setScene(scene);
primaryStage.show();

但使用此代码会出现冲突,因为我已经使用FXML代码在我的项目中定义了控制器,解决它就足以删除FXML代码中的段但我不会这样做,因为将代码保留在fxml允许我访问SceneBuilder的一些很好的功能。

1 个答案:

答案 0 :(得分:1)

将参数传递给控制器​​的构造函数的唯一方法是在fxml中指定控制器的类是使用控制器工厂:

FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
loader.setControllerFactory(cl -> dir.isEmpty() ? new PageController() : new PageController(dir));
AnchorPane root = loader.load();

另一种选择是在控制器类中创建一个方法,允许您在加载后传递信息并进行初始化:

FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
AnchorPane root = loader.load();
PageController controller = loader.getController();
controller.setDir(dir);

请注意,方法调用在运行initialize方法后发生,假设有一个。