Me gustaría cambiar el color de un SeparatorMenuItem en mi programa. ¿Qué código CSS me permitirá cambiar su color? No puedo encontrar ninguna información sobre ella en la Guía de referencia CSS JavaFX .
Esta pregunta se ha respondido varias veces ya para otros controles. Pero aquí van:
Siga el código
Cuando se agrega una SeparatorMenuItem
, se puede ver el código fuente aquí o directamente desde el IDE.
public SeparatorMenuItem() {
super(new Separator(Orientation.HORIZONTAL), false);
getStyleClass().add(DEFAULT_STYLE_CLASS);
}
Utiliza como DEFAULT_STYLE_CLASS
, separator-menu-item
y se extiende CustomMenuItem
, que se extiende MenuItem
, que no es un control , por lo que esta clase de estilo podría no ser el que tenemos que modificar.
Al hacer clic en el Menu
nodo que muestra una ContextMenu
con clase de estilo context-menu
, que contiene los elementos del menú, la piel se utiliza para representar el contenido es ContextMenuSkin
, y cada artículo utiliza una ContextMenuContent.MenuItemContainer
:
Recipiente responsable para el tendido de una sola fila en el menú - en otras palabras, este contiene y establece un único Menultem, independientemente de que de subtipo específico.
Los artículos se añadió a una ContextMenuContent.MenuBox
(una caja vertical), pero este recipiente no tiene una clase de estilo específico.
El nodo de contenido de la SeparatorMenuItem
es una Separator
, un nodo con clase de estilo separator
, que tiene SeparatorSkin
como la piel, y que sólo se hace una line
, una región con line
como clase de estilo.
Por último, podemos hacer algo como esto para cambiar el SeparatorMenuItem
color de:
.context-menu > * > .separator > .line {
-fx-border-color: red;
-fx-border-insets: 0;
}
Como se puede ver, la cuestión principal es encontrar el nodo real que se está representando en la escena gráfica, junto con sus padres.
También es útil para imprimir esta:
menu.setOnShown(e -> {
Node node = separatorMenuItem.getContent();
do {
System.out.println("Node: " + node);
node = node.getParent();
} while (node != null);
});
Se imprimirá algo como:
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]
uso ScenicView
Descargar la versión JDK 11 para su plataforma desde aquí , y mientras se ejecuta la aplicación, lanzarlo desde scenicview/bin/scenicview
:
Mientras que verá la jerarquía scenegraph completa cuando se muestra el contenido del menú, como en la imagen superior, en este caso no es un problema importante que le impide, selecciona uno de los nodos para inspeccionar su contenido y estilo de las clases, sin cerrar la menú.
Así, mientras que no ayudará en este caso, siempre es una herramienta muy útil para su uso.
Comprobar modena.css
Módena es el tema aplicado por defecto a todos los incorporados en JavaFX controles.
Ya sea aquí o en su IDE, se puede encontrar el estilo exacto aplicado al control.
En este caso:
.context-menu .separator:horizontal .line {
-fx-border-color: -fx-box-border transparent transparent transparent;
-fx-border-insets: 1 0 0 0;
}
Así que ahora usted puede cambiar eso, según sea necesario. Tenga en cuenta que coincide precisamente lo que hemos encontrado a través del código fuente.