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

TrueType集合(.ttc)在Java Swing中设置为字体,java,swing,fonts,jar,truetype,Java,Swing,Fonts,Jar,Truetype,我知道Java支持TrueType字体(.ttf)并且.ttc是TrueType格式的扩展,但是我找不到Java也支持TrueType集合(.ttc)在JLabel上显式设置为字体的信息 我举了一个例子,在我的应用程序中成功加载了一个.ttc文件,代码如下: InputStream is = getClass().getResourceAsStream("/resources/simsun.ttc"); Font font = Font.createFont(Font.TRUETYPE_FONT

我知道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);
代码运行良好,在Swing组件中将.ttc文件创建、加载或设置为字体时没有异常

我的问题是:是否有人能确认它工作正常,并且.ttc中字体的所有字形都用于组件中,或者与此相关的任何缺点?

另外,如果.ttc是从客户机上的jar加载的,或者必须以系统字体安装,那么有什么区别吗


我使用的是Windows 7。

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

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

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


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

谢谢您的帮助。我有三个.ttf文件,我希望它们作为一种字体。我认为将它们组合成一个.ttc将解决我的问题,但是有没有办法处理这些字体,例如在JLabel上将它们设置为一种字体?我不考虑修改fontconfig.properties的解决方案,因为它需要分发到每台计算机,而且回退字体也不是解决方案。