> .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.