【问题标题】:JavaFX Scene Builder handle OnAction on a different package/controllerJavaFX Scene Builder 在不同的包/控制器上处理 OnAction
【发布时间】:2015-03-01 03:14:52
【问题描述】:

我开始接触 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 中的一个方法。但是,ProductClassbase.fxml 位于不同的包中,当我为 base.fxml 上的菜单项单击 onAction 时,它显示为空。

我的问题是,如何将 Scene Builder 中控件的 onAction 方法与 .fxml 文件驻留在不同包/命名空间中的操作挂钩?

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

【问题讨论】:

    标签: java javafx scenebuilder


    【解决方案1】:

    您需要将您的 FXML 文件连接到 controller

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

    fx:controller="package.subpackage.ControllerName"
    

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

    如果你给任何元素一个fx:id,如果你用这样的@FXML标签声明它们,JavaFX会将它们注入你的控制器:

    @FXML private Button btnNew;
    

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

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

    更新:

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

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

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

    【讨论】:

    • 我对这个选项的担忧是,由于按钮位于模板 FXML 内的菜单栏上,我 100% 确定我会在菜单中添加更多按钮,并且这些按钮将访问不同的控制器方法,因此,如果我将具有菜单栏的 FXML 连接到 1 个控制器,我将无法将其余按钮连接到不同控制器上的不同方法中。我知道这似乎我可能误解了 JavaFX 的结构,但无论如何,你会如何处理这个?
    • @BenjaminVison 我扩展了我的答案。请告诉我这是否回答了您的问题,或者是否有任何不清楚的地方。
    • 这就是我的想法,感谢您的帮助,我将重新安排我正在做的事情,让控制器来处理所有这些操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2017-07-27
    • 2017-11-29
    相关资源
    最近更新 更多