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

发布时间:2026/7/21 9:41:45
Java Swing 自定义组件库分享(四) 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_NAMEMicrosoft YaHei;// 标签按钮Label模拟 /** * 创建标签按钮用 JLabel 模拟按钮 * param text 按钮文字 * param icon 图标 * param btnAction 点击事件 * return 标签按钮 */publicstaticJLabelcreateLabelBtn(Stringtext,Iconicon,RunnablebtnAction){JLabelbtnnewJLabel(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){JButtonbuttoncreateActionBtn(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){JLabeltextBtnnewJLabel(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,ConsumerJComponentmouseEntered,ConsumerJComponentmouseExited){JButtonbuttonnewJButton(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,ConsumerJComponentmouseEntered,ConsumerJComponentmouseExited){JButtonbuttoncreateActionBtn(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,ConsumerJComponentmouseEntered,ConsumerJComponentmouseExited){returncreateActionBtn(text,iconPath,,,mouseClick,mouseEntered,mouseExited);}/** * 创建按钮无图标带悬停回调 * param text 按钮文字 * param mouseClick 点击事件 * param mouseEntered 鼠标进入事件 * param mouseExited 鼠标离开事件 * return 按钮 */publicstaticJButtoncreateActionBtn(Stringtext,RunnablemouseClick,ConsumerJComponentmouseEntered,ConsumerJComponentmouseExited){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){JButtonbuttoncreateActionBtn(text,icon,bgColorHex,fontColorHex,mouseClick);button.setMargin(newInsets(2,8,2,8));button.setFont(newFont(FONT_NAME,Font.PLAIN,15));Dimensiondimensionbutton.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){JButtonbuttoncreateActionBtn(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){JButtonbuttoncreateActionBtn(text,mouseClick);parent.add(button);}// 鼠标光标 /** * 给组件添加鼠标移入时变成手型光标的功能 * param component 目标组件 */publicstaticvoidsetComponentCursor(Componentcomponent){if(nullcomponent)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 创建默认样式按钮JButtonsearchBtnButtonUtils.createDefaultBtn(查询,()-{System.out.println(执行查询);});panel.add(searchBtn);4.2 创建带图标按钮// 图片存储位置如 icons/export.pngStringiconPath;JButtonexportBtnButtonUtils.createActionBtn(导出,iconPath,()-{System.out.println(执行导出);});panel.add(exportBtn);4.3 创建自定义颜色按钮JButtondangerBtnButtonUtils.createActionBtn(删除,#F56C6C,#FFFFFF,()-{intresultJOptionPane.showConfirmDialog(null,确认删除,提示,JOptionPane.YES_NO_OPTION);if(resultJOptionPane.YES_OPTION){System.out.println(执行删除);}});panel.add(dangerBtn);4.4 创建文本按钮超链接样式JLabellinkLabelButtonUtils.createTextBtn(忘记密码,()-{System.out.println(跳转到找回密码);});panel.add(linkLabel);4.5 查询面板中使用JPanelqueryPanelnewJPanel(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;JButtoneditBtnButtonUtils.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 按钮的常见创建场景核心设计思路统一样式背景色、字体色、边框、光标简化调用一行代码完成按钮创建灵活扩展支持多种参数组合和自定义悬停效果