Java AWT如何加载.ttc字体及getResourceAsStream空值问题排查
问题根因
getClass().getResourceAsStream()是从**类路径(classpath)**查找资源,你当前写法是相对于Main类所在的bin_gen包路径查找,相当于找bin_gen/Dependencies/msjh.ttc,自然找不到返回null- 图标加载成功是因为
Toolkit.getDefaultToolkit().getImage()是从**程序工作目录(IDEA默认是项目根目录)**查找资源,刚好你Dependencies文件夹在项目根目录,所以能读到
解决步骤
- 调整资源目录配置(推荐,打包成jar后仍可正常读取)
- 打开IDEA项目视图,右键
Dependencies文件夹,选择Mark Directory as -> Resources Root,标记为资源根目录后,目录下的所有文件会被自动纳入类路径 - 修改字体加载代码的资源路径:
// 开头的/表示从类路径根目录查找,统一用正斜杠,不要用Windows反斜杠 InputStream inputStream = getClass().getResourceAsStream("/msjh.ttc"); - 打开IDEA项目视图,右键
- 补充ttc字体加载适配
.ttc是字体集合格式,需要额外指定字体索引,避免后续抛出FontFormatException,修改createFont代码:
// 第三个参数0表示取字体集合中的第一个字体,可根据实际需要调整索引 font = Font.createFont(Font.TRUETYPE_FONT, inputStream, 0).deriveFont(Font.PLAIN, 16f);
- 临时替代方案(仅本地调试用,打包后失效)
如果不想修改资源目录配置,也可以直接用文件流从工作目录读取,逻辑和图标加载一致:
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
相关产品推荐
相关产品推荐

