问题描述:
我正在使用 IntelliJ IDEA 开发 JavaFX 应用程序,并遇到应用程序找不到放置在资源文件夹中的 CSS 文件的问题。
在我的元素中,有一个 style.css
文件位于 src/main/resources/view
下。尽管如此,当尝试使用 getClass().getResource("/view/style.css")
将其加载到我的 JavaFX 应用程序中时,它始终返回 null
。
相关代码实现:
public class MainGui extends Application {
@Override
public void start(Stage primaryStage) {
BorderPane borderPane = new BorderPane();
borderPane.setCenter(new DocumentSelectionView());
Scene scene = new Scene(borderPane, 1400, 900);
// Attempting to load the CSS file
scene.getStylesheets().clear();
System.out.println(System.getProperty("user.dir")); // Prints the project directory
// Different methods tried to add the stylesheet
// Method 1
scene.getStylesheets().add("src/main/resources/view/style.css");
// Method 2
scene.getStylesheets().add(getClass().getResource("/view/style.css").toExternalForm());
}
}
遇到的问题:
方法 1(
scene.getStylesheets().add("src/main/resources/view/style.css");
):- 导致警告:
<强>WARNING: Resource "src/main/resources/view/style.css" not found.
- 导致警告:
方法 2(
scene.getStylesheets().add(getClass().getResource("/view/style.css").toExternalForm());
):- 返回
null
,导致尝试调用.toExternalForm()
时出错。
- 返回
其他信息:
正确打印元素目录,确认工作目录。
我已验证文件路径中没有拼写错误。
CSS文件肯定存在于指定的目录中。
CSS 文件不在目标输出文件夹中。
我使用 IntelliJ IDEA 作为我的元素结构,而不是 Maven 或 Gradle。以下是我的
.iml
的相关内容文件:<?xml version="1.0" encoding="UTF-8"?> <module version="4"> <component name="AdditionalModuleElements"> <content url="file://$MODULE_DIR$" dumb="true"> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> <excludeFolder url="file://$MODULE_DIR$/target" /> </content> </component> </module>
问题:
是什么原因导致无法找到 style.css
文件,如何正确地将其加载到我的 JavaFX 应用程序中?
任何见解或建议将不胜感激!
尝试:
我尝试了多种方法来解决 getResource()
的问题 始终返回 null
。以下是我所采取的步骤的摘要:
在不同包的其他类中复制了该问题,在
getResource()
中遇到了同样的问题。 返回null
。尝试了各种字符串来定位 CSS 文件,包括:
"style.css"
"/style.css"
"view/style.css"
"/view/style.css"
将 CSS 文件直接移至
resources
文件夹。尝试了不同的 CSS 文件名和创建这些文件的方法。
重新启动 IntelliJ IDEA。
重建整个软件。
使 IntelliJ IDEA 中的缓存失效并重新启动(为了确保安全,我在每次更改后都会执行此操作)。
我确实尝试在其他包的其他类中复制它。 getRecource() 始终返回 null。
到设置 -> 编译器 -> 我添加的资源模式
!?*.css
getClass().getClassLoader().getResource("/view/style.css");
将资源文件夹直接移动到元素文件夹/src/main/resources ->/resources
最佳答案
To Settings -> Compiler -> Resource patterns I've added !?*.css"
你不想这样做。
将 .css
文件视为 NOT 资源。这与您想要的相反。
请注意,(我认为)编译器设置仅用于处理标记为 Sources
的目录下的文件,并且不会影响标记为 Resources
的文件。根据我的测试,我标记为 Resources
的目录下的 .css
文件始终被复制到输出目录,无论 Compiler | 是什么。资源模式
设置。因此,这可能不是问题的根本原因。
工作示例
我尝试过:
- 在 Idea 中使用生成的示例代码创建一个新的 Java 元素(不是 JavaFX 元素)(使用 Idea 新建 Java 元素向导)。
- manually setting a resource path in the IDE for the module .
- 将css资源文件放置在我配置的资源目录中。
- 修改了 src 目录中的示例 java 代码以查找资源。
默认情况下(没有其他更改),我放入创建的资源目录中的 .css
文件被复制到构建输出目录,并且可以通过 getResource
找到code> 按预期查找。
构建后:
<projectdir>/out/production/<modulename>/
包含这些文件:
Main.class
styles.class
/src/Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println(Main.class.getResource("/styles.css"));
}
}
/resources/styles.css
.root {
-fx-base: mistyrose;
}
输出
Hello world!
file:/C:/dev/resourcetest/out/production/resourcetest/styles.css
设置 |编译 |资源模式
这些是使用 Idea 2023.2.4 (UE) 的新 Java 元素的默认值,我没有更改它们:
!?*.java
!?*.form
!?*.class
!?*.groovy
!?*.scala
!?*.flex
!?*.kt
!?*.clj
!?*.aj
推荐
使用构建工具(例如 Maven 或 Gradle),遵循 Maven standard layout ,将构建元素与 IDE 同步通常是比在 IDE 中手动配置元素更好的方法。
关于IntelliJ IDEA 中的 JavaFX 应用程序无法在资源中找到 CSS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77465864/