当前位置: 首页 > 知识库问答 >
问题:

如何强制Red Hat OpenJDK8在Windows上像AdoptOpenJDK和Oracle JDK一样清晰地呈现字体?

黄宏旷
2023-03-14

我们的用户在他们的Windows桌面上运行我们的Java GUI应用程序,我们正在计划从Oracle Java8切换到OpenJDK8。但是我们发现不同的OpenJDK构建在字体呈现的质量上是不一致的,Oracle和AdoptOpenJDK是等价的,但是Red Hat严重缺乏。

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

  • Oracle 1.8.0_201-B26
  • AdoptoPenJDK 1.8.0_202-B08
  • Red Hat 1.8.0_201-2-redhat-B09

该程序只是显示一个带有命令行指定的对话框/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)
  • 灵气外观(javax.swing.plaf.nimbus.nimbusLookandFeel)

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

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

共有1个答案

孔逸春
2023-03-14

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

FREETYPE_PROPERTIES=truetype:interpreter-version=35
 类似资料:
  • canvas 在绘制的时候,由于浏览器的缩放比例以及现在电脑的高清屏导致绘制的图像不清晰问题。 这篇文章可以分享一下,解决了上述的问题 高清的canvas图像

  • 问题内容: 作为Node.js环境和哲学的新手,我想回答几个问题。我已经下载了Windows安装程序的node.js和节点包管理器.Windows Cmd提示符当前用于运行nodejs应用程序。 cls清除命令窗口或命令提示符中的错误。有node.js的等效项吗?console.clear不存在;(或是否以其他形式存在? 我通过下面的代码创建了一个服务器 我将代码更改为下面的代码,并刷新了浏览器,

  • 我用这种方法上传文件: 并通过以下方式显示图像: 图像只有在重新启动应用程序后才可见。我不知道为什么以及如何解决这个问题。 顺便说一句,我如何点文件而不是使用整个路径: ?

  • 我正在制作一个使用swing的游戏,其中有一个用于选择关卡的JPanel和用于导航到关卡的JButtons。我还为整个级别屏幕创建了一个.png图像--是否可以在JButtons的顶部呈现该图像?如果不是,最简单的替代方案是什么?

  • 我想用我的opencart商店做点什么,里面有8000多个产品和他们的描述!问题是…我开始在这个opencart商店工作后,产品已经插入,但描述是错误的格式,如彩色文本,使用不需要的字体和字体样式等。我有一个关于opencart开发和php编码和MVC框架的非常基础的知识,但我想清除每个描述的格式,只留下字体重量:粗体;(因为我想把文案工作保存到现在)。有人知道我该怎么做吗?我试着导出数据库,用e

  • 我正在用HTML画布做一些工作,我发现当我画了一条线时,我无法清除或画出它? 所以我要做的是:我有一个带网格的画布,每个单元格在其中绘制自己(一个填充的矩形,在页面加载时完成),当鼠标在网格上时,应该勾勒出鼠标所在的单元格的轮廓(在画布上绘制四条线,没有其他重绘)。当鼠标移动到另一个单元格时,应勾勒出新单元格的轮廓(如前所述),而不应再勾勒出先前勾勒出的单元格的轮廓(目的是重新绘制单元格,绘制线条