2017-02-28 135 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());