2014-01-18 64 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(),並可用於字體構造函數。

希望這能最終回答你的問題!