/**********************************************************************************
* *
* Analog/Digital clock Applet *
* ( AD_Clock.java ) *
* Author : Seiichi Inoue *
**********************************************************************************/
/********************** << Imported package class definition >> *******************/
import java.applet.Applet; /* Applet packages */
import java.awt.*; /* All of the Abstract Windowing Toolkit packages */
import java.util.Date; /* Date packages */
/************************** <<Oneself of class definition>> ***********************/
// Class name : AD_Clock
// Access control : public( Access possibility even from which class )
// Extends class : Applet
// Implements class: Runnable( Use of Thread is enabled )
public class AD_Clock extends Applet implements Runnable {
/************************* << Class attribute of definition >> ********************/
Dimension dm; /* Display range */
Thread kicker=null; /* Thread(Initial value:suspension) */
Image offs; /* Off screen */
Graphics grf; /* Drawing range */
Image img; /* Background image */
MediaTracker mt; /* MediaTracker */
String param; /* Parameter reading */
int imgsw; /* Background image presence info */
int h_fontsize; /* Hour display font information */
int m_fontsize; /* Minute display font information */
int s_fontsize; /* Second display font information */
String sh,h10,h01; /* Hour display letter information */
String sm,m10,m01; /* Minute display letter information*/
String ss,s10,s01; /* Second display letter information*/
int h10x,h10y,h01x,h01y; /* Hour display position information*/
int m10x,m10y,m01x,m01y; /* Minute display position info */
int s10x,s10y,s01x,s01y; /* Second display position info */
int am_pm; /* Morning/Afternoon information */
int cent_x,cent_y; /* Analog clock center coordinate */
boolean digital,analog; /* Display/undisplay information */
int r; /* Size of analog clock */
/***************** << Class of method (implementation procedure) >> ***************/
//
/******** Initialization (init) method *********/
public void init() {
dm = size(); /* Set display screen size */
offs = createImage(dm.width,dm.height); /* Off scr area preparation */
grf = offs.getGraphics(); /* Graphics object extraction */
param = getParameter("image"); /* Background image input reading */
if ( param != null ) { /* Input parameter existence? */
mt = new MediaTracker(this); /* MediaTracker instance */
img = getImage(getCodeBase(),param);/* Background image reading */
mt.addImage(img,0); /* Image load surveillance reg */
imgsw = 1; /* Background image existence info*/
}
else /* No : no designated input */
imgsw = 0; /* No background image info */
param = getParameter("h_fontsize"); /* Hour display font size reading */
h_fontsize = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("m_fontsize"); /* Minute disp font size reading */
m_fontsize = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("s_fontsize"); /* Second disp font size reading */
s_fontsize = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("h10x"); /* Hour 10 places disp position(H)*/
h10x = (param != null)? /* Input determination */
Integer.parseInt(param): 0;
param = getParameter("h10y"); /* Hour 10 places disp position(V)*/
h10y = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("h01x"); /* Hour 1 place disp position(H) */
h01x = (param != null)? /* Input determination */
Integer.parseInt(param): 10;
param = getParameter("h01y"); /* Hour 1 place disp position(V) */
h01y = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("m10x"); /* Minute 10 places disp posi(H) */
m10x = (param != null)? /* Input determination */
Integer.parseInt(param): 30;
param = getParameter("m10y"); /* Minute 10 places disp posi(V) */
m10y = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("m01x"); /* Minute 1 place disp position(H)*/
m01x = (param != null)? /* Input determination */
Integer.parseInt(param): 40;
param = getParameter("m01y"); /* Minute 1 place disp position(V)*/
m01y = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("s10x"); /* Second 10 places disp posi(H) */
s10x = (param != null)? /* Input determination */
Integer.parseInt(param): 60;
param = getParameter("s10y"); /* Second 10 places disp posi(V) */
s10y = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("s01x"); /* Second 1 place disp position(H)*/
s01x = (param != null)? /* Input determination */
Integer.parseInt(param): 70;
param = getParameter("s01y"); /* Second 1 place disp position(V)*/
s01y = (param != null)? /* Input determination */
Integer.parseInt(param): 20;
param = getParameter("clock_x"); /* Analog clock center read(H) */
cent_x = (param != null)? /* Input determination */
Integer.parseInt(param): dm.width/2;
param = getParameter("clock_y"); /* Analog clock center read(V) */
cent_y = (param != null)? /* Input determination */
Integer.parseInt(param): dm.height/2;
param = getParameter("digital"); /* Digital clock display reading */
param = (param != null)? /* Input determination */
param: "true";
if ( "true".equals (param) ) /* Digital clock is displayed? */
digital = true; /* YES: display setting */
else
digital = false; /* NO: undisplay setting */
param = getParameter("analog"); /* Analog clock display reading */
param = (param != null)? /* Input determination */
param: "true";
if ( "true".equals (param) ) /* Analog clock is displayed? */
analog = true; /* YES: display setting */
else
analog = false; /* NO: undisplay setting */
param = getParameter("size"); /* Analog clock size reading */
r = (param != null)? /* Input determination */
Integer.parseInt(param): 60;
} /* End of initial method */
/************ Start (start) method *************/
public void start() {
if ( kicker == null ) { /* Kicker is null? ( Suspension? )*/
kicker = new Thread(this); /* YES: kicker setting */
kicker.start(); /* Setting of start */
}
repaint();
} /* End of start method */
/*********** Repeatedly (run) method ***********/
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
if ( imgsw != 0 ) { /* It is designated an image? */
try { /* Interruption confirmation */
mt.waitForID(0); /* Image load waiting */
} catch( InterruptedException e ) { /* Interruption processing */
System.out.println("Wait Error");
return;
}
}
while( kicker != null) { /* Repeat until kicker becomes null */
repaint(); /* Drawing triggering */
try { /* Interruption confirmation */
kicker.sleep(100); /* Wait 100 milli seconds set */
} catch (InterruptedException e) {} /* Interruption processing */
}
kicker = null; /* Repeate process completion set */
} /* End of run method */
/*********** Renewal (update) method ***********/
public void update(Graphics g) { /* Lost of screen flickering */
paint(g); /* Drawing */
} /* End of update method */
/*********** Drawing (paint) method ************/
public void paint(Graphics g) {
if ( imgsw != 0 ) { /* Background image infor existence? */
if ( mt.isErrorID(0)) { /* Load error? */
g.drawString("Image Load Error....",50,20); /* Error display */
return;
}
if( ! mt.checkID(0)) { /* Loading ? */
g.drawString("Loading....",dm.width/2-30,20); /* Loading display */
return;
}
grf.drawImage(img,0,0,this); /* Image information setting */
}
else { /* NO : */
grf.setColor(Color.black); /* Set backcolor ( black ) */
grf.fillRect(0,0,dm.width,dm.height); /* Paint backcolor */
}
Date d = new Date(); /* Read clock information */
double h = d.getHours(); /* Hour information reading */
double m = d.getMinutes(); /* Minute information reading */
double s = d.getSeconds(); /* Second information reading */
// <<Digital clock drawing processing>>
if ( digital ) { /* Digital clock is displayed? */
/* YES */
if ( h < 12 ) /* Morning? */
am_pm = 0; /* YES:Morning information setting*/
else { /* NO :Afternoon */
h -= 12; /* 12 hours reduction from hour */
am_pm = 1; /* Afternoon information setting */
}
if ( h < 10 ) /* One column ( 0 - 9 )? */
sh = " " + h + " "; /* Two column ( 0 - 9 ) + Blank */
else
sh = h + " "; /* Figure + Blank(for extraction) */
h10 = sh.substring(0,1); /* Hour 10 places figure extracte */
h01 = sh.substring(1,2); /* Hour 1 place figure extracte */
if ( am_pm == 0 ) /* Morning? */
grf.setColor(Color.red); /* Set morning letter color(red) */
else
grf.setColor(Color.green); /*Set afternoon letter color(green)*/
grf.setFont(new Font("Dialog",Font.BOLD,h_fontsize)); /* Set font info */
grf.drawString( h10, h10x, h10y ); /* Set hour 10 places display */
grf.drawString( h01, h01x, h01y ); /* Set hour 1 place display */
if ( m < 10 ) /* One column ( 0 - 9 )? */
sm = "0" + m + " "; /* Two column ( 00 - 09 ) + Blank */
else
sm = m + " "; /* Figure + Blank(for extraction) */
m10 = sm.substring(0,1); /* Minute 10 places fig extracte */
m01 = sm.substring(1,2); /* Minute 1 place fig extracte */
if ( am_pm == 0 ) /* Morning? */
grf.setColor(Color.red); /* Set morning letter color(red) */
else
grf.setColor(Color.green); /*Set afternoon letter color(green)*/
grf.setFont(new Font("Dialog",Font.BOLD,m_fontsize)); /* Set font info */
grf.drawString( m10, m10x, m10y ); /* Set minute 10 places display */
grf.drawString( m01, m01x, m01y ); /* Set minute 1 place display */
if ( s < 10 ) /* One column ( 0 - 9 )? */
ss = "0" + s + " "; /* Two column ( 00 - 09 ) + Blank */
else
ss = s + " "; /* Figure + Blank(for extraction) */
s10 = ss.substring(0,1); /* Second 10 places fig extracte */
s01 = ss.substring(1,2); /* Second 1 place fig extracte */
grf.setColor(Color.red); /* Letter color setting (red) */
grf.setFont(new Font("Dialog",Font.BOLD,s_fontsize)); /* Set font info */
grf.drawString( s10, s10x, s10y ); /* Set second 10 places display */
grf.drawString( s01, s01x, s01y ); /* Set second 1 place display */
}
// <<Analog clock drawing processing>>
if ( analog ) { /* Analog clock is displayed? */
/* YES */
double rd = 3.14159/180; /* Radian value (64bit) */
grf.setColor(Color.yellow); /* Dial plate color setting */
for ( int k=0; k<12; k++ ) { /* Dial plate drawing (Twelve dot)*/
int dx = (int)(cent_x+(r+5)*Math.sin(k*30*rd)); /* Calculate abscissa */
int dy = (int)(cent_y-(r+5)*Math.cos(k*30*rd)); /* Calculate ordinate */
grf.fillRect(dx-3,dy-3,6,6); /* Drawing square of 6 pixel */
}
// With the expression that calculates the width coordinate of the hour hand and
// minute hand the last term(0.5 or 0.4) is a central angle.
// Even if the size of the clock is changed it does not change.
// Therefore, it might had better change it by the size of the clock.
/* Hour hand (short hand) processing*/
int hx2 = (int)(cent_x+r/3*Math.sin((h*5+m/12)*6*rd-0.5));/*Left width(X) */
int hy2 = (int)(cent_y-r/3*Math.cos((h*5+m/12)*6*rd-0.5));/*Left width(Y) */
int hx3 = (int)(cent_x+r*2/3*Math.sin((h*5+m/12)*6*rd)); /*Top(X) */
int hy3 = (int)(cent_y-r*2/3*Math.cos((h*5+m/12)*6*rd)); /*Top(Y) */
int hx4 = (int)(cent_x+r/3*Math.sin((h*5+m/12)*6*rd+0.5));/*Right width(X)*/
int hy4 = (int)(cent_y-r/3*Math.cos((h*5+m/12)*6*rd+0.5));/*Right width(Y)*/
int hxPoint[] = {cent_x,hx2,hx3,hx4}; /* Polygon setting (X) */
int hyPoint[] = {cent_y,hy2,hy3,hy4}; /* Polygon setting (Y) */
grf.setColor(Color.green); /* Hour hand color setting */
grf.fillPolygon(hxPoint,hyPoint,4); /* Hour hand polygon drawing */
/* Minute hand (long hand) processing*/
int mx2 = (int)(cent_x+r/3*Math.sin((m+s/60)*6*rd-0.4)); /*Left width(X) */
int my2 = (int)(cent_y-r/3*Math.cos((m+s/60)*6*rd-0.4)); /*Left width(Y) */
int mx3 = (int)(cent_x+r*Math.sin((m+s/60)*6*rd)); /*Top(X) */
int my3 = (int)(cent_y-r*Math.cos((m+s/60)*6*rd)); /*Top(Y) */
int mx4 = (int)(cent_x+r/3*Math.sin((m+s/60)*6*rd+0.4)); /*Right width(X)*/
int my4 = (int)(cent_y-r/3*Math.cos((m+s/60)*6*rd+0.4)); /*Right width(Y)*/
int mxPoint[] = {cent_x,mx2,mx3,mx4}; /* Polygon setting (X) */
int myPoint[] = {cent_y,my2,my3,my4}; /* Polygon setting (Y) */
grf.setColor(Color.blue); /* Minute hand color setting */
grf.fillPolygon(mxPoint,myPoint,4); /* Minute hand polygon drawing */
/* Second hand processing */
int sx2 = (int)(cent_x+r*Math.sin(s*6*rd));/* Second hand top X coordinate*/
int sy2 = (int)(cent_y-r*Math.cos(s*6*rd));/* Second hand top Y coordinate*/
grf.setColor(Color.red); /* Second hand color setting */
grf.drawLine(cent_x,cent_y,sx2,sy2); /* Second hand drawing */
grf.setColor(Color.red); /* Center dot color setting */
grf.fillOval(cent_x-5,cent_y-5,10,10); /* Drawing circle of 10 pixel */
}
g.drawImage(offs,0,0,this); /* Drawing setting */
} /* End of paint method */
/************ Stop (stop) method ***************/
public void stop() {
if( kicker != null ) { /* Kicker is not null?( action? ) */
kicker.stop(); /* Set kicker to suspension */
kicker = null; /* Set kicker suspension condition*/
}
} /* End of stop method */
} /* End of class setting */
/**********************************************************************************
* End of Analog/Digital clock Applet *
**********************************************************************************/