当前位置: 首页 > news >正文

JavaFX CSS @font-face 错误全面分析 loadStylesheetUnPrivileged / reportException

JavaFx 支持样式表,并且支持 @font-face 加载指定字体。官方提供的示例代码如下:

@font-face {font-family: 'sample';font-style: normal;font-weight: normal;src: local('sample'), url('http://font.samples/resources/sample.ttf';) format('truetype');
}

但是这段代码极具误导性,而且很容易出现如下错误:

// 错误1
com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
INFO:Could not load @font-face font [file:/D:/JOYZL%20SCADA/scada/trunk/brace/target/classes/com/joyzl/brace/window/HUATENS.ttf]// 错误2
javafx.css.CssParser reportException
警告: Please report java.lang.NullPointerException at:

其次的错误是字体加载成功了,但是却没有生效。

原因为:

1. StyleManager 使用 Font.loadFont() 这个方法不会对URL编码的百分号字符执行解码,那么如果路径中存在空格,会导致加载失败。由于CSS中的路径URL是样式解析器通过 getResource 获得的,因此我们没有可用的干预手段,折中的方案是,JavaFx 程序启动时通过代码加载字体,我们需要将 %20 替换为 空格。

 2. src:url("/sample.ttf") 的URL不能出现 ‘/’ 开头的根目录表示形式,字体文件定位相对于CSS文件的位置,不应使用绝对路径,请改为相对路径。如果路径解析失败将收到 reportException 异常。

3. 字体加载成功(未提示异常),但是字体依然没有生效,是为字体名称匹配失败,这会由三个原因导致:
  A. @font-face 中指定的 font-family 是无效的,JavaFx 不会使用这个指令,@font-face 中除了 src:url 之外的指令都被忽略,包括 url 后面的 format,只能使用字体默认名称。
  B. 字体默认名称,在不同的操作系统可能不一样,以“阿里巴巴普惠体”字体测试,在简体中文 Windows 11 中字体名称为 '阿里巴巴普惠体 3.0 45 Light' 而在 Debian 12 中字体名称为 'Alibaba PuHuiTi 3.0 45 Light',并且 -fx-fongt-family 指令不支持多个字体名称,是不是要疯了。
  C. 样式表中的字体名称必须有引号包围,否则依然会匹配失败。

-fx-font-family: Monserrat; /*无效*/
-fx-font-family: 'Monserrat';

JavaFX CSS Reference Guide

Introduction to FXML | JavaFX 24 

http://www.lryc.cn/news/604805.html

相关文章:

  • 快速删除Word和WPS文字中的空白行
  • Redis实现数据传输简介
  • Kubernetes高级调度02
  • Elasticsearch 索引管理 API 实战:涵盖创建、查看、修改、删除及别名
  • Redis 面试全解析:从数据结构到集群架构(含实战解决方案)
  • 设计模式之单例模式及其在多线程下的使用
  • 【C#】DevExpress.XtraEditors.MemoEdit memoEditLog控件讲解
  • Rabbitmq中常见7种模式介绍
  • pytorch小记(三十三):PyTorch 使用 TensorBoard 可视化训练过程(含完整示例)
  • 用 Go Typed Client 快速上手 Elasticsearch —— 从建索引到聚合的完整实战
  • 8.Linux : 日志的管理与时钟同步的配置
  • Rabbit MQ的消息模式-Java原生代码
  • YOLO-01目标检测基础
  • 02 基于sklearn的机械学习-特征降维(特征选择、PCA)、KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)
  • Android调用python库和方法的实现
  • YOLOv5u:无锚点检测的革命性进步
  • android-PMS-创建新用户流程
  • 舆情监测专员需要哪些常用软件工具?
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(一)
  • 论文Review 3DGSSLAM S3PO-GS | ICCV 2025 港科广出品!| 高效快速的3DGSSLAM!
  • sqli-labs:Less-1关卡详细解析
  • CMS框架漏洞
  • 3D Web轻量化引擎HOOPS Communicator数据处理与流式加载能力概述
  • 【音视频】WebRTC-Web 音视频采集与播放
  • 【预判一手面试问题:排序】
  • 依托客户满意度分析协助企业精准把握市场趋势​(满意度调查)
  • 智能AI医疗物资/耗材管理系统升级改造方案分析
  • InfluxDB 与 Java 框架集成:Spring Boot 实战(二)
  • VSCode插件开发完整教程:从零开始创建文件导出插件
  • Python 程序设计讲义(37):字符串的处理方法——设置字符串居中显示:center() 方法