我们应该在JavaFX自定义控件中使用FXML吗?

这似乎有点问,我认为使用FXML编写我们的自定义组件显然是正确的方法。

但正如我们从ControlsFX,JFXextras甚至“掌握JavaFX8控件”这本书中看到的那样,不要在自定义控件中使用或提及使用FXML。

尽管如此,官方文档说要继续这条路线,并通过FXML创建JavaFX控件。

什么是更正确的方式和原因?

JavaFX中有两种自定义控件:

  • fx:基于root的自定义控件 :这些自定义控件是可定制的(支持CSS),但不是可换肤的。

    如果您是应用程序开发人员,那么大多数情况下您都希望使用它。

    这种控制通常是应用程序或组织特定的。 不需要为这些控件提供额外的自定义皮肤,CSS就足够了。

    通常他们只是将一些控件组合在一起并提供更好的API并隐藏内部。

    它们比可换肤的自定义控件更容易编写。

    我认为这是Swing-world中JPanel子类的替代品。

    我建议将你的GUI分解为小的独立的fx:基于root的控件(高内聚,低耦合)。 使用Mediator模式组合这些控件(父控件管理/配置其子控件并侦听其子控件的事件。子控件彼此不了解)。

    您可以创建此类控件的整个层次结构。 将它们分解为小控件将使维护更容易(例如,如果布局或用户交互必须改变)。

  • skinnable自定义控件 :skinnable自定义控件不仅可以设置样式(通过CSS),而且可以通过提供自定义皮肤完全更改其外观。

    如果您是控件库开发人员,那么很可能您希望提供可换肤的自定义控件,以允许库的用户充分利用JavaFX。

    这种控件通常是非常基本的,高度可重复使用的控件,并且通常(但不总是)使用一些自定义绘画。

    他们比fx更难做到:基于root的自定义控件。

没有正确的方法。 但我们可以将其分解为:

您知道在应用程序启动之前要显示的JavaFX元素的数量吗? 如果是,您可以使用SceneBuilder构建GUI,或者直接在XML中编写FXML文件。 大多数GUI屏幕设置都是如此,其中整体布局(MenuBar,ToolBar,内容,侧边栏,…)众所周知,并且不会随时间而改变。

现在,自定义组件不知道如何显示自己。 有许多选项可供对应,大多数自定义组件都是动态构建的,或者在用户更改这些选项时可能会发生巨大变化。 您不能编写单个FXML文件,而是必须编写许多单个文件,每个文件都构建自定义组件的一小部分。 这对管理来说并不是很方便,因此大多数开发人员选择直接在代码中使用FXML。

最重要的是:有许多自定义组件使用了特殊的布局而没有内置到JavaFX中,为了实现这一点,您必须编写自己的容器并使用自定义组件连接它们以获得完美的结果。 最后,构建自定义组件(或者更好:应该构建)以在FXML / SceneBuilder中使用。