未记录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" ;,这不是相对的,而是绝对的。
答案 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
以及警告。