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

M1 Mac Pro上JavaFX显示字符异常问题求助

为何我的M1 Mac Pro上JavaFX应用显示错误字符?

显示效果:
错误字符显示效果

我已尝试的操作:

  • 修改系统字体
  • 将JavaFX版本升级至当前最新的20版
  • 检查语言/区域设置

以下是完整项目文件(包含primary和secondary fxml文件):


App.java

// 已导入所有必要库

public class App extends Application {

    private static Scene scene;

    @Override
    public void start(Stage stage) throws IOException {
        scene = new Scene(loadFXML("primary"), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    static void setRoot(String fxml) throws IOException {
        scene.setRoot(loadFXML(fxml));
    }

    private static Parent loadFXML(String fxml) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
        return fxmlLoader.load();
    }

    public static void main(String[] args) {
        launch();
    }
}

PrimaryController.java

public class PrimaryController {

    @FXML
    private void switchToSecondary() throws IOException {
        App.setRoot("secondary");
    }
}

SecondaryController.java

public class SecondaryController {

    @FXML
    private void switchToPrimary() throws IOException {
        App.setRoot("primary");
    }
}

primary.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>

<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testing.PrimaryController">
   <children>
      <Label text="Primary View" />
      <Button fx:id="primaryButton" text="Switch to Secondary View" onAction="#switchToSecondary"/>
   </children>
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
   </padding>
</VBox>

secondary.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>

<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testing.SecondaryController">
    <children>
        <Label text="Secondary View" />
        <Button fx:id="secondaryButton" text="Switch to Primary View" onAction="#switchToPrimary" />
    </children>
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
    </padding>
</VBox>

解决方案

1. 添加JVM渲染参数

启动应用时添加以下JVM参数,强制JavaFX使用系统字体和正确的文本渲染引擎:

-Dprism.fontdir=/Library/Fonts
-Dprism.text=t2k

IDE运行时直接在VM选项里添加,打包后则加到启动命令中。

2. 确认FXML文件编码

检查所有FXML文件实际保存编码为UTF-8(可通过VS Code等编辑器右下角确认),若编码不符则转换为UTF-8。

3. 手动指定控件字体

在FXML或代码中给Label、Button明确指定系统支持的字体,比如修改FXML:

<Label text="Primary View" font="System 14"/>
<Button fx:id="primaryButton" text="Switch to Secondary View" onAction="#switchToSecondary" font="System 14"/>

4. 验证JavaFX架构适配

确保下载的JavaFX是**ARM64(aarch64)**版本,M1属于ARM架构,使用x86版本会引发兼容性问题。

5. 更新系统与JDK

升级Mac系统到最新版本,同时使用适配ARM64的JDK(如Azul Zulu的ARM版JDK),避免架构不匹配导致的字体渲染异常。

内容的提问来源于stack exchange,提问作者snir10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:27:04