IntelliJ 代码无法识别字体文件,即使它们很明显存在

IntelliJ code not recognizing font files even though it is clear they exist

IntelliJ/Java 无法识别明明存在的文件。这是我的文件系统:

MODULE/resources/a.ttf
MODULE/resources/test.png
MODULE/src/test/Test.java

这是我使用的代码:https://paste.ubuntu.com/p/pQxRXMF3wg/

我的代码的哪一部分不正确,我该如何解决?

我做了什么:

请尝试以下步骤:

  1. 鼠标右键单击资源包(在 IntelliJ 中)-> 将目录标记为 -> 资源根。
  2. 现在您的文件应该可以通过 "test.png" 而不是 "resources/test.png" 访问了。

希望这会有所帮助。

玩得开心! =)

答案其实很简单,跟@KolyaSh的评论有关。反编译我的 JAR 后,我发现 'resources' 文件夹实际上从未放入 JAR 文件中,因此我的代码首先无法运行。另一个问题是我尝试检索资源 URL 的方式。我尝试了 ClassLoader.getSystemResource(),尽管我对为什么这不是解决方案进行了更多研究。

解决方案是获取调用 class 的类加载器。我还写了一个读取文件的方法,看起来像这样:

Font.loadFont(getResource("a.ttf"), doubleValue);
/* NOTE: The string argument in the resource is the path of which the 
file is located. If your file path is something like 
'resources/fonts/a.ttf', please use 'fonts/a.ttf' as the string argument.
*/
public InputStream getResource(String path) {
  URL url = this.getClass().getClassLoader().getResource(path);
  try {
    URLConnection c = url.openConnection();
    return c.getInputStream();
  } catch (Exception e) {
    e.printStackTrace();
  }
}

为了给出一个直接的答案,我缺少的概念是文件实际上是如何存储在 jar 中的,以及如何访问它。首先,你必须得到 ClassLoader 实例(不要使用它提供的静态方法),打开一个到 URL 路径的连接,得到 InputStream,瞧,你有一个很好的,简单的方法来加载任何来自已编译 JAR 的文件。

再次感谢所有帮助回答这个问题的人!!希望这一切都清楚了。