Java中如何为JLabel设置自定义字体?createFont方法报错怎么办
JLabel设置自定义字体报错解决方案
核心报错原因
你写的代码存在两个共性问题,也是createFont方法报错、字体不生效的核心原因:
- 没有处理
createFont抛出的受检异常,且字体文件路径大概率配置错误 - 直接使用
createFont返回的字体对象,该对象默认字号为1pt,就算加载成功也几乎看不到文字,容易被误判为加载失败
常见报错场景排查
- 文件找不到异常:代码里写的
new File("pixelFont.TTF")是相对路径,读取的是程序启动时的工作目录,不是源码目录、类文件目录,90%的路径报错都是这个原因导致。可以直接执行System.out.println(new File("pixelFont.TTF").getAbsolutePath())打印程序实际查找的文件路径,对照调整即可。 - 字体格式异常:传入
Font.TRUETYPE_FONT参数时,必须传入标准未损坏的ttf格式文件,如果是otf格式、修改后缀的伪ttf文件、损坏的字体文件,都会抛出格式错误。 - 未做异常兜底:
Font.createFont会抛出IOException和FontFormatException两个受检异常,必须显式捕获,否则编译不通过,运行时遇到异常会直接崩溃。 - 字号未设置:
createFont返回的基础字体默认字号为1pt,直接设置到组件上文字会小到无法识别,必须调用deriveFont派生指定字号和样式后再使用。
正确实现代码
优先推荐把字体文件作为内置资源打包到程序中,避免部署时因为路径问题找不到文件:
- 先在项目源码目录下新建
fonts文件夹,把pixelFont.TTF放进去,保证编译后文件能被输出到类路径下 - 参考如下实现:
import javax.swing.*; import java.awt.*; import java.io.IOException; import java.io.InputStream; public class CustomFontDemo { public static void main(String[] args) { JFrame frame = new JFrame("自定义字体测试"); frame.setSize(500, 200); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JLabel title = new JLabel("自定义字体测试文本", SwingConstants.CENTER); // 从类路径读取字体资源,避免相对路径问题 try (InputStream fontStream = CustomFontDemo.class.getResourceAsStream("/fonts/pixelFont.TTF")) { if (fontStream == null) { throw new IOException("字体资源不存在"); } Font baseFont = Font.createFont(Font.TRUETYPE_FONT, fontStream); // 派生指定样式、字号,24f为字号大小,可根据需求调整 Font customFont = baseFont.deriveFont(Font.PLAIN, 24f); title.setFont(customFont); } catch (FontFormatException | IOException e) { e.printStackTrace(); // 加载失败回退到系统默认字体,避免程序崩溃 title.setFont(new Font("微软雅黑", Font.PLAIN, 24)); } frame.add(title); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
如果需要读取jar包外部的字体文件,直接传入文件的绝对路径即可,加载逻辑和上面一致,注意提前判断文件是否存在:
File externalFontFile = new File("D:/resources/pixelFont.TTF"); if (!externalFontFile.exists()) { System.out.println("外部字体文件不存在,路径:" + externalFontFile.getAbsolutePath()); // 走默认字体兜底逻辑 } Font baseFont = Font.createFont(Font.TRUETYPE_FONT, externalFontFile); Font customFont = baseFont.deriveFont(Font.PLAIN, 24f); title.setFont(customFont);
快速排查步骤
- 先看控制台打印的异常栈信息:
如果是
FileNotFoundException:直接按前面说的打印文件绝对路径,调整路径或者把字体文件放到对应目录即可
如果是FontFormatException:换一个可正常使用的标准ttf文件测试,排除文件损坏、格式不匹配问题 - 确认加载完基础字体后,调用了
deriveFont方法设置了合适的字号 - 如果界面还是不生效,检查Swing组件的修改逻辑是否放在事件 dispatch 线程中执行,可以把界面初始化逻辑放到
SwingUtilities.invokeLater()里测试。
内容的提问来源于stack exchange,提问作者Somethings Wrong
相关产品推荐
相关产品推荐

