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

Posted

技术标签:

【中文标题】为啥 JavaFX 应用程序和场景生成器显示乱码?【英文标题】:Why JavaFX application and scene builder is showing garbled text?为什么 JavaFX 应用程序和场景生成器显示乱码? 【发布时间】:2021-06-19 03:56:20 【问题描述】:

我的场景构建器如下所示:

这是图形用户界面:

独立的场景构建器:

我只是从 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

【问题讨论】:

看看***.com/questions/14091011/…是否有帮助。 @Sedrick 编辑器已设置为 UTF8。无论如何,谢谢! You Parent root,从 fxml 加载,从未使用过。这是故意的吗?如果相关:请出示 FXML。 该系统的默认语言环境是什么?尝试使用-Duser.language=en -Duser.country=US运行它 @Puce 是的,我正在尝试一些代码,所以我添加了自己的“root”来进行测试。谢谢,我会添加语言环境,看看它是否有效。 【参考方案1】:

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

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

每个字母占用的空间仍然是正确字母的空间,如下图所示,绿色背景上有正确的文本:

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

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

Scene Builder Editor displaying weird characters

JavaFX Scene builder shows wired characters

【讨论】:

你是对的!有什么解释? 我仍在寻找解释。但我很确定这不是 cp1252 和 utf-8 之间的编码问题,因为这些编码在同一位置有受影响的字母。我用另一个观察更新了我的答案。 Segoe UI 字体在我刚刚测试过的计算机上运行良好。 这很奇怪,在其他情况下 Segoe UI 是问题所在,请参阅我的更新答案。 非常感谢!它与 Segoe UI 字体有关!我删除了字体系列并安装了一个新的,它现在可以工作了【参考方案2】:

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

我猜是因为微软产品中使用了该字体,Mac无法渲染该字体,甚至下载的版本也无法使用。

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

.root
  -fx-font-family: serif

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

【讨论】:

【参考方案3】:

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

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于为啥 JavaFX 应用程序和场景生成器显示乱码?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 菜单项在右侧显示快捷方式

JavaFX的Scene Builder的奇怪屏幕大小

Ubuntu 中的 JavaFX 场景生成器路径

javafx 场景生成器 2.0 中的文件选择器在哪里?我找不到它

JavaFX Scene Builder 怎么用???

如何在javafx中制作透明的场景和舞台?