(JavaFX) 如何在不知道控制器名称的情况下将 class 的实例传递给 FXML 控制器?

(JavaFX) How to pass instance of class to an FXML controller without knowing that controller's name?

我正在开发一个具有多个 "child" FXML 视图的 JavaFX 应用程序。我正在努力确保所有 children 都可以访问 "root" 布局。

这是我的应用程序的基本层次结构:

RootLayout
  -> SubLayout1
    -> UnknownLayout

SubLayout1 是在 RootLayout.

上单击按钮时从 FXML 文件创建的

SubLayout1 控制器中,我有代码可以动态实例化和加载 UnknownLayout (FXML) 和 UnknownLayoutController(关联控制器)文件:

FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString()));
loader.setController(controller);
loader.setRoot(this);
loader.load();

filecontroller 都是在 FXML 加载完成之前分配的。

由于我是动态执行此操作的,所以我不知道 UnknownLayout 或其控制器的实际名称是什么。

我的问题是我不知道如何将 RootLayout 控制器的实例传递给 UnknownLayoutController 以便它可以访问该控制器中的方法。我确实在每个 UnknownLayoutController class 中都有一个方法可以让我将 RootLayout 的控制器传递给它:

public void setRootLayoutController (RootLayoutController rootController) {}

RootController 传递给 SubLayout1 不是问题,因为我可以使用构造函数传递它。但是在不知道 UnknownLayout 的实际名称的情况下,我将如何调用该方法?有没有办法从 FXMLLoader 块中调用新控制器的构造函数?有什么 "best practice" 方法可以做到这一点吗?

我的 controller 参考创建于此:

StringBuilder controller = new StringBuilder();
controller.append(title + "Controller.java");

提前感谢您提供的任何帮助!

编辑:我已经尝试了其他几个建议来完成此操作,包括 Passing Parameters JavaFX FXML,但我发现的所有内容都假设我在运行前知道新控制器的名称。

我还研究了在 UnknownLayoutController 中实现一个接口,但是我在这段代码上遇到了 NullPointerException 错误:

UnknownLayoutInterface subController = loader.getController();
subController.setRootController(rootController);

controller 变量是一个字符串, 保存有问题的控制器的名称,但是否有办法将字符串转换为 Object 的同名并以这种方式访问​​它?

(我现在在 FXML fx:controller 标记中而不是在代码中定义 FXMLs 控制器)。

我能够通过简化我的代码并根据文件名(动态确定)确定 class 类型来解决这个问题:

Class subLayout;
  SubLayout2Interface subInterface = null;
  try {
    subLayout = Class.forName([Full Package Name] + subLayoutTitle);
    subInterface = (SubLayout2Interface) subLayout.newInstance();
  } catch (Exception e) {
    e.printStackTrace();
}

subInterface.setRootController(this);