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 中的一个方法。但是,ProductClass 与 base.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。
我开始接触 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 中的一个方法。但是,ProductClass 与 base.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。