Java Swing 自定义组件库分享(四)

按钮工具 --- ButtonUtils

一、这个类解决什么问题?

Swing 原生按钮 JButton 本身功能完整,但实际项目中经常需要:

  • 统一按钮的样式(背景色、字体、边框)
  • 鼠标悬停时改变光标和背景色
  • 按钮带图标
  • 快速创建特定场景的按钮(搜索按钮、重置按钮、操作列按钮等)

如果每次都用原生写法,代码会非常冗余。ButtonUtils 的作用就是:封装常用按钮的创建逻辑,一行代码搞定

二、类源码

java 复制代码
import cn.hutool.core.util.StrUtil;
import com.hyjk.met.base.module.constant.MetConstants;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.function.Consumer;

/**
 * 按钮工具类
 * 封装 Swing 按钮的常用创建方法
 *  * 使用示例:
 * 1. 创建默认样式按钮:
 *    JButton btn = ButtonUtils.createDefaultBtn("查询", () -> doSearch());
 * 2. 创建带图标的按钮:
 *    JButton btn = ButtonUtils.createActionBtn("导出", "icons/export.png", () -> export());
 * 3. 创建表格操作列按钮:
 *    JButton btn = ButtonUtils.createOperateColBtn("编辑", editIcon, "#409EFF", "#FFFFFF", () -> edit(rowData));
 */
public class ButtonUtils {
	  /** 默认的按钮颜色 */
    public static final String COLOR_BTN = "#34AE7F";
    /** 白色字体 */
    public static final String COLOR_WHITE = "#FFFFFF";
    /** 默认的字体名称 */
    public static final String FONT_NAME = "Microsoft YaHei";

    // ==================== 标签按钮(Label模拟) ====================

