我试图ContextMenu使用单独的CSS文件更改项目的样式.我查看了caspian.css部分,找到了以下定义:
我将那些完全复制到我的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;
}
Run Code Online (Sandbox Code Playgroud)
这显然不起作用或我不会在这里.无论我改变什么价值,它似乎都没有效果.
我打开了JavaFX场景生成器来看一下(旁注我用它作为最后的手段,因为我发现使用起来非常笨拙).我注意到在css部分的样式部分下面的上下文菜单是列表CSSBridge[context-menu],看起来很奇怪.像Label这样的其他东西Label[label].
任何人都可以向我解释这里发生了什么,因为它似乎忽略了我的css文件上下文菜单并使用caspian.css中的默认值?
附加样本FXML文件,css和java代码来运行.
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>
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
jew*_*sea 16
这是一个通过css设计JavaFX上下文菜单样式的简单示例.
在WinXPsp3,Jdk7u6b14ea,JavaFX 2.2b12上测试.
java app
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
我无法告诉你为什么你的CSS样式没有按预期运行的确切原因.一些可能的原因是:
更新
查看问题中通过fxml加载css文件的完整代码,我可以重现你的问题,其中没有设置上下文菜单的样式.如果,而不是在FXML设置样式表,我设置样式表在现场的代码(在我的测试应用程序),那么这一切工作正常.
通过fxml设置css的区别在于fxml不是在场景上设置样式表,而是在场景的父根节点上设置样式表.如果在代码中我将样式表添加到父项而不是场景中,那么我最终会从代码实现中获得与fxml相同的行为.所以这对fxml本身来说并不是一个问题,而是与JavaFX 2.2 css处理的继承规则有关.IMO,css处理错误 - 无论是在场景上还是在场景的根节点上设置样式表,样式都应该相同.
我建议在http://javafx-jira.kenai.com上使用您的测试用例和回到此StackOverflow问题的链接提交针对JavaFX运行时控件的错误,JavaFX团队将在适当的时候解决问题.
作为一种解决方法,现在只需在代码中将样式表设置在场景中.
更新
此问题的根本原因似乎是RT-19435:未设置样式的弹出控件是父级的样式表声明.
| 归档时间: |
|
| 查看次数: |
22559 次 |
| 最近记录: |