3

在许多情况下,JavaFX 需要使用扩展现有类的类进行定制。我尝试了这种方法,例如向 NumberAxis 类添加一个方法,该方法可以旋转轴的标签。但是我得到了一个“NumberAxis 被声明为最终的,无法扩展”的编译器错误。我想知道扩展课程的人是怎么做的?他们是否可以访问 javafx 的源代码,修改它以使某些类不是最终的,然后重新编译它?(听起来很棘手!)

4

1 回答 1

5

在 JavaFX 框架中最终确定大量类是框架开发人员的有意决定。要了解它的完成原因,请参阅制作颜色最终提案。这只是一个例子,还有其他原因。我认为在 Swing 框架中进行子类化的经验是它会导致 JavaFX 设计者想要避免的错误和维护问题,所以很多事情都是最终确定的。

除了直接继承子类之外,还有其他方法可以扩展功能。轮换示例的一些替代方案:

  1. 聚合:包括 NumberAxis 作为新类的成员(例如 NumberAxisWithRotatableText),它添加了一个访问器来获取底层的 NumberAxis 节点和一个执行旋转的方法(例如,通过如下所述的查找)。
  2. 组成:例如扩展Pane,添加一个NumberAxis,禁用轴上的标准文本绘制,并根据需要自己添加旋转标签。
  3. css 样式表:例如,使用选择器在 NumberAxis 中查找文本,并使用 -fx-rotate 属性来旋转它。
  4. 节点查找:使用node.lookup获取底层文本节点,并通过 API 应用旋转。
  5. 皮肤:所有控件都有一个皮肤类,用自定义的替换默认皮肤类。
  6. 子类化一个替代类:子类化抽象ValueAxis类而不是最终的 NumberAxis 类。

JavaFX 的源代码随构建说明一起提供。但是,我不建议破解源代码的个人副本以删除最终构造,除非您还将其作为可接受的补丁提交给 JavaFX 系统,以便确保您的应用不会在标准 JavaFX 安装时中断.

如果你真的认为给定的类可以子类化是个好主意,那么记录一个更改请求。有时 JavaFX 开发人员过分热心,将东西做成最终的,最好不要成为最终的。NumberAxis 可能属于这一类。

于 2013-07-25T21:07:40.147 回答