为什么 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);
}
}
文本唯一看起来不错的地方是在控制台中。
我还没有找到解决方案,但我发现了一个有趣的模式:
在您的 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
这是我的场景构建器的样子:
这是 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);
}
}
文本唯一看起来不错的地方是在控制台中。
我还没有找到解决方案,但我发现了一个有趣的模式:
在您的 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