我的应用程序包含几个不同的包,我希望能够访问存储在应用程序的themes
文件夹中的CSS主题文件。JavaFX - 无法加载外部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");
这些都存在相同的 “资源未找到” 错误。
此代码在上面的示例:
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
文件夹包含几十个可供选择的主题。
预先感谢您为您的帮助!
检查CSS文件被部署到build文件夹(细节取决于你的IDE和项目设置),但基本上你想看到一个''包含文件夹themes' Theme.css'无论你的输出文件夹是什么。 'themes'文件夹应该放在包含* class *文件的'sample'文件夹旁边(不是Java源文件)。 –
我正在使用IntelliJ IDEA Ultimate。 build文件夹不包含'/ themes'目录。不过,我很好奇。我从我的代码访问的其他外部文件不需要在构建路径中;什么是CSS不同的原因? – Zephyr
为了测试目的,我也手动将整个'/ themes'文件夹复制到构建文件夹,并且发生同样的问题。 – Zephyr