我想在程序中更改SeparatorMenuItem的颜色。哪些CSS代码可让我更改其颜色?我在JavaFX CSS Reference Guide中找不到任何信息。
答案 0 :(得分:4)
对于其他控件,已经多次回答了这个问题。但是你去了:
添加SeparatorMenuItem
时,可以查看源代码here或直接从IDE中查看。
public SeparatorMenuItem() {
super(new Separator(Orientation.HORIZONTAL), false);
getStyleClass().add(DEFAULT_STYLE_CLASS);
}
它用作DEFAULT_STYLE_CLASS
,separator-menu-item
,并扩展了CustomMenuItem
,又扩展了MenuItem
,而这不是控件,因此这种样式可能类不是我们需要修改的类。
单击Menu
节点时,它将显示一个ContextMenu
样式类context-menu
,其中包含菜单项,用于呈现内容的外观为ContextMenuSkin
,并且每个项目都使用ContextMenuContent.MenuItemContainer
:
负责在菜单中布置单行的容器-换句话说,它包含并布置单个MenuItem,无论其具体的子类型为何。
项目已添加到ContextMenuContent.MenuBox
(一个VBox)中,但是此容器没有特定的样式类。
SeparatorMenuItem
的内容节点是Separator
,这是一个样式类为separator
的节点,其外观为SeparatorSkin
,并且仅呈现{{1 }},一个以line
作为样式类的区域。
最后,我们可以执行以下操作来更改line
的颜色:
SeparatorMenuItem
如您所见,主要问题是找出场景图中正在渲染的真实节点及其父节点。
打印以下内容也很有帮助:
.context-menu > * > .separator > .line {
-fx-border-color: red;
-fx-border-insets: 0;
}
它将打印如下内容:
menu.setOnShown(e -> {
Node node = separatorMenuItem.getContent();
do {
System.out.println("Node: " + node);
node = node.getParent();
} while (node != null);
});
从here下载适合您平台的JDK 11版本,并在运行应用程序时从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]
启动它:
虽然在显示菜单内容时会看到完整的场景图层次结构(如上图所示),但是在这种情况下,存在一个主要问题,即您无法单击任何节点来检查其内容和样式类,无需关闭菜单。
因此,尽管在这种情况下无济于事,但它始终是一个非常有用的工具。
Modena是默认情况下应用于所有内置JavaFX控件的主题。
here或从您的IDE中,您都可以找到应用于控件的确切样式。
在这种情况下:
scenicview/bin/scenicview
因此,您现在可以根据需要进行更改。请注意,它与我们通过源代码找到的内容完全匹配。