Java Swing 自定义组件库分享(四):按钮工具 — ButtonUtils
- 一、这个类解决什么问题?
- 二、类源码
- 三、核心方法说明
- 四、使用示例
- 五、方法重载说明
- 六、注意事项
- 七、小结
一、这个类解决什么问题?
Swing 原生按钮JButton本身功能完整,但实际项目中经常需要:
- 统一按钮的样式(背景色、字体、边框)
- 鼠标悬停时改变光标和背景色
- 按钮带图标
- 快速创建特定场景的按钮(搜索按钮、重置按钮、操作列按钮等)
如果每次都用原生写法,代码会非常冗余。ButtonUtils的作用就是:封装常用按钮的创建逻辑,一行代码搞定。
二、类源码
importcn.hutool.core.util.StrUtil;importjavax.swing.*;importjava.awt.*;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.util.function.Consumer;/** * 按钮工具类 * 封装 Swing 按钮的常用创建方法 * * 使用示例: * 1. 创建默认样式按钮: * JButton btn = ButtonUtils.createDefaultBtn("查询", () -> doSearch()); * 2. 创建带图标的按钮: * JButton btn = ButtonUtils.createActionBtn("导出", exportIcon, () -> export()); * 3. 创建表格操作列按钮: * JButton btn = ButtonUtils.createOperateColBtn("编辑", editIcon, "#409EFF", "#FFFFFF", () -> edit(rowData)); */publicclassButtonUtils{/** 默认的按钮颜色 */publicstaticfinalStringCOLOR_BTN="#34AE7F";/** 白色字体 */publicstaticfinalStringCOLOR_WHITE="#FFFFFF";/** 默认的字体名称 */publicstaticfinalStringFONT_NAME="Microsoft YaHei";// ==================== 标签按钮(Label模拟) ====================/** * 创建标签按钮(用 JLabel 模拟按钮) * @param text 按钮文字 * @param icon 图标 * @param btnAction 点击事件 * @return 标签按钮 */publicstaticJLabelcreateLabelBtn(Stringtext,Iconicon,RunnablebtnAction){JLabelbtn=newJLabel(text,icon,SwingConstants.LEADING);btn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));btn.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvente){if(null!=btnAction){btnAction.run();}}});returnbtn;}// ==================== 表单按钮 ====================/** * 创建表单按钮(固定高度50,绿色背景白色文字) * @param btnText 按钮文字 * @param btnIcon 图标 * @param btnAction 点击事件 * @return 按钮 */publicstaticJButtoncreateFormBtn(StringbtnText,IconbtnIcon,RunnablebtnAction){JButtonbutton=createActionBtn(btnText,btnIcon,btnAction);button.setPreferredSize(newDimension(button.getPreferredSize().width,50));button.setBackground(Color.decode(COLOR_BTN));button.setForeground(Color.WHITE);button.setBorderPainted(false);button.setIconTextGap(15);returnbutton;}// ==================== 文本按钮 ====================/** * 创建文本按钮(用 JLabel 模拟,默认主题色) * @param text 文字 * @param mouseClicked 点击事件 * @return 标签按钮 */publicstaticJLabelcreateTextBtn(Stringtext,RunnablemouseClicked){returncreateTextBtn(text,Color.decode(COLOR_BTN),mouseClicked);}/** * 创建文本按钮(可指定字体颜色) * @param text 文字 * @param fontColor 字体颜色 * @param mouseClicked 点击事件 * @return 标签按钮 */publicstaticJLabelcreateTextBtn(Stringtext,ColorfontColor,RunnablemouseClicked){JLabeltextBtn=newJLabel(text);textBtn.setBorder(BorderFactory.createEmptyBorder(3,0,3,0));textBtn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));textBtn.setForeground(fontColor);textBtn.setFont(newFont(FONT_NAME,Font.BOLD,16));textBtn.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvente){if(null!=mouseClicked){mouseClicked.run();}}});returntextBtn;}// ==================== 通用按钮创建 ====================/** * 创建按钮(最灵活版本,支持图标 + 悬停回调) * @param text 按钮文字 * @param icon 图标 * @param bgColorHex 背景色(十六进制) * @param fontColorHex 字体颜色 * @param mouseClick 点击事件 * @param mouseEntered 鼠标进入事件(可为null) * @param mouseExited 鼠标离开事件(可为null) * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,Iconicon,StringbgColorHex,StringfontColorHex,RunnablemouseClick,Consumer<JComponent>mouseEntered,Consumer<JComponent>mouseExited){JButtonbutton=newJButton(text);button.setMargin(newInsets(5,10,5,10));button.setFont(newFont(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);if(icon!=null){button.setIcon(icon);}button.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseEntered(MouseEvente){if(null!=mouseEntered){mouseEntered.accept(button);}}@OverridepublicvoidmouseExited(MouseEvente){if(null!=mouseExited){mouseExited.accept(button);}}@OverridepublicvoidmouseClicked(MouseEvente){if(null!=mouseClick){mouseClick.run();}}});returnbutton;}/** * 创建按钮(带图标) * @param text 按钮文字 * @param iconPath 图标路径 * @param bgColorHex 背景色 * @param fontColorHex 字体颜色 * @param mouseClick 点击事件 * @param mouseEntered 鼠标进入事件 * @param mouseExited 鼠标离开事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,StringiconPath,StringbgColorHex,StringfontColorHex,RunnablemouseClick,Consumer<JComponent>mouseEntered,Consumer<JComponent>mouseExited){JButtonbutton=createActionBtn(text,bgColorHex,fontColorHex,mouseClick,mouseEntered,mouseExited);if(StrUtil.isNotBlank(iconPath)){// 需自行实现,获取图片// button.setIcon();}returnbutton;}/** * 创建按钮(带图标,无背景色/字体色设置) * @param text 按钮文字 * @param iconPath 图标路径 * @param mouseClick 点击事件 * @param mouseEntered 鼠标进入事件 * @param mouseExited 鼠标离开事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,StringiconPath,RunnablemouseClick,Consumer<JComponent>mouseEntered,Consumer<JComponent>mouseExited){returncreateActionBtn(text,iconPath,"","",mouseClick,mouseEntered,mouseExited);}/** * 创建按钮(无图标,带悬停回调) * @param text 按钮文字 * @param mouseClick 点击事件 * @param mouseEntered 鼠标进入事件 * @param mouseExited 鼠标离开事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,RunnablemouseClick,Consumer<JComponent>mouseEntered,Consumer<JComponent>mouseExited){returncreateActionBtn(text,"","",mouseClick,mouseEntered,mouseExited);}/** * 创建按钮(带图标和背景色,无悬停回调) * @param text 按钮文字 * @param iconPath 图标路径 * @param bgColorHex 背景色 * @param fontColorHex 字体颜色 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,StringiconPath,StringbgColorHex,StringfontColorHex,RunnablemouseClick){returncreateActionBtn(text,iconPath,bgColorHex,fontColorHex,mouseClick,null,null);}/** * 创建按钮(带背景色,无图标) * @param text 按钮文字 * @param bgColorHex 背景色 * @param fontColorHex 字体颜色 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,StringbgColorHex,StringfontColorHex,RunnablemouseClick){returncreateActionBtn(text,"",bgColorHex,fontColorHex,mouseClick);}/** * 创建按钮(带图标,默认背景色) * @param text 按钮文字 * @param iconPath 图标路径 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,StringiconPath,RunnablemouseClick){returncreateActionBtn(text,iconPath,"","",mouseClick);}/** * 创建按钮(纯文字,默认背景色) * @param text 按钮文字 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,RunnablemouseClick){returncreateActionBtn(text,"",mouseClick);}// ==================== 操作列按钮 ====================/** * 创建表格操作列按钮(尺寸紧凑) * @param text 按钮文字 * @param icon 图标 * @param bgColorHex 背景色 * @param fontColorHex 字体颜色 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateOperateColBtn(Stringtext,Iconicon,StringbgColorHex,StringfontColorHex,RunnablemouseClick){JButtonbutton=createActionBtn(text,icon,bgColorHex,fontColorHex,mouseClick);button.setMargin(newInsets(2,8,2,8));button.setFont(newFont(FONT_NAME,Font.PLAIN,15));Dimensiondimension=button.getPreferredSize();button.setPreferredSize(dimension);button.setMinimumSize(dimension);button.setMaximumSize(dimension);returnbutton;}// ==================== 快捷按钮 ====================/** * 创建默认样式按钮(主题色背景白色文字) * @param text 按钮文字 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateDefaultBtn(Stringtext,RunnablemouseClick){returncreateActionBtn(text,COLOR_BTN,COLOR_WHITE,mouseClick);}/** * 创建带图标的默认样式按钮 * @param text 按钮文字 * @param icon 图标 * @param mouseClick 点击事件 * @return 按钮 */publicstaticJButtoncreateDefaultBtn(Stringtext,Iconicon,RunnablemouseClick){returncreateActionBtn(text,icon,COLOR_BTN,COLOR_WHITE,mouseClick);}/** * 添加查询面板搜索按钮 * @param parent 父面板 * @param mouseClick 点击事件 */publicstaticvoidcreateSearchBtn(JComponentparent,RunnablemouseClick){createSearchBtn(parent,"查询",mouseClick);}/** * 添加查询面板搜索按钮(可自定义文字) * @param parent 父面板 * @param text 按钮文字 * @param mouseClick 点击事件 */publicstaticvoidcreateSearchBtn(JComponentparent,Stringtext,RunnablemouseClick){JButtonbutton=createActionBtn(text,COLOR_BTN,COLOR_WHITE,mouseClick);parent.add(button);}/** * 添加查询面板重置按钮 * @param parent 父面板 * @param mouseClick 点击事件 */publicstaticvoidcreateResetBtn(JComponentparent,RunnablemouseClick){createResetBtn(parent,"重置",mouseClick);}/** * 添加查询面板重置按钮(可自定义文字) * @param parent 父面板 * @param text 按钮文字 * @param mouseClick 点击事件 */publicstaticvoidcreateResetBtn(JComponentparent,Stringtext,RunnablemouseClick){JButtonbutton=createActionBtn(text,mouseClick);parent.add(button);}// ==================== 鼠标光标 ====================/** * 给组件添加鼠标移入时变成手型光标的功能 * @param component 目标组件 */publicstaticvoidsetComponentCursor(Componentcomponent){if(null==component)return;component.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseEntered(MouseEvente){component.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));}@OverridepublicvoidmouseExited(MouseEvente){component.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));}});}}三、核心方法说明
标签按钮(Label模拟):createLabelBtn:用 JLabel 模拟按钮,适合图标+文字的简单点击场景
表单按钮:createFormBtn:固定高度50,绿色背景白色文字,适合表单提交按钮
文本按钮:createTextBtn:用 JLabel 模拟超链接样式,适合“忘记密码”等场景
通用按钮:createActionBtn:最灵活的按钮创建方法,提供多个重载版本
操作列按钮:createOperateColBtn:表格行内操作按钮,尺寸紧凑
快捷按钮:
createDefaultBtn:默认样式(主题色背景白色文字)
createSearchBtn / createResetBtn:快捷创建查询/重置按钮并添加到父面板辅助方法:setComponentCursor:给任意组件添加手型光标悬停效果
四、使用示例
- 4.1 创建默认样式按钮
JButtonsearchBtn=ButtonUtils.createDefaultBtn("查询",()->{System.out.println("执行查询");});panel.add(searchBtn);- 4.2 创建带图标按钮
// 图片存储位置,如 icons/export.pngStringiconPath="";JButtonexportBtn=ButtonUtils.createActionBtn("导出",iconPath,()->{System.out.println("执行导出");});panel.add(exportBtn);- 4.3 创建自定义颜色按钮
JButtondangerBtn=ButtonUtils.createActionBtn("删除","#F56C6C","#FFFFFF",()->{intresult=JOptionPane.showConfirmDialog(null,"确认删除?","提示",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){System.out.println("执行删除");}});panel.add(dangerBtn);- 4.4 创建文本按钮(超链接样式)
JLabellinkLabel=ButtonUtils.createTextBtn("忘记密码?",()->{System.out.println("跳转到找回密码");});panel.add(linkLabel);- 4.5 查询面板中使用
JPanelqueryPanel=newJPanel(newFlowLayout(FlowLayout.LEFT));queryPanel.add(newJLabel("用户名:"));queryPanel.add(newJTextField(10));ButtonUtils.createSearchBtn(queryPanel,this::doSearch);ButtonUtils.createResetBtn(queryPanel,this::doReset);- 4.6 表格操作列中使用
// 获取图片ImageIcon//ImageIcon editIcon = xxxx;JButtoneditBtn=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,读者可在自己的常量类中定义
- createLabelBtn 和 createTextBtn 返回的是 JLabel,不是 JButton,注意区分
- 操作列按钮的尺寸经过压缩,适合放在表格行内
七、小结
ButtonUtils 封装了 Swing 按钮的常见创建场景,核心设计思路:
- 统一样式:背景色、字体色、边框、光标
- 简化调用:一行代码完成按钮创建
- 灵活扩展:支持多种参数组合和自定义悬停效果