I am trying to change the style of a ContextMenu
item using a seperate CSS file. I looked at the caspian.css section and found the following definitions:
- .context-menu
- .context-menu .separator
- .context-menu .scroll-arrow
- .context-menu .scroll-arrow:hover
- .context-menu:show-mnemonics .mnemonic-underline
I copied those over exactly to my css file and changed just the background color values as a test:
.context-menu {
-fx-skin: "com.sun.javafx.scene.control.skin.ContextMenuSkin";
-fx-background-color: #006699;
-fx-background-insets: 0, 1, 2;
-fx-background-radius: 0 6 6 6, 0 5 5 5, 0 4 4 4;
/* -fx-padding: 0.666667em 0.083333em 0.666667em 0.083333em; 8 1 8 1 */
-fx-padding: 0.333333em 0.083333em 0.666667em 0.083333em; /* 4 1 8 1 */
}
.context-menu .separator {
-fx-padding: 0.0em 0.333333em 0.0em 0.333333em; /* 0 4 0 4 */
}
.context-menu .scroll-arrow {
-fx-padding: 0.416667em 0.416667em 0.416667em 0.416667em; /* 5 */
-fx-background-color: #006699;
}
.context-menu .scroll-arrow:hover {
-fx-background: -fx-accent;
-fx-background-color: #006699;
-fx-text-fill: -fx-selection-bar-text;
}
.context-menu:show-mnemonics .mnemonic-underline {
-fx-stroke: -fx-text-fill;
}
This obviously does not work or I would not be here. It seems to have no effect no matter what values I change.
I opened up JavaFX Scene Builder to take a look (side note I used this as a last resort, as I find it pretty clumsy to use). I noticed under the Styleable Parts of the css section for the context menu that is lists CSSBridge[context-menu]
which seems odd. Other things like Label have Label[label]
.
Can anybody explain to me what is going on here, as it appears to be ignoring my css file for context menus and using the default values in caspian.css?
Attaching sample FXML file, css and java code to run.
Sample.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.net.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="myroot" xmlns:fx="http://javafx.com/fxml">
<children>
<Label text="Right click for options">
<contextMenu>
<ContextMenu>
<items>
<MenuItem text="Help" />
<MenuItem text="Me" />
</items>
</ContextMenu>
</contextMenu>
</Label>
</children>
<stylesheets>
<URL value="@contextcolor.css" />
</stylesheets>
</AnchorPane>
contextcolor.css
.root {
-fx-background-color: cornsilk;
-fx-padding: 10;
}
.context-menu {
-fx-background-color: #006699;
-fx-text-fill: white;
}
.menu-item .label {
-fx-text-fill: yellow;
}
.menu-item:focused .label {
-fx-text-fill: white;
}
Test.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Test extends Application {
public static void main(String[] args) {
Application.launch(Test.class, args);
}
@Override
public void start(Stage stage) throws Exception {
System.out.println(com.sun.javafx.runtime.VersionInfo.getVersion());
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
stage.setScene(new Scene(root));
stage.show();
}
}