java swing 加载自定义的字体

02/02 08:37
阅读数 70

在实际开发中, 我们需要把字体的名字和字体做一一对应的映射关系, 然后需要通过可配置的方式加载自定义的字体. 所以就有了这个需求, 我们来实现.

首先我们定义一个自定义加载子类的工具类:

import java.awt.Font;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 字体工具类, 获取需要的字体
 */
public class FontUtil {


    /**
     * 所有字体配置
     */
    private static Map<String, String> fontNameMap = new HashMap<String, String>();

    /**
     * 默认字体的大小
     */
    private static final float defaultFontSize = 20f;

    static {
        //加载配置文件
        Properties properties = new Properties();
        // 使用properties对象加载输入流, 编码使用GBK
        try {
            properties.load(new InputStreamReader(FontUtil.class.getClassLoader().getResourceAsStream("font.properties"), "GBK"));
        } catch (IOException e) {
            System.err.println("font.properties 配置文件不存在");
        }
        //获取key对应的value值
        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            Object key = entry.getKey();
            Object value = entry.getValue();
            if (key != null && value != null) {
                fontNameMap.put(String.valueOf(key), String.valueOf(value));
            }
        }
    }


    /**
     * 获取定义的字体
     *
     * @param key 字体的名字
     * @return
     */
    public static Font getConfigFont(String key) {
        return getConfigFont(key, defaultFontSize);
    }


    /**
     * 获取自定义的字体
     *
     * @param key      字体的名字
     * @param fontSize 字体的大小
     * @return
     */
    public static Font getConfigFont(String key, float fontSize) {
        String fontUrl = fontNameMap.get(key);
        if (fontUrl == null) {
            throw new RuntimeException("名字是:" + key + "的字体配置不存在");
        }
        //默认先看是不是系统字体
        Font font = new Font(fontUrl, Font.PLAIN, (int) fontSize);
        //判断当前字体存不存在
        if ("Dialog.plain".equals(font.getFontName())) {
            try (
                    InputStream is = new FileInputStream(new File(fontUrl));
            ) {
                Font definedFont = Font.createFont(Font.TRUETYPE_FONT, is);
                //设置字体大小,float型
                definedFont = definedFont.deriveFont(fontSize);
                return definedFont;
            } catch (Exception e) {
                throw new RuntimeException("名字是:" + key + "的字体不存在");
            }
        }
        return font;
    }


}

第二部再就是写测试代码:

import java.awt.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        
        Font a = FontUtil.getConfigFont("A");
        System.out.println(a.getName() + "~" + a.getSize());

        Font b = FontUtil.getConfigFont("B", 100);
        System.out.println(b.getName() + "~" + b.getSize());

        Font c = FontUtil.getConfigFont("C");
        System.out.println(c.getFontName());

        Font d = FontUtil.getConfigFont("D");

    }


}

运行, 第四个字体不存在, 抛出异常 , 其他的都正常处理了, A, B都加载了自己配置的字体.

环境配置, 在resources里面新建一个字体配置文件: font.properties 内容如下:

#字体的配置文件,等号前是字体名字,等号后是字体的路径
A=D:/logs/苹方黑体-准-简.ttf
B=D:/logs/苹方黑体-中粗-简.ttf
C=宋体
D=宋体22222

本来是帮别人写的代码, 最后不要了, 就直接开源出来了. 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部