JavaFX国际化功能在jar包运行失效,阿拉伯语显示异常如何解决?
问题根因
- 开发环境运行时,JavaFX默认加载本地JDK/系统的可用字体,包含阿拉伯语字符支持,因此显示正常
- 打包为独立JAR后,若未明确指定字体、或打包的JavaFX运行时未内置支持阿拉伯语的字体,非系统渲染的组件就会出现字符乱码/方块
- 系统菜单栏调用的是操作系统原生菜单渲染能力,使用系统自带字体,因此不受JavaFX字体配置影响,显示正常
解决方案
方案1:全局指定支持阿拉伯语的系统字体
在应用UI初始化之前,为所有控件配置默认使用支持阿拉伯语的系统字体,代码示例:
// 放在start方法最开头,UI初始化之前执行 Font arabicSupportFont = Font.font("Tahoma", 12); // 全局注入字体样式 StyleManager.getInstance().addUserAgentStylesheet( "* {-fx-font-family: '" + arabicSupportFont.getFamily() + "';}" );
也可以直接在全局CSS文件中配置,之后引入到场景即可:
* { -fx-font-family: "Tahoma", "Noto Sans Arabic", sans-serif; }
方案2:内置支持阿拉伯语的字体到JAR包
如果担心用户系统缺少对应字体,可将开源的阿拉伯语支持字体(比如Noto系列的阿拉伯语ttf字体)放到项目resources/fonts目录下,运行时动态加载:
// 初始化阶段加载内置字体 Font.loadFont(getClass().getResourceAsStream("/fonts/NotoNaskhArabic-Regular.ttf"), 12); // 之后按方案1的方式全局指定该字体即可
需要确认构建配置中已将resources下的字体文件纳入打包范围。
方案3:校验资源文件编码
确认你的多语言资源properties文件编码为UTF-8,打包时没有被自动转码为ISO-8859-1。如果使用Maven构建,可在pom.xml中添加如下配置强制编码:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <encoding>UTF-8</encoding> </resource> </resources> </build>
Gradle项目可对应添加资源编码配置。
内容的提问来源于stack exchange,提问作者karokh aziz
相关产品推荐
相关产品推荐

