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
相关产品推荐
相关产品推荐

