JavaFX Scene Builder 在不同 package/controller 上处理 OnAction

JavaFX Scene Builder handle OnAction on a different package/controller

我开始接触 JavaFX,并且正在使用 SceneBuilder 开发 GUI。我的 java 项目有以下结构:

src/ # Main class and other classes..
src/[package]/IndexClass
src/[Another package]/ProductClass
src/base.fxml # I am using this as a template

base.fxml 中,我有一个包含菜单项的 MenuBar,假设一个名为 btnNew 的 Button 。在 SceneBuilder 中,我已经为那个按钮声明了一个 onAction 事件处理程序,我试图将它连接到 ProductClass 中的一个方法。但是,ProductClassbase.fxml 在不同的包中,当我单击 onAction 上的菜单项时 base.fxml,显示为空。

我的问题是,如何将 Scene Builder 中控件的 onAction 方法挂钩到驻留在与 .fxml 文件不同的 package/namespace 上的操作?

如果您需要更多说明,请告诉我,我会花一些时间来解释我的问题。

您需要将 FXML 文件挂接到 controller

在 FXML 页面的根节点中,键入以下内容:

fx:controller="package.subpackage.ControllerName"

其中字符串为Controller的相对包路径。请注意,控制器是否位于与 FXML 文件不同的包中并不重要,您始终声明来自源包的路径。您还可以让 Netbeans 为您执行此操作,方法是右键单击 FXML 文件并选择 'Make Controller'.

如果您给任何元素一个 fx:id,如果您使用 @FXML 标签声明它们,JavaFX 会将它们注入您的控制器,如下所示:

@FXML private Button btnNew;

您可以用同样的方式声明事件。例如:

@FXML
void btnNew_OnAction(ActionEvent event) {
    //body
}

更新:

我认为你应该重新考虑你的设计。一个 FXML 文件只能绑定到一个控制器。如果你有一个菜单栏,那个菜单栏上按钮的行为可能是相关的,我认为把那个行为分离到不同的控制器中是个坏主意 类。我要解决的方法是让一个控制器处理菜单栏中所有按钮的所有事件。

你是如何设置你的控制器的? FXML 是 MVC(模型-视图-控制器)的一种形式。我通常这样做的方式是将所有数据从模型层中的控制器中取出。然后我让控制器与数据交互并监听变化。这样,您就不需要将事件处理程序分散到特定的控制器中,因为它们都可以访问模型层。我发现 this answer 很好地解释了这一点。它向控制器中注入一个 Context 对象。对于小型应用程序来说是一个很好的解决方案,但要注意以这种方式创建上帝对象。 :)

就是说,如果您真的想要在同一屏幕上为各种 GUI 元素设置多个控制器,那完全有可能。不过,您需要为每个控制器准备一个不同的 FXML 文件。看看这个答案,它很好地解决了这个问题:creating multiple controllers