2017-02-28 140 views
0

我的應用程序包含幾個不同的包,我希望能夠訪問存儲在應用程序的themes文件夾中的CSS主題文件。JavaFX - 無法加載外部CSS主題

以下幾個教程和其他StackExchange問​​題和答案後,我還沒有找到任何適合我的情況。事實上,許多的「答案」的只說給.css文件移動到相同的文件夾類調用它;對我的情況來說這不是一個可接受的解決方案

我的目錄結構與此類似:

- Root Project Folder 
    - /data 
    - /themes 
     - /Theme.css 
    - /src 
     - sample 
      - /Main.java 
      - /Controller.java 
      - /sample.fxml 

我將如何運用Theme.csssample.fxml文件?

我扔在一起的作品來說明我的問題的示例項目。

Main.java:

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     primaryStage.setTitle("Hello World"); 

     Scene scene = new Scene(root, 300, 275); 

     scene.getStylesheets().add(
      getClass().getResource("/themes/Theme.css").toExternalForm()); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

sample.fxml:

<GridPane fx:controller="sample.Controller" 
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> 
</GridPane> 

的錯誤:

Caused by: java.lang.NullPointerException 
    at sample.Main.start(Main.java:18) 

也試過:

scene.getStylesheets().add("file:///themes/Theme.css"); 
scene.getStylesheets().add("file:///../themes/Theme.css"); 

這些都存在相同的 「資源未找到」 錯誤。

此代碼在上面的示例:

File css = new File("themes/Theme.css"); 
scene.getStylesheets().add("file:///" + css.getAbsolutePath()); 

但是,我不能得到完全相同的代碼到我的結構相同的較大的項目中工作。

我得到這個錯誤:

WARNING: Resource "file:////[PATH TO PROJECT]/themes/Theme.css" not found 

錯誤顯示的完整路徑是完全正確的,並導致了確實存在的文件。

我怎麼會去解決此?由於它在示例項目中工作正常,但不是我的大項目,所以問題顯然在於我的其他項目代碼中的某處。

但是爲什麼編譯器告訴我一個文件時,它顯然不會不存在?


順便說一句,我的目標是讓用戶選擇一個「主題」使用樣式整個應用程序。 /themes文件夾包含幾十個可供選擇的主題。

預先感謝您爲您的幫助!

+0

檢查CSS文件被部署到build文件夾(細節取決於你的IDE和項目設置),但基本上你想看到一個''包含文件夾themes' Theme.css'無論你的輸出文件夾是什麼。 'themes'文件夾應該放在包含* class *文件的'sample'文件夾旁邊(不是Java源文件)。 –

+0

我正在使用IntelliJ IDEA Ultimate。 build文件夾不包含'/ themes'目錄。不過,我很好奇。我從我的代碼訪問的其他外部文件不需要在構建路徑中;什麼是CSS不同的原因? – Zephyr

+0

爲了測試目的,我也手動將整個'/ themes'文件夾複製到構建文件夾,並且發生同樣的問題。 – Zephyr

回答

0

繼@ James_D對原始問題的評論,我能夠得到這個與以下代碼的工作,將字符串轉換爲一個URI以獲得正確的格式。

我不想在JAR中捆綁CSS文件,因爲我希望我的用戶能夠自定義它們並添加它們自己的。

解決方案:

 scene.getStylesheets().clear(); 

     File css = new File("themes/" + Settings.getThemeName() + ".css"); 
     System.out.println(css.toString()); 
     File fontFile = new File("themes/Font.css"); 

     scene.getStylesheets().addAll(
       css.toURI().toString(), 
       fontFile.toURI().toString());