当前位置: 首页 > 知识库问答 >
问题:

我可以从FXML自动生成控制器类吗?

养鸿运
2023-03-14

据我所知,当使用FXML描述Java FX场景时,controller类是手动编写的,然后可以从.FXML文件引用它的成员变量和方法。当使用FXMLLoader加载场景时,成员变量被设置为相应的场景元素,方法被自动连接到相应的事件。这可以工作,但是非常麻烦,因为需要在两个地方进行更改,并且任何错误只会在运行时出现。

我看到过其他GUI框架,这些框架允许您从场景描述生成控制器作为抽象类,需要实现该抽象类来访问场景元素和处理事件。我的意思的一个例子:

我将创建以下.fxml文件(例如,使用JavaFX场景生成器):

<AnchorPane ... >
  <children>
     <Button fx:id="button" ... text="Button" onAction="#buttonPressed" />
  </children>
</AnchorPane>
abstract class TestController {
    protected final Parent root;
    protected final Button button;

    {
        // Load test.fxml file
        // Assign scene elements to root and button
        // Attach event handler to the button that calls buttonClicked()
    }

    protected abstract void buttonClicked(ActionEvent event);
}
final class TestControllerImpl extends TestController {
    TestControllerImpl(String buttonLabel) {
        button.setText(buttonLabel);
    }

    @Override
    protected void buttonClicked(ActionEvent event) {
        button.setText("I've been clicked! What a great day!");
    }
}

我从这种方法中看到以下好处:

  • 自动生成控制器成员变量和方法的声明。
  • 所有成员变量都是final和受保护的,而不是非final变量,要么是公共的,要么是带注释的。
  • 与方法相同,它们是受保护的,而不是公共或注释的。
  • 不实现方法或拼写错误将导致编译器错误。
  • 场景的编程设置可以在构造函数中完成,而不是initialize()方法,因为构造函数将在场景被加载并将其元素分配给成员变量之后运行。

共有1个答案

万高畅
2023-03-14

现在SceneBuilder、NetBeans和Eclipse都支持这一点。注这在NetBeans和SceneBuilder中是开箱即用的,但是在Eclipse中首先需要e(fx)clipse插件。

SceneBuilder:在编辑器中打开一个FXML文件,进入菜单选择“查看”和“显示示例控制器骨架”。

Eclipse:打开fxml文件,以便在代码编辑窗格中显示内容(您应该看到fxml是Eclipse中带有语法高亮显示的明文xml,而不是在SceneBuilder中可视化呈现)。右键单击Eclipse中的代码并选择“code”,然后选择“Generate Controller”。

 类似资料:
  • 如何解释文件与其对应的控制器类之间的关系

  • 我想做一些我认为应该很简单的事情。我有一个对象,用spring-boot、spring-data-rest和spring-hateoas设置。所有的基本工作都很好。我希望添加一个自定义控制器,该控制器返回的url的格式与GET to my

  • 生成一个 Http Controller 必选参数: -name 生成的 Controller 类名 -namespace 生成的 Controller 所在命名空间 可选参数: -prefix 路由前缀,不传则为类名 -render 渲染方式,默认为json,可选:html/json/xml -rest 是否生成 RESTful 风格,默认 false -override 是否覆盖已存在的文件,

  • 在应用程序中使用JavaFX,我有一个main.fxml文件,其中包含一些fxml子文件。 我想从子控制器访问Main.fxml的MainController类。 我试着用一个例子来解释得更好: MainFXML: 主控制器: ChildFXML:

  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为