我想在程序中更改SeparatorMenuItem的颜色。哪些CSS代码将允许我更改其颜色?我在JavaFX CSS Reference Guide中找不到任何信息。

最佳答案

对于其他控件,已经多次回答了这个问题。但是,您可以在这里:

遵循代码

添加SeparatorMenuItem时,您可以直接从IDE中查看源代码here

public SeparatorMenuItem() {
    super(new Separator(Orientation.HORIZONTAL), false);
    getStyleClass().add(DEFAULT_STYLE_CLASS);
}

它用作DEFAULT_STYLE_CLASSseparator-menu-item,并扩展了CustomMenuItem,扩展了MenuItem,后者不是控件,因此此样式类可能不是我们需要修改的类。

当您单击Menu节点时,它将显示一个样式表为ContextMenucontext-menu,其中包含菜单项,用于呈现内容的外观为ContextMenuSkin,并且每个项目都使用ContextMenuContent.MenuItemContainer:

负责在菜单中布置单行的容器-换句话说,此容器包含并布置单个MenuItem,而不管其特定的子类型如何。

这些项目将添加到ContextMenuContent.MenuBox(VBox)中,但是此容器没有特定的样式类。
SeparatorMenuItem的内容节点是Separator,它是样式类separator的节点,以SeparatorSkin作为皮肤,它仅呈现line,这是一个line作为样式类的区域。

最后,我们可以执行以下操作来更改SeparatorMenuItem的颜色:
.context-menu > * > .separator > .line {
    -fx-border-color: red;
    -fx-border-insets: 0;
}

java - 用于设置SeparatorMenuItem颜色的CSS?-LMLPHP

如您所见,主要问题是找出场景图中正在渲染的真实节点及其父节点。

打印以下内容也很有帮助:
menu.setOnShown(e -> {
        Node node = separatorMenuItem.getContent();
        do {
            System.out.println("Node: " + node);
            node = node.getParent();
        } while (node != null);
    });

它将打印如下内容:
Node: Separator@296d4a5a[styleClass=separator]
Node: ContextMenuContent$MenuBox@14793a99
Node: ContextMenuContent[id=null, styleClass=context-menu]
Node: PopupControl$CSSBridge[id=null, styleClass=context-menu]
Node: Pane@2decd2c5[styleClass=root popup]

使用ScenicView

here下载适合您平台的JDK 11版本,并在运行应用程序时从scenicview/bin/scenicview启动它:

虽然在显示菜单内容时将看到完整的场景图层次结构,如上图所示,但在这种情况下,存在一个主要问题,即您无法单击任何节点来检查其内容和样式类,而不会关闭菜单。

因此,尽管在这种情况下无济于事,但它始终是一个非常有用的工具。

检查modena.css

Modena是默认情况下应用于所有内置JavaFX控件的主题。

要么here,要么从您的IDE中,您可以找到应用于控件的确切样式。

在这种情况下:
.context-menu .separator:horizontal .line {
    -fx-border-color: -fx-box-border transparent transparent transparent;
    -fx-border-insets: 1 0 0 0;
}

因此,现在您可以根据需要进行更改。请注意,它与我们通过源代码找到的内容完全匹配。

07-24 21:34