Javafx Gluon Mobile 显示中文乱码问题

原因

当应用未设置字体时,JavaFX 默认采用 System 字体,此字体在windows平台可获取到,但是安卓平台获取不到.

windows: ` System.out.println(Font.getDefault()); Font[name=System Regular, family=System, style=Regular, size=12.0] `

在安卓端(ios未知)。获取系统如下: ` [Sun Sep 22 18:14:30 CST 2024][INFO] [SUB] D/GraalCompiled( 4100): File not found: /system/etc/system_fonts.xml [Sun Sep 22 18:14:30 CST 2024][INFO] [SUB] D/GraalCompiled( 4100): AndroidClock Regular [Sun Sep 22 18:14:30 CST 2024][INFO] [SUB] D/GraalCompiled( 4100): Carrois Gothic SC [Sun Sep 22 18:14:30 CST 2024][INFO] [SUB] D/GraalCompiled( 4100): Coming Soon [Sun Sep 22 18:14:30 CST 2024][INFO] [SUB] D/GraalCompiled( 4100): Cutive Mono `

发现安卓端缺失 system fonts, 隐藏中文显示会乱码,其他语言未试过.根本原因就是字体设置问题.

解决方案

方案一: 采用系统自带的字体

选用平台可用字体(支持目标语言), 通过css进行全局设置.如下所示:

you-css-file.css ` .root { -fx-font-family: "Noto Sans CJK SC" } `

然后在 scene 根目录加入此 stylesheet, 默认情况下,所有子节点都会采用根节点使用的字体.

Scene#getStyleSheets.add("you-css-file.css");

此方法适合针对平台进行设置,因为不同平台支持的字体不一致。

方案二:使用自定义字体

  1. 下载合适的字体文件

  2. 通过Font加载下载的字体

` Font font = Font.loadFont(FileUtils.getFileInputStream("/fonts/FeiHuaSongTi-2.ttf"), 20); `

  1. 同方案一的使用一样

优劣

  1. 方案一采用系统的字体,需要针对平台进行选择,需要验证字体存在与否。

  2. 方案二采用自定义的字体,不需要考虑平台支持问题,但是存在字体文件,使应用体积增大。