欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-25 21:16:18
目录java swing 加载自定义的字体java swing更改全局字体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); 
 }
}

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