2

我知道 Java 支持 TrueType 字体 (.ttf) 并且 .ttc 是 TrueType 格式的扩展,但我找不到 Java 还支持将 TrueType 集合 (.ttc) 明确设置为 JLabel 上的字体的信息。

我做了一个例子,在我的应用程序中成功加载了一个 .ttc 文件,代码如下:

InputStream is = getClass().getResourceAsStream("/resources/simsun.ttc");
Font font = Font.createFont(Font.TRUETYPE_FONT, is);
Font fontBase = font.deriveFont(15f);
field.setFont(fontBase);

代码运行良好,没有与创建、加载或设置 .ttc 文件作为 Swing 组件中的字体相关的异常。

我的问题是:有人可以确认它运行良好并且 .ttc 中字体的所有字形都用于组件中,或者有任何与此相关的缺点吗?

此外,如果 .ttc 是从客户端机器上的 jar 加载还是必须以系统字体安装,有什么区别吗?

我正在使用 Windows 7。

4

1 回答 1

2

首先,TTC 和 TTF 的区别在于:TTC 可以(并且通常)包含多种字体,但 TTF 只定义了字体。将多种字体放入一个文件的原因是通过共享字形(或子字形)来节省空间。例如,在 SimSun 和 NSimSun 中,大多数字形都是相同的,将它们保存在一起可以节省大量空间。

其次,Java支持TTC字体格式,但使用Font.createFont()只能得到TTC文件中定义的第一个字体。目前,没有办法指定字体索引。看一下sun.font.FontManager.createFont2D(),当他们调用时new TrueTypeFont(),fontIndex 总是为零。耻辱!

对于您的问题:如果您只需要 TTC 文件中的第一个字体,那么一切都会好起来的。为第一个字体定义的所有字形都将可用。但是,如果您希望在该文件中定义第二种或其他字体,那么您就遇到了障碍。您甚至无法使用此 API 获取字体名称。

系统加载的字体和创建的字体没有区别。但是没有指定字体索引的好方法,您可以尝试破解 FontManager 并提出一些特定于平台的代码。

于 2013-06-15T00:28:58.880 回答