1

我正在尝试用 Java 编写一个游戏,在开始屏幕上我使用了我下载的自定义字体。当我从 Eclipse 运行程序时,屏幕看起来像这样(就像它应该的那样): 可爱的字体。

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

这是我加载字体的代码:

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 时没有给出错误。我知道程序可以访问字体资源,因为当我重命名“资源”文件夹(以防止访问)时,屏幕如下所示: 正如预期的那样。

此外,我收到此错误:

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

当然,这是意料之中的。

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

4

1 回答 1

3

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

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

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

但是,Font.createFont需要 aFileInputStream参考,在这种情况下,您应该使用getClass().getResourceAsInputStream(...),例如...

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

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

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

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

如果遇到困难,请尝试打开 Jar 的包装,查看字体是否位于其中和位置,并根据需要进行调整。

更新...

尝试使用...

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

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

来自Java Docs forFont#createFont ...

然后可以将此基本字体与此类中的 derivedFont 方法一起使用,以派生具有不同大小、样式、变换和字体特征的新 Font 对象。...

为了使构造函数Font可用,Font 返回的Font必须GraphicsEnviroment通过调用 注册registerFont(Font)

于 2013-11-12T23:01:23.873 回答