怎么用java编写时钟呀?

怎么用java编写时钟呀?,第1张

import

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.jave

import 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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8106762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存