java中Swing中的自定义JButton



package Swing;
import java.awt.AlphaComposite;  
import java.awt.Color;  
import java.awt.Dimension;  
import java.awt.FlowLayout;
import java.awt.Font;  
import java.awt.GradientPaint;  
import java.awt.Graphics;  
import java.awt.Graphics2D;  
import java.awt.Point;  
import java.awt.RenderingHints;  
import java.awt.Shape;  
import java.awt.event.MouseAdapter;  
import java.awt.event.MouseEvent;  
import java.awt.geom.Arc2D;  
import java.awt.geom.GeneralPath;  
import java.awt.geom.RoundRectangle2D;  
  
import javax.swing.JButton;  
import javax.swing.JFrame;
  
/** 
 * Custom JButton 
 *  
 * @version 0.1.0 
 * @author ruislan <a href="mailto:z17520@126.com" mce_href="mailto:z17520@126.com"></a> 
 */  
public class RButton extends JButton {  
    private static final long serialVersionUID = 39082560987930759L;  
    public static final Color BUTTON_COLOR1 = new Color(205, 255, 205);  
    public static final Color BUTTON_COLOR2 = new Color(51, 154, 47);  
    // public static final Color BUTTON_COLOR1 = new Color(125, 161, 237);  
    // public static final Color BUTTON_COLOR2 = new Color(91, 118, 173);  
    public static final Color BUTTON_FOREGROUND_COLOR = Color.WHITE;  
    private boolean hover;  
    private int style;  
    public static final int ROUND_RECT = 0;     // 分别定义的四种形状
    public static final int LEFT_ROUND_RECT = 1;  
    public static final int RIGHT_ROUND_RECT = 2;  
    public static final int BALL = 3;  
    public static final int STAR = 4;  
  
    public RButton() {  
        this(ROUND_RECT);  
    }  
  
    public RButton(int style) 
    {  
        this.style = style;  
        setPreferredSize(new Dimension(60, 30));   //默认初始的大小为60、30
        if (BALL == style) 
        {  
            setPreferredSize(new Dimension(42, 42));      //为球形时新大小
        } else if (STAR == style) 
        {  
            setPreferredSize(new Dimension(42, 42));     //为星星时新大小
        }  
        setFont(new Font("system", Font.PLAIN, 12));  
        setBorderPainted(false);  
        setForeground(BUTTON_COLOR2);  
        setFocusPainted(false);  
        setContentAreaFilled(false);  
        addMouseListener(new MouseAdapter() {  
            @Override  
            public void mouseEntered(MouseEvent e) {                           //鼠标进入button
                setForeground(BUTTON_FOREGROUND_COLOR);  
                hover = true;  
                repaint();  
            }  
  
            @Override  
            public void mouseExited(MouseEvent e) {                //鼠标离开button
                setForeground(BUTTON_COLOR2);  
                hover = false;  
                repaint();  
            }  
        });  
    }  
  
