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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
