Java Jar文件中的内容

Java Jar文件中的内容,java,jar,java-font,Java,Jar,Java Font,是否可以使用.jar文件中的.ttf文件创建自定义字体? 我创建了一个具有以下结构的jar文件 Game.jar ├──Snake │ ├── lib │ | └── game_over.ttf | ├── src │ | ├── GameFrame.class │ | ├── GamePanel.class │ | └── SnakeGame.class 我尝试通过执行以下操作来获得自定义字体 Font GAMEOVER_FONT; Inp

是否可以使用.jar文件中的.ttf文件创建自定义字体? 我创建了一个具有以下结构的jar文件

Game.jar
├──Snake  
│  ├── lib  
│  |   └── game_over.ttf  
|  ├── src  
│  |   ├── GameFrame.class  
│  |   ├── GamePanel.class  
│  |   └── SnakeGame.class
我尝试通过执行以下操作来获得自定义字体

Font GAMEOVER_FONT;
InputStream is = this.getClass().getClassLoader().getResourceAsStream("Snake/lib/game_over.ttf");

GAMEOVER_FONT = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(200f);   
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, is));
g.setFont(GAMEOVER_FONT);

我做错了什么?甚至可以实现我所尝试的吗?

1:使用绝对路径访问字体资源,如下所示:

InputStream is=this.getClass().getClassLoader().getResourceAsStream(“/Snake/lib/game_over.ttf”);
注意
蛇之前的
/

如果不使用绝对名称,我认为Java将在类的包中搜索,而不是在Jar的根级别

2:您使用InputStream两次,实际上您调用了
Font.createFont(…)
两次。至少在第二次,输入流要么关闭,要么在最后无法读取其他内容,因此第二次调用将失败。只需使用加载的字体进行注册:

GAMEOVER\u FONT=FONT.createFont(FONT.TRUETYPE\u FONT,is).deriveFont(200f);
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();

ge.registerFont(GAMEOVER_字体);// 尽管我认为在您的用例中,结果应该是相同的,但请尝试:

this.getClass().getResourceAsStream()
而不是:

this.getClass().getClassLoader().getResourceAsStream()
请注意
getClassLoader()
中的差异

类加载器层次结构中可能存在一些差异,它可以为您提供不同的输出


此外,您可以尝试将字体放在类、Java输出目录中,然后从中读取,以检查字体是否存在实际问题。

在命令行上运行字体时仍然无法工作,我得到
Java.io.IOException:读取字体数据时出现问题。
检查
是否为==null
。如果为
null
,则无法找到资源。如果它不为null,那么就会找到tif文件,但是还有其他一些问题。我已经用与新异常相关的第二点更新了我的答案,直到不起作用,输入流为nullAndré,可能这只是创建问题时的问题,但是jar中的字体名为
game\u over.tff
。请注意输入错误,应该是“ttf”。然后使用@cello中的代码-基本上,在路径中包含
/
之前的
Snake
,并去掉第二个
Font.createFont
方法调用,使用
ge.registerFont(GAMEOVER\u Font)
,它应该可以正常工作,是关于扩展是否正确的问题的输入错误谢谢您的澄清。而且,大提琴的密码,不起作用吗?事实上,应该是这样。拜托,如果你运行它,你有什么问题?
null
InputStream
?我检查了(is==null),当我运行jar时,我得到了
java.io.IOException:字体数据读取问题。
请,在您的用例中应该是相同的,但是,您可以尝试
this.getClass().getResourceAsStream()
而不是
this.getClass().getClassLoader()).getResourceAsStream()
?请注意
getClassLoader()中的差异。
。此外,请将字体放在类和Java输出目录中,并尝试从中读取,以检查字体是否存在实际问题。InputStream是否会干扰序列化?在那之后,我的序列化停止了工作,它不应该是安德烈。请问,你能解释一下你的新问题吗?我想它太长了,不能发表评论。我应该打开另一个问题吗?但无论如何,我得到的错误是
java.io.WriteAbortedException:写操作中止;java.io.notserializableeexception:sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream
如您所愿。如果您认为新问题与此问题密切相关,请修改此问题,尽管我认为最好创建一个新问题,但最好只针对每个问题发布一个问题,以帮助人们识别问题中正在解决的实际问题。我现在必须走了,但我也很乐意在早上一大早就复习这个新问题。