2016-05-06 152 views
0

它沒有記錄在getStylesheets() javadoc的相對路徑的起始位置。它部分記錄在"JavaFX CSS Reference Guide",但描述是有爭議的。什麼是Scene#getStylesheets()中相對路徑的路徑起源?

例如,它表示:

一個樣式表的URL可以是絕對URL或相對URL。如果給出了一個 相對URL,它會根據具體Application類的 ClassLoader的基本URL進行解析。例如,如果 是擴展應用程序的主類com.wicked.cool.ui.Main,則 相對URL「/com/wicked/cool/resources/styles.css」將正確解析 ,就像「 COM /邪惡/冷/資源/ Styles.css中」。 相對URL「../resources/styles.css」不會因爲相對於根的路徑「..」 不是有效的路徑。通常使用 某些類的ClassLoader來查找資源更容易。例如,如果 「styles.css」文件與Main存在於相同的包中,則 以下代碼將提供正確的URL: com.wicked.cool.ui.Main.class.getResource(「styles.css」 ).toExternalForm()。

I.e. 「相對」URL的例子是「/com/wicked/cool/resources/styles.css」,它不是相對的,而是絕對的。

回答

1

注意,既

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

com/wicked/cool/resources/styles.css 

是如RFC1808定義相對URL。

這裏的相對意思是相對於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以及警告。