java swing 实现加载自定义的字体

 更新时间:2021年11月12日 09:34:04   作者:长河  
这篇文章主要介绍了java swing 实现加载自定义的字体,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java swing 加载自定义的字体

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

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

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

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

Java swing更改全局字体

这段代码在jframe显示前调用,比如main方法开始就调用:

public static void setUIFont()
{
 Font f = new Font("宋体",Font.PLAIN,18);
 String   names[]={ "Label", "CheckBox", "PopupMenu","MenuItem", "CheckBoxMenuItem",
   "JRadioButtonMenuItem","ComboBox", "Button", "Tree", "ScrollPane",
   "TabbedPane", "EditorPane", "TitledBorder", "Menu", "TextArea",
   "OptionPane", "MenuBar", "ToolBar", "ToggleButton", "ToolTip",
   "ProgressBar", "TableHeader", "Panel", "List", "ColorChooser",
   "PasswordField","TextField", "Table", "Label", "Viewport",
   "RadioButtonMenuItem","RadioButton", "DesktopPane", "InternalFrame"
 }; 
 for (String item : names) {
   UIManager.put(item+ ".font",f); 
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java版仿QQ验证码风格图片验证码

    Java版仿QQ验证码风格图片验证码

    这篇文章主要为大家分享了java图片验证码实例代码,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 使用Feign调用第三方http接口

    使用Feign调用第三方http接口

    这篇文章主要介绍了使用Feign调用第三方http接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot多数据源配置并通过注解实现动态切换数据源

    SpringBoot多数据源配置并通过注解实现动态切换数据源

    本文主要介绍了SpringBoot多数据源配置并通过注解实现动态切换数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 实例解析Java单例模式编程中对抽象工厂模式的运用

    实例解析Java单例模式编程中对抽象工厂模式的运用

    这篇文章主要介绍了实例解析Java单例模式编程中对抽象工厂模式的运用,抽象工厂模式可以看作是工厂方法模式的升级版,本需要的朋友可以参考下
    2016-02-02
  • Java Number类原理实例解析

    Java Number类原理实例解析

    这篇文章主要介绍了Java Number类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中的List接口实现类解析

    Java中的List接口实现类解析

    这篇文章主要介绍了Java中的List接口实现类解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 关于Java单个TCP(Socket)连接发送多个文件的问题

    关于Java单个TCP(Socket)连接发送多个文件的问题

    这篇文章主要介绍了关于Java单个TCP(Socket)连接发送多个文件的问题,每次我只能使用一个 Socket 发送一个文件,没有办法做到连续发送文件,本文来解决这个问题,需要的朋友可以参考下
    2023-04-04
  • 使用java8 API遍历过滤文件目录及子目录和隐藏文件示例详解

    使用java8 API遍历过滤文件目录及子目录和隐藏文件示例详解

    这篇文章主要介绍了使用java8API遍历过滤文件目录及子目录及隐藏文件示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • MyBatis Plus 入门使用详细教程

    MyBatis Plus 入门使用详细教程

    这篇文章主要介绍了MyBatis Plus 入门使用详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringCloud持久层框架MyBatis Plus的使用与原理解析

    SpringCloud持久层框架MyBatis Plus的使用与原理解析

    MyBatisPlus为MyBatis的增强版,专注于简化数据库操作,提供自动化CRUD、内置分页和乐观锁等功能,极大提升开发效率,在SpringCloud微服务架构中,MyBatisPlus通过插件机制和自动生成代码功能,有效支持企业级应用和分布式系统的开发
    2024-10-10

最新评论