IntelliJ IDEA 中的 JavaFX 应用程序无法在资源中找到 CSS 文件

标签 java css intellij-idea javafx

问题描述:
我正在使用 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. 方法 1( scene.getStylesheets().add("src/main/resources/view/style.css"); ):

    • 导致警告:
      <强> WARNING: Resource "src/main/resources/view/style.css" not found.
  2. 方法 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

resources

/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/

相关文章:

java - 如何使用java向手机发送短信警报?

html - CSS3 : Multi Column System with Titles

java - IntelliJ : Arrange Java members by name

java - 当GWT无法找到类路径时,我应该在哪里添加(Intellij)

java - 查看构造函数是否执行成功

java - 如何重构 "stringly-typed"代码?

java - BLE设备与同一设备上不同Android应用程序之间的通信

css - 在 Drupal 7 的页面中定位元素

javascript - 如何在谷歌图表中刷新页面后停止 x 轴文本相互重叠

intellij-idea - 是否可以将模板添加到数据类的 getter/setter 中?