随着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
类中的错误。我想创建ColorPicker
的自定义版本,因此我创建了一个扩展ColorPickerSkin
的类。正如刚刚说的那样,我发现很难使用这个类,所以我让我的类扩展ComboBoxPopupControl
(ColorPickerSkin
的直接sublcass),我发现从我的基础创建更干净自定义颜色选择器。但是这个类有一个bug,它引发了NullPointerException
一个变量,包私有可见性,没有被初始化。此变量的类型为ColorPickerBehaviour
,在Java 8中可以通过在构造函数中传递vaule来初始化它,Java 9中的构造函数不接受该类型的参数。
我想知道你是否像我一样工作或正在使用这个JavaFX API,你做了什么决定或者你找到了什么解决方案。