    /**
     * 创建标签按钮(用 JLabel 模拟按钮)
     * @param text 按钮文字
     * @param icon 图标路径
     * @param btnAction 点击事件
     * @return 标签按钮
     */
    public static JLabel createLabelBtn(String text, String icon, Runnable btnAction) {
        // 获取图片
        // ImageIcon imageIcon = ;
        JLabel btn = new JLabel(imageIcon);
        btn.setText(text);
        btn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (null != btnAction) {
                    btnAction.run();
                }
            }
        });
        return btn;
    }

    // ==================== 表单按钮 ====================

    /**
     * 创建表单按钮(固定高度50,绿色背景白色文字)
     * @param btnText 按钮文字
     * @param btnIcon 图标路径
     * @param btnAction 点击事件
     * @return 按钮
     */
    public static JButton createFormBtn(String btnText, String btnIcon, Runnable btnAction) {
        JButton button = createActionBtn(btnText, btnIcon, btnAction);
        button.setPreferredSize(new Dimension(button.getPreferredSize().width, 50));
        button.setBackground(Color.decode(COLOR_BTN));
        button.setForeground(Color.WHITE);
        button.setBorderPainted(false);
        button.setIconTextGap(15);
        return button;
    }

    // ==================== 文本按钮 ====================

    /**
     * 创建文本按钮(用 JLabel 模拟,默认主题色)
     * @param text 文字
     * @param mouseClicked 点击事件
     * @return 标签按钮
     */
    public static JLabel createTextBtn(String text, Runnable mouseClicked) {
        return createTextBtn(text, Color.decode(COLOR_BTN), mouseClicked);
    }

    /**
     * 创建文本按钮(可指定字体颜色)
     * @param text 文字
     * @param fontColor 字体颜色
     * @param mouseClicked 点击事件
     * @return 标签按钮
     */
    public static JLabel createTextBtn(String text, Color fontColor, Runnable mouseClicked) {
        JLabel textBtn = new JLabel(text);
        textBtn.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0));
        textBtn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        textBtn.setForeground(fontColor);
        textBtn.setFont(new Font(FONT_NAME, Font.BOLD, 16));
        textBtn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (null != mouseClicked) {
                    mouseClicked.run();
                }
            }
        });
        return textBtn;
    }

    // ==================== 通用按钮创建 ====================

    /**
     * 创建按钮(最灵活版本)
     * @param text 按钮文字
     * @param bgColorHex 背景色(十六进制)
     * @param fontColorHex 字体颜色
     * @param mouseClick 点击事件
     * @param mouseEntered 鼠标进入事件(可为null)
     * @param mouseExited 鼠标离开事件(可为null)
     * @return 按钮
     */
    public static JButton createActionBtn(String text, String bgColorHex, String fontColorHex, 
                                          Runnable mouseClick, Consumer<JComponent> mouseEntered, 
                                          Consumer<JComponent> mouseExited) {
        JButton button = new JButton(text);
        button.setMargin(new Insets(5, 10, 5, 10));
        button.setFont(new Font(FONT_NAME, Font.PLAIN, 16));
        button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        button.setBackground(StrUtil.isNotBlank(bgColorHex) ? Color.decode(bgColorHex) : Color.decode("#F2F3F5"));
        button.setForeground(StrUtil.isNotBlank(fontColorHex) ? Color.decode(fontColorHex) : Color.decode("#666666"));
        button.setBorderPainted(false);
        
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                if (null != mouseEntered) {
                    mouseEntered.accept(button);
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                if (null != mouseExited) {
                    mouseExited.accept(button);
                }
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                if (null != mouseClick) {
                    mouseClick.run();
                }
            }
        });
        return button;
    }

    /**
     * 创建按钮(带图标)
     * @param text 按钮文字
     * @param iconPath 图标路径
     * @param bgColorHex 背景色
     * @param fontColorHex 字体颜色
     * @param mouseClick 点击事件
     * @param mouseEntered 鼠标进入事件
     * @param mouseExited 鼠标离开事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, String iconPath, String bgColorHex, String fontColorHex,
                                          Runnable mouseClick, Consumer<JComponent> mouseEntered, 
                                          Consumer<JComponent> mouseExited) {
        JButton button = createActionBtn(text, bgColorHex, fontColorHex, mouseClick, mouseEntered, mouseExited);
        if (StrUtil.isNotBlank(iconPath)) {
            // 需自行实现,获取图片
            // button.setIcon();
        }
        return button;
    }

    /**
     * 创建按钮(带图标,无背景色/字体色设置)
     * @param text 按钮文字
     * @param iconPath 图标路径
     * @param mouseClick 点击事件
     * @param mouseEntered 鼠标进入事件
     * @param mouseExited 鼠标离开事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, String iconPath, Runnable mouseClick,
                                          Consumer<JComponent> mouseEntered, Consumer<JComponent> mouseExited) {
        return createActionBtn(text, iconPath, "", "", mouseClick, mouseEntered, mouseExited);
    }

    /**
     * 创建按钮(无图标,带悬停回调)
     * @param text 按钮文字
     * @param mouseClick 点击事件
     * @param mouseEntered 鼠标进入事件
     * @param mouseExited 鼠标离开事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, Runnable mouseClick,
                                          Consumer<JComponent> mouseEntered, Consumer<JComponent> mouseExited) {
        return createActionBtn(text, "", "", mouseClick, mouseEntered, mouseExited);
    }

    /**
     * 创建按钮(带图标和背景色,无悬停回调)
     * @param text 按钮文字
     * @param iconPath 图标路径
     * @param bgColorHex 背景色
     * @param fontColorHex 字体颜色
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, String iconPath, String bgColorHex, 
                                          String fontColorHex, Runnable mouseClick) {
        return createActionBtn(text, iconPath, bgColorHex, fontColorHex, mouseClick, null, null);
    }

    /**
     * 创建按钮(带背景色,无图标)
     * @param text 按钮文字
     * @param bgColorHex 背景色
     * @param fontColorHex 字体颜色
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, String bgColorHex, String fontColorHex, Runnable mouseClick) {
        return createActionBtn(text, "", bgColorHex, fontColorHex, mouseClick);
    }

    /**
     * 创建按钮(带图标,默认背景色)
     * @param text 按钮文字
     * @param iconPath 图标路径
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, String iconPath, Runnable mouseClick) {
        return createActionBtn(text, iconPath, "", "", mouseClick);
    }

    /**
     * 创建按钮(纯文字,默认背景色)
     * @param text 按钮文字
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createActionBtn(String text, Runnable mouseClick) {
        return createActionBtn(text, "", mouseClick);
    }

    // ==================== 操作列按钮 ====================

    /**
     * 创建表格操作列按钮(尺寸紧凑)
     * @param text 按钮文字
     * @param imageIcon 图标
     * @param bgColorHex 背景色
     * @param fontColorHex 字体颜色
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createOperateColBtn(String text, ImageIcon imageIcon, String bgColorHex, 
                                              String fontColorHex, Runnable mouseClick) {
        JButton button = createActionBtn(text, imageIcon, bgColorHex, fontColorHex, mouseClick);
        button.setMargin(new Insets(2, 8, 2, 8));
        button.setFont(new Font(FONT_NAME, Font.PLAIN, 15));
        Dimension dimension = button.getPreferredSize();
        button.setPreferredSize(dimension);
        button.setMinimumSize(dimension);
        button.setMaximumSize(dimension);
        return button;
    }

    // ==================== 快捷按钮 ====================

    /**
     * 创建默认样式按钮(主题色背景白色文字)
     * @param text 按钮文字
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createDefaultBtn(String text, Runnable mouseClick) {
        return createActionBtn(text, COLOR_BTN, COLOR_WHITE, mouseClick);
    }

    /**
     * 创建带图标的默认样式按钮
     * @param text 按钮文字
     * @param iconPath 图标路径
     * @param mouseClick 点击事件
     * @return 按钮
     */
    public static JButton createDefaultBtn(String text, String iconPath, Runnable mouseClick) {
        return createActionBtn(text, iconPath, COLOR_BTN, COLOR_WHITE, mouseClick);
    }

    /**
     * 添加查询面板搜索按钮
     * @param parent 父面板
     * @param mouseClick 点击事件
     */
    public static void createSearchBtn(JComponent parent, Runnable mouseClick) {
        createSearchBtn(parent, "查询", mouseClick);
    }

    /**
     * 添加查询面板搜索按钮(可自定义文字)
     * @param parent 父面板
     * @param text 按钮文字
     * @param mouseClick 点击事件
     */
    public static void createSearchBtn(JComponent parent, String text, Runnable mouseClick) {
        // 搜索图片存储位置,如 icons/table/search-white.png
    		 String iconPath = "";
        JButton button = createActionBtn(text, iconPath, "#34AE7F", "#FFFFFF", mouseClick);
        parent.add(button);
    }

    /**
     * 添加查询面板重置按钮
     * @param parent 父面板
     * @param mouseClick 点击事件
     */
    public static void createResetBtn(JComponent parent, Runnable mouseClick) {
        createResetBtn(parent, "重置", mouseClick);
    }

    /**
     * 添加查询面板重置按钮(可自定义文字)
     * @param parent 父面板
     * @param text 按钮文字
     * @param mouseClick 点击事件
     */
    public static void createResetBtn(JComponent parent, String text, Runnable mouseClick) {
    		 // 重置图片存储位置,如 icons/table/reset-gray.png
    		 String iconPath = "";
        JButton button = createActionBtn(text, iconPath, mouseClick);
        parent.add(button);
    }
}

