为什么 GraphicsEnvironment 是无头的?

Why is GraphicsEnvironment headless?

我正在尝试使用此方法注册 .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(这可能是问题所在?)。

更新:对于 old/new 项目,我指的是我正在修改的两个独立的 Minecraft 版本(1.12.2 和 1.16.4),我 运行 在 win 10 机器上调试在 Intellij Idea 上并在两个项目中使用 JDK 1.8。

请 运行 您的 java 流程

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

也尝试将您的字体添加到 JVM 的字体文件夹中。如果这很好用,你可以试试这个 Why does GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts() give different results when ssh'ed in?

我解决了这个问题,其中有一个静态块:

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

正如@rmunge 所说,解决方案是找到它并将其设置为 false。

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