You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:36:05