TrueType Collection(.ttc)在Java Swing中设置为字体

时间:2013-05-30 07:57:42

标签: java swing fonts jar true-type-fonts

我知道Java支持TrueType字体(.ttf),而.ttc是TrueType格式的扩展,但我找不到Java也支持在JLabel上显式设置为字体的TrueType集合(.ttc)的信息例如。

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

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

代码运行良好,没有与.tc文件在Swing组件中创建,加载或设置相关的例外。

我的问题是:有人可以确认这项工作正常,并且.ttc中字体的所有字形都在组件中使用,或者有与此相关的任何缺点吗?

另外,如果从客户端计算机上的jar加载.ttc或者必须将其安装在系统字体中,有什么区别吗?

我正在使用Windows 7。

1 个答案:

答案 0 :(得分:2)

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

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

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

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