首页 > 解决方案 > JavaFX 字体未正确呈现

问题描述


public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");

        Button btn = new Button();
        btn.setText("Hello");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

在控制台上获取以下第一行:

35026:1978749] CoreText 注意:客户端请求的名称“.SFNS-Regular”,它将获得 Times-Roman 而不是预期的字体。所有系统 UI 字体访问都应通过适当的 API,例如 CTFontCreateUIFontForLanguage() 或 +[NSFont systemFontOfSize:]。2021-06-09 00:00:46.808 java[35026:1978749] CoreText 注意:在 CTFontLogSystemFontNameRequest 上设置断点以进行调试。2021-06-09 00:00:46.815 java[35026:1978749] CoreText 注意:客户端请求的名称“.SFNS-Regular”,它将获得 Times-Roman 而不是预期的字体。所有系统 UI 字体访问都应通过适当的 API,例如 CTFontCreateUIFontForLanguage() 或 +[NSFont systemFontOfSize:]。2021-06-09 00:00:46.982 java[35026:1978817] CoreText 注意:客户端请求的名称“.SFNS-Regular”,它将获得 Times-Roman 而不是预期的字体。

操作系统:macOS javafx-sdk-11.0.2 jdk 11

而不是 Hello 在按钮上获得以下文本 在此处输入图像描述

标签: javajavafxjava-11javafx-11

解决方案


问题是您没有正确安装或配置字体:“.SFNS-Regular”,以便 JavaFx 可以知道它在哪里。我实际上不确定是否是因为没有正确安装/配置字体但是....

我必须做的是添加:

* {
   -fx-font-family: 'serif'
}

在我的根 CSS 文件中。如果您不使用 CSS 文件或使用内联样式,那么您仍然可以设置全局字体:

而不是这个:

primaryStage.setScene(new Scene(root, 300, 250));

你可以这样做:

Scene scene = new Scene(root, 300, 250);
scene.getRoot().setStyle("-fx-font-family: 'serif'");
primaryStage.setScene(scene);

您可以在此处阅读有关 JavaFX 字体以及组件的其他 CSS 配置的更多信息。使用 CSS 文件是将组件样式与其逻辑分开的好方法,如果您以前创建过网页,它会感觉非常熟悉并且非常容易上手。


推荐阅读