【问题标题】:What are the pros and cons FXML?FXML 的优缺点是什么?
【发布时间】:2014-01-24 18:50:32
【问题描述】:

使用 FXML 或不使用 FXML 开发 JavaFX 应用程序的优缺点是什么?

对于开发企业 JavaFX 应用程序,应该遵循哪种方法?

【问题讨论】:

标签: javafx javafx-2 fxml javafx-8 scenebuilder


【解决方案1】:

FXML 缺点:加载和显示时间稍长。

FXML 优点:

  • 使用 Scene Builder 进行快速场景开发/模拟。
  • FXML 不是编译语言;您无需重新编译代码即可查看更改。只需重新加载 FXML 文件。
  • 它提供了 GUI 与逻辑/控制器的清晰分离。
  • 因此您可以使用同一个控制器拥有不同版本的场景/视图。例如,这对于演示很方便。
  • FXML 文件的内容可以在读取文件时进行本地化。

在企业应用程序中一定要使用 FXML!

【讨论】:

  • 那么,有什么建议总是使用 FXML 吗?
  • @Ang 一般使用 FXML。对于一个非常简单的视图,例如包含文本字段和按钮的弹出窗口,您可能不必使用 FXML。
  • 随着复杂性的增加,使用代码设计场景和放置控件可能会变得混乱。 Scenebuilder 提供了一种非常互动的方式来将您的控件放置在场景中并立即进行预览。
  • @Angom 3 号 Jurgen Pros 非常重要。 SceneBuilder 可以是一个强大的专业人士,但我个人认为没有必要使用它:许多人在没有 WYSIWIYG 工具的情况下使用 GUI 的声明性语言。请记住,关注点分离在软件中始终很重要。
  • 我不同意在企业应用程序中“绝对”使用 FXML 的建议。我开始使用 FXML 编写我的应用程序,但很快就放弃了,因为它太受限制了。我的主要反对意见是您不能使用通用控制器。没有它们你也可以生活,但这会让事情变得更加困难,代码也变得不那么优雅。此外,对于大型表单,加载时间不仅仅是“稍长”。需要解析 FXML 文件并使用反射创建对象图。有趣的是,现在我已经编写了一些辅助方法,实际上我可以比使用 Scene Builder 更快地从代码构建表单。
【解决方案2】:

我会在 Jurgens 列表中添加两个反对者。

如果您使用 FXML 实例化您的视图有点不方便。至少在我看来。

Node explorer = new MyExplorerWidget();

Node explorer = cdicontainer.newInstance(MyExplorerWidget.class);

更令人愉快
FXMLLoader loader = new FXMLLoader(getClass().getResource("com.mycompany.some.very.long.name.MyExplorerWidget.fxml"),explorerwidgetresouces);//Of course we want our app internationalized
Node explorer = loader.load();

另一点是 FXML 是静态的。如果您想根据某些模型在运行时生成 UI,无论如何您都将编写 UI 代码。我最终得到了像这样的无用 fxml 文件PropertyGrid.fxml

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="PropertyGridController">
    <children>
        <VBox fx:id="vbox" layoutX="63.0" layoutY="-28.0" prefHeight="172.0" prefWidth="163.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
    </children>
</AnchorPane>

还有PropertyGridController

public class PropertyGridController{

    @FXML
    VBox vbox;

    ....

    public void setModel(PropertySheet model){
        //.... tons of code to generate the actual property grid and add it to the view
    }
}

【讨论】: