解决方法
我从Javafx How to display custom font in webview更新了示例?演示在使用 CSS 设置样式的 JavaFX 控件中使用自定义 true-type 字体。
要点是:
- 将字体放置在与应用程序类相同的位置,并确保构建系统将其放置在二进制构建包(例如应用程序 jar 文件)中。
- 在应用使用它的样式之前,在 JavaFX 代码中加载代码字体。
Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
- 要在样式类中使用自定义字体,请使用
-fx-font-family
css 属性并仅引用字体的名称(例如在本例中"TRON"
)。
- 创建并加载定义样式类的样式表。
- 将样式类应用于您的控件。
附加信息
如果您使用的是 Java 8,您可能会对Use web(Google) fonts in JavaFX感兴趣。
字体集合
如果您的字体文件是.ttc
格式,在单个文件中包含多个字体,则使用Font.loadFonts
API(而不是Font.loadFont
)。请注意,这Font.loadFonts
仅在 JDK 9 之后可用,在早期版本中不可用。
使用自定义字体的示例输出
示例代码
该示例依赖于您可以从 dafont 下载的 TRON.TTF字体。
CustomFontApp.java
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.*;
import javafx.stage.Stage;
// demonstrates the use of a custom font.
public class CustomFontApp extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
stage.setTitle("TRON Synopsis");
// load the tron font.
Font.loadFont(
CustomFontApp.class.getResource("TRON.TTF").toExternalForm(),
10
);
Label title = new Label("TRON");
title.getStyleClass().add("title");
Label caption = new Label("A sci-fi flick set in an alternate reality.");
caption.getStyleClass().add("caption");
caption.setMaxWidth(220);
caption.setWrapText(true);
caption.setTextAlignment(TextAlignment.CENTER);
VBox layout = new VBox(10);
layout.setStyle("-fx-padding: 20px; -fx-background-color: silver");
layout.setAlignment(Pos.CENTER);
layout.getChildren().setAll(
title,
new ImageView(
new Image(
"http://ia.media-imdb.com/images/M/MV5BMTY5NjM2MjAwOV5BMl5BanBnXkFtZTYwMTgyMzA5.V1.SY317.jpg"
)
),
caption
);
// layout the scene.
final Scene scene = new Scene(layout);
scene.getStylesheets().add(getClass().getResource("custom-font-styles.css").toExternalForm());
stage.setScene(scene);
stage.show();
}
}
自定义字体样式.css
/** file: custom-font-styles.css
* Place in same directory as CustomFontApp.java
*/
.title {
-fx-font-family: "TRON";
-fx-font-size: 20;
}
.caption {
-fx-font-family: "TRON";
-fx-font-size: 10;
}
关于 FXML 的使用
Font.loadFont(url, size)是一个采用两个参数的静态方法。我认为您不能从 FXML 调用 font.loadFont 并且如果可以的话也不会建议您这样做。相反,在加载需要字体的 FXML 或样式表之前,在 Java 代码中加载字体(正如我在回答中所做的那样)。