java.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)
}
}
这里有书上源码一篇,可以参考。import java.awt.*
import java.awt.event.*
import java.awt.geom.*
import java.util.Calendar
import javax.swing.*
public class Clock extends JPanel implements ActionListener
{
// 创建时钟的外形
protected static Ellipse2D face = new Ellipse2D.Float(3, 3, 94, 94)
// 创建时钟的标记
protected static GeneralPath tick = new GeneralPath()
static
{
tick.moveTo(100, 100)
tick.moveTo(49, 0)
tick.lineTo(51, 0)
tick.lineTo(51, 6)
tick.lineTo(49, 6)
tick.lineTo(49, 0)
}
// 创建时针
protected static GeneralPath hourHand = new GeneralPath()
static
{
hourHand.moveTo(50, 15)
hourHand.lineTo(53, 50)
hourHand.lineTo(50, 53)
hourHand.lineTo(47, 50)
hourHand.lineTo(50, 15)
}
// 创建分针
protected static GeneralPath minuteHand = new GeneralPath()
static
{
minuteHand.moveTo(50, 2)
minuteHand.lineTo(53, 50)
minuteHand.lineTo(50, 58)
minuteHand.lineTo(47, 50)
minuteHand.lineTo(50, 2)
}
// 创建秒针
protected static GeneralPath secondHand = new GeneralPath()
static
{
secondHand.moveTo(49, 5)
secondHand.lineTo(51, 5)
secondHand.lineTo(51, 62)
secondHand.lineTo(49, 62)
secondHand.lineTo(49, 5)
}
// 设置时钟的颜色
protected static Color faceColor = new Color(220, 220, 220)
protected static Color hourColor = Color.red.darker()
protected static Color minuteColor = Color.blue.darker()
protected static Color secondColor = new Color(180, 180, 0)
protected static Color pinColor = Color.gray.brighter()
// 创建时钟的枢纽
protected Ellipse2D pivot = new Ellipse2D.Float(47, 47, 6, 6)
protected Ellipse2D centerPin = new Ellipse2D.Float(49, 49, 2, 2)
// 创建绕时钟枢纽转的变换
protected AffineTransform hourTransform =
AffineTransform.getRotateInstance(0, 50, 50)
protected AffineTransform minuteTransform =
AffineTransform.getRotateInstance(0, 50, 50)
protected AffineTransform secondTransform =
AffineTransform.getRotateInstance(0, 50, 50)
// 创建每秒触发一次的Timer
protected Timer timer = new Timer(1000, this)
protected Calendar calendar = Calendar.getInstance()
public Clock()
{
setPreferredSize(new Dimension(100, 100))
}
// 当plane加入container中时发生
public void addNotify()
{
super.addNotify()
timer.start()
}
// 当plane从container中移处时发生
public void removeNotify()
{
timer.stop()
super.removeNotify()
}
public void actionPerformed(ActionEvent event)
{
// 更新calender的时间
this.calendar.setTime(new java.util.Date())
int hours = this.calendar.get(Calendar.HOUR)
int minutes = this.calendar.get(Calendar.MINUTE)
int seconds = this.calendar.get(Calendar.SECOND)
//设置变换,使得时针、分针、秒针各自按绕枢纽旋转一定的角度
hourTransform.setToRotation(((double) hours) *
(Math.PI / 6.0), 50, 50)
minuteTransform.setToRotation(((double) minutes) *
(Math.PI / 30.0), 50, 50)
secondTransform.setToRotation(((double) seconds) *
(Math.PI / 30.0), 50, 50)
repaint()
}
public void paint(Graphics g)
{
super.paint(g)
// 得到图形上下文和抗锯齿处理
Graphics2D g2 = (Graphics2D) g
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON)
g2.setPaint(faceColor)
g2.fill(face)
g2.setPaint(Color.black)
g2.draw(face)
// 产生钟面上12个滴答位置
for (double p = 0.0p <12.0p += 1.0)
{
//利用变换画出同心的滴答的标线
g2.fill(tick.createTransformedShape(
AffineTransform.getRotateInstance((Math.PI / 6.0) * p,
50, 50)))
}
g2.setPaint(hourColor)
g2.fill(hourHand.createTransformedShape(hourTransform))
g2.setPaint(minuteColor)
g2.fill(minuteHand.createTransformedShape(minuteTransform))
g2.setPaint(secondColor)
g2.fill(secondHand.createTransformedShape(secondTransform))
g2.fill(pivot)
g2.setPaint(pinColor)
g2.fill(centerPin)
}
public static void main(String[] args)
{
JFrame frame = new JFrame()
frame.setLocation(700, 400)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.getContentPane().add(new Clock())
frame.pack()
frame.show()
}
}
//程序文件名AppletDemo.javeimport java.awt.*
import java.applet.Applet
ipport java.util.date
public class AppletDemo extends Applet
{
String strTime = new String()
public void init()
{
}
public void start()
{
date d=new date()
strTime =d.toString()
repaint()
}
public void paint(Graphics g)
}
g.drawString("当前时间为:"+strTime,20,30)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)