(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();
file
和 controller
都是在 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);
我正在开发一个具有多个 "child" FXML 视图的 JavaFX 应用程序。我正在努力确保所有 children 都可以访问 "root" 布局。
这是我的应用程序的基本层次结构:
RootLayout
-> SubLayout1
-> UnknownLayout
SubLayout1
是在 RootLayout
.
在 SubLayout1
控制器中,我有代码可以动态实例化和加载 UnknownLayout
(FXML) 和 UnknownLayoutController
(关联控制器)文件:
FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString()));
loader.setController(controller);
loader.setRoot(this);
loader.load();
file
和 controller
都是在 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);