2013-11-15 25 views
2

我已將「styles.css」放入了我的包的根目錄,現在試圖弄清楚如何在代碼中將其鏈接起來。問題是,@ .getStylesheets()加(_)將一個字符串不URL,所以我知道所有的方法都失敗在這裏。OSGi包內的JavaFX樣式表

以1:

scene.getStylesheets().add("styles.css"); 

Nov 15, 2013 2:04:47 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged 
WARNING: Resource "styles.css" not found. 

以2:

scene.getStylesheets().add(this.getClass().getResource("styles.css").toExternalForm()); 

NullPointerException 

取3:

scene.getStylesheets().add(this.getClass().getClassLoader().getResource("styles.css").toExternalForm()); 

Nov 15, 2013 2:27:31 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged 
INFO: Could not load stylesheet: bundle://5.0:1/styles.css 

以4:

scene.getStylesheets().add(myBundle.getEntry("styles.css").toExternalForm()); 

Nov 15, 2013 1:31:35 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged 
INFO: Could not load stylesheet: bundle://5.0:0/styles.css 

我使用費利克斯 - 4.2.1的Java-8(建立1.8.0-EA-B115)JavaFX的8(8.0.0-EA-B115 )

回答

2

我最近在相同的錯誤跑/麻煩,因爲這問題的樓主,我設法解決它,而不進行任何更改的CSS/FXML或將其解壓到一個臨時文件。我在這裏張貼,因爲我沒有找到任何好的答案在線:

在我的情況下設置爲:

Bundle0:

  • someview.fxml使用相對路徑參照的CSS文件
  • somestyle.css一起圖像相對路徑引用
  • someimage.png
  • Resourceloader.java(返回從CSS和FXML文件URL對象)

Bundle1:

  • 基本JavaFX的文件從bundle0的FXML加載器加載的FXML。

問題:

所有的CSS和CSS參考的圖像似乎被FXML被忽略,即使我設置的FXML裝載的類加載器。它只適用於如果我使用絕對文件路徑的CSS和CSS引用的圖像。這不是我想要的。

解決辦法:

有2個錯誤/設計問題JavaFX中,從與OSGi的工作,禁止該設置。

  • 加載從FXML的CSS
  • 從CSS

參考圖像要解決的第一個問題,你已經由系統屬性binary.css設置爲禁用在JavaFX的二進制css文件假。 javafx中存在一個錯誤(可能它已經修復了?),其中javafx試圖變得聰明並嘗試查找bss文件,即使您說css。它翻轉是因爲OSGi資源URL在沒有模式的情況下有一個'bundle://'模式。解決方案:

  • -Dbinary.css =假

要解決的第二個問題,你必須線程上下文類加載器設置到CSS的圖像所在的包的類加載器,然後還原線程上下文類加載器。關鍵是這個CSS是通過JavaFX的,當你希望它是,這並不總是解釋每次做...

ClassLoader tccl = Thread.currentThread().getContextClassLoader(); 
     try { 
      final ClassLoader resourcesClassLoader = Resourceloader.class.getClassLoader(); 
     //needed for css 
     Thread.currentThread().setContextClassLoader(resourcesClassLoader); 
     this.primaryStage.show(); 
    } finally { 
     Thread.currentThread().setContextClassLoader(tccl); 
    } 

不幸的是,這是我能想出的最好的解決方案。 JavaFX不是用類加載器或依賴注入來實現的,即使幾乎每個公司應用程序都以某種形式使用這些功能。:(

//編輯 看起來你並不需要設置線程上下文的classloader從CSS訪問圖像

0

getClass()。getClassloader()。getResource()。toExternalForm()?

+0

同樣的麻煩基於束變,但感謝嘗試 - !我已將它包含在帖子中 – aemxdp

+0

因爲它對我來說正是這樣,而對於@puce,在你的設置中有錯誤嗎?是否有可能你的IDE沒有將CSS文件複製到類路徑中(例如在Eclipse中)必須是bin文件夾的一部分) – tomsontom

+0

我檢查過jar並且一切正常。它實際上看到了css文件,但未能加載它(「INFO:無法加載樣式表」vs「WARNING:Resource」styles.css「找不到「)。也許麻煩在於上一個felix,javafx或java。目前,我已經切換到embedde d felix(處理javafx部分外部捆綁包),一切都很好。 – aemxdp

2
  • 確保你使用的訪問包含CSS文件
  • 如果您使用的是相對路徑捆綁類的類加載器,確保CSS位於相對於該類包

這裏有一個例子,我如何Drombler FX加載CSS文件(Drombler FX is a modular Rich Client Platform for JavaFX based on OSGi and Maven (POM-first)):

http://sourceforge.net/p/drombler/drombler-fx/ci/default/tree/drombler-fx-core-docking/src/main/java/org/drombler/fx/core/docking/impl/skin/Stylesheets.java

這裏:Stylesheets類與CSS文件在同一個包中。

3

這不起作用的原因在這裏解釋:javafx jira RT-14177。 由於您無法使用資源的「ExternalForm」,因此我通過直接讀取輸入流將其複製到臨時文件中。

 InputStream inputStream = MainApp.class.getResourceAsStream("/styles/styles.css"); 
     File tempStyleSheetDest = File.createTempFile("javafx_stylesheet", ""); 
     tempStyleSheetDest.deleteOnExit(); 
     Files.copy(inputStream, tempStyleSheetDest.toPath(), StandardCopyOption.REPLACE_EXISTING); 
     scene.getStylesheets().add(tempStyleSheetDest.toURI().toString()); 

我真的希望這可以幫助你。

喬納森

+0

RT-14177現在是[JDK-8112993](https://bugs.openjdk.java.net/browse/JDK-8112993) – Itai