原文地址:http://www.blogjava.net/ruislan/archive/2007/09/12/144464.html 版权归原作者所有;

/** * @(#)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" 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; 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[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); } }

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

JButton大改造之二 - 五芒星之辉相关推荐

  1. 窃密程式CoreBot的五芒星评估

    恶意程序威胁评估五类行为的监测方法及实战. 待评样本 Corebot 五芒星 回顾我们的五芒星评估法: 破坏(Destroy) 窃密(SSI) 远控(RC)RemoteControl 感染(Infec ...

  2. 恶意程序威胁程度“五芒星”评估法

    一种新的恶意程序检查分类策略及检测方法. 需求 传统的恶意程序分析报告重在依照程序级行为进行归类,真是"事无巨细".这样的表述导致三个后果: 淡化了反病毒工程师的作用.无法将工程师 ...

  3. QGraphicsView编写五芒星图

    之前利用QPainter简单绘制过五芒星图,本次利用Qt的场景图元编写五芒星图, 增加了五芒星缩放动画,悬浮效果等. 效果图 注:由于录制原因,悬浮效果没有录制下来. 头文件 #ifndef QWHP ...

  4. 【观察】大数据3.0新时代 星环科技的思与行

    申耀的科技观察 读懂科技,赢取未来! 众所周知,如今的世界正在以加速度进入到智慧时代,特别是随着各项业务的云化深入以及万物互联,数据处理能力的进一步提升,智能算法一次又一次的突破,以及云计算在传统产业 ...

  5. 闲置台式机+文件服务器,牛人闲置电脑大改造!超低成本组建家用黑群晖NAS

    牛人闲置电脑大改造!超低成本组建家用黑群晖NAS 2018-09-12 一.前言: 大家好,俺又来了. 这篇原创很早就在构思怎么写了,因为确实作为一个数码爱好者来说,当得知有 群晖 威联通 这种NAS ...

  6. sql优化的15个小技巧(必知五颗星),面试说出七八个就有了

    目录 前言 1 避免使用select * 2 用union all代替union 3 小表驱动大表 4 批量操作 5 多用limit 6 in中值太多 7 增量查询 8 高效的分页 9 用连接查询代替 ...

  7. 索引失效的10种场景,你知道几个呢?(必知五颗星)

    目录 前言 1. 准备工作 1.1 创建user表 1.2 插入数据 1.3 查看数据库版本 1.4 查看执行计划 2. 不满足最左匹配原则 2.1 哪些情况索引有效? 2.2 哪些情况索引失效? 3 ...

  8. 2021年大数据ELK(五):Elasticsearch中的核心概念

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Elasticsearch中的核心概念 一.索引 index 二 ...

  9. 2021年大数据Kafka(五):❤️Kafka的java API编写❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的java API编写 一.生产者代码 第一步: ...

最新文章

  1. 虚拟机安装(Cent OS)
  2. oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动
  3. string插入字符_String类
  4. raft算法mysql主从复制_mysql主从复制原理
  5. 微服务学习之Gateway服务网关【Hoxton.SR1版】
  6. 【Bash百宝箱】shell作业控制(jobs、bg、fg)
  7. java毕业设计房屋租赁管理系统Mybatis+系统+数据库+调试部署
  8. 青岛理工计算机网络期末试题,青岛理工大学计算机网络试题2008~2009
  9. 三维热传导matlab模拟,MATLAB编辑一维热传导方程的模拟程序(最新整理)
  10. Android跑马灯进度条,跑马灯进度条在Powershell中冻结
  11. 移动机器人定位方法概述
  12. RF天线设计的一些概念
  13. 遍历vad二叉树来遍历进程里的模块
  14. 索引格式的图片在PS软件中无法操作,怎么解决?
  15. 2020“天猫双11”淘宝直播商家数据报告:新渠道、新品牌、新趋势
  16. 程序员的职业病,一定要注重身体健康才是最重要的
  17. Math.Round函数四舍五入的问题
  18. linux locale设置
  19. C++使用CreateProcess执行cmd命令(实例演示)
  20. 计算机音乐文爱数字普,CG、贺敬轩《文爱》钢琴谱

热门文章

  1. iPhoto的删除动画(转)
  2. 使用oledbdatareader取得数据库中数据
  3. 手机定位技术术语收录之-MCC(Mobile Country Code,移动国家号码)
  4. RHEL / CentOS 配置epel源
  5. 【STM32 Net MF开发板学习-14】红外遥控器编码识别
  6. 不让三星、LG独美,夏普在IFA 2012推出新型IGZO屏幕
  7. Ubuntu 安装NVIDIA RTX 2080显卡驱动
  8. M1芯片的Mac电脑进入恢复模式的最新教程
  9. BroadcastReceiver 中的onReceiver()方法执行多次的完美结局方案
  10. 云数据库时代,华为GaussDB系列数据库走向市场第一