java swing 集成fontawesome字体

如上图所示,左侧工具栏和右侧的文件图标,都是用的fontawesome图标字体,属于Unicode码。好处就是可以自定义字体大小、颜色等,也可以根据手表点击、滑动等实现不同的事件效果。

一、下载fontawesome字体

去fontawesome官网,下载字体样式,项目中只需要用到途中文件。

二、加载字体

fontswesome提供了丰富的图标库,我们可以直接拿来使用,只不过需要进行一步转化。

如下图,打开fontawesome官方图标页面,按F12,选中咖啡图标,在元素页签选中::before,右侧显示字体的content为 \f0f4,代码中需要将其转化为Unicode码,也就是在斜杠后f前加个u变为 \uf0f4

字体样式工具代码代码:

package com.zhufeng.demo01;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName: FontAwesomeUtil
 * @Description 获取fontawesome字体样式
 * @author 月夜烛峰
 * @date 2022/7/7 13:47
 */
public class FontAwesomeUtil {

    /**字体文件*/
    public final static String ICON_FONT_AWESOME="/font/fontawesome-webfont.ttf";

    /********文件展示面板**********/
    /**咖啡*/
    public final static char FONT_ICON_COFFEE = '\uf0f4';
    /**消息*/
    public final static char FONT_ICON_BELL = '\uf0f3';
    /**设置*/
    public final static char FONT_ICON_SETTING = '\uf013';
    /**圆形*/
    public final static char FONT_ICON_CIRCLE = '\uf111';

    /**
     * 返回fontawesome字体样式
     * @return
     */
    public static Font getFontAwesome(int fontSize) {
        try {
            InputStream in = FontAwesomeUtil.class.getResourceAsStream(ICON_FONT_AWESOME);
            Font ttfBase = Font.createFont(Font.TRUETYPE_FONT, in);
            Font ttfReal = ttfBase.deriveFont(Font.PLAIN, fontSize);
            return ttfReal;
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 创建FontAwesome文本样式
     * @param x
     * @param y
     * @param g
     * @param c
     */
    public static void fontAwesomeText(int x, int y, Graphics g, char c) {

        g.setFont(getFontAwesome(16));
        g.drawString(String.valueOf(c), x, y);
    }

    /**
     * 创建FontAwesome按钮样式
     * @param name
     * @param c
     * @return
     */
    public static JButton createFontAwesomeBtn(String name, char c) {
        JButton fontBtn = new JButton();
        fontBtn.setFont(getFontAwesome(20));
        fontBtn.setText(String.valueOf(c));
        //设置字体颜色
        fontBtn.setForeground(Color.BLUE);
        fontBtn.setName(name);
        fontBtn.setVerticalTextPosition(0);
        fontBtn.setHorizontalTextPosition(0);
        //隐藏按钮边框
        fontBtn.setBorderPainted(false);
        return fontBtn;
    }

    /**
     * 获取字体图标
     * @param c
     * @param iconLabel
     * @return
     */
    public static String getLabelFontIcon(char c, JLabel iconLabel) {
        iconLabel.setFont(getFontAwesome(16));
        //居中
        iconLabel.setVerticalTextPosition(JLabel.BOTTOM);
        iconLabel.setHorizontalTextPosition(JLabel.CENTER);
        return String.valueOf(c);
    }
}

三、效果演示

创建样式panel,在panel中通过paintComponent画出一个圆形图标,创建一个蓝色的铃铛按钮,在创建一个字号稍大的咖啡图标。

使用时,就像是指定不同类型的字体font一样,非常方便。

package com.zhufeng.demo01;

import javax.swing.*;
import java.awt.*;

/**
 * @ClassName: IconFontPanel
 * @Description TODO
 * @author 月夜烛峰
 * @date 2022/7/13 09:28
 */
public class IconFontPanel extends JPanel {

    public IconFontPanel(){
        setLayout(null);
        JLabel iconLabel = new JLabel();
        String iconText = FontAwesomeUtil.getLabelFontIcon(FontAwesomeUtil.FONT_ICON_COFFEE,iconLabel);
        iconLabel.setText(iconText);
        iconLabel.setForeground(new Color(227, 115, 35));
        iconLabel.setFont(FontAwesomeUtil.getFontAwesome(32));
        iconLabel.setBounds(160,30,100,80);
        add(iconLabel);

        //图标按钮
        JButton fontBtn = FontAwesomeUtil.createFontAwesomeBtn("bell",FontAwesomeUtil.FONT_ICON_BELL);
        fontBtn.setBounds(50,100,80,40);
        add(fontBtn);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //画出一个圆形字体
        FontAwesomeUtil.fontAwesomeText(260,130,g,FontAwesomeUtil.FONT_ICON_CIRCLE);
    }
}

运行窗口

package com.zhufeng.demo01;

import javax.swing.*;
import java.awt.*;

/**
 * @ClassName: FontIconDemo
 * @Description TODO
 * @author 月夜烛峰
 * @date 2022/7/13 09:22
 */
public class FontIconDemoFrame {

    public static void createAndShowGUI(String title) {
        //窗口名称
        JFrame frame = new JFrame("月夜烛峰-" + title);
        //窗口带有关闭按钮
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //指定窗口大小
        frame.setSize(new Dimension(400, 300));
        //窗口居中展示
        frame.setLocationRelativeTo(null);
        //窗口设置为可见
        frame.setVisible(true);

        frame.add(new IconFontPanel());
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI("图标演示");
            }
        });
    }
}


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