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