Scene#getStylesheets()中相对路径的路径来源是什么?

时间:2016-05-06 12:06:40

标签: java css javafx

未记录getStylesheets() javadoc中相对路径的原点位置。它在"JavaFX CSS Reference Guide"中有部分记载,但描述存在争议。

例如,据说:

  

样式表URL可以是绝对URL或相对URL。如果一个   给出相对URL,它是根据的基本URL解析的   具体Application类的ClassLoader。例如,如果那里   是一个扩展Application的主要类com.wicked.cool.ui.Main   相对网址" /com/wicked/cool/resources/styles.css"会解决   正确地说," com / wicked / cool / resources / styles.css"。该   相对URL" ../ resources / styles.css"自从路径" .."   相对于根不是有效路径。它通常更容易使用   一些类的ClassLoader来查找资源。例如,如果   " styles.css"文件驻留在与Main相同的包中   以下代码将提供正确的URL:   com.wicked.cool.ui.Main.class.getResource(" styles.css的&#34)。toExternalForm()

即。 "亲戚" URL是" /com/wicked/cool/resources/styles.css" ;,这不是相对的,而是绝对的。

1 个答案:

答案 0 :(得分:1)

注意两者

/com/wicked/cool/resources/styles.css

com/wicked/cool/resources/styles.css

RFC1808中定义的相对网址。

此处的相对意味着相对于ClassLoader用于解析网址的位置。 (两个URL都缺少权限/协议部分。)

以下示例使用URLClassLoader添加新位置以查找样式表:

public class Main {

    public static void main(String[] args) throws MalformedURLException {
        File stylesheetDir = ...

        // classloader able to resolve additional resources located at the given dir
        ClassLoader classLoader = new URLClassLoader(new URL[] {stylesheetDir.toURI().toURL()}, Main.class.getClassLoader());
        Thread thread = new Thread(() -> Application.launch(TestApplication.class, new String[0]));

        // specify classloader to use
        thread.setContextClassLoader(classLoader);

        thread.start();
    }
}

假设TestApplication具有以下启动方法:

public void start(Stage primaryStage) {
    Scene scene = new Scene(new Group(new Rectangle(100, 100)));
    primaryStage.setScene(scene);
    scene.getStylesheets().add("/style.css");
    primaryStage.show();
}

style.css是一个仅位于包含以下内容的指定目录的css文件:

* {
    -fx-fill: red;
}

Rectangle将显示为红色。

现在注释掉

thread.setContextClassLoader(classLoader);

您将获得默认的黑色Rectangle以及警告。