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

标签 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, 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/

相关文章:

java - WebSphere Liberty ActiveMQ

java - 如何捕获 trayicon.displayMessage() 鼠标点击工具提示气球

java - 在java上分层绘画?

java - 组合圆弧和矩形时出现小间隙

java - 如何在java对话框中使字体变粗?

html - 调整html中文本的选择区域

java - 如何更改 JFrame 中的字体颜色

java - 创建新对象或重用旧对象Java

java - SSLHandshakeException : PKIX path building failed. 即使在我导入证书之后

java - 如果没有 Web 层并因此没有 HTTP session ,CDI 是否有意义?