我开始接触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文件驻留在不同包/命名空间的操作?
如果您需要更多说明,请告诉我,我会花一些时间来解决我的问题。
答案 0 :(得分:1)
您需要将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(模型 - 视图 - 控制器)的一种形式。我通常这样做的方法是在Model层中将所有数据都从控制器中移除。然后我让控制器与数据交互并监听变化。这样,您不需要在特定控制器中展开事件处理程序,因为它们都可以访问模型层。我发现this answer很好地解释了这一点。它将Context
对象注入控制器。对于小规模应用程序来说是一个很好的解决方案,但要注意以这种方式创建一个God-object。 :)
也就是说,如果你真的想在同一个屏幕上为各种GUI元素配备多个控制器,这是完全可能的。但是,您需要为每个控制器提供不同的FXML文件。看一下这个答案,它很好地解决了这个问题:creating multiple controllers。