我注意到我使用的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);
现在一切都正常呈现,但这个解决方案不是跨平台的,我真的希望它能像开箱即用一样开箱即用。我错过了什么吗?如果没有,那么为什么只有一部分系统字体被加载到JavaFX环境中?
我在Windows 10上运行它。
答案 0 :(得分:0)
我想出了另一件事:我创建了以下代码
String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); for(String font: fonts) { System.out.printf("This is font %s %n", 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">
文字根本没有变化。也许这会导致您/我们的问题。