实现效果如图:

Java代码:

文件一:ClockPanel.java

importstaticjava.util.Calendar.HOUR;importstaticjava.util.Calendar.MILLISECOND;importstaticjava.util.Calendar.MINUTE;importstaticjava.util.Calendar.SECOND;importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.util.Calendar;importjavax.swing.ImageIcon;importjavax.swing.JPanel;/**

* 时钟面板

*

* @author 听说你很会玩

*/@SuppressWarnings("serial")publicclassClockPanelextendsJPanel{// 3个指针的粗细privatestaticfinalBasicStroke HOURS_POINT_WIDTH=newBasicStroke(4);privatestaticfinalBasicStroke MINUETES_POINT_WIDTH=newBasicStroke(3);privatestaticfinalBasicStroke SEC_POINT_WIDTH=newBasicStroke(2);ImageIcon background;// 背景图片对象privateintcenterX;// 中心坐标privateintcenterY;// 中心坐标privatefinalstaticintsecLen=60;// 指针长度privatefinalstaticintminuesLen=55;// 指针长度privatefinalstaticinthoursLen=36;// 指针长度/**

* 构造方法

*/publicClockPanel(){setToolTipText("小键盘+、-调整透明度,Crtl+Shift+X退出");// 提示信息setOpaque(false);background=newImageIcon(getClass().getResource("clock.jpg"));// 加载图片inticonWidth=background.getIconWidth();// 获取图片大小centerX=iconWidth/2;// 获取图片中间坐标inticonHeight=background.getIconHeight();centerY=iconHeight/2;// 获取图片中间坐标setPreferredSize(newDimension(iconWidth,iconHeight));}@Overridepublicvoidpaint(Graphics g){// 重写父类方法Graphics2D g2=(Graphics2D)g;g2.drawImage(background.getImage(),0,0,this);// 绘制背景图片Calendar calendar=Calendar.getInstance();// 获取日历对象intmillisecond=calendar.get(MILLISECOND);// 获取毫秒值intsec=calendar.get(SECOND);// 获取秒值intminutes=calendar.get(MINUTE);// 获取分值inthours=calendar.get(HOUR);// 获取时值doublesecAngle=(60-sec)*6-(millisecond/150);// 秒针角度intminutesAngle=(60-minutes)*6;// 分针角度inthoursAngle=(12-hours)*360/12-(minutes/2);// 时针角度// 计算秒针、分针、时针指向的坐标intsecX=(int)(secLen*Math.sin(Math.toRadians(secAngle)));// 秒针指向点的X坐标intsecY=(int)(secLen*Math.cos(Math.toRadians(secAngle)));// 秒针指向点的Y坐标intminutesX=(int)(minuesLen*Math.sin(Math.toRadians(minutesAngle)));// 分针指向点的X坐标intminutesY=(int)(minuesLen*Math.cos(Math.toRadians(minutesAngle)));// 分针指向点的Y坐标inthoursX=(int)(hoursLen*Math.sin(Math.toRadians(hoursAngle)));// 时针指向点的X坐标inthoursY=(int)(hoursLen*Math.cos(Math.toRadians(hoursAngle)));// 时针指向点的Y坐标// 分别绘制时针、分针、秒针g2.setStroke(HOURS_POINT_WIDTH);// 设置时针的宽度g2.setColor(Color.BLACK);// 设置时针的颜色g2.drawLine(centerX,centerY,centerX-hoursX,centerY-hoursY);// 绘制时针g2.setStroke(MINUETES_POINT_WIDTH);// 设置分针的宽度if(minutesAngle!=hoursAngle)// 分针、时针重叠变色g2.setColor(newColor(0x2F2F2F));// 设置未重叠时的颜色else{g2.setColor(Color.GREEN);// 设置重叠时的颜色}g2.drawLine(centerX,centerY,centerX-minutesX,centerY-minutesY);// 绘制分针g2.setStroke(SEC_POINT_WIDTH);// 设置秒针的宽度if(secAngle!=hoursAngle&&secAngle!=minutesAngle)// 分针、时针、秒针重叠变色g2.setColor(Color.ORANGE);// 设置未重叠时的颜色else{g2.setColor(Color.GREEN);// 设置重叠时的颜色}// 绘制3个指针的中心圆和秒针g2.fillOval(centerX-5,centerY-5,10,10);// 绘制中心圆g2.drawLine(centerX,centerY,centerX-secX,centerY-secY);// 绘制秒针g2.drawLine(centerX+1,centerY+1,centerX-secX+1,centerY-secY+1);// 绘制秒针}}

文件二:ClockFrame.java

importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/**

* @author 张振坤

*/@SuppressWarnings("serial")publicclassClockFrameextendsJDialog{privatefloatopqua=0.7f;privateClockPanel clockPanel;privatePoint fp;// 拖曳窗体之前的鼠标位置publicstaticvoidmain(String args[]){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClockFrame frame=newClockFrame();// 创建窗体对象frame.setVisible(true);// 显示窗体}catch(Exceptione){e.printStackTrace();}}});}/**

* 布局窗体的构造方法

*/publicClockFrame(){super();setUndecorated(true);// 取消窗体修饰setAlwaysOnTop(true);// 窗体置顶setTitle("石英钟");// 设置窗体标题getContentPane().setLayout(newBorderLayout());setBounds(100,30,217,257);setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);clockPanel=newClockPanel();// 创建时钟面板getContentPane().add(clockPanel);// 为时钟面板添加鼠标按键事件监听器clockPanel.addMouseListener(newMouseAdapter(){publicvoidmousePressed(finalMouseEvent e){fp=e.getPoint();if(e.getButton()==MouseEvent.BUTTON3){System.exit(0);// 右键退出}}});// 在时钟面板的鼠标拖曳事件中移动窗体clockPanel.addMouseMotionListener(newMouseMotionAdapter(){publicvoidmouseDragged(finalMouseEvent e){JDialog frame=(JDialog)getRootPane().getParent();Point point=e.getLocationOnScreen();frame.setLocation(point.x-fp.x,point.y-fp.y);}});pack();addKeyListener(newKeyAdapter(){// 为窗体添加键盘事件监听器publicvoidkeyPressed(finalKeyEvent e){intcode=e.getKeyCode();switch(code){// 判断按键编码caseKeyEvent.VK_ADD://+符号按键会降低透明图                        opqua+=0.05;opqua=opqua>0.95f?1f:opqua;break;caseKeyEvent.VK_SUBTRACT://-符号按键会提升透明度                        opqua-=0.05;opqua=opqua<0.1f?0.1f:opqua;break;}// 如果按Ctrl+Shift+X組合鍵,将退出程序if(code==KeyEvent.VK_X&&e.getModifiersEx()==(KeyEvent.CTRL_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK))System.exit(0);}});Dimension screenSize=getToolkit().getScreenSize();doublewidth=screenSize.getWidth();intx=(int)(width-getWidth()-30);setLocation(x,30);newThread(){// 创建线程对象,更新时钟面板界面@Overridepublicvoidrun(){try{while(true){sleep(1000);// 休眠1秒clockPanel.repaint();// 重新绘制时钟面板界面}}catch(InterruptedExceptione){e.printStackTrace();}}}.start();}}

两个Java文件就实现了!!Java是不是很牛逼!!哈哈。接下来讲解一下实现步骤:

把上面的代码赋值下来并把它粘贴到记事本保存,两个文件放在同一个文件加里,改一下文件后缀为Java。

配置Java环境就是下载JDK,这个步骤不懂的自行百度

cmd执行编译命令javac(注意:只编译ClockFrame.java文件,ClockPanel.java不编译,因为它在编译ClockFrame.java文件时,也会编译ClockPanel.java文件)

执行Java命令(效果如图)

欧克,这个实现功能就到此结束了。

java表盘时钟的设计思路_java代码实现时钟相关推荐

  1. 普歌-允异团队-【Java实例】一起做一个简单的王者荣耀RPG吧!从设计思路到代码实现一条龙!-登录与注册(IO流)/记录时间/属性面板呈现

    [Java实例]-王者荣耀RPG-从设计思路到代码实现 前言 一.案例分析 1. 设计理念 2. 功能设计 (1)登录与注册 (2)游戏时间记录 (3)选择游戏模式 (4)游戏地图 (5)生物属性 二 ...

  2. AT串口抽象层的设计思路及代码实现

    文章目录 1 AT串口抽象层的设计思路及代码实现 1.1 AT串口抽象层的设计思路 1.2 AT串口抽象层的代码实现 1 AT串口抽象层的设计思路及代码实现 1.1 AT串口抽象层的设计思路 我们先来 ...

  3. ML之分类预测:机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现

    ML之分类预测:机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现 目录 机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现 代码实现

  4. 【三子棋小游戏的设计思路以及代码实现】

    目录 一,设计思路 二, 代码实现 首先,欢迎各位点进我的文章.话不多说,正如标题一样,接下来,我来给大家讲解三子棋小游戏的设计思路以及代码实现.            一,设计思路 一. 大家应该都 ...

  5. python+unittest框架 UI自动化设计思路以及代码剖析,增加易用性

    前言 学习UI自动化的同学都应该知道PO模式,PO共分为三层,分别是页面定位层,页面对象层,业务逻辑层. po模式有以下几个优点: 1.易读性好 2.扩展性高 3.复用性强 4.维护性好 5.代码冗余 ...

  6. 手机号码归属地 API 实现防止骚扰电话,看这一篇就够了(内附设计思路和代码)

    在当今时代,骚扰电话已经成为了很多人日常生活中的一个常见问题,严重影响了人们的工作和生活. 为了避免这种情况的发生,企业和机构可以采用手机号码归属地 API,以提供更好的电话服务,减少骚扰电话的出现. ...

  7. 密保问题数据库设计思路和代码实现

    用户注册时设置三个密保问题方便用户找回. 数据库设计思路: 用户一张表,用户密保问题答案一张表,密保问题单独一张表.这样做的好处是满足三范式,条理清晰,跟重要的是方便后期更改维护密保问题,比如增加删除 ...

  8. java贪吃蛇课程设计报告_java贪吃蛇课程设计报告().doc

    java贪吃蛇课程设计报告() <Java应用开发> 课程设计报告 题 目: JAVA小游戏 - 贪吃蛇 指导老师: 姓 名: 专 业: 班 级: 日 期: 目 录 一.系统总体设计1 ( ...

  9. java坦克大战登录界面设计_基于JAVA的坦克大战设计和实现-代码.doc

    JISHOU UNIVERSITY 本科生毕业设计 题 目:基于JAVA的坦克大战设计与实现作 者:学 号:所属学院:专业年级:指导教师:职 称:完成时间:2012年5月7日 吉首大学 基于JAVA的 ...

最新文章

  1. C语言中的extern关键字用法
  2. opencv 高斯模糊
  3. Javascript 笔记与总结(2-11)暴力操作节点
  4. ACL 2020 | 基于稠密段落检索的开放域问答系统技术
  5. apache jmeter_Apache Server和JMeter调试
  6. XenApp Command Line参数的传递
  7. 如何用 CNN 玩转 AlphaGo 版的五子棋?
  8. arcgis怎么只显示一个图斑_森林监测、图斑核查必备技能
  9. 自媒体人常用工具,你还不知道的快速保存无水印视频图片方法
  10. Android 微信分享不显示分享出去的图标问题
  11. 企业债和公司债的四点区别
  12. Android SVG图片解析Demo
  13. 微生物群也有记忆 | 微生物群能被“训练”
  14. filezilla定时上传_windows下定时利用bat脚本实现ftp上传和下载
  15. SAP message TK 248 solved
  16. 无人机寻迹要两个单片机吗_基于OpenMV的循迹无人机设计
  17. 快速去除GIF动图的背景(让背景变透明),保姆级教程
  18. 用计算机专业术语祝福,学习计算机知识必须懂得50个专业术语
  19. sqlplus 命令简单整理
  20. p50, p90, p99 (pct 50, pct 90, pct 99)指什么?

热门文章

  1. PHPCMS网站登陆增加点触验证码
  2. 解读如何打造支撑万亿规模的K8s集群?
  3. html如何让文字图片同高,css里图片和文字如何等高
  4. 自动化爬取淘宝数据--(保存到文本中)
  5. CREO教程——1 初始配置
  6. creo二次开发python_使用C#/.net语言进行ProE/Creo二次开发
  7. 简要介绍下tensorflow的计算图
  8. html在一行内横向排列并排同行同时显示两个多个div盒子的方法
  9. 计算机吉祥如意制作贺卡作业,贺卡制作教案
  10. website for all kinds of courses