如何让Java Swing正常显示Comic Sans MS字体的所有字符字形?
问题根源
Java Swing的默认字体渲染逻辑和Windows原生应用不同:Windows原生程序遇到当前字体不支持的字符时,会自动遍历系统字体库查找可渲染该字符的替代字体;而默认配置的JRE不会触发该自动 fallback逻辑,当你指定的Comic Sans MS本身没有收录阿姆哈拉语字符「አማርኛ」的字形时,就会显示为空白占位符。
简便解决方案
方案1:修改JRE配置(无需改代码,本地运行首选)
- 找到运行项目所用的JDK/JRE安装路径,进入
jre/lib目录 - 把目录下的
fontconfig.properties.src文件复制一份,重命名为fontconfig.properties - 打开该文件,找到
allfonts开头的配置段,在对应Windows平台的字体序列中添加支持阿姆哈拉语的系统字体(Windows自带的Nirmala UI、Segoe UI Historic均支持该字符集) - 保存文件后重启Java应用即可生效
方案2:代码加全局配置(仅需加3行代码,快速验证首选)
在main方法最顶部、所有Swing初始化代码之前添加如下配置:
System.setProperty("sun.java2d.font.scaler", "freetype"); System.setProperty("awt.useSystemAAFontSettings", "on"); System.setProperty("swing.useSystemFontSettings", "true");
该配置会让JRE调用Windows原生的字体渲染逻辑,复用系统的字体 fallback规则,大部分场景下可直接解决生僻字符显示问题。
方案3:内嵌支持字体(一次修改永久生效,打包发布首选)
如果要对外发布应用,避免用户端JRE配置不一致的问题,可以直接把支持目标字符集的字体文件打包到项目资源中,代码中直接加载使用:
try { // 字体文件放在resources/fonts目录下,随项目打包 Font baseFont = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("/fonts/NotoSansEthiopic-Regular.ttf")); Font comicBld32 = baseFont.deriveFont(Font.BOLD, 32f); // 后续正常使用该字体即可 } catch (FontFormatException | IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

