На этот вопрос уже отвечали несколько раз для других элементов управления. Но здесь вы идете:
Следуйте коду
Когда вы добавляете SeparatorMenuItem
, вы можете увидеть исходный код здесь или непосредственно из вашей 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
в качестве обложки, и он просто отображает 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);
});
Будет напечатано что-то вроде:
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
Загрузите версию JDK 11 для вашей платформы с здесь , а во время работы приложения запустите ее с scenicview/bin/scenicview
:
Несмотря на то, что при отображении содержимого меню вы увидите полную иерархию графа сцены, как показано на рисунке выше, в этом случае существует серьезная проблема, которая не позволяет щелкнуть любой из узлов для проверки его содержимого и классов стилей, не закрывая меню.
Так что, хотя это не поможет в этом случае, это всегда очень полезный инструмент для использования.
Проверьте modena.css
Модена - это тема, применяемая по умолчанию ко всем встроенным элементам управления JavaFX.
Либо здесь , либо из вашей IDE, вы можете найти точный стиль, примененный к элементу управления.
В этом случае:
.context-menu .separator:horizontal .line {
-fx-border-color: -fx-box-border transparent transparent transparent;
-fx-border-insets: 1 0 0 0;
}
Так что теперь вы можете изменить это по мере необходимости. Обратите внимание, что это точно соответствует тому, что мы нашли через исходный код.