如何在 Java 7 和 8 中找出字体文件路径

Posted

技术标签:

【中文标题】如何在 Java 7 和 8 中找出字体文件路径【英文标题】:How to find out the font file path in Java 7 and 8 【发布时间】:2014-07-13 22:46:40 【问题描述】:

在 Java 7 和 8 中,由于 FontManager 发生了变化,所以现在我要找出一个字体文件路径,例如 c:/windows/fonts/arial.ttf。现在我如何使用 Java 7 和 8 做到这一点?

编辑

我有一个字体对象或字体名称,现在我想找出字体的文件路径。比如我已经得到了字体名称或者Font对象,比如Extra CVS bold,现在我想有办法在需要x32cvs_b.ttf的地方得到c:/windows/fonts/x32cvs_b.ttf

【问题讨论】:

“在 java 7 和 8 中,FontManager 发生了变化,..” FontManager 到底是什么?它不在JSE 8 docs 中。链接到 Java 文档。另外为什么你要获取字体的路径?它提供什么应用功能? @AndrewThompson 它可能看起来很奇怪,但在 mac 中,swing 组件无法正确呈现 utf-8 文本数据,我发现如果我直接从文件/流加载字体,Java 将呈现文本 dat 正确。所以这就是原因伙计:) 听起来像 bug 比解决方法更好。 还有FontManager是什么 @AndrewThompson sun.font.FontManager 是一个负责安装字体、加载它们并且通常是字体上下文的类。这家伙在JDK7之后有一些API变化。 【参考方案1】:
Object font2D;
try 
    // Java 7+.
    font2D = Class.forName("sun.font.FontUtilities").getDeclaredMethod("getFont2D", new Class[] Font.class)
        .invoke(null, new Object[] font);
 catch (Throwable ignored) 
    font2D = Class.forName("sun.font.FontManager").getDeclaredMethod("getFont2D", new Class[] Font.class)
        .invoke(null, new Object[] font);

Field platNameField = Class.forName("sun.font.PhysicalFont").getDeclaredField("platName");
platNameField.setAccessible(true);
String file = (String)platNameField.get(font2D);

【讨论】:

以上是关于如何在 Java 7 和 8 中找出字体文件路径的主要内容,如果未能解决你的问题,请参考以下文章

eclipse无法修改字体

如何从 Opentype 字体的 GPOS 表中使用和提取字距调整对,以在 Java 中将字形正确显示为 Path2D?

如何将jdk1.7更换为jdk1.8

java 求助:如何解决地址栏传参数为中文文件路径时 乱码的情况?

自定义字体在 iOS 8 中不起作用

带有 itext 的 OpenType 字体字距调整