Контент из файла Jar

Можно ли создать собственный шрифт с файлом .ttf, который находится внутри файла .jar? Я создал файл 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);

Что я делаю не так? Возможно ли вообще добиться того, что я пытаюсь?

2 ответа

Решение

Пожалуйста, хотя я думаю, что в вашем случае результат должен быть таким же, попробуйте:

      this.getClass().getResourceAsStream()

Вместо:

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

Обратите внимание на разницу в getClassLoader().

Возможно, есть некоторая разница в иерархии загрузчика классов, и он может предоставить вам разные результаты.

Кроме того, вы можете попробовать поместить шрифт в свои классы, в выходной каталог Java и прочитать его оттуда, чтобы проверить, есть ли реальная проблема со шрифтом.

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);
Другие вопросы по тегам