Почему GraphicsEnvironment безголовый?

Я пытаюсь зарегистрировать шрифт .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 13.12.2020 18:20

@cilap Я немного отредактировал вопрос и добавил некоторую информацию об окружающей среде, не стесняйтесь сказать мне, если это все еще неясно, я не знаю, что добавить.

Sapu 13.12.2020 18:36

до сих пор неясно, что такое старое/новое. также какая версия java используется в старой/новой?

cilap 13.12.2020 18:38

@cilap хорошо, отредактировано.

Sapu 13.12.2020 18:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
318
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

пожалуйста, запустите свой Java-процесс с помощью

java -Djava.awt.headless=true ...

также попробуйте добавить свой шрифт в папку шрифтов вашей JVM. Если это работает хорошо, вы можете попробовать это Почему GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts() дает разные результаты при подключении по ssh?

Разве это не должно быть -Djava.awt.headless=false или даже более безопасным: убедитесь, что аргументы виртуальной машины не содержат никакой записи -Djava.awt.headless=true?

rmunge 13.12.2020 19:01

вы реализуете серверную или клиентскую часть? для сервера вам потребуется безголовый

cilap 13.12.2020 19:18

Неважно, реализуете ли вы сервер или клиент. Если вы хотите загрузить шрифты .ttf в Java и работаете в Windows 10, вы должны убедиться, что аргументы виртуальной машины НЕ содержат -Djava.awt.headless=true. Указание этого аргумента VM — единственный способ в Windows получить HeadlessGraphicsEnvironment вместо Win32GraphicsEnvironment.

rmunge 13.12.2020 19:26
Ответ принят как подходящий

Я исправил проблему, был статический блок с этим:

        System.setProperty("java.awt.headless", "true");

Как сказал @rmunge, решение состояло в том, чтобы просто найти его и установить для него значение false.

        System.setProperty("java.awt.headless", "false");

Другие вопросы по теме