有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的自定义字体可以从Eclipse工作,而不能从导出的JAR工作?

我正在尝试用Java编写一个游戏,在开始屏幕上我使用了我下载的自定义字体。当我从Eclipse运行程序时,屏幕如下所示(正如它应该的那样): Lovely font.

但是,当我从编译的jar运行程序时,屏幕如下所示: Whut

以下是我加载字体的代码:

title = new JLabel("philip k. dick"); // font requires all lowercase
try {
    Font f = Font.createFont(Font.TRUETYPE_FONT, new File(Util.getFile("all used up.ttf")));
    title.setFont(new Font(f.getName(), f.getStyle(), 150));
} catch (Exception e) {
    e.printStackTrace();
    Font oldFont = title.getFont();
    title.setFont(new Font(oldFont.getName(), oldFont.getStyle(), 100));
}

方法Util.getFile只是将“resources/”添加到给定String的开头

当我从命令行运行jar时,没有给出任何错误。我知道程序可以访问字体资源,因为当我重命名“resources”文件夹(防止访问)时,屏幕如下所示: As expected.

此外,我还遇到以下错误:

java.io.IOException: Can't read resources/all used up.ttf

当然,这是意料之中的

我还想指出的是,我有其他音频和图像资源正在从同一位置加载,它们工作正常。此位置位于jar外部的文件夹中。另外,我使用的是Mac电脑,但我在Windows上也遇到了同样的问题


共 (1) 个答案

  1. # 1 楼答案

    通常会直接将resources的内容添加到Jar中

    这意味着不能再使用File对象访问它们,因为它们现在实际上是Zip文件的一部分

    您需要使用类似getClass().getResource(...)的东西来完成它。这将返回指向资源的URL实例(如果可以找到)

    但是,Font.createFont采用FileInputStream引用,在这种情况下,您应该使用getClass().getResourceAsInputStream(...),类似于

    Font f = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsInputStream("resources/all used up.ttf"));
    

    这会从试图加载资源的类的上下文发出“相对”路径请求。这可能行不通,因此您可以使用

    getClass().getResourceAsInputStream("/resources/all used up.ttf")
    

    它从类路径的上下文创建绝对路径查找

    如果你卡住了,试着打开罐子,看看字体是否在里面,在哪里,并根据需要进行调整

    已更新

    尝试使用

    Font f = Font.createFont(Font.TRUETYPE_FONT, new File("resources/all used up.ttf"));
    title.setFont(f.deriveFont(150f));
    

    据我所知,new Font(...)正在尝试从可用的系统字体中查找字体

    Java Docs for ^{}

    This base font can then be used with the deriveFont methods in this class to derive new Font objects with varying sizes, styles, transforms and font features. ...

    To make the Font available to Font constructors the returned Font must be registered in the GraphicsEnviroment by calling registerFont(Font).