JavaFX 2.2从头开始控制

Dmi*_*try 13 java user-interface javafx javafx-2

有谁知道为什么互联网上有这么多关于使用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

jew*_*sea 20

原始答案

有一个关键的功能要求提高建筑定制控件的支持针对交货未来的主要的JavaFX版本(JavaFX的8.0/8.0 JDK).

在将BehaviourBase和SkinBase API公开之前,构建自己的自定义控件所需的其他工作(例如自定义css属性和伪类的定义)作为公共API公开,关于使用这些类的最佳建议是Richard Bair,在JavaFX平台领先:

如果你的意图是写一个新的控件提交给openjfx...然后肯定使用这些类.如果您正在编写一个旨在与该平台的未来版本一起使用的应用程序,并且您不想中断,那么请不要使用这些类.

无论如何,使用BehaviourBase和SkinBase API可能最适合由控件库创建者构建的控件(例如为open-jfx项目构建的包含在核心JavaFX api中的控件,或者之前链接的jfxtras项目)回答).许多可重用的自定义应用程序组件不需要使用这些类引入的复杂性.

除非您为库创建通用平台控件,否则不需要子类Control可能最好采取以下路由之一:

  1. 使用现有控件并通过CSS事件及其公共API对其进行自定义.
  2. 对现有控件进行子类化以执行更激进的更改.
  3. 创建自己的类,该类是容器的子类,例如Group或布局Pane子类.在您的子类中处理布局并封装多个JavaFX节点和控件的行为.

有关从Container创建自定义可重用组件的示例,请参阅FXML简介文档的自定义组件部分.有关子类化现有控件的示例,请参阅此JavaFX时钟示例中的DigitalClock类.

更新

在我写完这个答案之后,我回顾了从更新的答案链接的控件创建演示文稿,它与此答案提出了相同的建议.我向任何对JavaFX控件创建主题感兴趣的人推荐该演示文稿.

2014年12月更新

大部分工作都是在Java 8中完成的,用于创建使用JavaFX框架类创建控件的公共API.因此,可以构建自己的自定义控件,扩展Control或Control子类并使用SkinBase.这样的控件在结构和API上类似于内置的JavaFX控件,如Label,Button等.有关如何执行此操作的一些信息在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 Enhancement Proposal(JEP)和相关的Java bug跟踪器问题:

这项工作的目的是:

为JavaFX UI控件和CSS功能定义公共API,这些API目前只能通过内部API获得,因此会因模块化而无法访问.

链接的JEP和错误跟踪器文档中提供了有关自定义控件支持的API更改的更多信息.

Java 9的早期访问版本(包括新的API更改)可供下载和测试.

请注意,公共Behavior API不是Java 9的一部分,目前计划在Java 10中实现:

其他资源

如果您想要一个关于自定义JavaFX控件的深层资源,您可能希望查看有关该主题的Hendrik Ebbers书籍(我还没有读过这本书):