原文:https://segmentfault.com/a/1190000007683729

序言

够几个月没有更新了,博客还透露着春招焦虑的气息。最近code确实不多,而且缺乏原创性的内容,当然,关键点还是在于,对于最近看的东西,看的比较杂,没能够有一个非常透彻的理解,input后没有进行很好的内化,导致output如难产的婴儿,迟迟无法落地。转到正题,这次写的仪表盘,继承JComponent实现一个仪表空间。支持直线性,弧形,圆形。同时支持对于表盘的颜色,大小的一些自定义操作。难点在于对于表盘刻度的绘制。涉及到数学公式的转化,将我们的刻度线进行绘制。

实现思路

初次想到实现一个仪表盘,有点畏惧心理,但是想到了之前创业公司实现的一个扇形的RecyclerView控件,感觉有很多可以参考的算法在里面,所以决定来尝试下。逐层剖析,同时在网上看到了一个实现,大体上看了下其实现,代码写的非常烂,阅读难度非常大,对于后期想在其寄出上造个轮子来说是比较困难的。平时开发中,很多轮都不能完全match我们的需求,因此需要我们具备自身拆轮能力,而作为一个造轮者,除了完成需求,应该尽可能的使轮具备更好的泛化能力。

对于刻度盘的绘制,首先要知道的是,一个刻度盘包含哪些东西,哪些需要我们去绘制的,对刻度盘进行了一个拆分之后,然后逐个去绘制,此时就没有这么难了。

  • 刻度:刻度盘,首先要有的必然是刻度,如下图中的所示,对于刻度,我们需要有长刻度和短刻度,长刻度也就是我们的大的单位。然后是其中的最小单位,也就是一个个的小刻度。

  • 文字标量:刻度盘中的文字标量,对于刻度盘,我们需要文字来准确直观的描述,每一个刻度所度量的大小,因此,我们需要在刻度上,对于大小进行一个标注。

  • 指针:对于表示我们的当前值的大小,我们需要一个指针来指向我们的当前值,这个时候我们需要根据提供的数值的大小,绘制一个指针来表示当前的值,指向刻度盘上的当前位置。

因此,我们可以得出,对于一个刻度盘的绘制,需要对于三个部分的绘制综合得到。以绘制弧形的举例。

绘制弧形,首先是对于刻度的绘制,我们需要根据提供整个圆弧的角度和数值的范围来将刻度盘进行分割,分割完成之后,对其进行绘制,这个时候,如何绘制呢?从什么地方开始绘制,画刻度,无非是提供线的两端,然后画一条线,那么问题就是在于如何如何找到这条线的两端的坐标,这个时候,需要我们运用一些数学知识,来进行计算,根据角度来计算。这个时候需要我们计算出起始角度,然后根据每当我们画出一个刻度,就加上相应的角度值,最后得到每一个刻度所处的角度,然后根据余弦公式,表示当前的角度。

  double x1 = Math.cos(startAngle - num * major * dunit) * r + width / 2;double y1 = height - yOffset - Math.sin(startAngle - num * major * dunit) * r;double x2 = Math.cos(startAngle - num * major * dunit) * r * 0.75 + width / 2;double y2 = height - yOffset - Math.sin(startAngle - num * major * dunit) * r * 0.75;

具体代码的实现可以参考本人github开源代码。

实现效果

线性刻度盘

弧形刻度盘


半圆中心刻度盘


圆形刻度盘

开源实现

Github地址

