JavaFX CSS 根属性引用未解析

3

JavaFX文档似乎暗示,如果属性在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中...


你尝试过将test.css添加到场景而不是窗格中吗? - Andy Till
我刚刚尝试了一下,仍然无法解决查找问题。我还尝试了重新排序,在几个不同的排列方式中添加样式类和样式表。 - elecengin
1个回答

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();
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接