类的话 没茄兆枝什么猜耐实际意义 timer 和 date 一颤敏起用就是时钟了
要模仿 个时钟的 话 要写 JS样式就可以 要这个类的话 打开jdK的date类 就能看到 时间类是怎么设计的
import java.util.*import java.awt.*
import java.applet.*
import java.text.*
import java.awt.event.*
public class Alarm extends Applet implements Runnable
{
Thread timer=null//创建线程timer
Image gif1//clockp:闹钟的外壳,闹铃和报时物
boolean setflag=false,stopflag=false,cancelflag=false
Panel setpanel
//获取声音文件
AudioClip ring=getAudioClip(getCodeBase(), "1.mid")
Button setbutton=new Button("SET")
Button cancelbutton=new Button("CANCEL")
Button stopbutton=new Button("STOP")
//响应按钮事件
private ActionListener setli=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setflag=true
}
}
private ActionListener cancelli=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setflag=true
}
}
private ActionListener stopli=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
ring.stop()
/渣局/清除的方法
//g.clearRect(83,280,20,30)
}
}
Label note1=new Label("Alarm clock:")
//GregorianCalendar提供的是一个日历式的东东,上面又多了很多的参数,是方便 *** 作了不少。而Date类的功能远不及其,求个和日期有联系的还要自己计算。
GregorianCalendar cal=new GregorianCalendar()
GregorianCalendar cal2=new GregorianCalendar()
SimpleDateFormat df=new SimpleDateFormat("yyyy MM dd HH:mm:ss")//设置时间格式
Date dummy=new Date()//生成Data对象
String lastdate=df.format(dummy)
Font F=new Font("TimesRoman",Font.PLAIN,14)//设置字体格式
Date dat=null
Date timeNow
Color fgcol=Color.blue
Color fgcol2=Color.darkGray
Color backcolor=Color.blue
Label hlabel2,mlabel2,slabel2//显示时间单位时所用的标签(时、分、秒)
int i
int s,m,h
TextField sethour,setmin,setsec//显示当前时间文本框和定时文本框
//在Applet程序中,首先自动调用初始化完成必要的初始化运梁老工作,紧接着自动调用start,在进入执行程序和返回到该页面时被调用,而从旁升该页面转到别的页面时,stop被调用,关闭浏览器时,执行destroy。
public void init()//初始化方法
{
int fieldx=50,fieldy1=120,fieldy2=220,fieldw=30,fieldh=20,space=50//显示时间和定时文本框的定位参数
setLayout(null)//将布局管理器初始化为null
setpanel=new Panel()
setpanel.setLayout(null)
setpanel.add(note1)
note1.setBounds(30,100,60,20)
note1.setBackground(backcolor)
note1.setForeground(Color.black)
//定时用的文本框(时、分、秒)
sethour=new TextField("00",5)
setmin=new TextField("00",5)
setsec=new TextField("00",5)
hlabel2=new Label()
mlabel2=new Label()
slabel2=new Label()
//定时的小时文本框的位置、大小
setpanel.add(sethour)
sethour.setBounds(fieldx,fieldy2,fieldw,fieldh)
sethour.setBackground(Color.white)
//在文本框后加入单位“时”
setpanel.add(hlabel2)
hlabel2.setText("h")
hlabel2.setBackground(backcolor)
hlabel2.setForeground(Color.black)
hlabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20)
fieldx=fieldx+space
//定时的分钟文本框的位置、大小
setpanel.add(setmin)
setmin.setBounds(fieldx,fieldy2,fieldw,fieldh)
setmin.setBackground(Color.white)
//在文本框后加入单位“分”
setpanel.add(mlabel2)
mlabel2.setText("m")
mlabel2.setBackground(backcolor)
mlabel2.setForeground(Color.black)
mlabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20)
fieldx=fieldx+space
//定时的秒文本框的位置、大小
setpanel.add(setsec)
setsec.setBounds(fieldx,fieldy2,fieldw,fieldh)
setsec.setBackground(Color.white)
//在文本框后加入单位“秒”
setpanel.add(slabel2)
slabel2.setText("s")
slabel2.setBackground(backcolor)
slabel2.setForeground(Color.black)
slabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20)
//设置闹钟控制按钮(on,off)
setpanel.add(cancelbutton)
setpanel.add(setbutton)
setpanel.add(stopbutton)
cancelbutton.setBounds(90,180,40,20)
setbutton.setBounds(140,180,40,20)
stopbutton.setBounds(522,180,40,20)
setbutton.addActionListener(setli)
cancelbutton.addActionListener(cancelli)
stopbutton.addActionListener(stopli)
stopbutton.setVisible(false)
//将面板加入当前容器中,并设置面板的大小和背景色
add(setpanel)
setpanel.setBounds(300,1,250,420)
setpanel.setBackground(backcolor)
/*int xcenter,ycenter,s,m,h
//闹钟中心点所在位置
xcenter=145
ycenter=162
s=(int)cal.get(Calendar.SECOND)
m=(int)cal.get(Calendar.MINUTE)
h=(int)cal.get(Calendar.HOUR_OF_DAY)
//初始化指针位置
lastxs=(int)(Math.cos(s*3.14f/30-3.14f/2)*30+xcenter)
lastys=(int)(Math.sin(s*3.14f/30-3.14f/2)*30+ycenter)
lastxm=(int)(Math.cos(m*3.14f/30-3.14f/2)*25+xcenter)
lastym=(int)(Math.sin(m*3.14f/30-3.14f/2)*25+ycenter)
lastxh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*18+xcenter)
lastyh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*18+ycenter)
lasts=s*/
MediaTracker mt=new MediaTracker(this)//为给定组件创建一个跟踪媒体的MediaTracker对象,把图片添加到被跟踪的图片组
//Java允?Sapplet??HTML所在的位置(decument base)下?d?Y料,也允?Sapplet?钠涑淌酱a所在的位置(code base)下?d?Y料。藉由呼叫getDocumentBase()?cgotCodeBase()可得到URL物件。?@些函?????湍阏业侥阆胂螺d的?n案的位置
//clockp=getImage(getDocumentBase(),"11.png")
gif1=getImage(getCodeBase(),"2.gif")
//i为id号
mt.addImage(gif1,i++)
try
{
mt.waitForAll()
}
catch(InterruptedException e)
{}//等待加载结束
resize(600,420)//设置窗口大小
}
//窗口显示有改变的时候调用paint
public void paint(Graphics g)
{//重写paint()方法
int xh,yh,xm,ym,xs,ys,strike_times
int xcenter,ycenter
String today
xcenter=148
ycenter=186
dat=new Date()
//用当前时间初始化日历时间
cal.setTime(dat)
//读取当前时间
s=(int)cal.get(Calendar.SECOND)
m=(int)cal.get(Calendar.MINUTE)
h=(int)cal.get(Calendar.HOUR_OF_DAY)
//换一种时间表达形式
today=df.format(dat)
//指针位置
xs=(int)(Math.cos(s*3.14f/30-3.14f/2)*30+xcenter)
ys=(int)(Math.sin(s*3.14f/30-3.14f/2)*30+ycenter)
xm=(int)(Math.cos(m*3.14f/30-3.14f/2)*25+xcenter)
ym=(int)(Math.sin(m*3.14f/30-3.14f/2)*25+ycenter)
xh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*12+xcenter)
yh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*12+ycenter)
//设置字体和颜色
g.setFont(F)
//前景色
g.setColor(getBackground())//取背景色的
g.drawImage(gif1,75,110,this)
//以数字方式显示年、月、日和时间
g.drawString(today,55,415)
//画指针
g.drawLine(xcenter,ycenter,xs,ys)
g.drawLine(xcenter,ycenter-1,xm,ym)//(x1,y1,x2,y2)
g.drawLine(xcenter-1,ycenter,xm,ym)
g.drawLine(xcenter,ycenter-1,xh,yh)
g.drawLine(xcenter-1,ycenter,xh,yh)
int timedelta//记录当前时间与闹铃定时的时差
Integer currh,currm,currs//分别记录当前的时、分、秒
Date dat2=new Date()
cal2.setTime(dat2)
//读取当前时间
currh=(int)cal2.get(Calendar.SECOND)
currm=(int)cal2.get(Calendar.MINUTE)
currs=(int)cal2.get(Calendar.HOUR_OF_DAY)
//这样做的话说我API已过时
//timeNow=new Date()
//currh=new Integer(timeNow.getHours())
//currm=new Integer(timeNow.getMinutes())
//currs=new Integer(timeNow.getSeconds())
if(setflag)
{ //判断是否设置了闹钟
//判断当前时间是否为闹钟所定的时间
if((currh.intValue()==Integer.valueOf(sethour.getText()).intValue())&&(currm.intValue()==Integer.valueOf(setmin.getText()).intValue())&&(currs.intValue()==Integer.valueOf(setsec.getText()).intValue()))
{
ring.play()
g.drawImage(gif1,83,280,this)
stopbutton.setVisible(true)
}
timedelta=currm.intValue()*60+currs.intValue()-Integer.valueOf(setmin.getText()).intValue()*60-Integer.valueOf(setsec.getText()).intValue()
if((timedelta>=30))
{
//若当前时间与闹钟相差时间超过30秒,闹钟自动停
ring.stop()
//清除的方法
g.clearRect(83,280,20,30)
}
}
dat=null
}
public void start()
{
if(timer==null)
{
timer=new Thread(this)//将timer实例化
timer.start()
}
}
public void stop()
{
timer=null
}
//给创建线程后start之后自动执行的函数
public void run()
{
//在run()方法中,调用repaint()方法,以重绘小程序区,进行时钟显示的更新。接着调用sleep方法让当前线程(也就是我们创建的线程clockthread)睡眠1000毫秒,因为我们每秒钟要更新一下显示,所以让它睡眠1秒
while(timer!=null)
{
try
{
timer.sleep(1000)
}
catch(InterruptedException e)
{}
//调用repaint时,会首先清除掉paint方法之前的画的内容,再调用paint方法
repaint()//刷新画面
}
timer=null
}
//当AWT接收到一个applet的重绘请求时,它就调用applet的 update(),默认地,update() 清除applet的背景,然后调用 paint()。重载 update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除
//有两种方法可以明显地减弱闪烁:重载 update()或使用双缓冲。
//使用双缓冲技术:另一种减小帧之间闪烁的方法是使用双缓冲,它在许多动画Applet中被使用。其主要原理是创建一个后台图像,将需要绘制的一帧画入图像,然后调用DrawImage()将整个图像一次画到屏幕上去;好处是大部分绘制是离屏的,将离屏图像一次绘至屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。
// 双缓冲可以使动画平滑,但有一个缺点,要分配一张后台图像,如果图像相当大,这将需要很大一块内存;当你使用双缓冲技术时,应重载 update()。
public void update(Graphics g)
{
Image offscreen_buf=null
//采用双缓冲技术的update()方法
if(offscreen_buf==null)
offscreen_buf=createImage(600,420)
Graphics offg=offscreen_buf.getGraphics()
offg.clipRect(1,1,599,419)
paint(offg)
Graphics ong=getGraphics()
ong.clipRect(1,1,599,419)
ong.drawImage(offscreen_buf,0,0,this)
}
/** Creates a new instance of AlarmClock */
}
importjava.util.*
import
java.awt.*
import
java.applet.*
//impelements
Runnable
是线程程序的接口
public
class
Clock
extends
Applet
implements
Runnable
{
Thread
timer
=
null
//
定义线程实体timer
int
xcenter
=
400,
ycenter
=
50
int
Radius
=
ycenter
-
5
public
void
init()
{
resize(400,
125)//
设置时钟程序的窗口大小
setBackground(Color.white)//
设衡并置小应用程序的背景色
}
public
void
paint(Graphics
g)
{
int
xh,
yh,
xm,
ym,
xs,
ys,
s,
m,
h
String
today
Date
dat
=
new
Date()
//
定义时间类dat
s
=
dat.getSeconds()
//
获得时间秒
m
=
dat.getMinutes()
//
获得时间分
h
=
dat.getHours()
today
=
dat.toLocaleString()
//
获得字符串时间格式
g.clearRect(0,
0,
size().width,
size().height)
//
消咐掘迹除小应用程序
xcenter
=
xcenter
-
1
//
向左移动一个像素点
if
(xcenter
<
-50)
xcenter
=
400
//
如果xcenter小于-50,则回到初始位置
//
计算秒的坐标
xs
=
(int)
(Math.cos(s
*
3.14f
/
30
-
3.14f
/
2)
*
(Radius
-
5)
+
xcenter)
ys
=
(int)
(Math.sin(s
*
3.14f
/
30
-
3.14f
/
2)
*
(Radius
-
5)
+
ycenter)
//
计算分钟的坐标
xm
=
(int)
(Math.cos(m
*
3.14f
/
30
-
3.14f
/
2)
*
(Radius
-
10)
+
xcenter)
ym
=
(int)
(Math.sin(m
*
3.14f
/
30
-
3.14f
/
2)
*
(Radius
-
10)
+
ycenter)
//
计算小时的散或坐标
xh
=
(int)
(Math.cos((h
*
30
+
m
/
2)
*
3.14f
/
180
-
3.14f
/
2)
*
(Radius
-
20)
+
xcenter)
yh
=
(int)
(Math.sin((h
*
30
+
m
/
2)
*
3.14f
/
180
-
3.14f
/
2)
*
(Radius
-
20)
+
ycenter)
g.setColor(Color.darkGray)
//
设置颜色
g.drawString("9",
xcenter
-
(Radius
-
5),
ycenter
+
3)
//
显示时钟上的数字‘9’
g.drawString("3",
xcenter
+
(Radius
-
10),
ycenter
+
3)
//
显示时钟上的数字‘3’
g.drawString("12",
xcenter
-
5,
ycenter
-
(Radius
-
13))
//
显示时钟上的数字'12'
g.drawString("6",
xcenter
-
3,
ycenter
+
(Radius
-
10))
//
显示时钟上的数字'6'
g.drawString(today,
0,
125)
//
显示字符串时钟
g.drawLine(xcenter,
ycenter,
xs,
ys)
//
画秒针
g.setColor(Color.blue)
//
设置颜色
g.drawArc(xcenter
-
Radius,
ycenter
-
Radius,
2
*
Radius,
2
*
Radius,
0,
360)
//
画钟
g.drawLine(xcenter,
ycenter
-
1,
xm,
ym)
//
画分针
g.drawLine(xcenter
-
1,
ycenter,
xm,
ym)
//
画分针
g.drawLine(xcenter,
ycenter
-
1,
xh,
yh)
//
画时针
g.drawLine(xcenter
-
1,
ycenter,
xh,
yh)
//
画时针
}
public
void
start()
{
if
(timer
==
null)
{
timer
=
new
Thread(this)
//
生成Thread(多线程程序)的对象实体
timer.start()
//
启动生成的线程
}
}
public
void
stop()
{
timer.stop()
//
停止线程的工作
timer
=
null
//
放掉Thread对象
}
public
void
run()
//
改方法用来定义线程体,一旦线程被启动执行,就开始执行这个方法
{
while
(timer
!=
null)
{
try
{
Thread.sleep(150)
//
使当前正在执行的线程进入睡眠时间由参数millis确定,
//
单位时间是毫秒,当这个时间过去,线程即可运行的
while
(timer
!=
null)
{
try
{
Thread.sleep(150)//
使用当前正在执行的线程进入睡眠时间由参数
//
millis确定,单位是毫秒,当这个时间过去,线程即为可运行的
}
catch
(InterruptedException
e)
{
}
repaint()
//
repaint所做的事其实是去调用方法uadate重画效应用程序
}
timer
=
null
}
catch
(InterruptedException
e)
{
}
}
}
//
所做的工作是先将整个效应用程序区域清除,再去调用paint,完成重画的动作
public
void
update(Graphics
g)
{
paint(g)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)