我的应用程序包含几个不同的包,我希望能够访问存储在应用程序的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
文件夹包含数十个主题供您选择。
提前感谢您的帮助!
答案 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());