【发布时间】:2014-02-05 10:52:51
【问题描述】:
据我了解,当使用 FXML 描述 Java FX 场景时,控制器类是手动编写的,然后可以从.fxml 文件。当使用FXMLLoader 加载场景时,成员变量被设置为相应的场景元素,方法自动连接到相应的事件。这可行,但非常麻烦,因为需要在两个地方进行更改,并且任何错误只会在运行时出现。
我见过其他 GUI 框架,它们允许您从场景描述生成控制器作为一个抽象类,需要实现该抽象类来访问场景元素和处理事件。我的意思的一个例子:
我将创建以下 .fxml 文件(例如,使用 JavaFX 场景构建器):
<AnchorPane ... >
<children>
<Button fx:id="button" ... text="Button" onAction="#buttonPressed" />
</children>
</AnchorPane>
在我的构建过程中,将创建以下.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);
}
然后,我可能会多次创建该控制器的具体实现:
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!");
}
}
是否有一个目标是这样做的项目?或者这种方法应用于 FXML 是否有问题?
我看到这种方法有以下好处:
- 自动生成控制器的成员变量和方法的声明。
- 所有成员变量都是 final 和 protected 而不是 non-final 和 public 或注释。
- 方法也一样,它们是 protected 而不是 public 或注释。
- 未实现方法或拼写错误名称将导致编译器错误。
- 场景的编程设置可以在构造函数中完成,而不是在
initialize()方法中完成,因为构造函数将在场景加载并将其元素分配给成员变量之后运行。李>
【问题讨论】:
-
只是出于好奇,你用过javafx scene builder的自动控制器示例吗?
-
@ItachiUchiha 我有,虽然它确实减少了一点点创建控制器类的工作,但它并没有解决我想避免的任何问题。此外,它仅在最初创建控制器时有帮助,而在使用现有控制器修改视图时没有帮助。
标签: javafx code-generation fxml