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

当控制器类加载到FXML中时,start方法中控制器类的JavaFx可选参数,javafx,javafx-8,fxml,scenebuilder,Javafx,Javafx 8,Fxml,Scenebuilder,使用ScheneBuilder,我定义了fxml的控制器类,AnchorPane标记中生成的代码是: fx:controller="demo.SplashController" 现在,我想如果我的主要参数,加载控制器的新版本,使用适当的构造。我在应用程序中尝试此代码。开始: FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml")); PageController controller; if(!dir.equ

使用ScheneBuilder,我定义了fxml的控制器类,AnchorPane标记中生成的代码是:

fx:controller="demo.SplashController"
现在,我想如果我的主要参数,加载控制器的新版本,使用适当的构造。我在应用程序中尝试此代码。开始:

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的一些良好功能。

将参数传递给控制器的构造函数和指定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
方法运行后(假设存在)