【问题标题】:JavaFX Font not being rendered correctlyJavaFX 字体未正确呈现
【发布时间】:2021-06-08 19:15:04
【问题描述】:

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 而不是预期的字体。所有系统 UI 字体访问都应通过适当的 API,例如 CTFontCreateUIFontForLanguage() 或 +[NSFont systemFontOfSize:]。

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

而不是 Hello 在按钮上获得以下文本

【问题讨论】:

  • 我没有答案,只是一个建议。默认情况下,JavaFX 使用映射到物理字体的逻辑字体,这些映射也依赖于默认的locale。我没有 MacOS,但您应该检查 Java 尝试加载的物理字体,然后检查该字体是否可以显示 Hello World!

标签: java javafx java-11 javafx-11


【解决方案1】:

问题是您没有正确安装或配置字体:“.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 字体here 以及组件的其他 CSS 配置的信息。 Using CSS files 是将组件样式与其逻辑分离的好方法,如果您以前创建过网页,它会感觉非常熟悉且非常容易上手。

【讨论】:

  • 有帮助,感谢贡献!
  • 它确实有效,但你必须为每个场景都这样做。有没有办法全局设置?
  • 经过一番研究:您可以通过调用 Application.setUserAgentStylesheet() 设置全局字体,但不幸的是您需要设置整个全局样式表,您无法将样式表添加到默认样式表。跨度>
【解决方案2】:

我通过将 Module SDK 切换回 11.0.8 解决了这个问题。你可以找到here on the Java SE 11 Archive Downloads page.

似乎这与 11.0.12 隔离。

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
【解决方案3】:

我能够通过调整 JDK 版本来解决这个问题,并且我也在使用 macOS 和 JDK 11。虽然我没有 JDK 8,但 JDK 14 工作正常,而 JDK 17 没有。如果您将项目结构更改为与 JavaFx 更兼容的 JDK 版本,它将正常工作。

【讨论】:

    【解决方案4】:

    如何在“fxml”中纠正同样的问题。

    <font>
        <Font name="Times New Roman bold" size="20"/>
        </font>
    

    换句话说,在 中将替换什么以进行相同的更正。 谢谢 这有点新

    【讨论】:

    • 这是问题还是答案?
    • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
    • 我猜你的答案是一个问题,而你的问题的答案是:FXML Label text bold
    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起更多的关注这个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2017-11-04
    • 2018-12-19
    • 2015-03-14
    相关资源
    最近更新 更多