2016-04-03 168 views
-1

我試圖從名爲cssBundle另一束導入OSGi包資源(稱爲style.css的CSS文件)導入CSS文件:如何從外部束資源

public void addCSS() { 
    Bundle bundle = FrameworkUtil.getBundle(this.getClass()); 
    Bundle[] bArray = bundle.getBundleContext().getBundles(); 
    Bundle cssBundle = null; 
    for (Bundle b : bArray) { 
     if (b.getSymbolicName().equals("cssBundle")) { 
      cssBundle = b; 
      break; 
     } 
    } 
    Enumeration<URL> resources = null; 
    try { 
     resources = cssBundle.getResources("/resources/css/mainscreen.css"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    if (resources != null) { 
     URL myCSSURL = resources.nextElement(); 
     try { 
      URI uri = myCSSURL.toURI(); 
      File f = new File(uri); 
      scene.getStylesheets().add("file:///" + f.getAbsolutePath().replace("\\", "/")); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

然而,這樣,我得到:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: URI scheme is not "file" 
at java.io.File.<init>(Unknown Source) 

什麼是正確的或更好的方式去了解它?

System.out.println(myCSSURL); 

產出

bundle://13.1:1/resources/css/style.css 

有沒有一種方法,我可以不使用URL到我的場景中添加呢?

+0

我沒有使用過OSGI,但是有沒有一個原因,你不會只是'scene.getStylesheets()。add(uri.toString());'? (或者'uri.toURL()。toExternalForm()')'stylesheets'屬性是URL的字符串表示形式的列表,畢竟... –

+0

@James_D我從不同的bundle資源導入CSS資源文件。 –

+0

我真的不覺得那很重要。如果你調用'uri.toString()',你實際上得到了什麼?它大概是一個jar文件中的條目,並且URI將指示jar文件。 –

回答

2

表示來自包的資源的URI不能表示爲文件。所以從URI創建文件的方法是不可能的。

你可以用bundle資源做什麼,就是爲它獲取InputStream。因此,您可以使用它將流內容複製到臨時文件夾中的文件,並將該文件提供給scene.getStylesheets()。add。

另一種方法可能是在bundle中爲resources.css定義一個Import-Package。這將使該文件在您的包的類路徑中可用。那麼scene.getStylesheets()。add(「/ resources/css」)就可以工作了。

0

該異常意味着它無法找到您的文件。你應該研究創建一個到CSS文件的URI。

URI uri = new URI("file:///C:/other/mydir/myfile.txt"); 
+1

實際上,異常真的說URI不代表一個文件(很可能它代表了一個jar文件中的條目)。 –