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
相关产品推荐
相关产品推荐

