Java 无法读取字体

标签 java fonts

好的,所以我在使用自定义字体时遇到了问题。基本上我得到了我从互联网上下载的自定义字体并在我的程序中使用它。当我在 Eclipse(我使用的编辑器)中运行程序时,一切正常,没有问题。但是,每当我将它从 eclipse 导出到 jar,或尝试从命令提示符运行它时,我都会收到这个非常烦人的错误:

java.io.IOException: Can't read REVOLUTION.ttf
    at java.awt.Font.createFont(Unknown Source)
    at TowerDefense.<init>(TowerDefense.java:55)
    at TowerDefense.main(TowerDefense.java:302)

由于我在哪里使用字体,我得到了它以及一堆空指针异常。但是我不知道为什么它说它无法读取它。这是创建字体的代码:

try {
        revolution = Font.createFont(Font.TRUETYPE_FONT, new File("REVOLUTION.ttf"));
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(revolution);
    }
    catch (Exception e) {
        e.printStackTrace();
    }

文件夹布局

塔防

src
    default package
        TowerDefense.java
        Game.java
        DragTest.java
JRE System Library
REVOLUTION.ttf
neuropol.ttf

最佳答案

您不能使用文件 API 访问 JAR 的内容。

您必须使用 Classloader 的 getResourceAsStream 方法加载字体文件。为此,您必须将字体文件放在类路径中。

所以你的代码变成了:

revolution = Font.createFont(Font.TRUETYPE_FONT, getClass().getClassLoader().getResourceAsStream("REVOLUTION.ttf"));

如果字体包含在 JAR 中的包或文件夹中,则路径会相应更改。

getResourceAsStream("com/example/font/REVOLUTION.ttf"); // if font is present inside com.example.font package

关于Java 无法读取字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466697/

相关文章:

java - Hibernate:我什么时候应该使用 Cascade.ALL 什么时候应该单独指定它们

objective-c - 为什么此文本会改变 Yosemite 中的字符?

css - 使用 %? 时字体大小不受影响

java - 如何注解injector.getInstance?

java - WebView SSL 错误?

java - 验证是否使用 Mockito 和 PowerMock 捕获了异常

html - 在 HTML/CSS 中加载自定义中文/日文字体是否有比@font-face 更快的方法?

iphone - iPhone-sdk 中有哪些西里尔字体?

css - 使用过多的字体声明是否会对性能产生影响?

java - 如何在点击选项卡时显示Toast消息?