0

随着 Java JDK 9 的发布,如 JEP 253 所述,与控件的 JavaFX 皮肤相关的类从私有包com.sun.javafx.scene.control.skin移至公共包javafx.scene.control.skin

这种变化的原因是开发人员习惯于对他们的自定义控件进行编程,尽管 Oracle 不鼓励这种做法,将私有包的皮肤子类化。因此,通过将这些类移动到公共包中,Java 现在提供了一个公共 API 来为自定义控件设置外观。

但是,事情并没有那么简单。我发现了几个我希望有人可以证明的问题。

第一个问题是,虽然现在有公共包javafx.scene.control.skin,但没有公共 API 可以修改或自定义皮肤。创建一个简单的按钮很简单(通过抽象类的子类化也很简单SkinBase)但是自定义一个ColorPicker或一个TextField或更复杂的控件非常令人沮丧。问题是我们开发人员无法访问组成复杂复合控件的更简单的组件。加上新模块系统的引入,反射很难使用,这意味着除了一个简单的自定义按钮或另一个简单的控件之外,使用 Skin API 非常非常困难。

我发现的第二个问题是ComboBoxPopupControl课堂上的一个错误。我想创建 a 的自定义版本,ColorPicker所以我创建了一个扩展ColorPickerSkin. 正如刚才所说,我发现使用这个类非常困难,所以我让我的类扩展ComboBoxPopupControl(一个直接的子类ColorPickerSkin),我发现从我的自定义颜色选择器的基础上创建更干净。但是这个类有一个错误,它引发了一个NullPointerException因为变量,具有包私有可见性,没有初始化。这个变量是 类型ColorPickerBehaviour的,在 Java 8 中可以通过在构造函数中传递值来初始化它,Java 9 中的构造函数不接受该类型的参数。

我想知道你是否像我一样工作或正在工作,使用 JavaFX 的这个 API,你做了什么决定或者你找到了什么解决方案。

4

0 回答 0