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

Java加载自定义字体文件(.ttf),java,fonts,custom-font,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.<in

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

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)
我称之为:

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();
    }
(以上课程有效,我的图像加载)


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

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

从资源中加载字体并不像加载图像那样困难。我知道一年前有人问过这个问题,但我希望最终能给出答案

只需使用文档,它详细说明了如何将自定义字体加载到
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(stringfiledir)
从Jar文件中的我的资源目录加载该文件

在图形环境中注册字体后,该字体可在调用
getAvailableFontFamilyNames()
时使用,并可在字体构造函数中使用


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

与试图加载的代码相关的字体存储在哪里?部署时,
font
很可能会成为一种新的字体。在这种情况下,必须通过
URL
而不是
File
访问资源。请参阅标签,了解形成
URL
的方法。我尝试过,它不会抛出堆栈跟踪,但字体不起作用。能给我一个coce/method吗?@user3141055那么问题不在于字体的加载,而是你如何使用它
    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){}