使用javagui的多时钟
我正在做一个项目,其中我必须使用JavaGUI创建一组6个时钟,显示不同地点的不同时间。我已经成功地创建了使用线程显示一个时钟的代码。但是如何创建6个不同的线程来处理这6个时钟呢? 这是创建单个时钟的以下类:使用javagui的多时钟,java,multithreading,swing,user-interface,Java,Multithreading,Swing,User Interface,我正在做一个项目,其中我必须使用JavaGUI创建一组6个时钟,显示不同地点的不同时间。我已经成功地创建了使用线程显示一个时钟的代码。但是如何创建6个不同的线程来处理这6个时钟呢? 这是创建单个时钟的以下类: public class analogClockGUI extends JPanel implements Runnable{ int secx,secy,lsecx,lsecy; int minx,miny,lminx,lminy;
public class analogClockGUI extends JPanel implements Runnable{
int secx,secy,lsecx,lsecy;
int minx,miny,lminx,lminy;
int hrx,hry,lhrx,lhry;
int secRadius,minRadius,hrRadius,center;
int pointx1,pointy1,pointx2,pointy2;
double dhs,dhm,dhh;
Random rndm;
Thread t;
Font clockFont;
Date incre;
int s,h,m;
boolean off=false,drawFirst=true;
Dimension dimension;
Color wallColor,backColor=Color.black;
int previousMin,previousSec;
int change;
public analogClockGUI()
{
addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent me)
{
dimension=getSize();
if(change!=dimension.height)
{
center=dimension.height/2;
setSize(new Dimension(dimension.height,dimension.height));
}
/*else
{
center=dimension.width/2;
setSize(new Dimension(dimension.width,dimension.width));
}*/
drawFirst=true;
change=dimension.height;
secRadius=(int)(0.7*center);
minRadius=(int)(0.75*center);
hrRadius=(int)(0.5*center);
}
});
init();
}
public void init()
{
rndm=new Random();
t=new Thread(this);
dimension=getSize();
center=dimension.height/2;
secRadius=(int)(0.7*center);
minRadius=(int)(0.75*center);
hrRadius=(int)(0.5*center);
wallColor=new Color(rndm.nextInt(255),rndm.nextInt(255),rndm.nextInt(255));
t.start();
}
public void run() throws NullPointerException
{
while(true)
{
s=new Date().getSeconds();//+incre.getSeconds();
if(s!=previousSec)
{
dhs=Math.toRadians(s*6-90);
secx=(int)(secRadius*Math.cos(dhs))+center;
secy=(int)(secRadius*Math.sin(dhs))+center;
pointx1=(int)((secRadius+center*0.15)*Math.cos(dhs))+center;
pointy1=(int)((secRadius+center*0.15)*Math.sin(dhs))+center;
m=new Date().getMinutes();
dhm=Math.toRadians(m*6-90);
minx=(int)(minRadius*Math.cos(dhm))+center;
miny=(int)(minRadius*Math.sin(dhm))+center;
pointx2=(int)((secRadius+center*0.15)*Math.cos(dhm))+center;
pointy2=(int)((secRadius+center*0.15)*Math.sin(dhm))+center;
h =new Date().getHours();
dhh=Math.toRadians(h*30-90+((m-1)/2));
hrx=(int)(hrRadius*Math.cos(dhh))+center;
hry=(int)(hrRadius*Math.sin(dhh))+center;
repaint();
previousSec=s;
}
try
{
Thread.sleep(100);
if(off)
break;
}catch(InterruptedException e){}
}
}
public void upgate(Graphics g) throws NullPointerException
{
if(drawFirst==true)
{
clockFont=new Font("Serif",Font.PLAIN,(int)(0.2*center));
drawFirst=false;
}
if(m!=previousMin){
if(s==0)
{
wallColor=new Color(rndm.nextInt(255),rndm.nextInt(255),rndm.nextInt(255));
g.setColor(wallColor);
g.fillOval(0,0,2*center,2*center);
g.setColor(backColor);
g.fillOval((int)(0.1*center),(int)(0.1*center),(int)(center*1.8),(int)(center*1.8));
clear(g);
previousMin=m;
}}
drawPoints(g);
g.setColor(Color.white);
g.setFont(clockFont);
g.drawString("12",(int)(0.9*center),(int)(0.25*center));
g.drawString("6",(int)(0.95*center),(int)(1.885*center));
g.drawString("9",(int)(0.11*center),(int)(1.06*center));
g.drawString("3",(int)(1.805*center),(int)(1.07*center));
g.drawString("1",(int)(1.369*center),(int)(0.36*center));
g.drawString("2",(int)(1.674*center),(int)(0.645*center));
g.drawString("4",(int)(1.665*center),(int)(1.485*center));
g.drawString("5",(int)(1.372*center),(int)(1.778*center));
g.drawString("7",(int)(0.545*center),(int)(1.777*center));
g.drawString("8",(int)(0.227*center),(int)(1.485*center));
g.drawString("10",(int)(0.212*center),(int)(0.675*center));
g.drawString("11",(int)(0.522*center),(int)(0.365*center));
if(lsecx!=0)
{
g.setColor(backColor);
g.drawLine(center,center,lsecx,lsecy);
}
g.setColor(Color.green);
g.drawLine(center,center,hrx,hry);
g.drawLine(center+1,center,hrx,hry);
g.drawLine(center-1,center,hrx,hry);
g.drawLine(center,center+1,hrx,hry);
g.drawLine(center,center-1,hrx,hry);
g.drawLine(center+2,center,hrx,hry);
g.drawLine(center-2,center,hrx,hry);
g.drawLine(center,center+2,hrx,hry);
g.drawLine(center,center-2,hrx,hry);
//show the minute hand with bigger size
g.setColor(Color.blue);
g.drawLine(center,center,minx,miny);
g.drawLine(center+1,center,minx,miny);
g.drawLine(center-1,center,minx,miny);
g.drawLine(center,center+1,minx,miny);
g.drawLine(center,center-1,minx,miny);
g.setColor(Color.red);
g.drawLine(center,center,secx,secy);
g.fillOval(center-3,center-3,6,6); //center point
if(m%5!=0)
{
g.setColor(Color.cyan);
g.fillOval(pointx2-2,pointy2-2,4,4);
}
if(s%5!=0)
{
g.setColor(Color.red);
g.fillOval(pointx1-2,pointy1-2,4,4);
}
lminx=minx;
lminy=miny;
lhrx=hrx;
lhry=hry;
lsecx=secx;
lsecy=secy;
}
public void paint(Graphics g) throws NullPointerException
{
g.setColor(wallColor);
g.fillOval(0,0,2*center,2*center);
g.setColor(backColor);
g.fillOval((int)(0.1*center),(int)(0.1*center),(int)(center*1.8),(int)(center*1.8));
upgate(g);
}
public void clear(Graphics g) throws NullPointerException
{
if(lsecx!=0)
{
g.setColor(backColor);
g.drawLine(center,center,lhrx,lhry);
g.drawLine(center+1,center,lhrx,lhry);
g.drawLine(center-1,center,lhrx,lhry);
g.drawLine(center,center+1,lhrx,lhry);
g.drawLine(center,center-1,lhrx,lhry);
g.drawLine(center+2,center,lhrx,lhry);
g.drawLine(center-2,center,lhrx,lhry);
g.drawLine(center,center+2,lhrx,lhry);
g.drawLine(center,center-2,lhrx,lhry);
g.drawLine(center,center,lminx,lminy);
g.drawLine(center+1,center,lminx,lminy);
g.drawLine(center-1,center,lminx,lminy);
g.drawLine(center,center+1,lminx,lminy);
g.drawLine(center,center-1,lminx,lminy);
}
}
public void drawPoints(Graphics g) throws NullPointerException
{
int x1,y1;
double p;
for(int i=1;i<=60;i++)
{
if(i%5!=0)
{
p=i*0.10472;
x1=(int)((secRadius+center*0.15)*Math.cos(p))+center;
y1=(int)((secRadius+center*0.15)*Math.sin(p))+center;
g.setColor(Color.gray);
g.fillOval(x1-2,y1-2,4,4);
}
}
}
public void stop() throws NullPointerException /*close the thread when applet stopped*/
{
off=true;
t=null;
}
}
公共类analogClockGUI扩展JPanel实现可运行{
国际证券交易所、证券交易所、伦敦证交所、伦敦证交所;
int minx,miny,lminx,lminy;
int hrx、hry、lhrx、lhry;
int secRadius、minRadius、hrRadius、center;
int点x1、点y1、点x2、点y2;
双dhs,dhm,dhh;
随机rndm;
螺纹t;
字体时钟字体;
日期递增;
int s,h,m;
布尔值off=false,drawFirst=true;
维度;
颜色墙颜色,背景色=Color.black;
int previousMin,previousSec;
智力变化;
公共图形用户界面()
{
addMouseListener(新的MouseAdapter()
{
公共无效mouseenterned(MouseEvent me)
{
维度=getSize();
如果(更改!=尺寸高度)
{
中心=尺寸。高度/2;
设置尺寸(新尺寸(尺寸.高度,尺寸.高度));
}
/*否则
{
中心=尺寸。宽度/2;
设置尺寸(新尺寸(尺寸.宽度,尺寸.宽度));
}*/
drawFirst=真;
变更=尺寸。高度;
secRadius=(int)(0.7*中心);
最小半径=(整数)(0.75*中心);
hrRadius=(int)(0.5*中心);
}
});
init();
}
公共void init()
{
rndm=新随机数();
t=新螺纹(本螺纹);
维度=getSize();
中心=尺寸。高度/2;
secRadius=(int)(0.7*中心);
最小半径=(整数)(0.75*中心);
hrRadius=(int)(0.5*中心);
wallColor=新颜色(rndm.nextInt(255)、rndm.nextInt(255)、rndm.nextInt(255));
t、 start();
}
public void run()引发NullPointerException
{
while(true)
{
s=新日期().getSeconds();//+incr.getSeconds();
如果(s!=上一秒)
{
dhs=数学托拉迪安(s*6-90);
secx=(int)(secRadius*Math.cos(dhs))+中心;
secy=(int)(secRadius*Math.sin(dhs))+中心;
点x1=(int)((secRadius+中心*0.15)*数学cos(dhs))+中心;
点1=(int)((秒半径+中心*0.15)*数学sin(dhs))+中心;
m=新日期().getMinutes();
dhm=数学托拉迪安(m*6-90);
minx=(int)(minRadius*Math.cos(dhm))+中心;
miny=(int)(minRadius*Math.sin(dhm))+中心;
点x2=(int)((secRadius+中心*0.15)*数学cos(dhm))+中心;
点y2=(int)((secRadius+中心*0.15)*数学sin(dhm))+中心;
h=新日期().getHours();
dhh=数学托拉迪安(h*30-90+((m-1)/2));
hrx=(int)(hrRadius*Math.cos(dhh))+中心;
hry=(int)(hrRadius*Math.sin(dhh))+中心;
重新油漆();
前一秒=秒;
}
尝试
{
睡眠(100);
如果(关闭)
打破
}捕获(中断异常e){}
}
}
public void upgate(图g)抛出NullPointerException
{
如果(drawFirst==true)
{
clockFont=新字体(“衬线”,普通字体,(int)(0.2*中心));
drawFirst=假;
}
如果(m!=上一个最小值){
如果(s==0)
{
wallColor=新颜色(rndm.nextInt(255)、rndm.nextInt(255)、rndm.nextInt(255));
g、 setColor(wallColor);
g、 圆角(0,0,2*中心,2*中心);
g、 设置颜色(背景色);
g、 圆角((int)(0.1*中心),(int)(0.1*中心),(int)(中心*1.8),(int)(中心*1.8));
清晰(g);
previousMin=m;
}}
支取点(g);
g、 setColor(Color.white);
g、 setFont(时钟字体);
g、 抽绳(12英寸,(内)(0.9*中心)(内)(0.25*中心));
g、 抽绳(6英寸,中间距0.95英寸,中间距1.885英寸);
g、 抽绳(9英寸,内)(0.11*中心,(内)(1.06*中心));
g、 拉丝(3英寸,中间)(1.805*中心)(中间)(1.07*中心));
g、 抽绳(1英寸,整数)(1.369*中心,(整数)(0.36*中心));
g、 抽绳(2英寸,内)(1.674*中心,(内)(0.645*中心));
g、 抽绳(4英寸,内部)(1.665*中心)(内部)(1.485*中心));
g、 拉丝(5英寸,中间)(1.372*中心)(中间)(1.778*中心));
g、 拉丝(7英寸,中间距为0.545英寸,中间距为1.777英寸);
g、 抽绳(8英寸,内部)(0.227*中心)(内部)(1.485*中心));
g、 抽绳(10英寸,(内)(0.212*中心)(内)(0.675*中心));
g、 抽绳(11英寸,(整数)(0.522*中心),(整数)(0.365*中心));
如果(lsecx!=0)
{
g、 设置颜色(背景色);
g、 抽绳(中心、中心、lsecx、lsecy);
}
g、 setColor(Color.green);
g、 抽绳(中心、中心、hrx、hry);
g、 抽绳(中心+1,中心,hrx,hry);
g、 抽绳(中心-1,中心,hrx,hry);
g、 抽绳(中心,中心+1,hrx,hry);
g、 抽绳(中心,中心-1,hrx,hry);
g、 抽绳(中心+2,中心,hrx,hry);
g、 抽绳(中心-2,中心,hrx,hry);
g、 抽绳(中心,中心+2,hrx,hry);
g、 抽绳(中心,中心2,hrx,hry);
//显示更大尺寸的分针
g、 setColor(Color.blue);
g、 抽绳(中间,中间,小貂皮,小貂皮);
g、 抽绳(中心+1,中心,minx,miny);
g、 抽绳(中间-1,中间,minx,miny);
g、 抽绳(中心,中心+1,最小,最小);
g、 抽绳(中间,中间-1,minx,miny);
g、 setColor(Color.red);
g、 抽绳(中、中、秒、秒);
g、 填满
public void run() throws NullPointerException {
while (true) {
// !! This is wrong !!
// Each clock should have its own concept of it's start time, then each "second" you
// should advance the time by a single second...
s = new Date().getSeconds();//+incre.getSeconds();
// This is a bad idea...
if (s != previousSec) {
dhs = Math.toRadians(s * 6 - 90);
secx = (int) (secRadius * Math.cos(dhs)) + center;
secy = (int) (secRadius * Math.sin(dhs)) + center;
pointx1 = (int) ((secRadius + center * 0.15) * Math.cos(dhs)) + center;
pointy1 = (int) ((secRadius + center * 0.15) * Math.sin(dhs)) + center;
m = new Date().getMinutes();
dhm = Math.toRadians(m * 6 - 90);
minx = (int) (minRadius * Math.cos(dhm)) + center;
miny = (int) (minRadius * Math.sin(dhm)) + center;
pointx2 = (int) ((secRadius + center * 0.15) * Math.cos(dhm)) + center;
pointy2 = (int) ((secRadius + center * 0.15) * Math.sin(dhm)) + center;
h = new Date().getHours();
dhh = Math.toRadians(h * 30 - 90 + ((m - 1) / 2));
hrx = (int) (hrRadius * Math.cos(dhh)) + center;
hry = (int) (hrRadius * Math.sin(dhh)) + center;
repaint();
previousSec = s;
}