java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Swing自定义按钮组件

Java Swing实现自定义按钮组件的完整代码

作者:RainCity

本文介绍了Java Swing按钮工具类,用于简化按钮创建,它封装了多种按钮样式、图标及事件处理,支持悬停效果,开发者仅需一行代码即可创建规范按钮,大幅提升开发效率,文中附有完整源码

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

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

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

二、类源码

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 创建默认样式按钮

JButton searchBtn = ButtonUtils.createDefaultBtn("查询", () -> {
    System.out.println("执行查询");
});
panel.add(searchBtn);

4.2 创建带图标按钮

// 图片存储位置,如 icons/export.png
String iconPath = "";
JButton exportBtn = ButtonUtils.createActionBtn("导出", iconPath, () -> {
    System.out.println("执行导出");
});
panel.add(exportBtn);

4.3 创建自定义颜色按钮

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 创建文本按钮(超链接样式)

JLabel linkLabel = ButtonUtils.createTextBtn("忘记密码?", () -> {
    System.out.println("跳转到找回密码");
});
panel.add(linkLabel);

4.5 查询面板中使用

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 表格操作列中使用

// 获取图片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)

六、注意事项

七、小结

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

以上就是Java Swing实现自定义按钮组件的完整代码的详细内容,更多关于Java Swing自定义按钮组件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文