三、核心方法说明

  • 标签按钮(Label模拟):createLabelBtn:用 JLabel 模拟按钮,适合图标+文字的简单点击场景

  • 表单按钮:createFormBtn:固定高度50,绿色背景白色文字,适合表单提交按钮

  • 文本按钮:createTextBtn:用 JLabel 模拟超链接样式,适合"忘记密码"等场景

  • 通用按钮:createActionBtn:最灵活的按钮创建方法,提供多个重载版本

  • 操作列按钮:createOperateColBtn:表格行内操作按钮,尺寸紧凑

  • 快捷按钮: createDefaultBtn:默认样式(主题色背景白色文字) createSearchBtn / createResetBtn:快捷创建查询/重置按钮并添加到父面板

四、使用示例

  • 4.1 创建默认样式按钮
java 复制代码
JButton searchBtn = ButtonUtils.createDefaultBtn("查询", () -> {
    System.out.println("执行查询");
});
panel.add(searchBtn);
  • 4.2 创建带图标按钮
java 复制代码
// 图片存储位置,如 icons/export.png
String iconPath = "";
JButton exportBtn = ButtonUtils.createActionBtn("导出", iconPath, () -> {
    System.out.println("执行导出");
});
panel.add(exportBtn);
  • 4.3 创建自定义颜色按钮
