代码之家  ›  专栏  ›  技术社区  ›  Francesco

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

  •  0
  • Francesco  · 技术社区  · 6 年前

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

    fx:controller="demo.SplashController"
    

    现在,我想如果我在main中有args,使用适当的构造加载控制器的新版本。我在应用程序中尝试此代码。开始时间:

    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 回复  |  直到 6 年前
        1
  •  1
  •   fabian    6 年前

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

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

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

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

    请注意,方法调用发生在 initialize 方法在假定存在的情况下运行。