> .context-menu
> .context-menu .separator
> .context-menu .scroll-arrow
> .context-menu .scroll-arrow:hover
> .context-menu:show-mnemonics .mnemonic-underline
我把这些完全复制到了我的css文件,并且只是改变了背景颜色值作为测试:
- .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;
- }
这显然不行,否则我不会在这里.似乎没有任何影响,无论我改变什么价值.
我打开了JavaFX Scene Builder来看看(旁注,我用这个作为最后的手段,因为我发现它很笨拙的使用).我注意到在CSS列表的上下文菜单的CSS样式部分,列出了CSSBridge [上下文菜单],这似乎是奇怪的. Label等标签有标签.
有人可以向我解释这里发生了什么,因为它似乎忽略了我的css文件的上下文菜单,并使用caspian.css中的默认值?
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();
- }
- }
解决方法
测试在WinXPsp3,Jdk7u6b14ea,JavaFX 2.2b12.
java应用程序
- import javafx.application.Application;
- import javafx.scene.Scene;
- import javafx.scene.control.*;
- import javafx.stage.Stage;
- public class ContextColor extends Application {
- public static void main(String[] args) { launch(args); }
- @Override public void start(Stage stage) {
- Label label = new Label("Right click for options");
- label.setContextMenu(new ContextMenu(new MenuItem("Help"),new MenuItem("Me")));
- Scene scene = new Scene(label);
- scene.getStylesheets().add(ContextColor.class.getResource("contextcolor.css").toExternalForm());
- stage.setScene(scene);
- stage.show();
- }
- }
css样式表
- /** contextcolor.css
- * place in same folder as ContextColor.java
- * ensure your build system copies this file to the ContextColor.class output directory on build
- */
- .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;
- }
我无法告诉你为什么你的CSS样式没有按你所期望的功能的确切原因.
一些可能的原因是:
>您没有正确加载它.
>您的css文件不会复制到您的输出路径.
>您的css文件被破坏或语法错误.
>您正在使用JavaFX的早期版本,该版本难以从CSS设置上下文菜单.
更新
看看你的问题的完整代码,通过fxml加载css文件,我可以重现你的问题,上下文菜单没有样式.如果,而不是在fxml中设置样式表,我将代码中的样式表(如我的测试应用程序)设置在场景中,那么这一切都可以正常运行.
通过fxml设置css的区别是fxml不是在场景中设置样式表,而是在场景的父根节点上设置.如果在代码中,我将样式表添加到父项而不是场景中,那么我最终会得到与fxml一样的代码实现.所以这并不是fxml本身的一个问题,而是与JavaFX 2.2 css处理的继承规则有关. IMO,css处理是错误的 – 无论样式表是在场景还是场景的根节点上设置,样式都应该相同.
我建议您使用您的测试用例向http://javafx-jira.kenai.com的JavaFX运行时控件提交错误,并返回此StackOverflow问题的链接,JavaFX团队将及时解决此问题.
更新
这个问题的根本原因似乎是RT-19435: popup control not styled be parent’s style sheet declarations.