JavaFX 2.2从头开始控制

时间:2012-08-18 11:36:32

标签: 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

2 个答案:

答案 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可能最好采用以下路径之一:

  1. 使用现有控件并通过CSS事件及其公共API对其进行自定义。
  2. 对现有控件进行子类化以执行更激进的更改。
  3. 创建自己的类,该类为容器(如Control或布局Group子类)创建子类。在您的子类中处理布局并封装多个JavaFX节点和控件的行为。
  4. 有关从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上找到控件的源代码