原始答案
有一个重要的功能请求来改进对构建自定义控件的支持,这些控件旨在交付给下一个主要 JavaFX 版本(JavaFX 8.0/JDK 8.0)。
在 BehaviourBase 和 SkinBase API 公开并且构建您自己的自定义控件所需的其他工作(例如自定义 css 属性和伪类的定义)公开为公共 API 之前,关于使用这些类的最佳建议是 Richard Bair,JavaFX 平台负责人:
如果您的意图是编写一个新控件以提交到 openjfx 。. . 那么一定要使用这些类。如果您正在编写一个旨在与平台的未来版本一起使用的应用程序并且您不想破坏,那么不要使用这些类。
在任何情况下,使用 BehaviourBase 和 SkinBase API 可能最适合由控件库创建者构建的控件(例如为open-jfx项目构建以包含到核心 JavaFX api 中的控件,或之前链接的jfxtras项目)回答)。许多可重用的自定义应用程序组件不需要使用这些类引入的复杂性。
除非您正在为库创建通用平台控件,否则您不需要子类Control可能最好采用以下路线之一:
- 使用现有控件并通过 CSS 事件及其公共 API 对其进行自定义。
- 子类化现有控件以执行更彻底的更改。
- 创建您自己的类,该类将容器子类化,例如Group或布局Pane子类。在您的子类中处理布局并封装多个 JavaFX 节点和控件的行为。
有关从 Container 创建自定义、可重用组件的示例,请参阅 FXML 简介文档的自定义组件部分。有关对现有控件进行子类化的示例,请参见JavaFX 时钟示例中的 DigitalClock 类。
更新
在我写完这个答案之后,我查看了从更新的答案链接的控件创建演示文稿,它提出了与这个答案相同的建议。我会向任何对 JavaFX 控件创建主题感兴趣的人推荐该演示文稿。
2014 年 12 月更新
Java 8 中已经完成了大部分工作,以创建公共 API 以使用 JavaFX 框架类创建控件。因此,可以构建您自己的自定义控件,这些控件扩展Control或 Control 子类并使用SkinBase。这样的控件在结构和 API 上类似于标签、按钮等内置 JavaFX 控件。有关如何执行此操作的一些信息以非正式方式记录在 open-jfx wiki 上,尽管 Oracle 尚未在JavaFX 主文档页面上提供了有关创建此类控件的完整官方文档。
未最终确定为公共 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 使用,因此由于模块化而无法访问。
链接的 JEP 和错误跟踪器文档中提供了有关自定义控件支持的 API 更改的更多信息。
包含新 API 更改的 Java 9 早期访问版本可供下载和测试。
请注意,公共行为 API 不是 Java 9 的一部分,目前计划在 Java 10 中实现:
其他资源
如果您想深入了解自定义 JavaFX 控件,您可能希望查看 Hendrik Ebbers 关于该主题的书(我没有读过这本书):