Java 如何加载自定义字体文件(.ttf)

3

我使用了下面的代码,但它出现了以下堆栈跟踪:

java.io.FileNotFoundException: font.ttf (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at com.ominious.core.graphics.Assets.getFont(Assets.java:55)
    at com.ominious.core.graphics.Assets.loadImages(Assets.java:37)
    at com.ominious.core.GamePanel.init(GamePanel.java:63)
    at com.ominious.core.GamePanel.run(GamePanel.java:69)
    at java.lang.Thread.run(Thread.java:744)
Exception in thread "Thread-1" java.lang.NullPointerException
    at com.ominious.core.graphics.Assets.loadImages(Assets.java:49)
    at com.ominious.core.GamePanel.init(GamePanel.java:63)
    at com.ominious.core.GamePanel.run(GamePanel.java:69)
    at java.lang.Thread.run(Thread.java:744)

我使用这段代码(我在资源文件中调用方法,我知道它能正常工作)
    private static Font getFont(String name) throws Exception {

    Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(name));

    return font;
}

我在这里称呼它为:

try {
        FONT = getFont("font.ttf");

        tileSprites = ImageIO.read(getClass().getResourceAsStream("/mom.gif"));

        SPLASH_BACKGROUND = ImageIO.read(getClass().getResourceAsStream("/swag.gif"));

    } catch (Exception e) {
        Game.logger.log(LogType.ERROR_STACKTRACE);

        e.printStackTrace();
    }

上面的类可用,我的图片已经加载了。

为什么这个不起作用?有更好的方法吗?(是的,我确实将它放在我的目录中)


字体在尝试加载它的代码相对于哪里存储? - MadProgrammer
在部署时,Font 很可能会变成一个 [tag:embedded-resource]。既然如此,资源必须通过 URL 而不是 File 来访问。请参阅 信息页面 了解该标签的 URL 形式。 - Andrew Thompson
2个回答

6

从资源中加载字体的方式与加载图片的方式并不困难。我知道这个问题在一年前就被问过了,但我希望终于能够提供一个答案。

只需使用此处的文档,其中详细介绍了如何将自定义字体加载到GraphicsEnvironment中。代码应该如下所示:

    GraphicsEnvironment ge = null;
    try{
      ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
      ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, game.getClass().getResourceAsStream("/fonts/fantasy.TTF")));
    } catch(FontFormatException e){} catch (IOException e){}

注意:我使用classInstance.getClass().getResourceAsStream(String fileDir)从Jar文件的资源目录加载文件。
在将字体注册到图形环境后,可以在调用getAvailableFontFamilyNames()时使用该字体,并且可以在字体构造函数中使用。
希望这最终回答了你的问题!

2
很可能是因为你正在从一个jar文件中运行,所以没有File对象可用。请将加载图像的方式与getResourceAsStream进行比较,它可以找到作为文件(通常用于开发)或打包成jar文件的资源。在createFont中使用相同的getResourceAsStream调用。

我尝试了一下,没有抛出堆栈跟踪,但字体无法工作。我可以有一段代码/方法吗? - SirTrashyton
1
@user3141055 那么问题不在于字体的加载,而在于您如何使用它。 - MadProgrammer

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