CSS для настройки цвета SeparatorMenuItem? - PullRequest
3 голосов
/ 02 июля 2019

Я хотел бы изменить цвет SeparatorMenuItem в моей программе.Какой код CSS позволит мне изменить его цвет?Я не могу найти информацию об этом в Справочном руководстве по JavaFX CSS .

1 Ответ

4 голосов
/ 02 июля 2019

На этот вопрос уже отвечали несколько раз для других элементов управления. Но здесь вы идете:

Следуйте коду

Когда вы добавляете 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;
}

Separator Menu Item

Как вы можете видеть, главная проблема заключается в обнаружении реального узла, отображаемого в графе сцены, вместе с их родителями.

Также полезно напечатать это:

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:

image

Несмотря на то, что при отображении содержимого меню вы увидите полную иерархию графа сцены, как показано на рисунке выше, в этом случае существует серьезная проблема, которая не позволяет щелкнуть любой из узлов для проверки его содержимого и классов стилей, не закрывая меню.

Так что, хотя это не поможет в этом случае, это всегда очень полезный инструмент для использования.

Проверьте 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;
}

Так что теперь вы можете изменить это по мере необходимости. Обратите внимание, что это точно соответствует тому, что мы нашли через исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...