java 复制代码
JButton dangerBtn = ButtonUtils.createActionBtn("删除", "#F56C6C", "#FFFFFF", () -> {
    int result = JOptionPane.showConfirmDialog(null, "确认删除?", "提示", JOptionPane.YES_NO_OPTION);
    if (result == JOptionPane.YES_OPTION) {
        System.out.println("执行删除");
    }
});
panel.add(dangerBtn);
  • 4.4 创建文本按钮(超链接样式)
java 复制代码
JLabel linkLabel = ButtonUtils.createTextBtn("忘记密码?", () -> {
    System.out.println("跳转到找回密码");
});
panel.add(linkLabel);
  • 4.5 查询面板中使用
java 复制代码
JPanel queryPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

queryPanel.add(new JLabel("用户名:"));
queryPanel.add(new JTextField(10));

ButtonUtils.createSearchBtn(queryPanel, this::doSearch);
ButtonUtils.createResetBtn(queryPanel, this::doReset);
  • 4.6 表格操作列中使用
java 复制代码
// 获取图片ImageIcon
//ImageIcon editIcon = xxxx;
JButton editBtn = ButtonUtils.createOperateColBtn("编辑", editIcon, "#409EFF", "#FFFFFF", () -> {
    System.out.println("编辑行数据");
});

五、方法重载说明

createActionBtn 提供了多个重载版本:

参数情况 使用方法
只要文字+点击事件 createActionBtn(text, runnable)
文字+图标+点击事件 createActionBtn(text, iconPath, runnable)
文字+背景色+字体色+点击事件 createActionBtn(text, bgColor, fontColor, runnable)
文字+图标+背景色+字体色+点击事件 createActionBtn(text, iconPath, bgColor, fontColor, runnable)
需要自定义悬停效果 createActionBtn(text, runnable, mouseEntered, mouseExited)

六、注意事项

  • 代码中涉及图标的地方已注释或标注,需要自行实现图标加载
  • 使用了 COLOR_BTN、COLOR_WHITE、FONT_NAME,读者可在自己的常量类中定义

七、小结

ButtonUtils 封装了 Swing 按钮的常见创建场景,核心设计思路:

  • 统一样式:背景色、字体色、边框、光标
  • 简化调用:一行代码完成按钮创建
  • 灵活扩展:支持多种参数组合和自定义悬停效果
相关推荐
技术崽崽1 小时前
Java多线程神器——ThreadForge ,让多线程从此简单
后端
Leinwin1 小时前
OpenAI Daybreak实战指南:如何将AI安全检查嵌入你的开发流程
后端·python·flask
带刺的坐椅1 小时前
agentscope-harness vs solon-ai-harness:Java 智能体「马具引擎」的双雄对决
java·ai·llm·solon·agentscope·harness
Seven971 小时前
Paxos算法:如何解决分布式系统中的共识问题?
java
Ting-yu1 小时前
SpringCloud快速入门(1)---- 微服务介绍
后端·spring·spring cloud
d111111111d2 小时前
MQTT+STM32+云平台+AT命令的编写
服务器·笔记·stm32·单片机·嵌入式硬件·算法
九思十安2 小时前
HNU2026-计算机系统-笔记 6 整数
笔记
铁皮哥2 小时前
【力扣题解】LeetCode 25. K 个一组翻转链表
java·数据结构·windows·python·算法·leetcode·链表
小新同学^O^2 小时前
简单学习 --> 单例模式
java·学习·多线程