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

Dav*_*kys 8 java javafx fxml javafx-8

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

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

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

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

Puc*_*uce 18

JavaFX中有两种自定义控件:

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

    如果您是应用程序开发人员,那么这就是您希望在大多数时间使用的内容.

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

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

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

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

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

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

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

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

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

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

  • 很好的答案.请注意,对于基于`fx:root`的控件,您的控件必须公开一个可修改的子节点列表(例如,是`Pane`的子类),这是一个使得它有点不适合库开发的方面."skinnable自定义控件"可以是"Control"的子类,因此构成控件的元素不能被最终用户添加或删除,并且正如您所指出的那样,它适合API层次结构中的自然位置. (2认同)
  • 在创建SceneBuilder时,Oracle选择(主要)使用fx:root方法,因此您可以[研究SceneBuilder源代码](http://hg.openjdk.java.net/openjfx/8u-dev/rt/file/tip/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/paintpicker/gradientpicker)用于生产质量应用程序代码中的具体示例. (2认同)