按钮工具 --- 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 按钮的常见创建场景,核心设计思路:
- 统一样式:背景色、字体色、边框、光标
- 简化调用:一行代码完成按钮创建
- 灵活扩展:支持多种参数组合和自定义悬停效果