java - 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
解决方案
问题是您没有正确安装或配置字体:“.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 文件是将组件样式与其逻辑分开的好方法,如果您以前创建过网页,它会感觉非常熟悉并且非常容易上手。
推荐阅读
- elixir - 使用主管为每个节点启动 elixir 子进程
- c++ - arm-none-eabi-g++:没有这样的文件或目录
- javascript - fs.readdir 没有读取作为参数传递的路径
- elasticsearch - 弹性搜索 - 有没有办法在可能符合“must_not”标准的结果中强制文档?
- arrays - 有没有办法可以将 a[indexOfMin] = a[startIndex] 转换为 ArrayList 形式?我似乎不能正确地这样做
- node.js - User.find 不是函数猫鼬
- angular - 如何从 Ionic 3 在 Modal 上 popToRoot
- android - Android导航如何在第二级片段上添加导航向上按钮
- php - 更新 wp 数据库中的记录
- graphql - 获取 NestJS/GraphQL 请求中的请求键列表