有没有人知道为什么互联网上有这么多关于使用com.sun中的SkinBase和BehaviorBase类在JavaFX中创建自己的自定义控件的例子?他们为什么用?为什么在FXEnsemble中没有这样的实现?这有什么最佳实践吗?请问,为什么我应该使用BehaviorBase和SkinBase进行自定义控制?提前谢谢。
更新
昨天我看到了这段视频 - http://www.parleys.com/#st=5&id=2789&sl=1,它指的是自定义控件的创建。作者说公共(控制和皮肤)和私有API,实际上行为是私有API。是否适合使用com.sun中的BehaviorBase和SkinBase,这些在官方文档中没有描述?
更新2:
SkinBehaviour和JavaFX 8:http://mail.openjdk.java.net/pipermail/openjfx-dev/2013-February/005874.html
答案 0 :(得分:20)
原始答案
improve support for building custom controls有一个关键功能请求,旨在为下一个主要JavaFX版本(JavaFX 8.0 / JDK 8.0)提供交付。
在将BehaviourBase和SkinBase API公开之前,构建自己的自定义控件所需的其他工作(例如自定义css属性和伪类的定义)作为公共API公开,关于使用这些类的最佳建议是Richard Bair,JavaFX platform领导:
如果你的意图是写一个新的控件提交给openjfx 。 。 。绝对是 使用这些类。如果您正在编写应用程序 使用该平台的未来版本,你不想打破, 然后不要使用这些类。
无论如何,使用BehaviourBase和SkinBase API可能最适合由控件库创建者构建的控件(例如为open-jfx项目构建以包含在核心JavaFX api中的控件,或{ {3}}在之前的答案中链接的项目)。许多可重用的自定义应用程序组件不需要使用这些类引入的复杂性。
除非您为库创建通用平台控件,否则不需要子类jfxtras可能最好采用以下路径之一:
有关从Container创建自定义可重用组件的示例,请参阅FXML简介文档的Pane。有关子类化现有控件的示例,请参阅此custom component section示例中的DigitalClock类。
更新
在我写完这个答案之后,我查看了从更新后的答案中链接的JavaFX clock,它与此答案的建议相同。我建议任何对JavaFX控件创建主题感兴趣的人。
2014年12月更新
大部分工作都是在Java 8中完成的,用于创建使用JavaFX框架类创建控件的公共API。因此,可以构建自己的自定义控件,扩展control creation presentation或Control子类并使用Control。这样的控件在结构和API上类似于内置的JavaFX控件,如Label,Button等。有关如何执行此操作的一些信息是SkinBase,尽管Oracle尚未提供有关创建的完整官方文档documented in an informal way on the open-jfx wiki上的此类控件。
未完成公共API的API的一部分是BehaviourBase类,通常用于处理某些特定于跨平台的特定实现,例如用于控件的加速键命令,但是您仍然可以使用基本JavaFX键处理事件或者第三方库(例如ControlsFX main JavaFX documentation page)来实现此类行为,以便您的代码不需要使用可能在将来的Java版本中更改的私有API。我相信BehaviourBase功能目前计划在Java 9时间框架内移至公共API类。
如原始答案所述,除非您为库创建通用平台控件,否则不需要子类Control(无论JavaFX 8或9中的新控件创建工具如何,都是如此)。
2016年3月更新
对于Java 9,已经创建了Java Enhancement Proposal(JEP)和相关的Java bug跟踪器问题:
这项工作的目的是:
定义JavaFX UI控件和CSS功能的公共API,这些API目前只能通过内部API获得,因此会因模块化而无法访问。
链接的JEP和错误跟踪器文档中提供了有关自定义控件支持的API更改的更多信息。
Java 9的早期访问版本包括新的API更改JDK-8076423和测试。
请注意,公共行为API不是Java 9的一部分,目前计划在Java 10中实现:
其他资源
如果您想要自定义JavaFX控件的深层资源,您可能希望查看Hendrik Ebbers关于该主题的书籍(我还没有读过这本书):
答案 1 :(得分:2)
您可能想看一下JFXtras项目(http://jfxtras.org)。在那里你会发现许多自定义JavaFX控件将使用SkinBase和BehaviorBase。可以在https://github.com/JFXtras
的github上找到控件的源代码