java实现时钟效果
本文实例为大家分享了java实现时钟效果的具体代码,供大家参考,具体内容如下
实现效果如图:
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个指针的粗细 privatestaticfinalBasicStrokeHOURS_POINT_WIDTH=newBasicStroke(4); privatestaticfinalBasicStrokeMINUETES_POINT_WIDTH=newBasicStroke(3); privatestaticfinalBasicStrokeSEC_POINT_WIDTH=newBasicStroke(2); ImageIconbackground;//背景图片对象 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)); } @Override publicvoidpaint(Graphicsg){//重写父类方法 Graphics2Dg2=(Graphics2D)g; g2.drawImage(background.getImage(),0,0,this);//绘制背景图片 Calendarcalendar=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; privateClockPanelclockPanel; privatePointfp;//拖曳窗体之前的鼠标位置 publicstaticvoidmain(Stringargs[]){ EventQueue.invokeLater(newRunnable(){ publicvoidrun(){ try{ ClockFrameframe=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(finalMouseEvente){ fp=e.getPoint(); if(e.getButton()==MouseEvent.BUTTON3){ System.exit(0);//右键退出 } } }); //在时钟面板的鼠标拖曳事件中移动窗体 clockPanel.addMouseMotionListener(newMouseMotionAdapter(){ publicvoidmouseDragged(finalMouseEvente){ JDialogframe=(JDialog)getRootPane().getParent(); Pointpoint=e.getLocationOnScreen(); frame.setLocation(point.x-fp.x,point.y-fp.y); } }); pack(); addKeyListener(newKeyAdapter(){//为窗体添加键盘事件监听器 publicvoidkeyPressed(finalKeyEvente){ 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); } }); DimensionscreenSize=getToolkit().getScreenSize(); doublewidth=screenSize.getWidth(); intx=(int)(width-getWidth()-30); setLocation(x,30); newThread(){//创建线程对象,更新时钟面板界面 @Override publicvoidrun(){ try{ while(true){ sleep(1000);//休眠1秒 clockPanel.repaint();//重新绘制时钟面板界面 } }catch(InterruptedExceptione){ e.printStackTrace(); } } }.start(); } }
两个Java文件就实现了!接下来讲解一下实现步骤:
1、把上面的代码赋值下来并把它粘贴到记事本保存,两个文件放在同一个文件加里,改一下文件后缀为Java。
2、配置Java环境就是下载JDK,这个步骤不懂的自行百度
推荐阅读:
图文详解Java环境变量配置方法
Java新手环境搭建JDK8安装配置教程
3、cmd执行编译命令javac(注意:只编译ClockFrame.java文件,ClockPanel.java不编译,因为它在编译ClockFrame.java文件时,也会编译ClockPanel.java文件)
4、执行Java命令(效果如图)
这个实现功能就到此结束了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。