Я пытаюсь зарегистрировать шрифт .ttf, используя этот метод:
private void addFont(String name) {
try {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
File file = new File("D:/Client/assets/fonts/"+ name);
Font font = Font.createFont(Font.TRUETYPE_FONT, file);
ge.registerFont(font);
} catch (FontFormatException | IOException e) {
e.printStackTrace();
}
}
Проблема в том, что шрифты не создаются, все, что я получаю, это:
java.awt.FontFormatException: java.nio.BufferUnderflowException
Точно такой же код работал в прошлом проекте, при отладке с точками останова я обнаружил, что ge был «Win32GraphicsEnvironment», а в текущем проекте это HeadlessGraphicsEnvironment (может быть, это проблема?).
Обновление: под старым/новым проектом я подразумеваю две отдельные версии Minecraft, которые я модифицирую (1.12.2 и 1.16.4), я работаю на машине с Win 10, отлаживаю Intellij Idea и использую JDK 1.8 в обоих проектах.
@cilap Я немного отредактировал вопрос и добавил некоторую информацию об окружающей среде, не стесняйтесь сказать мне, если это все еще неясно, я не знаю, что добавить.
до сих пор неясно, что такое старое/новое. также какая версия java используется в старой/новой?
@cilap хорошо, отредактировано.




пожалуйста, запустите свой Java-процесс с помощью
java -Djava.awt.headless=true ...
также попробуйте добавить свой шрифт в папку шрифтов вашей JVM. Если это работает хорошо, вы можете попробовать это Почему GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts() дает разные результаты при подключении по ssh?
Разве это не должно быть -Djava.awt.headless=false или даже более безопасным: убедитесь, что аргументы виртуальной машины не содержат никакой записи -Djava.awt.headless=true?
вы реализуете серверную или клиентскую часть? для сервера вам потребуется безголовый
Неважно, реализуете ли вы сервер или клиент. Если вы хотите загрузить шрифты .ttf в Java и работаете в Windows 10, вы должны убедиться, что аргументы виртуальной машины НЕ содержат -Djava.awt.headless=true. Указание этого аргумента VM — единственный способ в Windows получить HeadlessGraphicsEnvironment вместо Win32GraphicsEnvironment.
Я исправил проблему, был статический блок с этим:
System.setProperty("java.awt.headless", "true");
Как сказал @rmunge, решение состояло в том, чтобы просто найти его и установить для него значение false.
System.setProperty("java.awt.headless", "false");
вы должны обновить более подробную информацию об окружающей среде, чтобы избежать отрицательных голосов. что означает старый или новый проект? какое было предыдущее время выполнения?