【问题标题】:Java Load Custom Font File (.ttf)Java 加载自定义字体文件 (.ttf)
【发布时间】:2014-02-08 05:14:08
【问题描述】:

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

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

(上面的类有效,我的图像加载)

这不起作用有什么原因吗?有没有更好的方法? (是的,我的目录中确实有它)

【问题讨论】:

  • 字体存储在哪里与试图加载它的代码相关?
  • 部署时,Font 可能会变成embedded-resource。在这种情况下,资源必须由URL 而不是File 访问。查看标签的info page,了解形成URL的方法。

标签: java fonts custom-font


【解决方案1】:

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

只需使用文档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() 的调用中使用,并可在字体构造函数中使用。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我试过了,它没有抛出堆栈跟踪,但字体不起作用。可以给我一份coce/method吗?
    • @user3141055 那么问题不在于字体的加载,而在于你如何使用它
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2021-04-03
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多