为什么 JavaFX 应用程序和场景生成器显示乱码?

Why JavaFX application and scene builder is showing garbled text?

这是我的场景构建器的样子:

这是 GUI:

独立场景构建器:

我只是 运行 来自 Java SDK 演示的以下源代码:

package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Button btn = new Button();
        btn.setText("Say 'Hello World'!");
        StackPane root_ctn = new StackPane();
        root_ctn.getChildren().add(btn);
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                System.out.println("Hello World!");
            }
        });
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root_ctn, 300, 275));
        primaryStage.show();
    }


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

文本唯一看起来不错的地方是在控制台中。

View idea.log

我还没有找到解决方案,但我发现了一个有趣的模式: 在您的 Gluon Scene Builder 屏幕截图上,写有 Pgy Rtqlgev,它应该是 New Project,而 Qrgp Rtqlgev 应该是 Open Project。请注意,每个字母都由字母表中的下一个字母代替!

同样适用于Say 'Hello World'!,“翻译”为Lc{ 'Jgrrq Yqtrf'!。请注意,字母 y 被替换为 {,它位于 ASCII table 中 y 之后的两个位置。有趣的是,字符 '! 保持不变..

每个字母所占的 space 仍然是正确字母的 space ,如下图所示,正确的文字在绿色背景上:

更新: 字体“Segoe UI”是否可能在您的系统上丢失或有缺陷?例如,您可以在 Word 中使用该字体吗?

更新: 我发现另外两个用户的问题也面临同样的问题。在这两种情况下,问题似乎都与 Segoe UI 字体有关:

JavaFX Scene builder shows wired characters

我也遇到过这个问题,在阅读了很多论坛后我认为我有一个可能的解释和解决方案。该问题似乎与 Mac 用户和 Segoe UI;

有关

我猜测是因为该字体是在微软产品中使用的,所以Mac无法渲染该字体,即使下载的版本也无法使用。

到目前为止对我有用的最简单的修复方法是包括 style="-fx-font-family: serif" 在根节点中或将其添加到控制器中或添加

.root{
  -fx-font-family: serif
}

给你的CSS。这适用于您系统中的任何字体。

安装 Segoe UI 对我来说是一个巨大的转移注意力。相反,我将 build.gradle 中定义的 javafx 的版本更改为 17.0.1,并将 JavaFX 升级到 16