1

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

问题是在CustomComponentController方法中我需要引用其他方法和标准组件MenuController。我添加public static MainController mc;MainController类主体中,以便可以从CustomComponentController( MainController.mc.neededMethod()) 中看到它。然后我尝试在MainController.initialize()方法 ( mc = this;) 中将所有内容传递给它 - 在调试此断点时,我看到this充满了组件实例,但mc之后仍保留为空组件。

问题是如何引用正在运行的实例MainController以在其他类中使用其组件和方法,并相互交叉引用不同的自定义组件?如何通过将MainController代码全部移动到组件自己的类来从组件的事件处理程序和辅助方法中清除代码?

我尝试了以下方法,但没有办法让它们正常工作:

访问 FXML 控制器类

如何访问 JavaFx 2.0 中的 Controller 类?

JavaFX 2.0 + FXML。从不同的任务更新场景值

JavaFX 2.2 -fx:include - 如何从子控制器访问父控制器

4

2 回答 2

2

满足以下条件即可解决问题:

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

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

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

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

  5. main.fxml创建CustomComponentController具有唯一fx:id参数的相同类型的主要组件。CustomComponentController通过创建方法并从的方法reloadCustomComponents()调用它来替换主要组件。通过将以下内容添加到方法来做到这一点:CustomComponentControllerinitialize()reloadCustomComponents()

    customComponentAnchorPane.getChildren().remove(customComponent);

    customComponent = new customComponent();

    customComponentAnchorPane.getChildren().add(customComponent);

因此,所有组件都可以CustomComponentController使用它们的所有方法放置在外部,并在应用程序启动时重新加载。所有组件声明都保留在MainController类中,并且可以通过MainController mc引用进行访问。无需重复创建带有参数的组件。

于 2013-07-10T18:40:32.700 回答
0

您的问题看起来像经典的目录-crud 表单更新,我实现了一个我调用的接口,Updatable因此update method我可以在Controller Main Class作为UserData Property子根组件表单的

希望它能解决你的问题

于 2014-02-23T02:33:28.240 回答