2015-12-25 63 views
3

好的,所以我有一个使用自定义字体的问题。基本上我从互联网上下载了一个自定义字体,并将其用于我的程序中。当我在Eclipse(我使用的编辑器)中运行程序时,一切正常,并且没有问题。但每当我将它导出到一个罐子从日食,或尝试从命令提示符下运行它,我得到这个非常恼人的错误:Java无法读取字体

java.io.IOException: Can't read REVOLUTION.ttf 
    at java.awt.Font.createFont(Unknown Source) 
    at TowerDefense.<init>(TowerDefense.java:55) 
    at TowerDefense.main(TowerDefense.java:302) 

我得到,随着一群,因为在那里空指针异常的我使用字体。但我不知道它为什么说它无法读取它。下面是创建的字体代码:

try { 
     revolution = Font.createFont(Font.TRUETYPE_FONT, new File("REVOLUTION.ttf")); 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     ge.registerFont(revolution); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

FOLDER布局

塔防游戏

src 
    default package 
     TowerDefense.java 
     Game.java 
     DragTest.java 
JRE System Library 
REVOLUTION.ttf 
neuropol.ttf 
+0

Jar中是否包含字体?我会在命令行上运行字体需要包含在类路径中。 – EkcenierK

+1

JAR中包含字体吗?它位于哪里? –

+0

是的,它包含在JAR中。我看到了你的思考过程,但即使在我正在运行JAVA文件时,我仍然遇到了这个错误。是的,一切都在适当的位置,并正确引用它。 @KLibby – Ryan

回答

4

您不能访问使用文件API一个JAR的内容。

您必须使用Classloader的getResourceAsStream方法加载字体文件。为了这个工作,你必须把字体文件放在classpath中。

所以,你的代码就变成了:

revolution = Font.createFont(Font.TRUETYPE_FONT, getClass().getClassLoader().getResourceAsStream("REVOLUTION.ttf")); 

如果字体包含在JAR包或文件夹中,然后路径将发生相应的变化。

getResourceAsStream("com/example/font/REVOLUTION.ttf"); // if font is present inside com.example.font package 
+0

这会在Eclipse中创建一个错误:“java.IO.IOException:读取字体数据的问题” – Ryan

+1

检查您的字体文件是否可以通过Classloader访问,它必须位于classpath中。同时验证它是否与导出的JAR一起工作。 – 11thdimension

+0

你是什么意思 – Ryan