jbutton 按钮 圆角 渐变色

效果图

没按压时背景渐变色
在这里插入图片描述
鼠标按压时背景色改变
在这里插入图片描述

下面是可用的源码

package com.beijin.robot.utils;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ButtonBuilder {

    private static JButton DEFAULT_BUTTON = new JButton();

    public static JButton createRadButtonGradientLowBule(){
        return createRadCustomColorButton(new Color(0x000000),30,null,new Color(0xFFFFFF),new Color(0xF0F7FF),new Color(172,223,253));
    }

    /**
     * 普通圆角自定义颜色按钮,可设置渐变色
     * @param fgColor 字体前景色,这里默认给的是 new Color(0xF0F7FF);
     * @param radius  圆角半径 eg:30
     * @param bgColor 单一背景色 ,注意:如果空则使用渐变色,如果渐变色也空则使用字体前景色
     * @param bgColorGradient1 背景渐变色一端 (左)
     * @param bgColorGradient2 背景渐变色另一端 (右)
     * @param bgPressColor 按钮被按住时的背景色
     * @return
     */
    public static JButton createRadCustomColorButton(Color fgColor, int radius, Color bgColor,Color bgColorGradient1,Color bgColorGradient2,Color bgPressColor) {
        JButton button = new RoundButton(radius, bgColor,bgColorGradient1,bgColorGradient2,bgPressColor);//50
        button.setForeground(fgColor);
        return button;
    }

    /**
     * 椭圆按钮
     */
    private static class RoundButton extends JButton {
        private int radius;
        private Color bgColor;//单一背景颜色,如果有则不用渐变色
        private Color bgColorGradient1;// 一端背景渐变色1
        private Color bgColorGradient2;//另一端背景渐变色2
        private Color bgPressColor;//鼠标按住时的颜色
        private boolean isPressed = false;
        public RoundButton(int radius, Color bgColor,Color bgColorGradient1,Color bgColorGradient2,Color bgPressColor) {
            super();
            this.radius = radius;
            this.bgColor = bgColor;
            this.bgColorGradient1 = bgColorGradient1;
            this.bgColorGradient2 = bgColorGradient2;
            this.bgPressColor = bgPressColor;
//            super.setBackground(color);
			setBorder(null);
            // 取消画矩形
            super.setContentAreaFilled(false);

            if(bgPressColor == null){
                bgPressColor = new Color(0xF0F7FF);
            }
            //添加鼠标监听点击事件,记录鼠标按压松开状态,颜色改变需要用到
            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    isPressed = true;
                }
                @Override
                public void mouseReleased(MouseEvent e) {
                    isPressed = false;
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            if(bgColor != null){
                //设置背景色
                if(isPressed){
                    g2.setColor(bgPressColor);
                }else{
                    g2.setColor(bgColor);
                }
            }else if(bgColorGradient1 != null && bgColorGradient2 != null){
                if(isPressed){
                    g2.setColor(bgPressColor);
                }else{
                    //背景色定义渐变色
                    GradientPaint gradient = new GradientPaint(0, 0, bgColorGradient1, super.getSize().width, super.getSize().height, bgColorGradient2, true);
                    // 设置渐变效果
                    g2.setPaint(gradient);
                }
            }else{
                g2.setColor(bgPressColor);
            }
            g2.fillRoundRect(0, 0, super.getSize().width - 1, super.getSize().height - 1, radius, radius);
            super.paintComponent(g2);
            g2.dispose();
        }

        /**
         * 创建与默认按钮大小相同的 内边距
         *
         * @param color
         * @param radius
         * @return
         */
        public Border createRoundBorder(Color color, int radius) {
            return new RoundBorder(color, radius);
        }
    }

    /**
     * 椭圆边框
     */
    private static class RoundBorder implements Border {

        private Color color;

        private int radius;

        public RoundBorder(Color color, int radius) {
            this.color = color;
            this.radius = radius;
        }

        public Insets getBorderInsets(Component c) {
            return DEFAULT_BUTTON.getBorder().getBorderInsets(c);
        }

        ;

        @Override
        public boolean isBorderOpaque() {
            return false;
        }


        // 实现Border(父类)方法
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int width,
                                int height) {
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(color);
            g2.drawRoundRect(0, 0, c.getWidth() - 1, c.getHeight() - 1, radius, radius);
            g2.dispose();
        }

    }

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JButton可以通过设置其Border来实现圆角效果。 以下是一个示例代码: ``` import java.awt.*; import javax.swing.*; import javax.swing.border.*; public class RoundedButton extends JButton { public RoundedButton(String text) { super(text); setBackground(Color.WHITE); setForeground(Color.BLACK); setBorder(new RoundedBorder(10)); } private class RoundedBorder implements Border { private int radius; public RoundedBorder(int radius) { this.radius = radius; } public Insets getBorderInsets(Component c) { return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius); } public boolean isBorderOpaque() { return true; } public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { g.setColor(getForeground()); g.drawRoundRect(x, y, width-1, height-1, radius, radius); } } public static void main(String[] args) { JFrame frame = new JFrame("Rounded Button Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); JPanel panel = new JPanel(new FlowLayout()); panel.add(new RoundedButton("Click me!")); frame.getContentPane().add(panel); frame.setVisible(true); } } ``` 该代码中,我们定义了一个RoundedButton类,继承自JButton。在构造函数中,我们设置按钮的背景和前景色,并且将按钮的边框设置为一个自定义的RoundedBorder类。 RoundedBorder类实现了Border接口,用于绘制圆角边框。在getBorderInsets方法中,我们返回一个Insets对象,用于指定边框的大小和位置。在paintBorder方法中,我们使用Graphics对象绘制圆角边框。 最后,在main方法中,我们创建了一个JFrame和一个JPanel,并将一个RoundedButton添加到该JPanel中,最后将JPanel添加到JFrame中。运行该程序,可以看到一个带有圆角边框的按钮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值