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

时间:2014-01-18 21:38:16

标签: java fonts custom-font

我在下面使用了这段代码,它提供了这个堆栈跟踪:

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();
    }

(上面的课程正常,我的图片加载)

这是不是有效的原因?有更好的方法吗? (是的,我确实在我的目录中有它)

2 个答案:

答案 0 :(得分:2)

很可能是因为你从jar中运行它,并且没有File对象可以获取。比较您使用getResourceAsStream加载图像的方式,getResourceAsStream可以找到作为文件解压缩(通常用于开发)或打包到jar中的资源。在createFont中使用相同的{{1}}来电。

答案 1 :(得分:2)

从资源加载字体并不像加载图像一样困难。我知道这个问题是在一年前提出的,但我希望最终能够给出答案。

只需使用文档here,其中详细说明了如何将自定义字体加载到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()的调用,并可用于字体构造函数。

希望这最终能回答你的问题!