3

我们的用户在他们的 Windows 桌面上运行我们的 Java GUI 应用程序,我们正计划从 Oracle Java 8 切换到 OpenJDK 8。但是我们发现不同的 OpenJDK 构建在字体渲染质量上不一致,Oracle 和 AdoptOpenJDK相当,但红帽严重缺乏。

以下屏幕截图显示了三个不同 JDK 上 Windows 上的简单 Java AWT/Swing 程序:

  • 甲骨文 1.8.0_201-b26
  • 采用OpenJDK 1.8.0_202-b08
  • 红帽 1.8.0_201-2-redhat-b09

每个 JDK 上的 Windows Java 默认字体 - Oracle、AdoptOpenJDK、Red Hat

Red Hat JDK 中的渲染存在一些问题,因为每个字符都被扭曲了。

该程序仅显示带有命令行指定的 Dialog/bold/12 字体(每个 JDK 映射到 Windows OS Arial 字体)的 Swing JLabel:

    $ cat fontname.groovy
    import javax.swing.*
    import java.awt.Font
    import sun.font.*

    styles=[bold:Font.BOLD,italic:Font.ITALIC,plain:Font.PLAIN]
    SwingUtilities.invokeLater({
     l = new JLabel("${args}: ${System.getProperty('java.runtime.name')} ${System.getProperty('java.runtime.version')}")
     l.setFont(new Font(args[0],styles[args[1]],Integer.valueOf(args[2])))
     f = new JFrame()
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
     f.getContentPane().setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10))
     f.getContentPane().add(l)
     f.pack()
     f.setVisible(true)
     logicalFont = l.getGraphics().getFont()
     print(logicalFont)
     physicalFont = FontManagerFactory.getInstance().findFont2D( logicalFont.getName(), 0, FontManager.NO_FALLBACK )
     print(physicalFont)
    })

下面的附加屏幕截图显示了此 Windows 系统上可用的 3 个 Swing PLAF 上的相同字体,并显示 Red Hat OpenJDK 下的外观对于每个 PLAF 都是一致的(通过系统属性选项“-Dswing.defaultlaf =”设置):

  • 默认外观 (javax.swing.plaf.metal.MetalLookAndFeel)
  • Windows 外观 (com.sun.java.swing.plaf.windows.WindowsLookAndFeel)
  • Nimbus 外观和感觉 (javax.swing.plaf.nimbus.NimbusLookAndFeel)

多个 Swing PLAF 和 JDK 上的 Windows Java 默认字体

有谁知道为什么 Red Hat OpenJDK 构建会以如此不同的方式呈现字体?Red Hat OpenJDK 可能需要一些额外的 JDK 配置或设置吗?

更新- 从 OpenJDK 版本 1.8.0_201-2-redhat-b09 开始,alexkasko 的设置环境变量 FREETYPE_PROPERTIES 的答案(谢谢!)中的解决方法确实纠正了字体问题:

带/不带 FREETYPE_PROPERTIES 的 Windows Java 默认字体

4

1 回答 1

2

这是由FreeType 更新到 2.8导致的 Red Hat 构建中的回归。AdoptOpenJDK jdk8 build使用较旧的 FreeType 2.5.3。这将在 Red Hat 构建中得到修复,同时可以使用环境变量重新启用旧行为:

FREETYPE_PROPERTIES=truetype:interpreter-version=35
于 2019-05-10T10:11:00.533 回答