似乎有问题,我认为使用FXML编写我们的自定义组件显然是正确的方法。
但正如我们可以从ControlsFX,JFXextras甚至是掌握JavaFX8控件的书中看到的那样,不使用或提及在自定义控件中使用FXML。
尽管如此,官方文档说要继续这条路线,并通过FXML创建JavaFX控件。
更正确的方法是什么?为什么?
答案 0 :(得分:18)
JavaFX中有两种自定义控件:
fx:root based custom controls:这些自定义控件是可定制的(支持CSS),但不可换肤。
如果您是应用程序开发人员,那么这就是您最想要使用的内容 的时间。
这种控件通常是应用程序或组织特定的。不需要为这些控件提供额外的自定义皮肤,CSS就足够了。
通常他们只是将一些控件组合在一起并提供更好的API并隐藏内部。
它们比可换肤的自定义控件更容易编写。
我认为这是Swing世界中JPanel子类的替代品。
我建议将你的GUI细分为小 自包含的fx:基于根的控件(高内聚,低耦合)。使用 中介模式组合这些控件(父控件 管理/配置其子控件并监听事件 它的孩子控制。孩子控制不了解对方)。
您可以创建此类控件的整个层次结构。打破他们 进入小型控件将使维护更容易(例如,如果布局或 用户交互必须改变。)
skinnable自定义控件:skinnable自定义控件不仅可以设置样式(通过CSS),而且可以通过提供自定义皮肤来完全更改其外观。
如果您是控件库开发人员,那么很可能您希望提供可换肤的自定义控件,以允许库的用户充分利用JavaFX。
这种控件通常是非常基本的,高度可重复使用的控件,并且通常(但并非总是)使用一些自定义绘画。
他们比fx:基于root的自定义控件更难做到。
答案 1 :(得分:2)
没有正确的方式。但我们可以将其分解为:
您知道应用程序启动之前要显示的JavaFX元素数量吗?如果是,您可以使用SceneBuilder构建GUI,或者直接在XML中编写FXML文件。对于大多数GUI屏幕设置都是如此,其中整体布局(MenuBar,ToolBar,内容,侧边栏,...)是众所周知的,并且不会随着时间的推移而改变。
现在,自定义组件不知道如何显示自己。有许多选项可供选择,大多数自定义组件都是动态构建的,或者在用户更改这些选项时可能会发生巨大变化。您不能编写单个FXML文件,而是必须编写许多单个文件,每个文件都会构建自定义组件的一小部分。这对管理来说并不是很方便,因此大多数开发人员选择直接在代码中使用FXML来完成。
最重要的是:有许多自定义组件使用了特殊的布局而没有内置到JavaFX中,为了实现这一点,您必须编写自己的容器并使用自定义组件连接它们以获得完美的结果。 最后,构建自定义组件(或者更好:应该构建)以在FXML / SceneBuilder中使用。