在Java FX中扩展类?

时间:2013-07-25 20:13:07

标签: javafx-2 javafx

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

1 个答案:

答案 0 :(得分:4)

在JavaFX框架中使许多类最终是框架开发人员的有意决定。要了解其完成原因,请参阅Making Color Final proposal。这只是一个例子,还有其他原因。我认为在Swing框架中使用子类化的经验是它导致了JavaFX设计者想要避免的错误和维护问题,所以很多事情都是最终的。

还有其他方法来扩展功能而不是直接子类。您的轮换示例的一些替代方案:

  1. 聚合:包括NumberAxis作为新类的成员(例如NumberAxisWithRotatableText),它添加一个访问器来获取底层的NumberAxis节点和一个执行旋转的方法(例如通过查找,如下所述)。
  2. 组合:例如扩展Pane,添加NumberAxis,禁用轴上的标准文本绘图,并根据需要自行添加旋转标签。
  3. css stylesheet:例如使用选择器查找NumberAxis中的文本和-fx-rotate属性来旋转它。
  4. 节点查找:使用node.lookup获取基础文本节点,并通过API应用轮换。
  5. 皮肤:所有控件都附加了skin类,用自定义皮肤类替换默认皮肤类。
  6. 子类备用类:对抽象ValueAxis类进行子类化,而不是最终的NumberAxis类。
  7. JavaFX的源代码是available build instructions。但是,我不建议破解源代码的个人副本以删除最终构造,除非您还将其作为JavaFX系统的接受补丁提交,以便您可以确保您的应用程序不会在标准JavaFX安装上中断

    如果你真的认为给定的一个类可以是子类,那么log a change request。有时JavaFX开发人员过于热心并且做出最终决定,最好不要做到最终。 NumberAxis可能属于该类别。