【问题标题】:Why is GraphicsEnvironment headless?为什么 GraphicsEnvironment 是无头的?
【发布时间】:2021-03-24 11:14:17
【问题描述】:

我正在尝试使用此方法注册一个 .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 fonts


【解决方案1】:

请用

运行你的java进程

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

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

【讨论】:

  • 不应该是 -Djava.awt.headless=false 还是更安全:确保 VM 参数不包含任何 -Djava.awt.headless=true 条目?
  • 你实现的是服务器端还是客户端?对于服务器,您将需要无头
  • 实现服务器还是客户端都没有关系。如果要在 Java 中加载 .ttf 字体并且在 Windows 10 上运行,则必须确保 VM 参数不包含 -Djava.awt.headless=true。指定此 VM 参数是 Windows 中获取 HeadlessGraphicsEnvironment 而不是 Win32GraphicsEnvironment 的唯一方法。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2023-03-31
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2022-01-16
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多