当前位置: 首页 > 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.dtcms.com/a/306714.html

相关文章:

  • [Agent开发平台] Coze Loop开源 | 前端 | typescript架构API速查
  • Mac配置iterm2
  • 为什么选择 Apache RocketMQ
  • 基于Java+vue+MySQL实现(Web)疫情上报系统
  • 架构实战——架构重构内功心法第一式(有的放矢)
  • Effective C++ 条款12:复制对象时勿忘其每一个成分
  • AD里面出现元器件PCB封装不能编辑的情况
  • UE5保姆级新手教程第六章(角色互动)
  • 低成本高可控,TEMU自养号测评的6大核心优势解析
  • 【数据可视化-76】从释永信被查,探索少林寺客流量深度分析:Python + Pyecharts 炫酷大屏可视化(含完整数据和代码)
  • 142页|中型国有企业数字化转型方法论:京东数智化转型解决方案-五化方法论
  • Apache Ignite 集群标识(Cluster ID)和集群标签(Cluster Tag)
  • Python多线程利器:重入锁(RLock)详解——原理、实战与避坑指南
  • 国产音频DA转换芯片DP7361支持192K六通道24位DA转换器
  • AI服务器中,EEPROM有哪些部件使用,需要存储哪些信息?
  • sqli-labs:Less-2关卡详细解析
  • 跨云部署实战:前端、后端 + RSYNC、全栈场景统一落地方案
  • 在macOS上使用VS Code和Clang配置C++开发环境
  • 《解密React key:虚拟DOM Diff中的节点身份锚点》
  • Undo、Redo、Binlog的相爱相杀
  • GIS工程师面试题
  • Java项目:基于SSM框架实现的济南旅游网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 力扣 hot100 Day60
  • Rabbit MQ的消息模式-Java原生代码
  • 发那科机器人P点位置号码自动变更功能为禁用状态
  • 认识ansible(入门)
  • 《嵌入式C语言笔记(十六):字符串搜索、动态内存与函数指针精要》
  • RocketMQ 核心特性解析及与 Kafka区别
  • 思途JSP学习 0730
  • DP-v2.1-mem-clean学习(3.6.7)