gpt4 book ai didi

java - 如何在 Java 中检索 native 字体名称?

转载 作者:行者123 更新时间:2023-11-30 05:51:11 26 4
gpt4 key购买 nike

Java 中有没有一种方法可以从 Font 对象中获取 native 字体名称?

我使用此代码 Font.decode("Serif") 获取我的字体,出于调试目的,我想知道使用的 native 字体。

最佳答案

事情可能没那么简单。有些字体是由很多物理字体组成的,不同的字形使用不同的物理字体。

例如,在我的 Windows 系统上,Serif 字体使用 12 种物理字体:

  • ** TrueType 字体:Family=Times New Roman Name=Times New Roman style=0 fileName=C:\Windows\Fonts\TIMES.TTF
  • ** TrueType 字体:Family=Wingdings Name=Wingdings style=0 fileName=C:\Windows\Fonts\WINGDING.TTF
  • ** TrueType 字体:Family=Symbol Name=Symbol style=0 fileName=C:\Windows\Fonts\SYMBOL.TTF
  • ** TrueType 字体:Family=Lucida Sans Name=Lucida Sans Regular style=0 fileName=C:\Java\jdk\jdk1.6.0_37\jre\lib\fonts\LucidaSansRegular.ttf
  • ** TrueType 字体: Family=MingLiU Name=MingLiU style=0 fileName=C:\Windows\Fonts\MINGLIU.TTC
  • ** TrueType 字体:Family=Lucida Sans Name=Lucida Sans Regular style=0 fileName=C:\Java\jdk\jdk1.6.0_37\jre\lib\fonts\LucidaSansRegular.ttf
  • ** TrueType 字体:Family=SimSun Name=SimSun style=0 fileName=C:\Windows\Fonts\SIMSUN.TTC
  • ** TrueType 字体:Family=Lucida Sans Name=Lucida Sans Regular style=0 fileName=C:\Java\jdk\jdk1.6.0_37\jre\lib\fonts\LucidaSansRegular.ttf
  • ** TrueType 字体:Family=MS Mincho Name=MS Mincho style=0 fileName=C:\Windows\Fonts\MSMINCHO.TTC
  • ** TrueType 字体: Family=Batang Name=Batang style=0 fileName=C:\Windows\Fonts\batang.TTC
  • ** TrueType 字体:Family=MingLiU-ExtB Name=MingLiU-ExtB style=0 fileName=C:\Windows\Fonts\MINGLIUB.TTC
  • ** TrueType 字体:Family=SimSun-ExtB Name=SimSun-ExtB style=0 fileName=C:\Windows\Fonts\SIMSUNB.TTF

以下代码可以将字体分解为它的物理组件。它使用反射 hack 来访问 sun.awt.Font2D 对象,因此使用风险自负(适用于 Oracle Java 6u37):

import java.awt.Font;
import java.lang.reflect.Method;
import java.util.Locale;

import sun.font.CompositeFont;
import sun.font.Font2D;
import sun.font.PhysicalFont;

public class FontTester
{
public static void main(String... args)
throws Exception
{
Font font = new Font("Serif", Font.PLAIN, 12);
describeFont(font);
}

private static void describeFont(Font font)
throws Exception
{
Method method = font.getClass().getDeclaredMethod("getFont2D");
method.setAccessible(true);
Font2D f = (Font2D)method.invoke(font);

describeFont2D(f);
}

private static void describeFont2D(Font2D font)
{
if (font instanceof CompositeFont)
{
System.out.println("Font '" + font.getFontName(Locale.getDefault()) + "' is composed of:");

CompositeFont cf = (CompositeFont)font;
for (int i = 0; i < cf.getNumSlots(); i++)
{
PhysicalFont pf = cf.getSlotFont(i);
describeFont2D(pf);
}
}
else
System.out.println("-> " + font);
}
}

关于java - 如何在 Java 中检索 native 字体名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13077611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com