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

ControlsFX使用新版FontAwesome图标失败求助:代码执行后显示方块

解决ControlsFX加载新版FontAwesome图标显示方块的问题

我之前也碰到过一模一样的情况,FontAwesome图标显示方块大概率是字体加载失败、字符编码不匹配或者ControlsFX的GlyphFont兼容性问题,咱们一步步来搞定:

1. 先确认字体文件能正常加载

首先要排查字体文件的路径是否正确,以及文件本身有没有损坏:

  • 如果字体文件放在项目的resources根目录下,路径前面要加斜杠:
    InputStream resourceAsStream = getClass().getResourceAsStream("/fa-solid-900.ttf");
    // 一定要加个空值判断,避免默默加载失败
    if (resourceAsStream == null) {
        throw new RuntimeException("找不到fa-solid-900.ttf字体文件,请检查路径!");
    }
    
  • 手动打开字体文件(用系统的字体查看器),确认能看到购物篮对应的图标(Unicode码U+F291),确保文件没有损坏。

2. 修正字符编码的使用方式

直接用'\uf291'有时候会因为编码解析问题失效,换两种方式试试:

// 方式一:通过字符串转字符
char basketChar = "\uf291".charAt(0);
imageBuy.setGraphic(glyphFont.create(basketChar).size(28));

// 方式二:直接用十六进制数值转换
char basketChar = (char) 0xF291;
imageBuy.setGraphic(glyphFont.create(basketChar).size(28));

3. 绕开ControlsFX,用JavaFX原生组件实现

如果GlyphFontRegistry还是搞不定,试试用JavaFX原生的Font和Text组件,这种方式更稳定:

// 直接加载字体到JavaFX Font对象
Font faSolidFont = Font.loadFont(getClass().getResourceAsStream("/fa-solid-900.ttf"), 28);
// 创建Text节点显示图标
Text basketIcon = new Text("\uf291");
basketIcon.setFont(faSolidFont);
// 设置到控件上
imageBuy.setGraphic(basketIcon);

4. 避免字体名称冲突

如果之前注册过其他版本的FontAwesome,可能存在缓存冲突,给注册的字体起个独特的名字:

GlyphFontRegistry.register("FA-SOLID-900-V6", resourceAsStream, 14);
GlyphFont glyphFont = GlyphFontRegistry.font("FA-SOLID-900-V6");

我当时就是用原生Text组件的方式解决的,基本上不会有兼容性问题,你可以优先试试这个方案。

内容的提问来源于stack exchange,提问作者Thiago Sayão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:22:50