随着 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,你做了什么决定或者你找到了什么解决方案。