【问题标题】:JavaFX 2.2 control from scratchJavaFX 2.2 从头开始​​控制
【发布时间】:2012-08-18 11:36:32
【问题描述】:

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

【问题讨论】:

    标签: java user-interface javafx javafx-2


    【解决方案1】:

    原答案

    improve support for building custom controls 提出一项重要功能请求,目标是为下一个主要 JavaFX 版本(JavaFX 8.0/JDK 8.0)交付。

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

    如果您的意图是编写一个新控件以提交到 openjfx . . .那么肯定 使用这些类。如果您正在编写一个旨在 与平台的未来版本一起工作,你不想破坏, 那么不要使用这些类。

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

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

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

    有关从容器创建自定义、可重用组件的示例,请参阅 FXML 简介文档的 custom component section。有关对现有控件进行子类化的示例,请参阅此 JavaFX clock 示例中的 DigitalClock 类。

    更新

    在我写完这个答案后,我查看了更新后的答案链接的control creation presentation,它提出了与这个答案相同的建议。我会向所有对 JavaFX 控件创建主题感兴趣的人推荐该演示文稿。

    2014 年 12 月更新

    大部分工作已在 Java 8 中完成,以创建公共 API 以使用 JavaFX 框架类创建控件。因此,可以构建自己的自定义控件,扩展Control 或 Control 子类并使用SkinBase。此类控件在结构和 API 上与内置的 JavaFX 控件(如 Label、Button 等)相似。有关如何执行此操作的一些信息是 documented in an informal way on the open-jfx wiki,尽管 Oracle 尚未提供有关创建此类控件的完整官方文档在main JavaFX documentation page

    未最终确定为公共 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 使用,因此由于模块化而无法访问。

    有关自定义控件支持的 API 更改的更多信息,请参见链接的 JEP 和错误跟踪文档。

    包含新 API 更改的 Java 9 早期访问版本是 available for download 和测试。

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

    其他资源

    如果您想深入了解自定义 JavaFX 控件,您可能希望查看 Hendrik Ebbers 关于该主题的书(我还没有读过这本书):

    【讨论】:

      【解决方案2】:

      您可能想看看 JFXtras 项目 (http://jfxtras.org)。在那里,您会发现许多使用 SkinBase 和 BehaviorBase 的自定义 JavaFX 控件。控件的源代码可以在github上找到https://github.com/JFXtras

      【讨论】:

      • 谢谢,但我已经看过这些例子了。其中使用了 BehaviorBase 和 SkinBase,但它们是 com.sun 的一部分。正如我在上面所说的,FXEnsemble 和 Oracle 网站上的示例对此只字未提,所以我想知道,也许有人知道为什么要使用它们。
      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多