【问题标题】:JavaFX not finding all system fontsJavaFX 未找到所有系统字体
【发布时间】:2016-08-10 13:23:11
【问题描述】:

我注意到我使用的 JavaFX 组件与 Swing 对应的组件不同,它不能正确呈现某些系统字体。这是提出问题的完整示例。

public class JavaFXApplication1 extends Application {

    @Override
    public void start(Stage primaryStage) {
        // Swing button
        SwingNode node = new SwingNode();
        SwingUtilities.invokeLater(() -> {
            JButton swingButton = new JButton("Comic Sans MS");
            swingButton.setFont(new java.awt.Font("Comic Sans MS", java.awt.Font.PLAIN, 20));
            node.setContent(swingButton);
        });

        // JavaFX button
        Button fxButton = new Button("Comic Sans MS");
        fxButton.setFont(Font.font("Comic Sans MS", 20));

        HBox hbox = new HBox();
        hbox.getChildren().addAll(node, fxButton);

        Scene scene = new Scene(hbox, 300, 250);
        primaryStage.setTitle("Font test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

如果您的系统中有 Comic Sans MS 字体,您应该会看到以下结果。只有 Swing 组件看起来不错:

显然 FX 图形系统不会在启动时加载所有系统字体。最明显的解决方案是手动加载缺失的,如下所示:

Font.loadFont(new FileInputStream(System.getenv("WINDIR")+"\\fonts\\"+"comic.ttf"), 20);

现在一切都可以正常渲染了,但是这个解决方案不是跨平台的,我真的希望它可以像在 Swing 中一样开箱即用。我错过了什么吗?如果不是,那么为什么只有一部分系统字体被加载到 JavaFX 环境中?

我在 Windows 10 上运行它。

【问题讨论】:

  • 我对此有点不确定,因为我无法在 Windows 上复制您的问题,但它可能是特定于操作系统的,因为 Windows 7 可能已经具有可用于加载 java-fx 的 Comic-sans 字体但是您可以尝试 Font.getFontNames() 并查看可用的字体,并可能以与 awt java2s.com/Tutorial/Java/0261__2D-Graphics/… 类似的方式将它们加载到循环中
  • @Dean219 - 谢谢,我忘了说我在 Windows 10 上运行它。如果它在 Windows 7 上运行,那么它可能是特定于操作系统的错误。
  • 它对我有用,对其他人可能无效,但我猜想,由于您可以加载特定的系统字体,它可能只加载一些可用的字体,而不是可能是问题的每一个字体,也许如果 Windows 10 有更多不同的字体,那么 Comic sans 不是它加载的默认字体,因此它可能是 Windows 10 上的一个可重新创建的问题,但您应该尝试使用 Font 类打印可用的字体并查看它是否在列表中并查看如果列表中还有其他人在没有特别调用的情况下工作。

标签: java javafx fonts


【解决方案1】:

我想出了另一件事:我创建了以下代码

String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailab‌​leFontFamilyNames(); for(String font: fonts) { System.out.printf("This is font %s %n", font);

这会返回例如:This is font Something Strange(它是我下载并安装的字体),因此它可用。但是当我把它放到这段代码中时:

<GridPane fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"
      style="-fx-font-family: Something Strange">

文本根本没有改变。也许这有助于您/我们的问题。

【讨论】:

  • Ymm,因为这不是我问题的答案,我认为您应该将其作为评论发布,或者保持原样,因为我们的问题已经链接。
  • 啊,你可以链接它不知道。抱歉,我将其发布为答案。还在习惯 stackoverflow。
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 2014-05-06
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多