【问题标题】:JavaFx optional parameters for controller class in start method when it is loaded into the FXML将控制器类加载到 FXML 时,控制器类在 start 方法中的 JavaFx 可选参数
【发布时间】:2018-01-19 10:33:37
【问题描述】:

我使用 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 的一些不错的功能。

【问题讨论】:

    标签: javafx javafx-8 fxml scenebuilder


    【解决方案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 方法运行之后,假设有一个。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2012-12-15
      • 2013-12-25
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多