有许多方法可以设置样式或模板 JavaFX 控件。
预构建的 JavaFX 控件可通过css设置样式。
还可以对预构建的 JavaFX 控件进行子类化以修改其功能和外观。一个示例是 IntField,它创建了一个自定义为仅编辑整数的 TextField。
通常,您可以通过将一堆现有控件放在布局Pane或Group中来构建自定义组件。通过参数化构造合并组件的方法或类,您可以通过代码有效地模板化自定义组件构造。这是使用这种方法构建的数字和模拟时钟组件的示例(并且可以通过 css 设置样式)。
您还可以使用fxml 文档介绍中的方法,通过不同的 fxml 文件管理自定义组件的布局。fxml 可以使用像velocity这样的模板语言生成,或者可以为不同的布局编写一些不同的静态 fxml 文件。静态或生成的 fxml 也可以从网络服务器动态提供,如需要时动态生成的 html 站点。
构建自定义控件的另一种方式与 JavaFX 团队的方式相同(通过为控件创建外观和行为类)。从 JavaFX 2.2 开始(甚至可能在未来的 JavaFX 版本中),这最适合库创建者,例如从事jfxtras工作或直接为JavaFX 项目的 开源控制存储库做出贡献的库创建者。
另请注意,在 css 中,您可以为控件指定外观类,例如 RadioButton 具有以下 css:
。单选按钮 {
-fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin";
}
因此,您正在考虑自定义 RadioButton 外观的一种方法是:
- 从我之前链接的开源 JavaFX 存储库中获取RadioButtonSkin类源的副本。
- 将它复制到一个新的类名(例如 LinedRadioButtonSkin)。
- 修改它以获得您想要的外观。
- 为您的项目创建自定义 CSS 样式表。
- 在自定义 css 样式表中
-fx-skin
,将类的属性设置.radio-button
为使用新的 LinedRadioButtonSkin 类。
只要您的新皮肤正确实现并连接到现有的ButtonBehaviour类,类似于现有 RadioButtonSkin 类的工作方式,那么您应该自动获得与现有单选按钮相同的基于皮肤的新单选按钮的行为。例如,按钮将响应鼠标点击、键盘加速器、触摸事件、与 ToggleGroups 交互等,与现有的 RadioButtonSkin 完全相同,并且可以使用现有的RadioButton api 访问。也就是说,按钮保留了 RadioButton 的感觉(行为),但可以通过使用不同的内部组件、布局和 css 样式来完全不同。
如果您决定采用自定义皮肤路线并在此过程中需要帮助,请考虑联系 jfxtras 团队的成员并将您的新皮肤捐赠给 jfxtras 项目。
警告
JavaFX 2.2 中的 Skin 和 Behavior 类是私有实现 api,而不是公开支持的 api,并且在将来过渡到公共 api 时会发生变化(计划用于 JavaFX 的下一个主要版本 - JavaFX/JDK 8) - 所以如果你使用这些今天,请谨慎行事。一旦它们过渡到公共 API,我希望您会看到有关如何使用这些类创建自己的控件的更多信息和教程。
包名称和 api 方法将随着 api 的变化而改变,以构建您自己的控件,从皮肤和行为转换从内部私有实现到公共 api。例如com.sun.javafx.scene.control.behavior.BehaviorBase
可能变为javafx.scene.control.behavior.Behavior
,因此如果您创建一个扩展 BehaviorBase 的类,它不会针对新版本的 JavaFX 运行,直到您修改类的源以引用新名称和 api 并重新编译它。
出于同样的原因,在 API 公开和最终版本之前,不会有关于这个主题的好书,因为本书中包含的针对私有 api 编写的任何示例代码一旦公开 api 就会过时,并且两者都不会不针对公共 api 编译,也不针对较新版本的 JavaFX 执行。