繁体   English   中英

JavaFX Scene Builder在不同的包/控制器上处理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 ,比方说一个名为btnNewButton 在SceneBuilder中,我为该按钮声明了一个onAction事件处理程序,并且试图将其连接到ProductClass内部的方法。 然而,ProductClass是在不同的包作为base.fxml,当我点击onAction菜单项上base.fxml,它显示为空。

我的问题是,如何将Scene Builder中onAction方法挂接到与.fxml文件位于不同包/名称空间上的动作?

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

您需要将FXML文件连接到控制器

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

fx:controller="package.subpackage.ControllerName"

其中,字符串是Controller的相对程序包路径。 请注意,控制器与FXML文件位于不同的包中都没有关系,您始终从源包声明路径。 您也可以通过右键单击FXML文件并选择“ Make Controller”,让Netbeans为您执行此操作。

如果给任何元素一个fx:id ,则使用@FXML标签声明它们时,JavaFX会将它们注入到控制器中:

@FXML private Button btnNew;

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

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

更新:

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

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

就是说,如果您真的想在同一屏幕上拥有多个GUI元素的多个控制器,那是完全可能的。 但是,每个控制器都需要有一个不同的FXML文件。 看一下这个答案,它很好地解决了这个问题: 创建多个控制器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM