JavaFx 使用自定义字体

Hello,大家好,我是78KgMiao

场景分析

在软件开发过程中,有时系统字体并不能满足我们的需求,需要去使用自定义字体来吸引用户。这篇文章展示如何加载外部字体,以及在使用时需要注意哪些问题。

代码案例

import com.sun.javafx.tk.Toolkit;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class CustomFont extends Application {

	@Override
	public void start(Stage stage) throws Exception {
		VBox root = new VBox(10.0);
		root.setPadding(new Insets(10.0));

		Scene scene = new Scene(root, 230, 400);
		stage.setTitle("CustomFont");
		stage.setScene(scene);
		stage.show();

		// 1 临时文件目录
		System.out.println("java IO 临时目录:" + System.getProperty("java.io.tmpdir"));

		new Thread(() -> {
			double size = Toolkit.getToolkit().getFontLoader().getSystemFontSize();
			// 2 通过下载链接加载自定义字体
			Font font = Font.loadFont("https://miaoqx-1259708147.cos.ap-beijing.myqcloud.com/xqnt.ttf", size);

			// 3 直接加载自定义字体文件
//			try (FileInputStream in = new FileInputStream(new File("E://resources//xqnt.ttf"))) {
//				font = Font.loadFont(in, size);
//			} catch (Exception e) {
//				e.printStackTrace();
//			}

			for (int i = 0; i < 10; i++) {
				size = 14 + i;
				// 4 重新加载来切换字号
//				font = Font.loadFont("https://miaoqx-1259708147.cos.ap-beijing.myqcloud.com/xqnt.ttf", size);

				// 5 通过之前加载的字体来切换字号
				font = Font.font(font.getFamily(), size);

				Label label = new Label("你好,78KgMiao_" + i);
				label.setFont(font);

				Platform.runLater(() -> root.getChildren().add(label));
			}
		}).start();
	}

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

代码分析

  • 注释 1:打印java程序运行时存放临时文件的目录。
  • 注释 2:通过下载链接的方式加载自定义字体。
  • 注释 3:通过读取本地字体文件的方式加载字体。
  • 注释 4:通过重新加载字体的方式来切换字号。会生成**图2**所示的临时文件。造成磁盘空间浪费
  • 注释 5:通过之前加载的字体名称来切换字号。会生成**图1**所示的临时文件。节省磁盘空间,以及提高字体加载时间

总结:建议在实际开发中将加载自定义字体的功能单独封装,避免重复加载字体,造成临时目录磁盘空间浪费,严重时会导致系统崩溃

通过之前加载的字体来切换字号

图1

重新加载来切换字号

图2

版权声明:本文为weixin_44105483原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。