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

Feu*_*mel 14 code-generation javafx fxml

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

我见过其他GUI框架,它允许您从场景描述中生成控制器作为抽象类,需要实现它来访问场景元素并处理事件.我的意思的一个例子:

我将创建以下.fxml文件(例如,使用JavaFX Scene Builder):

<AnchorPane ... >
  <children>
     <Button fx:id="button" ... text="Button" onAction="#buttonPressed" />
  </children>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)

在我的构建过程中的某个地方,.java将创建以下文件(例如,使用Maven插件):

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);
}
Run Code Online (Sandbox Code Playgroud)

然后我可能会多次创建该控制器的具体实现:

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一个项目的目标是这样做?或者这种方法是否存在应用于FXML的问题

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

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

Mis*_*hax 9

现在,SceneBuilder,NetBeans和Eclipse都支持此功能.请注意,这在NetBeans和SceneBuilder中开箱即用,但在Eclipse中,您首先需要e(fx)clipse插件.

SceneBuilder:在编辑器中打开FXML文件后,进入菜单选择"View"和"Show Sample Controller Skeleton".

Eclipse:打开fxml文件,使内容显示在代码编辑窗格中(您应该看到fxml为明文xml,Eclipse内部语法突出显示,而不是在SceneBuilder中以可视方式呈现).右键单击Eclipse中的代码,选择"Code",然后选择"Generate Controller".

NetBeans:在NetBeans中更容易,右键单击项目资源管理器中的fxml文件,然后选择"Make Controller".


jew*_*sea 8

我所知道的并不是你在问题中提出的建议.

可能这个答案可能会随着时间的推移而过时.

替代技术

JRuby使用稍微不同的方法实现了大部分概述的好处 - 它使用jRuby的动态编程魔术在运行时动态地从FXML自动创建Ruby类成员.

Tom Schindl编写了一个从FXML生成Java代码的工具.在这个答案中列出的方法中,Tom的工具似乎与您的问题最接近.

SceneBuilder骷髅

来自FXML的类似Java代码生成器在SceneBuilder View | Show Sample Controller Skeleton功能中可用,该博客文章对此进行了描述.当我使用SceneBuilder时,我一直使用这个功能,并试着保持我的控制器非常轻,因此它们几乎都是来自SceneBuilder骨架特征的自动生成代码.

这有点令人讨厌,因为它没有实现生成的代码与手写代码的清晰分离,所以当你对FXML进行更新并想要生成一个新的骨架并将其复制并粘贴到部分时,你需要小心.您现有的控制器(加上这是一个稍微容易出错的手动操作,需要一点开发人员的时间).

如果要查看SceneBuilder的工作原理,可以使用SceneBuilder的源代码.

潜在的构建工具插件

这样的代码生成功能可能会对JavaFX生态系统中的一些现有构建工具进行有价值的补充,例如JavaFX Maven插件JavaFX Gradle插件(或者它本身就是一个单独的插件).

未来发展

我相信Oracle还在为未来的JavaFX版本(后Java 8)开发FXML的功能扩展,它将FXML直接编译为Java字节代码(类文件),绕过Java源代码步骤.这种功能可能会实现您概述的大部分优势.


use*_*416 7

NetBeans版本8可以实现.

打开FXML,转到Source并单击generate controller.

编辑:现在可以在任何IDE中完成,Eclipse需要一个插件思想.