基于Java Swing的仪表盘实现相关推荐

  1. java swing 链接_JAVA中Jtable标签设置超级链接:基于Java Swing的超链接标签和超链接按钮的实现...

    希望在一个标签上设置超级链接,找到了如下的一种方法: 1.要解决的问题 基于Java Swing的超链接实现 2.自定义一个超链接标签控件[LinkLabel] 2.1.完整代码如下: public ...

  2. 基于java+swing+mysql+JFeeChart的企业人力资源管理系统(1)

    文章目录 一,前言 二,项目运行图 (1)主界面(管理员界面) (2)员工资料运行图 (3)全部员工查看运行图 (4)部门管理运行图 (5)岗位管理运行图 (6)工资发放系统运行图 (7)薪酬记录运行 ...

  3. java包裹邮费计算_GitHub - honghailiang/FreightSystem: 基于Java Swing编写的简易运费计算工具...

    FreightSystem 基于java Swing编写的运费计算系统 初始化数据 从excel中读取数据,转化为对象(只保存基础数据:序列号.始发站.目的站.省份.100kg以下(元/kg).100 ...

  4. 基于Java Swing编写的简易运费计算工具

    两年前给媳妇儿做的一个基于Java Swing编写的简易运费计算工具,现开源,关键是思路(https://github.com/honghailiang/FreightSystem).主要有两个部分实 ...

  5. 基于java+swing的员工出差报销管理系统(java+swing+Mysql+lw)

    基于java+swing的员工出差报销管理系统(java+swing+Mysql+lw) 项目名称:基于java swing的员工出差报销管理系统 涉及技术:java.java swing.mysql ...

  6. 基于Java+Swing+Mysql员工信息管理系统

    基于Java+Swing+Mysql员工信息管理系统 一.系统介绍 二.功能展示 1.主页 2.查询员工信息 3.删除员工信息 三.数据库 四.其他系统实现 五.获取源码 一.系统介绍 该系统实现了查 ...

  7. 基于Java+Swing+Mysql项目信息管理系统

    基于Java+Swing+Mysql项目信息管理系统 一.系统介绍 二.功能展示 1.主页 2.新增项目信息 3.删除项目信息 三.数据库 四.其他系统实现 五.获取源码 一.系统介绍 该系统实现了查 ...

  8. 基于Java Swing界面编程教学

    基于Java Swing界面编程 Swing是Java基础类的一部分,是一个为Java设计的GUI工具包. Swing包含了诸多图形用户界面(GUI)器件,提供了许多比awt更好的屏幕显示元素. 本教 ...

  9. Java课程设计-基于Java Swing的学生信息管理系统-版本二

    Java课程设计-基于Java Swing的学生信息管理系统-版本二 1.介绍 2.相关技术 3. 代码仓库 4.所需环境 5.安装教程 6.运行截图 7.相关博客 1.介绍 设计一个简单学生个人信息 ...

最新文章

  1. 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)
  2. 一文探索 JavaScript 最强大特性—函数表达式
  3. Android——监听事件总结
  4. Android之走手机流量让电脑能上网几种方法
  5. 数据分析体系构建那点事!
  6. 利用文件扫描符恢复数据库.txt
  7. dbvisualizer连接达梦_Dbvisualizer怎么使用,Dbvisualizer使用教程解析
  8. Java基础系列--static关键字
  9. Oracle往表里插入系统当前时间
  10. PHP之Trait详解
  11. vecm模型怎么写系数_VAR模型与向量VECM模型(7)
  12. 天黑时间跟经度还是纬度有关_时差的具体由来,时差由纬度还是经度决定?
  13. python 操作微信 群发_python实现给微信公众号发送消息的方法
  14. 0723数组复习 堆区 动态数组
  15. mysql frm、MYD、MYI数据文件恢复,导入MySQL中
  16. Photoshop技能167个经典的Photoshop技巧大全
  17. HTML——多媒体语义化标签
  18. 大学物理(下)class1
  19. 小陈学js 预解析
  20. 数字图像处理第九章笔记

热门文章

  1. html5播放视频闪退,【报Bug】embed闪退
  2. icmp 报文中的进程号
  3. leetcode怎么用时间刷_LeetCode刷题专栏第一篇--思维导图时间安排
  4. mysql-5.2 lib_Centos 5.2下安装多个mysql数据库配置详解
  5. 大脑构造图与功能解析_锻炼改变大脑
  6. avrorecord.java,失败,但发生异常java.io.IOException:org.apache.avro.AvroTypeException:发现的很长,期望在配置单元中实现联合...
  7. 同花顺python_python的解析库pyquery解析并读取同花顺网站的焦点新闻
  8. 皮一皮:大自然的力量你无法想象...
  9. 2021年要关注这5个开源Kubernetes项目
  10. Java反射是什么?看这篇绝对会了!