    @Override  
    protected void paintComponent(Graphics g) {  
        Graphics2D g2d = (Graphics2D) g.create();  
        int h = getHeight();  
        System.out.println(h);
        
        int w = getWidth();
        System.out.println(w);
        float tran = 1F;  
        if (!hover) 
        {  
            tran = 0.3F;  
        }  
  
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
                RenderingHints.VALUE_ANTIALIAS_ON);  
        GradientPaint p1;  
        GradientPaint p2;  
        if (getModel().isPressed()) 
        {  
            p1 = new GradientPaint(0, 0, new Color(0, 0, 0), 0, h - 1,  
                    new Color(100, 100, 100));  
            p2 = new GradientPaint(0, 1, new Color(0, 0, 0, 50), 0, h - 3,  
                    new Color(255, 255, 255, 100));  
        } 
        else 
        {  
            p1 = new GradientPaint(0, 0, new Color(100, 100, 100), 0, h - 1,  
                    new Color(0, 0, 0));  
            p2 = new GradientPaint(0, 1, new Color(255, 255, 255, 100), 0,  
                    h - 3, new Color(0, 0, 0, 50));  
        }  
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,  
                tran));  
        GradientPaint gp = new GradientPaint(0.0F, 0.0F, BUTTON_COLOR1, 0.0F,  
                h, BUTTON_COLOR2, true);  
        g2d.setPaint(gp);  
        switch (style) {  
        case ROUND_RECT: {  
            RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0,  
                    w - 1, h - 1, 20, 20);  
            Shape clip = g2d.getClip();  
            g2d.clip(r2d);  
            g2d.fillRect(0, 0, w, h);  
            g2d.setClip(clip);  
            g2d.setPaint(p1);  
            g2d.drawRoundRect(0, 0, w - 1, h - 1, 20, 20);  
            g2d.setPaint(p2);  
            g2d.drawRoundRect(1, 1, w - 3, h - 3, 18, 18);  
            break;  
        }  
        case LEFT_ROUND_RECT: {  
            RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0,  
                    (w - 1) + 20, h - 1, 20, 20);  
            Shape clip = g2d.getClip();  
            g2d.clip(r2d);  
            g2d.fillRect(0, 0, w, h);  
            g2d.setClip(clip);  
            g2d.setPaint(p1);  
            g2d.drawRoundRect(0, 0, (w - 1) + 20, h - 1, 20, 20);  
            g2d.setPaint(p2);  
            g2d.drawRoundRect(1, 1, (w - 3) + 20, h - 3, 18, 18);  
            g2d.setPaint(p1);  
            g2d.drawLine(w - 1, 1, w - 1, h);  
            g2d.setPaint(p2);  
            g2d.drawLine(w - 2, 2, w - 2, h - 1);  
            break;  
        }  
        case RIGHT_ROUND_RECT: {  
            RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(-20, 0,  
                    (w - 1) + 20, h - 1, 20, 20);  
            Shape clip = g2d.getClip();  
            g2d.clip(r2d);  
            g2d.fillRect(0, 0, w, h);  
            g2d.setClip(clip);  
            g2d.setPaint(p1);  
            g2d.drawRoundRect(-20, 0, (w - 1) + 20, h - 1, 20, 20);  
            g2d.setPaint(p2);  
            g2d.drawRoundRect(-19, 1, (w - 3) + 20, h - 3, 18, 18);  
            g2d.setPaint(p1);  
            g2d.drawLine(0, 1, 0, h);  
            g2d.setPaint(p2);  
            g2d.drawLine(1, 2, 1, h - 1);  
            break;  
        }  
        case BALL: {  
            Arc2D.Float a2d = new Arc2D.Float(0, 0, w, h, 0, 360, Arc2D.CHORD);  
            Shape clip = g2d.getClip();  
            g2d.clip(a2d);  
            g2d.fillRect(0, 0, w, h);  
            g2d.setClip(clip);  
            g2d.setPaint(p1);  
            g2d.drawOval(0, 0, w - 1, h - 1);  
            g2d.setPaint(p2);  
            g2d.drawOval(1, 1, w - 3, h - 3);  
            break;  
        }  
        case STAR: {  
            int x = w / 2;  
            int y = h / 2;  
            int r = w / 2;  
            // 计算五个顶点  
            Point[] ps = new Point[5];  
            for (int i = 0; i <= 4; i++) {  
                ps[i] = new Point((int) (x - r  
                        * Math.sin((i * 72 + 36) * 2 * Math.PI / 360)),  
                        (int) (y + r  
                                * Math.cos((i * 72 + 36) * 2 * Math.PI / 360)));  
            }  
            GeneralPath star = new GeneralPath();  
            star.moveTo(ps[3].x, ps[3].y);  
            star.lineTo(ps[0].x, ps[0].y);  
            star.lineTo(ps[2].x, ps[2].y);  
            star.lineTo(ps[4].x, ps[4].y);  
            star.lineTo(ps[1].x, ps[1].y);  
            star.lineTo(ps[3].x, ps[3].y);  
            star.closePath();  
            Shape clip = g2d.getClip();  
            g2d.clip(star);  
            g2d.fillRect(0, 0, w, h);  
            g2d.setClip(clip);  
            g2d.setPaint(p1);  
            g2d.draw(star);  
            g2d.setPaint(p2);  
            g2d.draw(star);  
            break;  
        }  
        default:  
            break;  
        }  
        g2d.dispose();  
        super.paintComponent(g);  
    }  
    public static void main(String[] args)
  {
 JButton button=new RButton(0);//产生一个圆形按钮
 button.setText("开始");
 button.setBackground(new Color(216,191,216));//设置背景色为绿色
 //产生一个框架显示这个按钮
 JFrame frame=new JFrame("图形按钮");
 frame.getContentPane().setBackground(Color.orange);
 frame.getContentPane().setLayout(new FlowLayout());
 frame.getContentPane().add(button);
 frame.setSize(200,250);
 frame.setVisible(true);
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 


结果:


注意代码中的几个部分:

首先是paintComponent方法中最后一行,我们调用了父类的paintComponent方法,这是因为我们要靠父类来绘制字符,但是父类的这个方法除了绘制字符之外还会绘制其他的,所以我们需要关闭掉其他的(当然我们也可以自己来绘制字符,但是JButton提供了方法为什么不用呢),所以我们在构造方法那里调用了:
setBorderPainted(false);
setFocusPainted(false);
setContentAreaFilled(false);
告诉父类不用绘制边框,不用绘制焦点,不用绘制内容部分,这部分我们自己来搞*o*。

然后就是这一句了g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)告诉绘制API我们需要平滑一点,否则绘制出来会有很多锯齿哟。

接下来的这一句g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,tran))告诉绘图API我们需要绘制一个有透明度的,tran就是透明度(0-1)。

然后就是将边框的边角变直角为圆角,我们绘制一个RoundRectangle2D,这个就是边角都为圆角的方形,然后我们根据这个方形来clip我们的方形,这样方形就被RoundRectangle2D的圆角方形包裹,从而变成了圆角方形。

最后就是绘制外边线和内边线,通过改变内边线和外边线的色变从而造成陷入或者突出效果。

整个JButton改造完毕,如果你能够活用clip的话,你也可以做一个五角星的JButton哟。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值