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的问题?
我看到这种方法有以下好处:
initialize()方法中完成场景的编程设置,因为构造函数将在加载场景并将其元素分配给成员变量之后运行.现在,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".
我所知道的并不是你在问题中提出的建议.
可能这个答案可能会随着时间的推移而过时.
替代技术
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源代码步骤.这种功能可能会实现您概述的大部分优势.
NetBeans版本8可以实现.
打开FXML,转到Source并单击generate controller.
编辑:现在可以在任何IDE中完成,Eclipse需要一个插件思想.
| 归档时间: |
|
| 查看次数: |
25636 次 |
| 最近记录: |