Контент из файла 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);