Jar 文件中的内容

Content from Jar file

是否可以使用 .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");

注意Snake前的/

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

2:您正在使用 InputStream 两次,因为您实际上调用了 Font.createFont(...) 两次。至少第二次,输入流将关闭或结束,无法读取任何其他内容,因此第二次调用将失败。只需使用加载的字体进行注册即可:

GAMEOVER_FONT = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(200f);   
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(GAMEOVER_FONT); // <-- do not load 2nd time
g.setFont(GAMEOVER_FONT);

拜托,尽管我认为在您的用例中结果应该相同,请尝试:

this.getClass().getResourceAsStream()

而不是:

this.getClass().getClassLoader().getResourceAsStream()

注意 getClassLoader() 中的差异。

也许 class 加载程序层次结构存在一些差异,它可以为您提供不同的输出。

此外,您可以尝试将字体放入您的 classes,您的 Java 输出目录,并从那里读取它,以检查是否存在实际问题字体与否。