JavaFX 不公开支持使用内部 com.sun API
BehaviorSkinBase 是 com.sun api。
它从未作为公共 API 得到支持,因此它可以在没有警告或弃用的情况下更改(确实如此)。
任何用户应用程序代码最好不要依赖BehaviorSkinBase,或任何其他com.sun API。
以上信息是这个问题的实际答案。
以下信息是有关 JavaFX 自定义控件和实现选项的信息,因此如果此时与您无关,可以忽略。
实施选项
如果这个类肯定不再可用,是否还有另一种方法来进行这种自定义?
是的,有多种选择,请参阅以下步骤。
决定哪种方法最适合您的应用程序将取决于您希望进行的自定义数量,以及您的技能水平和您希望花费的时间。
如何重写您的自定义滑块
-
将自定义滑块与标准 JavaFX 滑块进行比较,如果您只能使用标准滑块而不是自定义滑块,那么请这样做。
-
如果自定义滑块的唯一变化是视觉样式,也许提供一些自定义 CSS 来设置标准滑块的样式就足够了。
-
如果自定义滑块与标准滑块具有不同的节点层次结构,那么可能只是设置标准滑块的样式不会削减它,您将需要创建自定义皮肤。
-
如果你需要创建自定义皮肤,那么看看你是否可以继承 SliderSkin,这将允许你为 Slider 提供不同的节点层次结构和完全不同的视觉效果,同时仍然保留 @987654322 的公共 API @类。
-
如果您的自定义滑块需要与滑块类不同的公共 API,则创建一个新的 Control 子类和一个新的 Skin 子类(您现在正在从头开始创建一个完全自定义的控件)。
请注意,自定义控件通常适用于通用控件库,但对于典型应用程序而言,通常不需要,因为应用程序不需要控件界面的形式,而是可以使用布局定义其 UI窗格和内置控件集合使用控制器集成在一起,并且可能使用 FXML 定义。因此,大多数应用程序代码只需执行上述列表的第 1 步或第 2 步(例如,使用标准滑块,可能通过 CSS 自定义外观)。
在您的自定义控件中处理行为
如果您使用现有的滑块皮肤,它会附带其内置的行为实现,该实现是内部的而非公共 API,但对您来说可能就足够了,您不太可能需要更改它。
如果您必须创建自己的完全自定义控件,那么它将没有行为实现,因此您需要从头开始添加自己的控件。行为实现将为控件执行键盘和输入处理,可能还有其他一些工作。
如果它是一个行为简单的简单控件,这就像将几个事件处理程序附加到控件中的节点一样简单。
如果它是一个针对不同平台具有不同键映射的复杂控件,那么不妨看看 JavaFX 中的内部行为实现,看看它如何实现行为建模并从中获得一些想法(或复制粘贴与您自己的应用程序代码库相关的东西),以帮助实现您的控件的行为。
历史内部实现链接行为和皮肤
见custom controls wiki change 4。
更改 #4:SkinBase 不再有任何对 Behavior API 的公开引用。
这是从 JavaFX 2 到 8 的变化。您正在使用的代码可能基于早已过时的 JavaFX 版本。另请阅读同一链接中有关皮肤的信息,它可能会对您有所帮助。
行为背景信息
如果你好奇,当前的 API 行为代码在:
它不包括 BehaviorSkinBase,因为很久以前,行为和皮肤的概念在 JavaFX 中是分开的。该行为(据我了解)主要用于处理键盘输入映射(尽管它也可能做其他事情)。许多这些输入映射是特定于目标平台的,因此 Mac 用户与 PC 用户可能使用不同的映射,这允许键盘输入符合目标平台的标准键盘使用。这些行为(我相信)有助于处理这些特质。
皮肤背景信息
皮肤代表控件的视觉布局。 Control 子类定义了公共 API,并且通常从 Skin 的内部实现中抽象出来。这允许您定义像 Spinner 这样的控件,它可能具有向上和向下箭头以在 PC 上更改某个范围内的整数值,但在像 iOS 这样的触摸设备上,它可能被实现为可滚动的rolodex 样式。公共控件界面不会改变,但不同的皮肤实现会附加到不同平台的控件上,以根据目标设备提供不同的外观。
您从头开始创建的自定义控件可以扩展Skin 接口,以使它们可以如上所述进行换肤。
此外,JavaFX 平台中所有内置控件的外观都可作为 javafx.scene.control.skin 包中的公共 API 使用。因此,如果您想为现有控件提供新的外观,您可以扩展和覆盖现有的外观实现(这将比从头开始创建自定义控件容易得多,只要您正在自定义的控件具有接近您的功能所需的控制)。
行为/皮肤整合背景
在内部,皮肤可以引用行为以进行其他自定义,例如如前所述,针对不同平台的不同键加速器输入映射。
JavaFX 平台实现了内部行为框架和系统,以支持核心平台中的公共 API 控件。该行为框架是完全私有的 API(在 com.sun 中)类,因此如有更改,恕不另行通知。
您永远不应该编写依赖于 JavaFX 框架中的 com.sun 类的代码,因为下次发布该框架以获取新功能或错误修复时,它可能会破坏您的代码,这与稳定且稳定的公共 API 不同。提前通知任何已弃用的功能。
所以不依赖 JavaFX 中的内部行为框架可能是件好事。但是,如果需要,您可以为自定义控件实现自己的行为。为此,您可以查看内置控件的 openjfx 源代码中的实现并模拟您希望的部分(通过将私有 API 复制并粘贴到项目中的新类或通过实现输入行为您的自定义控件从头开始)。
请注意,如果您的自定义控件只是来自 JavaFX 平台的一组内置核心控件或其中一个控件的子类,那么它将继承这些控件的默认行为。这通常就足够了,您无需编写自己的行为代码。