如何将 .ttc 应用于 Java awt 中的字体

Posted

技术标签:

【中文标题】如何将 .ttc 应用于 Java awt 中的字体【英文标题】:How to apply .ttc to a Font in Java awt 【发布时间】:2022-01-04 12:58:22 【问题描述】:

我试图在 IntelliJ IDEA 中使用 java.io.InputStream 读取 .ttc 文件,但失败了。

这是我的代码:

InputStream inputStream = getClass().getResourceAsStream("Dependencies\\msjh.ttc");
Font font;
try

    if (inputStream == null)
        throw new IOException();
    font = Font.createFont(Font.TRUETYPE_FONT, inputStream).deriveFont(Font.PLAIN);

catch (IOException | FontFormatException exception)

    font = new Font("Microsoft JhengHei UI", Font.PLAIN, 16);

无论我如何尝试,条件if (inputStream == null)总是为真,并且会抛出IOException。

但是类似的设置窗口图标的方法是有效的:

Frame frame = new Frame("Window");
frame.setIconImage(Toolkit.getDefaultToolkit().getImage("Dependencies\\icon.png"));

这是我文件中的路径:

IdeaProjects\Project\Dependencies\msjh.ttc (font file)
IdeaProjects\Project\Dependencies\icon.png (image file)
IdeaProjects\Project\src\bin_gen\Main.java (source code)

还有一个虚拟机选项:-Dfile.encoding=MS950

那个 .ttc 文件是从 C:\Windows\Fonts\Microsoft JhengHei UI 复制的。我正在尝试这个,因为font = new Font("Microsoft JhengHei UI", Font.PLAIN, 16); 似乎不起作用(窗口上显示的字体仍然是默认字体)。

【问题讨论】:

【参考方案1】:

我建议使用getResource 而不是getResourceAsStream。他们遵循的规则略有不同,我很理解前者的规则。

如果字体在 IDE 创建的 Jar 中,它将位于 /Dependencies/msjh.ttc

请注意两个单独的正斜杠 (/),而不是类似文件的反斜杠 (\\)。该反斜杠仅适用于文件,并且仅适用于 Windows。 getResource 需要的是一个直接来自项目或 jar 根目录或相对于调用它的类的资源路径。 / 前缀告诉 JRE 从类路径的根目录中查找资源,而不是相对于调用类。

也不要使用getImage("Dependencies\\icon.png")。这将假定该字符串表示一个文件路径,这在部署项目时将不起作用。也可以使用getResource

【讨论】:

以上是关于如何将 .ttc 应用于 Java awt 中的字体的主要内容,如果未能解决你的问题,请参考以下文章

世界第一!泰山JDK8完美支持TTC字体文件的效果图

java jdk-awt.font在centos上中文乱码的问题, 安装中文字体

awt.font在centos上中文乱码的问题

Java AWT/SWT/Swing:如何规划 GUI?

如何在 Java 中捕获 AWT 线程异常?

Java:Solaris 上的 AWT [关闭]