【问题标题】:TrueType Collection (.ttc) set as font in Java SwingTrueType 集合 (.ttc) 在 Java Swing 中设置为字体
【发布时间】:2013-05-25 17:05:24
【问题描述】:

我知道 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。

【问题讨论】:

    标签: java swing fonts jar truetype


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢这个。我有三个 .ttf 文件,我希望它们作为一种字体。我认为将它们组合成一个 .ttc 可以解决我的问题,但是有没有办法处理这些字体,例如将它们设置为 JLabel 上的一种字体?我没有考虑修改 fontconfig.properties 的解决方案,因为它需要分发到每台计算机,备用字体也不是解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2016-01-07
    • 2013-05-06
    • 2020-05-06
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多