JavaFx 控制器 class 的可选参数在启动方法加载到 FXML 时
JavaFx optional parameters for controller class in start method when it is loaded into the FXML
我用 ScheneBuilder 定义了我的 fxml 的控制器 class,在我的 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 的一些好的功能。
将参数传递给控制器的构造函数和在fxml中指定控制器的class的唯一方法是使用控制器工厂:
FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
loader.setControllerFactory(cl -> dir.isEmpty() ? new PageController() : new PageController(dir));
AnchorPane root = loader.load();
另一种选择是在控制器中创建一个方法class,允许您在加载后传递信息并进行初始化:
FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
AnchorPane root = loader.load();
PageController controller = loader.getController();
controller.setDir(dir);
请注意,方法调用发生在 initialize
方法之后 运行 假设有一个。
我用 ScheneBuilder 定义了我的 fxml 的控制器 class,在我的 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 的一些好的功能。
将参数传递给控制器的构造函数和在fxml中指定控制器的class的唯一方法是使用控制器工厂:
FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
loader.setControllerFactory(cl -> dir.isEmpty() ? new PageController() : new PageController(dir));
AnchorPane root = loader.load();
另一种选择是在控制器中创建一个方法class,允许您在加载后传递信息并进行初始化:
FXMLLoader loader = new FXMLLoader(getClass().getResource("page.fxml"));
AnchorPane root = loader.load();
PageController controller = loader.getController();
controller.setDir(dir);
请注意,方法调用发生在 initialize
方法之后 运行 假设有一个。