2014-10-27 59 views
4

我正在使用Java 1.8u25,我正在使用如下所示的樣式表(Java和Clojure等價物)。我可以在沒有JVM重啓的情況下重新加載JavaFX 8中的樣式表嗎?

//Java 
new Pane().getStylesheets().add("some_style.css") 

//Clojure 
(doto (Pane.) 
    (-> .getStylesheets (.add "some_style.css"))) 

我正在使用Clojure,並且在測試運行之間不重新啓動JVM。但是,我確實爲每次運行創建了一個新的GUI實例。 JavaFX將樣式表緩存在某處,因此編輯CSS文件不起作用。有沒有辦法強制JavaFX重新加載樣式表?或者,重新加載類以便緩存丟失的方法?

回答

1

注意,你是不是設置改變樣式表,但增加樣式表:

new Pane().getStylesheets().add("some_style.css") 

您調用add()方法!所以基本上它是你的Pane緩存以前加載的樣式表。

解決方法很簡單:重新裝入之前,刪除(清除)舊:

Pane p = new Pane(); 
// Load first time: 
p.getStylesheets().add("some_style.css"); 

// Later to reload: 
p.getStylesheets().clear(); 
p.getStylesheets().add("some_style.css"); 
    // some_style.css will be read again and applied 

注:

如果使用多個CSS文件,clear()可能不是你想要的這裏。在這種情況下,您可以使用remove()方法刪除特定樣式表(您要重新加載),然後再次添加它。

注2:

當加載CSS文件,你應該使用的網址資源,不只是一個文件名。如果只提供文件名,則它也必須包含軟件包名稱。這樣做可以從文件系統和jar文件兩方面工作:

p.getStylesheets().add(YourClass.class.getResource("some_style.css") 
    .toExternalForm()); // if some_style.css is next to YourClass.java 
+0

應該也許已經更清楚了:它們之間並不是相同的實例。我做了一個新的窗格實例。此外,我試圖添加,清除,然後再添加在同一個實例上,你說應該工作,但事實並非如此。我很確定有一個緩存,正如[這裏]討論的那樣(https://community.oracle.com/thread/2296345?tstart=0)。但是那裏提到的'reloadStylesheets'方法似乎沒有了。 在最糟糕的情況下,我只是臨時重命名css文件來欺騙緩存。 – oskarkv 2014-10-27 08:35:36

+0

@oskarkv我用相同的「窗格」實例檢查了它。添加樣式表,然後更改CSS文件,然後清除樣式表並添加再次爲我工作。 – icza 2014-10-27 09:07:18

+0

你使用哪個版本的Java?另外我嘗試更改CSS文件的名稱,然後按預期工作(一次)。 – oskarkv 2014-10-27 11:58:00

相關問題