找不到符号 BehaviorSkinBase(来自 javafx)
cannot find symbol BehaviorSkinBase (from javafx)
在我分叉的 javafx 项目中,使用了包 com.sun.javafx.scene.control.skin
中的 class BehaviorSkinBase
。这是一个旧项目,所以我预计一些代码会被弃用,但是这个 class 没有出现在 deprecated list.
中
在 this website 上,我找到了有关缺失 class 的完整文档,但没有源代码或 javafx 版本。
我尝试使用来自官方 website 的多个版本的 javafx 构建项目,但 none 解决了问题。
此 class 用于与其他 javafx class.
定义自定义滑块
public class CustomSliderSkin extends BehaviorSkinBase<Slider, SliderBehavior>
如果这个 class 肯定不再可用,是否还有其他方法可以进行此类自定义?
所以,在重装Java多次后,我发现Java sdk 8代码可以正常工作,一定是我配置有误。
然而,正如 jewelsea 的评论所述,这些技术不再受支持,因此不适合继续使用它们的项目。
JavaFX
public 不支持使用内部 com.sun
API
BehaviorSkinBase
是 com.sun
api.
它从未像 public API 那样受到支持,因此它可以在没有警告或弃用的情况下更改(它确实如此)。
任何用户应用程序代码最好不要依赖 BehaviorSkinBase
或任何其他 com.sun
API.
以上信息是本题的实际答案。
以下信息是有关 JavaFX 自定义控件和实现选项的信息,如果此时与您无关,可以忽略。
实施选项
Is there another way of doing this sort of customization if this class is definitely no longer usable?
是的,有多个选项,请看下面的步骤。
决定哪种方法最适合您的应用程序将取决于您希望进行的定制量,以及您的技能水平和您希望花费在工作上的时间量。
如何重写自定义滑块
将自定义滑块与标准 JavaFX 滑块进行比较,如果您可以只使用标准滑块而不是自定义滑块,那么就这样做。
如果自定义滑块中的唯一变化是视觉样式,也许提供一些自定义 CSS 来设置标准滑块的样式就足够了。
如果自定义滑块与标准滑块具有不同的节点层次结构,那么仅对标准滑块设置样式可能无法解决问题,您将需要创建自定义外观。
如果需要制作自定义皮肤,那么看看能不能子class SliderSkin, this will allow you to provide a different node hierarchy and completely different visuals for the Slider, while still retaining the public API for the Slider class.
如果您的自定义滑块需要与滑块 class 不同的 public API,则创建一个新的控制子 class 和一个新的Skin subclass(您现在正在从头开始创建一个完全自定义的控件)。
请注意,自定义控件通常适用于通用控件库,但通常对于典型应用程序而言并不需要,因为应用程序不需要控件接口的形式,而是可以定义其 UI 使用布局窗格和内置控件的集合,这些控件使用控制器集成在一起,并且可能使用 FXML 定义。因此,大多数应用程序代码仅通过上述列表的第 1 步或第 2 步完成(例如,使用可能通过 CSS 在外观中自定义的标准滑块)。
自定义控件中的处理行为
如果您使用现有的滑块皮肤,它带有内置的行为实现,这是内部的而不是 public API 但可能对您来说已经足够了,您不太可能需要更改它。
如果您必须创建自己的完全自定义控件,那么它将没有行为实现,因此您需要从头开始添加自己的控件。行为实现将为控件进行键盘和输入处理,也许还有一些其他工作。
如果它是一个具有简单行为的简单控件,这将与将几个事件处理程序附加到控件中的节点一样简单。
如果它是一个复杂的控件,对于不同的平台有不同的键映射,那么或许可以看看 JavaFX 中的内部行为实现,看看它是如何实现行为建模的,并从中获得一些想法(或复制和复制) - 将相关内容粘贴到您自己的应用程序代码库中),以帮助实现您的控件的行为。
历史内部实现 link 行为和皮肤
参见 custom controls wiki change 4。
Change #4: SkinBase no longer has any public reference to Behavior API.
这是从 JavaFX 2 到 8 的更改。您正在使用的代码可能基于早已过时的 JavaFX 版本。另请阅读有关皮肤的信息 link,它可能会对您有所帮助。
行为背景信息
好奇的话,目前的API行为代码在:
它不包括 BehaviorSkinBase,因为很久以前,行为和皮肤的概念在 JavaFX 中是分开的。该行为(据我所知)主要用于处理键盘输入映射(尽管它也可能做其他事情)。许多这些输入映射是特定于目标平台的,因此 Mac 用户和 PC 用户可能会使用不同的映射,这允许键盘输入符合目标平台的标准键盘使用。这些行为(我相信)有助于处理这些类型的特质。
皮肤背景信息
外观表示控件的可视布局。 Control子class定义了publicAPI,往往是从Skin的内部实现中抽象出来的。这允许您定义一个像 Spinner 这样的控件,它可能具有向上和向下箭头以在 PC 上更改一个范围内的整数值,但在像 iOS 这样的触摸设备上,它可能被实现为一个可滚动的 rolodex风格。 public 控件界面没有改变,但不同的皮肤实现附加到不同平台的控件,以根据目标设备允许不同的外观。
您从头开始创建的自定义控件可以扩展 Skin 界面,以允许它们如上所述进行换肤。
此外,JavaFX 平台中所有内置控件的外观在 javafx.scene.control.skin 包中作为 public API 可用。因此,如果您想为现有控件提供新外观,您可以扩展和覆盖现有外观实现(这比从头开始创建自定义控件要容易得多,只要您自定义的控件具有接近您的功能即可所需的控制)。
Behavior/Skin 集成背景
在内部,皮肤可以参考行为以进行额外的定制,例如如前所述,不同平台的不同键加速器输入映射。
JavaFX 平台实施内部行为框架和系统以支持核心平台中的 public API 控件。该行为框架是完全私有的 API 虽然(在 com.sun
中)classes,因此如有更改,恕不另行通知。
您永远不应该编写依赖于 JavaFX 框架的 com.sun
classes 的代码,因为下一次为新功能或错误修复发布框架时,它可能会破坏您的代码,与 public API 不同,它很稳定并且会提前通知任何已弃用的功能。
所以不依赖 JavaFX 中的内部行为框架可能是一件好事。但是,如果需要,您可以为自定义控件实现自己的行为。为此,您可以查看内置控件的 openjfx 源代码中的实现并模拟您想要的部分(通过将 private API 复制并粘贴到新的 classes您的项目或通过从头开始为您的自定义控件实施输入行为)。
请注意,如果您的自定义控件只是来自 JavaFX 平台的一组内置核心控件或其中一个控件的子class,那么它将继承这些控件的默认行为。通常这就足够了,您不需要编写自己的行为代码。
在我分叉的 javafx 项目中,使用了包 com.sun.javafx.scene.control.skin
中的 class BehaviorSkinBase
。这是一个旧项目,所以我预计一些代码会被弃用,但是这个 class 没有出现在 deprecated list.
在 this website 上,我找到了有关缺失 class 的完整文档,但没有源代码或 javafx 版本。
我尝试使用来自官方 website 的多个版本的 javafx 构建项目,但 none 解决了问题。
此 class 用于与其他 javafx class.
定义自定义滑块public class CustomSliderSkin extends BehaviorSkinBase<Slider, SliderBehavior>
如果这个 class 肯定不再可用,是否还有其他方法可以进行此类自定义?
所以,在重装Java多次后,我发现Java sdk 8代码可以正常工作,一定是我配置有误。
然而,正如 jewelsea 的评论所述,这些技术不再受支持,因此不适合继续使用它们的项目。
JavaFX
public 不支持使用内部com.sun
API
BehaviorSkinBase
是 com.sun
api.
它从未像 public API 那样受到支持,因此它可以在没有警告或弃用的情况下更改(它确实如此)。
任何用户应用程序代码最好不要依赖 BehaviorSkinBase
或任何其他 com.sun
API.
以上信息是本题的实际答案。
以下信息是有关 JavaFX 自定义控件和实现选项的信息,如果此时与您无关,可以忽略。
实施选项
Is there another way of doing this sort of customization if this class is definitely no longer usable?
是的,有多个选项,请看下面的步骤。
决定哪种方法最适合您的应用程序将取决于您希望进行的定制量,以及您的技能水平和您希望花费在工作上的时间量。
如何重写自定义滑块
将自定义滑块与标准 JavaFX 滑块进行比较,如果您可以只使用标准滑块而不是自定义滑块,那么就这样做。
如果自定义滑块中的唯一变化是视觉样式,也许提供一些自定义 CSS 来设置标准滑块的样式就足够了。
如果自定义滑块与标准滑块具有不同的节点层次结构,那么仅对标准滑块设置样式可能无法解决问题,您将需要创建自定义外观。
如果需要制作自定义皮肤,那么看看能不能子class SliderSkin, this will allow you to provide a different node hierarchy and completely different visuals for the Slider, while still retaining the public API for the Slider class.
如果您的自定义滑块需要与滑块 class 不同的 public API,则创建一个新的控制子 class 和一个新的Skin subclass(您现在正在从头开始创建一个完全自定义的控件)。
请注意,自定义控件通常适用于通用控件库,但通常对于典型应用程序而言并不需要,因为应用程序不需要控件接口的形式,而是可以定义其 UI 使用布局窗格和内置控件的集合,这些控件使用控制器集成在一起,并且可能使用 FXML 定义。因此,大多数应用程序代码仅通过上述列表的第 1 步或第 2 步完成(例如,使用可能通过 CSS 在外观中自定义的标准滑块)。
自定义控件中的处理行为
如果您使用现有的滑块皮肤,它带有内置的行为实现,这是内部的而不是 public API 但可能对您来说已经足够了,您不太可能需要更改它。
如果您必须创建自己的完全自定义控件,那么它将没有行为实现,因此您需要从头开始添加自己的控件。行为实现将为控件进行键盘和输入处理,也许还有一些其他工作。
如果它是一个具有简单行为的简单控件,这将与将几个事件处理程序附加到控件中的节点一样简单。
如果它是一个复杂的控件,对于不同的平台有不同的键映射,那么或许可以看看 JavaFX 中的内部行为实现,看看它是如何实现行为建模的,并从中获得一些想法(或复制和复制) - 将相关内容粘贴到您自己的应用程序代码库中),以帮助实现您的控件的行为。
历史内部实现 link 行为和皮肤
参见 custom controls wiki change 4。
Change #4: SkinBase no longer has any public reference to Behavior API.
这是从 JavaFX 2 到 8 的更改。您正在使用的代码可能基于早已过时的 JavaFX 版本。另请阅读有关皮肤的信息 link,它可能会对您有所帮助。
行为背景信息
好奇的话,目前的API行为代码在:
它不包括 BehaviorSkinBase,因为很久以前,行为和皮肤的概念在 JavaFX 中是分开的。该行为(据我所知)主要用于处理键盘输入映射(尽管它也可能做其他事情)。许多这些输入映射是特定于目标平台的,因此 Mac 用户和 PC 用户可能会使用不同的映射,这允许键盘输入符合目标平台的标准键盘使用。这些行为(我相信)有助于处理这些类型的特质。
皮肤背景信息
外观表示控件的可视布局。 Control子class定义了publicAPI,往往是从Skin的内部实现中抽象出来的。这允许您定义一个像 Spinner 这样的控件,它可能具有向上和向下箭头以在 PC 上更改一个范围内的整数值,但在像 iOS 这样的触摸设备上,它可能被实现为一个可滚动的 rolodex风格。 public 控件界面没有改变,但不同的皮肤实现附加到不同平台的控件,以根据目标设备允许不同的外观。
您从头开始创建的自定义控件可以扩展 Skin 界面,以允许它们如上所述进行换肤。
此外,JavaFX 平台中所有内置控件的外观在 javafx.scene.control.skin 包中作为 public API 可用。因此,如果您想为现有控件提供新外观,您可以扩展和覆盖现有外观实现(这比从头开始创建自定义控件要容易得多,只要您自定义的控件具有接近您的功能即可所需的控制)。
Behavior/Skin 集成背景
在内部,皮肤可以参考行为以进行额外的定制,例如如前所述,不同平台的不同键加速器输入映射。
JavaFX 平台实施内部行为框架和系统以支持核心平台中的 public API 控件。该行为框架是完全私有的 API 虽然(在 com.sun
中)classes,因此如有更改,恕不另行通知。
您永远不应该编写依赖于 JavaFX 框架的 com.sun
classes 的代码,因为下一次为新功能或错误修复发布框架时,它可能会破坏您的代码,与 public API 不同,它很稳定并且会提前通知任何已弃用的功能。
所以不依赖 JavaFX 中的内部行为框架可能是一件好事。但是,如果需要,您可以为自定义控件实现自己的行为。为此,您可以查看内置控件的 openjfx 源代码中的实现并模拟您想要的部分(通过将 private API 复制并粘贴到新的 classes您的项目或通过从头开始为您的自定义控件实施输入行为)。
请注意,如果您的自定义控件只是来自 JavaFX 平台的一组内置核心控件或其中一个控件的子class,那么它将继承这些控件的默认行为。通常这就足够了,您不需要编写自己的行为代码。