我正在开发一个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加载之前,file
和controller
都已分配。
由于我是动态执行此操作,因此我不知道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
中实现一个接口,但是我在这段代码上得到了一个NullPointerException错误:
UnknownLayoutInterface subController = loader.getController();
subController.setRootController(rootController);
controller
变量是执行保存有问题的控制器名称的字符串,但是有一种方法可以将String转换为具有相同名称和访问权限的对象就这样?
(我现在在FXML fx:controller
标签中而不是在代码中定义FXML控制器。
答案 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);