伍文運
【摘 要】在許多公共場合下,需要提供時鐘顯示,如機(jī)場、火車站、汽車站、酒店等,特別是一些需要接待外賓的場所,處理顯示本地區(qū)時間以外還必須顯示其他時區(qū)時間。本文使用Java多線程機(jī)制實現(xiàn)多個時區(qū)時鐘的顯示。
【關(guān)鍵詞】類;對象;繼承;接口;多線程機(jī)制
1.問題描述
Java多線程機(jī)制實現(xiàn)了異步執(zhí)行環(huán)境,線程間的通信簡單有效,每個線程彼此獨立執(zhí)行,一個程序可以同時使用多個線程來完成不同任務(wù)。依此可實現(xiàn)在窗口中顯示北京時間、格林尼治時間、夏威夷時間和東京時區(qū)四個時區(qū)的時鐘。
2.問題實現(xiàn)
定義從Jpanel控件繼承生成clock類并實現(xiàn)Runnable接口。在其構(gòu)造方法中創(chuàng)建線程,通過其中的pain方法畫出當(dāng)前時區(qū)的時鐘信息。在線程的run方法中檢測當(dāng)前CPU上線程是否為自身并讓自身線程睡眠1000個時間單位,在主類DrawingCLock的方法中創(chuàng)建四個clock對象并加入到主類的frame控件中,從而實現(xiàn)四個時區(qū)的時鐘同時顯示。
3.實現(xiàn)程序代碼
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class DrawingClock {
JFrame frame;
clock panell,panel2,panel3,panel4;
public static void main(String args[]) {
DrawingClock dc=new DrawingClock();
dc.go();
}
public void go() {
frame=new JFrame("時鐘");
frame.getContentPane().setLayout(null);
panell=new clock(160,150,"北京時間",0);//線程1畫北京時間時鐘
frame.getContentPane().add(panell);
panel2=new clock(400,150,"格林威治時間",-7);////線程2畫北京時間時鐘
frame.getContentPane().add(panel2);
panel3=new clock(160,450,"東京時間",1);//線程3畫北京時間時鐘
frame.getContentPane().add(panel3);
panel4 = new clock(400,450,"夏威夷時間",-10);//線程4畫北京時間時鐘
frame.getContentPane().add(panel4);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 650);
frame.setVisible(true);
}
}
class clock extends JPanel implements Runnable {
Thread thr1=new Thread(this);
String text;
int z;
Graphics graphics;
Date currentDate=new Date(); //獲取當(dāng)前日期信息
String lastdate=currentDate.toString(); //獲取當(dāng)前日期信息的字符串形式
int xcenter , ycenter; // 時鐘的中心坐標(biāo)值
int radius=100;// 時鐘的半徑
void drawCircle()
{graphics.drawArc(xcenter-radius, ycenter-radius, radius*2, radius*2,0,360);
for(int i=1;i<=12;i++)//畫表盤數(shù)字
{int x=xcenter+(int)((radius-15)*Math.sin(i*Math.PI/6));
int y=ycenter-(int)((radius-15)*Math.cos(i*Math.PI/6));
String str=""+i;
graphics.drawString(str,x,y);
}
}
public void paint(Graphics g) {
graphics=g;
g.clearRect(xcenter-radius,ycenter-radius,radius*2,radius*2);
drawCircle();//畫表盤
int xh, yh, xm, ym, xs, ys;
//定義變量用于存放當(dāng)前的秒針、分針和時針的末端坐標(biāo)值
int s,m,h;
currentDate= new Date(); //獲取當(dāng)前日期信息
String today=text+":"; //獲取當(dāng)前日期信息的字符串形式
Calendar nowcal= Calendar.getInstance();
s=nowcal.get(Calendar.SECOND);//獲取當(dāng)前的秒值
m=nowcal.get(Calendar.MINUTE);//獲取當(dāng)前的分鐘值
h=nowcal.get(Calendar.HOUR);//獲取當(dāng)前的小時值
h+=z;
nowcal.set(Calendar.HOUR,h);
today+=nowcal.getTime().toString();
//獲取當(dāng)前秒針、分針和時針的末端坐標(biāo)值
xs=(int) (Math.cos(s * Math.PI / 30 - Math.PI / 2) *(radius-10) + xcenter);
ys=(int) (Math.sin(s * Math.PI / 30 - Math.PI / 2) *(radius-10) + ycenter);
xm=(int) (Math.cos(m * Math.PI / 30 - Math.PI / 2) * (radius-40) + xcenter);
ym=(int) (Math.sin(m * Math.PI / 30 - Math.PI / 2) * (radius-40) + ycenter);
xh=(int) (Math.cos((h*30+m/2) * Math.PI / 180 - Math.PI / 2) * (radius-60)+ xcenter);
yh=(int) (Math.sin((h*30+m/2) * Math.PI / 180 - Math.PI / 2) * (radius-60)+ ycenter);
//清除界面,顯示日期信息,并畫秒針、分針和時針
g.clearRect(xcenter-100, ycenter+radius+2,200,30);
g.drawString(today, xcenter-100, ycenter+radius+20);
g.drawLine(xcenter, ycenter, xs, ys);
g.drawLine(xcenter, ycenter, xm, ym);
g.drawLine(xcenter, ycenter, xh, yh);
}
public void run() {
Thread me = Thread.currentThread();
while ((thr1== me)) {//若是本線程則休眠1000個單位后刷新
try {
Thread.currentThread().sleep(1000);//當(dāng)前線程休眠1秒
} catch (InterruptedException e) {
}
repaint();//重畫時鐘
}
}
public clock(int x,int y,String s,int zone)
{
z=zone;
text=s;
xcenter=x;
ycenter=y;
setSize(600,800);
thr1.start();//啟動線程
}
}
4.結(jié)語
本程序能準(zhǔn)確顯示四個時區(qū)的時間信息,但界面美觀程度不夠??梢岳肑ava的相關(guān)技術(shù)對時鐘界面進(jìn)行修改,使顯示效果更好。
【參考文獻(xiàn)】
[1]彭正文主編.Java程序設(shè)計.中國鐵道出版社.
[2]譚浩強主編.Java程序設(shè)計.清華大學(xué)出版社.
[3]http://java.sun.com/index.jsp.