2014-01-18 163 views
0

我在下面这段代码中使用,并将其与该堆栈跟踪出现:Java的加载自定义字体文件(.TTF)

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

(以上工程类,我的形象负载)

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

+0

字体存储在与试图加载它的代码的关系中? – MadProgrammer

+0

到部署时,'Font'可能会变成[tag:embedded-resource]。在这种情况下,资源必须通过'URL'而不是'File'访问。查看标签的[info page](http://stackoverflow.com/tags/embedded-resource/info),以获得一个“URL”。 –

回答

2

很可能是因为你正在运行这个罐子,并没有File对象获得。比较你如何加载你的图像getResourceAsStream,它可以找到解压为文件(通常用于开发)或打包成jar的资源。在createFont中使用相同的getResourceAsStream呼叫。

+0

我试过了,它不会抛出堆栈跟踪,但字体不起作用。我可以有一个Coce /方法吗? – user3131055

+1

@ user3141055然后问题不在于加载字体,而是如何使用它 – MadProgrammer

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(),并可用于字体构造函数。

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