如何在 JavaFX 8 中为 MenuItem 添加皮肤效果?

How to add skin effect to MenuItem in JavaFX 8?

我正在使用自定义 Button class 来实现 Android Material 设计中看到的效果。我从 here 那里得到了这个。

我想实现相同的功能,但在 MenuBar 中使用 MenuItem,但在 class 中我无法覆盖 createDefaultSkin()。还有其他方法可以创建此动态背景吗?我已经搜索过,只找到了如何更改背景颜色或如何制作颜色的动画过渡,但没有什么比设置自定义形状更像 Circle 在这种情况下它是后者的动画。

MenuItems 不是控件,因此不能使用像 createDefaultSkin() 这样的控件架构方法对它们进行换肤 - 您已经发现了这一点。不过,您确实有一些选择。

  1. JavaFX 提供 CustomMenuItem class which provides a configurable node content property。因此,您可以通过创建 CustomMenuItem 实例来自定义菜单项。

  2. 标准菜单项也可以通过 setting a graphic 自定义。

  3. 菜单项也可以在没有 Java 代码的情况下通过操纵它们的 CSS 进行相当广泛的自定义,尽管在 [=37] 中无法实现动画效果=] material您所指的设计按钮。

  4. MenuBars 是控件并且有一个皮肤实现,因此您可以为整个菜单栏提供您自己的皮肤实现(与您提供的 link 提供自定义皮肤实现的方式相同用于按钮)。自定义菜单栏皮肤然后负责呈现整个菜单的 GUI,并且可以使用您决定提供的任何实现来实现。

菜单栏是比按钮复杂得多的控件,因此提供自定义菜单栏外观是一项非常重要的任务。要了解内置的MenuBarSkin 实现,您可以search the JavaFX source repository for the MenuBarSkin class。内置菜单栏可以很复杂,因为它能够在 Mac 上使用系统菜单功能、弹出菜单、应用程序中基于场景图节点的菜单 window 等。内置-in 实现处理菜单栏本身的一些 UI 功能,在其他情况下委托从菜单项、各种 Java 帮助程序 类 和最终的底层 OS windowing 工具包支持菜单显示和管理。