Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX找不到所有系统字体_Java_Javafx_Fonts - Fatal编程技术网

JavaFX找不到所有系统字体

JavaFX找不到所有系统字体,java,javafx,fonts,Java,Javafx,Fonts,我注意到,我使用的JavaFX组件与Swing组件不同,没有正确呈现某些系统字体。下面是一个完整的例子来说明这个问题 public class JavaFXApplication1 extends Application { @Override public void start(Stage primaryStage) { // Swing button SwingNode node = new SwingNode(); Swin

我注意到,我使用的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上运行它。

我发现了另一件事:我创建了以下代码

String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailab‌​leFontFamilyNames(); for(String font: fonts) { System.out.printf("This is font %s %n", font);
这返回例如:这是一种奇怪的字体(这是我下载并安装的字体),所以它是可用的。但当我把它写进这段代码时:

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


文本根本没有改变。也许这是你/我们问题的原因

我对此有点不确定,因为我无法在windows上复制您的问题,但这可能是特定于操作系统的,因为windows 7可能已经为java fx加载了Comic sans字体,但是您可以尝试font.getFontNames()看看有哪些字体可用,也许可以像awt@Dean219一样在循环中加载它们-谢谢,我忘了提到我在Windows10上运行过它。如果它能在Windows 7上运行,那么可能是操作系统特有的错误。它对我有效,对其他人可能无效,但我猜,由于你可以加载特定的系统字体,它可能只加载一些可用的字体,而不是每个可能存在问题的字体,也许如果windows 10有更多不同的字体,那么comic sans不是它加载的默认字体,因此它可能是windows 10上的一个可重新创建的问题,但是您应该尝试使用字体类打印可用的字体,查看它是否在列表中,并查看列表中是否有其他字体可以工作,而不专门调用它们。Ymm,既然这不是我问题的答案,我想你应该把它作为评论发布,或者保持原样,因为我们的问题已经被链接了。啊,好吧,你可以链接它,我不知道。很抱歉,我把它作为答案贴了出来。仍然习惯于堆栈溢出。