2

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

我究竟做错了什么?甚至有可能实现我正在尝试的目标吗?

4

2 回答 2

2

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

this.getClass().getResourceAsStream()

代替:

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

注意 中的区别getClassLoader()

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

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

于 2021-03-05T23:39:45.460 回答
0

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

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

注意/之前的Snake.

如果不使用绝对名称,我认为Java会在类的包中搜索,而不是在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);
于 2021-03-05T21:56:30.520 回答