如何在 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 中找出字体文件路径的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Opentype 字体的 GPOS 表中使用和提取字距调整对,以在 Java 中将字形正确显示为 Path2D?