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

时间:2016-07-23 13:30:22

标签: java javafx fxml

我正在开发一个JavaFX应用程序,它有几个" child" FXML视图。我正在努力确保所有的孩子都可以访问" 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();

在完成FXML加载之前,filecontroller都已分配。

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

我的问题是我无法弄清楚如何将RootLayout控制器的实例传递给UnknownLayoutController,以便它可以访问该控制器中的方法。我在每个UnknownLayoutController类中都有一个方法,允许我将RootLayout的控制器传递给它:

public void setRootLayoutController (RootLayoutController rootController) {}

RootController传递给SubLayout1不是问题,因为我可以使用构造函数传递它。但是,如果不知道UnknownLayout的实际名称,我将如何调用该方法?有没有办法从FXMLLoader块中调用新控制器的构造函数?任何"最佳实践"如何实现这个目标?

我的controller引用在此处创建:

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

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

编辑:我已经尝试了其他一些建议来完成此任务,包括Passing Parameters JavaFX FXML,但我发现的一切都假定我在运行时之前知道新控制器的名称。

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

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

controller变量是执行保存有问题的控制器名称的字符串,但是有一种方法可以将String转换为具有相同名称和访问权限的对象就这样?

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

1 个答案:

答案 0 :(得分:0)

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

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);