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 输出目录,并从那里读取它,以检查是否存在实际问题字体与否。
是否可以使用 .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 输出目录,并从那里读取它,以检查是否存在实际问题字体与否。