JavaFX - 无法加载外部CSS主题

时间:2017-02-28 19:19:20

标签: java css javafx

我的应用程序包含几个不同的包,我希望能够访问存储在应用程序的themes文件夹中的CSS主题文件。

在完成了几个教程和其他StackExchange问​​题和答案之后,我还没有发现任何适合我情况的内容。事实上,很多"答案"只是说将.CSS文件移动到与调用它的类相同的文件夹中;这对我的情况来说不是一个可以接受的解决方案。

我的目录结构类似于:

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

如何将Theme.css应用于我的sample.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");

这些都呈现相同的&#34;未找到的资源&#34;错误。

此代码适用于上面的示例:

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

但是,我无法在具有相同结构的较大项目中使用完全相同的代码。

我收到此错误:

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

错误中显示的完整路径完全正确,并指向存在的文件。

我该如何解决此问题?由于它在示例项目中工作正常但不是我的大项目,因此问题显然存在于我的其他项目代码中。

但是为什么编译器会告诉我文件显然不存在?

顺便提一下,我的目标是让用户选择一个主题&#34;用于设置整个应用程序的样式。 /themes文件夹包含数十个主题供您选择。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分: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());
相关问题