我知道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。
最佳答案
首先,TTC 和 TTF 之间的区别是:TTC 可以(通常)包含多种字体,但 TTF 只能定义字体。将多种字体放入一个文件中的原因是通过共享字形(或子字形)来节省空间。例如,在SimSun和NSimSun中,大多数字形都是相同的,将它们保存在一起可以节省大量空间。
其次,Java支持TTC字体格式,但是使用Font.createFont()
只能获取TTC文件中定义的first字体。目前,无法指定字体索引。看一下sun.font.FontManager.createFont2D()
,当它们调用new TrueTypeFont()
时,fontIndex始终为零。耻辱!
对于你的问题:如果你只需要 TTC 文件中的第一个字体,那么一切都会好起来的。为第一种字体定义的所有字形都可用。但是,如果您期望在该文件中定义第二种或其他字体,那么您就会遇到障碍。使用此 API 甚至无法获取字体名称。
系统加载的字体和创建的字体没有区别。然而,没有好的方法来指定字体索引,您可以尝试侵入 FontManager 并提出一些特定于平台的代码。
关于java - TrueType Collection (.ttc) 在 Java Swing 中设置为字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16830807/