JavaFX documentation似乎暗示如果在CSS根类中定义了一个属性,它可以被场景中的任何对象引用:
.root样式类包含可供其他样式使用的属性,以在UI中提供一致性。例如,属性-fx-focused-base在.root样式中定义。其他UI控件的样式使用此属性作为控件具有焦点时的颜色。
例如,在以下简单应用程序中:
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
AnchorPane pane = new AnchorPane();
Scene s = new Scene(pane, 800, 600);
pane.getStylesheets().add("test.css");
pane.getStyleClass().add("test");
System.out.println("Root pane style classes:");
for (String clazz : pane.getStyleClass())
System.out.println(clazz);
stage.setScene(s);
stage.show();
}
public static void main(String[] args) {
Application.launch();
}
}
使用以下样式表test.css:
.test {
-fx-background-color: -fx-base;
}
结果如下:
Root pane style classes:
root
test
WARNING: com.sun.javafx.css.StyleHelper calculateValue Could not resolve '-fx-base' while resolving lookups for '-fx-background-color' from rule '*.test' in stylesheet test.css
(我从警告中删除了文件路径)
为什么它不能解析-fx-base?它显然包含在caspian.css ...
中答案 0 :(得分:5)
这里的问题似乎是样式表(caspian.css)被延迟加载。因此,除非构造组件(甚至不必添加),否则不会解析样式表。布局容器(如AnchorPane)不会触发样式表的加载。另一方面,控件(如Button / CheckBox / Label等)将触发要加载的样式表。
以上是上述测试用例的更新版本,以说明此行为:
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
AnchorPane pane = new AnchorPane();
new Button(); // Trigger loading of default stylesheet
Scene s = new Scene(pane, 800, 600);
pane.getStylesheets().add("test.css");
pane.getStyleClass().add("test");
System.out.println("Root pane style classes:");
for (String clazz : pane.getStyleClass())
System.out.println(clazz);
stage.setScene(s);
stage.show();
}
public static void main(String[] args) {
Application.launch();
}
}