原答案
向improve support for building custom controls 提出一项重要功能请求,目标是为下一个主要 JavaFX 版本(JavaFX 8.0/JDK 8.0)交付。
在 BehaviourBase 和 SkinBase API 公开并且构建您自己的自定义控件所需的其他工作(例如自定义 css 属性和伪类的定义)公开为公共 API 之前,关于使用这些类的最佳建议是JavaFX platform 负责人 Richard Bair:
如果您的意图是编写一个新控件以提交到 openjfx
. . .那么肯定
使用这些类。如果您正在编写一个旨在
与平台的未来版本一起工作,你不想破坏,
那么不要使用这些类。
无论如何,使用 BehaviourBase 和 SkinBase API 可能最适合由控件库创建者构建的控件(例如那些为 open-jfx 项目构建以包含在核心 JavaFX api 中的控件,或 jfxtras上一个答案中链接的项目)。许多可重用的自定义应用程序组件不需要使用这些类引入的复杂性。
除非您正在为库创建通用平台控件,否则您不需要子类化 Control 可能最好采用以下路线之一:
- 使用现有控件并通过 CSS 事件及其公共 API 对其进行自定义。
- 子类化现有控件以执行更彻底的更改。
- 创建您自己的类,将容器子类化为Group 或布局Pane 子类。在您的子类中处理布局并封装多个 JavaFX 节点和控件的行为。
有关从容器创建自定义、可重用组件的示例,请参阅 FXML 简介文档的 custom component section。有关对现有控件进行子类化的示例,请参阅此 JavaFX clock 示例中的 DigitalClock 类。
更新
在我写完这个答案后,我查看了更新后的答案链接的control creation presentation,它提出了与这个答案相同的建议。我会向所有对 JavaFX 控件创建主题感兴趣的人推荐该演示文稿。
2014 年 12 月更新
大部分工作已在 Java 8 中完成,以创建公共 API 以使用 JavaFX 框架类创建控件。因此,可以构建自己的自定义控件,扩展Control 或 Control 子类并使用SkinBase。此类控件在结构和 API 上与内置的 JavaFX 控件(如 Label、Button 等)相似。有关如何执行此操作的一些信息是 documented in an informal way on the open-jfx wiki,尽管 Oracle 尚未提供有关创建此类控件的完整官方文档在main JavaFX documentation page。
未最终确定为公共 API 的 API 的一部分是 BehaviourBase 类,该类通常用于处理一些跨平台特定的任务实现,例如用于控件的加速键命令,但是您仍然可以使用基本的 JavaFX 键处理事件或第三方库(例如 ControlsFX Action)来实现此类行为,以便您的代码不需要使用可能在未来 Java 版本中更改的私有 API。我相信 BehaviourBase 功能目前计划在 Java 9 时间范围内移至公共 API 类。
如原始答案中所述,除非您正在为库创建通用平台控件,否则您不需要子类 Control(无论 JavaFX 8 或 9 中的新控件创建工具如何,都是如此)。
2016 年 3 月更新
对于 Java 9,已创建 Java 增强提案 (JEP) 和相关的 Java 错误跟踪器问题:
这项工作的目的是:
为 JavaFX UI 控件和 CSS 功能定义公共 API,这些功能目前只能通过内部 API 使用,因此由于模块化而无法访问。
有关自定义控件支持的 API 更改的更多信息,请参见链接的 JEP 和错误跟踪文档。
包含新 API 更改的 Java 9 早期访问版本是 available for download 和测试。
请注意,公共行为 API 不是 Java 9 的一部分,目前计划在 Java 10 中实现:
其他资源
如果您想深入了解自定义 JavaFX 控件,您可能希望查看 Hendrik Ebbers 关于该主题的书(我还没有读过这本书):