You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java AWT如何加载.ttc字体及getResourceAsStream空值问题排查

问题根因
  • getClass().getResourceAsStream() 是从**类路径(classpath)**查找资源,你当前写法是相对于Main类所在的bin_gen包路径查找,相当于找bin_gen/Dependencies/msjh.ttc,自然找不到返回null
  • 图标加载成功是因为Toolkit.getDefaultToolkit().getImage() 是从**程序工作目录(IDEA默认是项目根目录)**查找资源,刚好你Dependencies文件夹在项目根目录,所以能读到
解决步骤
  1. 调整资源目录配置(推荐,打包成jar后仍可正常读取)
    • 打开IDEA项目视图,右键Dependencies文件夹,选择Mark Directory as -> Resources Root,标记为资源根目录后,目录下的所有文件会被自动纳入类路径
    • 修改字体加载代码的资源路径:
    // 开头的/表示从类路径根目录查找,统一用正斜杠,不要用Windows反斜杠
    InputStream inputStream = getClass().getResourceAsStream("/msjh.ttc");
    
  2. 补充ttc字体加载适配
    .ttc是字体集合格式,需要额外指定字体索引,避免后续抛出FontFormatException,修改createFont代码:
// 第三个参数0表示取字体集合中的第一个字体,可根据实际需要调整索引
font = Font.createFont(Font.TRUETYPE_FONT, inputStream, 0).deriveFont(Font.PLAIN, 16f);
  1. 临时替代方案(仅本地调试用,打包后失效)
    如果不想修改资源目录配置,也可以直接用文件流从工作目录读取,逻辑和图标加载一致:
InputStream inputStream = new FileInputStream("Dependencies/msjh.ttc");
额外注意事项
  • 直接调用new Font("Microsoft JhengHei UI", Font.PLAIN, 16)不生效,通常是因为系统中注册的字体名称和你写的不一致,部分Windows版本中该字体的注册名是Microsoft JhengHei(不带UI),还有可能是繁体中文名称,不如直接读取字体文件兼容性好
  • 当前配置的-Dfile.encoding=MS950参数是字符编码配置,不影响资源文件读取,无需修改

内容的提问来源于stack exchange,提问作者Alex Cai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:06:11