java为什么我的自定义字体可以从Eclipse工作,而不能从导出的JAR工作?
我正在尝试用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时,没有给出任何错误。我知道程序可以访问字体资源,因为当我重命名“resources”文件夹(防止访问)时,屏幕如下所示:
此外,我还遇到以下错误:
java.io.IOException: Can't read resources/all used up.ttf
当然,这是意料之中的
我还想指出的是,我有其他音频和图像资源正在从同一位置加载,它们工作正常。此位置位于jar外部的文件夹中。另外,我使用的是Mac电脑,但我在Windows上也遇到了同样的问题
# 1 楼答案
通常会直接将
resources
的内容添加到Jar中这意味着不能再使用
File
对象访问它们,因为它们现在实际上是Zip文件的一部分您需要使用类似
getClass().getResource(...)
的东西来完成它。这将返回指向资源的URL
实例(如果可以找到)但是,
Font.createFont
采用File
或InputStream
引用,在这种情况下,您应该使用getClass().getResourceAsInputStream(...)
,类似于这会从试图加载资源的类的上下文发出“相对”路径请求。这可能行不通,因此您可以使用
它从类路径的上下文创建绝对路径查找
如果你卡住了,试着打开罐子,看看字体是否在里面,在哪里,并根据需要进行调整
已更新强>
尝试使用
据我所知,
new Font(...)
正在尝试从可用的系统字体中查找字体从Java Docs for ^{}