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));
}
}
}
public static Font getConfigFont(String key) {
return getConfigFont(key, defaultFontSize);
}
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);
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。