Java无法读取字体。

4

好的,我有一个使用自定义字体的问题。基本上,我从互联网上下载了一个自定义字体,并在程序中使用它。当我在我使用的编辑器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();
    }

文件夹布局

TowerDefense

(塔防)
src
    default package
        TowerDefense.java
        Game.java
        DragTest.java
JRE System Library
REVOLUTION.ttf
neuropol.ttf

字体是否一定包含在Jar文件中?如果您正在命令行上运行,则需要将字体包含在类路径中。 - EkcenierK
1
字体是否包含在JAR文件中?它位于哪里? - Dioxin
是的,它包含在JAR文件中。我理解你的思路,但即使我只运行JAVA文件,我仍然会遇到那个错误。而且,是的,所有东西都放在正确的位置,并且正确地引用了它。@KLibby - Ryan
@VinceEmigh JAVA文件位于“src”文件夹中,然后字体位于与src文件夹相同的位置,而不是src文件夹内部。我对getResource不是很熟悉(我是Java新手)。 - Ryan
@VinceEmigh 我只是有...getResourceAsStream("REVOLUTION.ttf") - Ryan
显示剩余4条评论
1个回答

6

使用File 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

这在Eclipse中会创建一个错误:"java.IO.IOException:读取字体数据时出现问题"。 - Ryan
1
请检查您的字体文件是否可以被类加载器访问,它必须在类路径上。还要验证它是否与导出的JAR文件一起工作。 - 11thdimension
1
你能否发布你的Eclipse项目结构,包括其中字体文件的位置? - 11thdimension
1
将“REVOLUTION.ttf”放入“默认包”,然后它应该可以工作。 - 11thdimension
那解决了所有问题,非常感谢。我一直有这个问题,最终发了帖子。再次感谢。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接