我有一个标准的JavaFX应用程序:Main.java, MainController.java & main.fxml
。要添加自定义组件,我创建了CustomComponentController.java
和custom_component_controller.fxml
。
问题是在CustomComponentController
方法中我需要引用MenuController
中的其他方法和标准组件。我将public static MainController mc;
添加到MainController
类主体,以便可以从CustomComponentController
(MainController.mc.neededMethod()
)查看。然后我尝试在MainController.initialize()
方法(mc = this;
)中将所有内容传递给它 - 在调试此断点时,我看到this
充满了组件实例,但mc
仍为null组件之后。
问题是如何引用MainController
的运行实例来在其他类中使用其组件和方法,以及相互交叉引用不同的自定义组件?如何从事件处理程序和组件的辅助方法中清除MainController
代码,方法是将它们全部移动到组件自己的类中?
我尝试了以下方法,但没有办法让它们正常工作:
Accessing FXML controller class
How can I access a Controller class in JavaFx 2.0?
JavaFX 2.0 + FXML. Updating scene values from a different Task
JavaFX 2.2 -fx:include - how to access parent controller from child controller
答案 0 :(得分:2)
如果您符合以下条件,则可以解决问题:
不仅是公开的,而且是强制性的静态MainController mc
应该是。
不要忘记CustomComponentController的fxml中的id:<CustomComponentController fx:id="cc"/>
,其中cc是MainController类中“@FXML导入”CustomComponentController的名称。
在fx:controller="main.CustomComponentController"
中省略参数custom_component_controller.fxml
,因为它导致“已指定控制器值”错误(main.fxml
和custom_component_controller.fxml
标记声明的控制器之间发生冲突)。
将mc = this;
放在MainController
的{{1}}方法的开头。在CustomComponentController类中使用initialize()
之前,请检查它是否为null。当所有组件(包括mc
)在应用程序启动时实例化时,它可以为null,但是还没有mc实例。实现MainController的MainController方法CustomComponentController
在加载组件后调用。因此,更好的做法是在下一段中使用方法。
在initialize()
创建main.fxml
相同类型且仅包含CustomComponentController
参数的主要组件。通过创建fx:id
方法并使用CustomComponentController
的{{1}}方法调用主要组件,将主要组件替换为reloadCustomComponents()
。通过向CustomComponentController
方法添加以下内容来实现:
customComponentAnchorPane.getChildren()除去(customComponent);
customComponent = new customComponent();
customComponentAnchorPane.getChildren()添加(customComponent);
因此,所有组件都可以放在initialize()
之外,并使用所有方法,并在启动时重新加载。所有组件声明都保留在reloadCustomComponents()
类中,可以通过CustomComponentController
引用访问。不需要使用参数重复创建组件。
答案 1 :(得分:0)
您的问题看起来像经典的catalog-crud表单更新,我使用Updatable
实现了一个名为update method
的界面,因此我可以在传递{{{}}后轻松引用任何目录表单。 1}}作为子根组件表单的Controller Main Class
希望它可以解决您的问题