Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 288|回复: 0

[Swing学习]JButton大改造之二:五芒星之辉

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-2 23:55:53 | 显示全部楼层 |阅读模式
    多话不说,接着昨天的,现在我们来试想一下做一个MP3的播放软件上的几个播放按钮,“上一首”是左边有圆顶角而右边没有的方形按钮,“下一首”是右边有圆顶角而左边没有的方形按钮,而播放和暂停是一个圆形的按钮,再放上一个五角星的按钮来评分.

          现在我们来绘制他们(当然我们还有一个解决方案为每个Button换成图片,每个Button得有三张:普通状态,划过,按下,不过这不是重点)。还是先放上图片:


       
      
       
       
         
       

         
       
      


      
      
      
      

    和代码:


      
    /**

      * @(#)RJButton.java  0.1.0  2007-9-11
      
    */


    package
      ruislan.rswing;


    import
      java.awt.AlphaComposite;

    import
      java.awt.Color;

    import
      java.awt.Dimension;

    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;


    /**

      * Custom JButton
      *
      *
    @version
      0.1.0
      *
    @author
      ruislan <a href="mailto:z17520@126.com"/>
      
    */


    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;
             
    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) {
                     setForeground(BUTTON_FOREGROUND_COLOR);
                     hover
    =
      
    true
    ;
                     repaint();
                 }

                 @Override
                
    public
      
    void
      mouseExited(MouseEvent e) {
                     setForeground(BUTTON_COLOR2);
                     hover
    =
      
    false
    ;
                     repaint();
                 }
             });
         }

         @Override
         
    protected
      
    void
      paintComponent(Graphics g) {
             Graphics2D g2d
    =
      (Graphics2D) g.create();
             
    int
      h
    =
      getHeight();
             
    int
      w
    =
      getWidth();
             
    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
    =
      
    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);
         }
    }


        这个代码的其他地方我就不多说了,今天主要是讲一下如何来clip内容,从而弄出我们想要的按钮形状(当然其他组件也可以)
    如图所示,假设我们的按钮是黑色的框,我们想要的是红色的框,那么我们首先绘出我们想要的Shape,然后得到这个按钮的Shape,然后进行合并剪裁,也就是说将两个Shape合起来,然后交集部分留下,其余的去除,这样就得到了我们所想要的图形
    (五角星那个图我们对五角星进行了封闭closePath)。

    图示:



         我们还可以通过几个Area进行合并图形,反剪等等操作来勾勒我们想要的图形,从而勾画组件的图形,如果你有闲情逸致的话,也有美感和足够的素材的话可以写一个StarCraft或者War3屏幕下角的操作区哟。



      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:27 , Processed in 0.301070 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表