JavaFx:如何从CustomComponentController类引用主Controller类实例?

时间:2013-07-09 14:14:41

标签: reference controller javafx instance custom-component

我有一个标准的JavaFX应用程序:Main.java, MainController.java & main.fxml。要添加自定义组件,我创建了CustomComponentController.javacustom_component_controller.fxml

问题是在CustomComponentController方法中我需要引用MenuController中的其他方法和标准组件。我将public static MainController mc;添加到MainController类主体,以便可以从CustomComponentControllerMainController.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

2 个答案:

答案 0 :(得分:2)

如果您符合以下条件,则可以解决问题:

  1. 不仅是公开的,而且是强制性的静态MainController mc应该是。

  2. 不要忘记CustomComponentController的fxml中的id:<CustomComponentController fx:id="cc"/>,其中cc是MainController类中“@FXML导入”CustomComponentController的名称。

  3. fx:controller="main.CustomComponentController"中省略参数custom_component_controller.fxml,因为它导致“已指定控制器值”错误(main.fxmlcustom_component_controller.fxml标记声明的控制器之间发生冲突)。

  4. mc = this;放在MainController的{​​{1}}方法的开头。在CustomComponentController类中使用initialize()之前,请检查它是否为null。当所有组件(包括mc)在应用程序启动时实例化时,它可以为null,但是还没有mc实例。实现MainController的MainController方法CustomComponentController在加载组件后调用。因此,更好的做法是在下一段中使用方法。

  5. initialize()创建main.fxml相同类型且仅包含CustomComponentController参数的主要组件。通过创建fx:id方法并使用CustomComponentController的{​​{1}}方法调用主要组件,将主要组件替换为reloadCustomComponents()。通过向CustomComponentController方法添加以下内容来实现:

    customComponentAnchorPane.getChildren()除去(customComponent);

    customComponent = new customComponent();

    customComponentAnchorPane.getChildren()添加(customComponent);

  6. 因此,所有组件都可以放在initialize()之外,并使用所有方法,并在启动时重新加载。所有组件声明都保留在reloadCustomComponents()类中,可以通过CustomComponentController引用访问。不需要使用参数重复创建组件。

答案 1 :(得分:0)

您的问题看起来像经典的catalog-crud表单更新,我使用Updatable实现了一个名为update method的界面,因此我可以在传递{{{}}后轻松引用任何目录表单。 1}}作为子根组件表单的Controller Main Class

希望它可以解决您的问题