Uhr
/******************************************************************
* *
* Uhr *
* *
* Author: Michael Kraus *
* Date: 1997/1998/1999 *
* Version: 1.3 *
* JDK Version: 1.0.2 *
* *
* Please contact me via email or visit my homepage: *
* michael.kraus@informatik.uni-muenchen.de *
* www.informatik.uni-muenchen.de/~michael.kraus *
* *
* Use this applet like this: *
* <APPLET code="Uhr.class" width=200 height=200> *
* <PARAM name="timezone" value="120"> *
* </APPLET> *
* *
******************************************************************/
import java.applet.*;
import java.awt.*;
import java.lang.*;
import java.util.*;
public class Uhr extends Applet implements Runnable
{
Thread thread;
ParameterUtilities parameterUtilities;
Polygon lastsecondpolygon;
Polygon lastminutepolygon;
Polygon lasthourpolygon;
int center_x;
int center_y;
int timezoneoffset;
private static final int LOCALTIMEZONEOFFSET=new Date().getTimezoneOffset();
Color hourcolor;
Color minutecolor;
Color secondcolor;
int hourhand;
int minutehand;
int secondhand;
int none=0;
int slide=1;
int bound=2;
int off=0;
int on=1;
String handvalues[]=
{
"none","slide","bound"
};
String secondhandvalues[]=
{
"off","on"
};
Color fifteenminutecolor;
Color fiveminutecolor;
Color oneminutecolor;
int fifteenminute;
int fiveminute;
int oneminute;
int diamonds=1;
int lines=1;
int numbers=2;
String minutevalues[]=
{
"none","diamonds","numbers"
};
String oneminutevalues[]=
{
"none","lines","numbers"
};
Color dialcolor;
Color dialedgecolor;
int dial;
int withedge=1;
int withoutedge=2;
String dialvalues[]=
{
"none","with edge","without edge"
};
private static final int UNDEFINED=0xffff;
public void init()
{
Color backgroundcolor;
thread=null;
parameterUtilities=new ParameterUtilities(this);
lastsecondpolygon=new Polygon();
lastminutepolygon=new Polygon();
lasthourpolygon=new Polygon();
timezoneoffset=parameterUtilities.getIntegerParameter("timezone",UNDEFINED);
secondhand=parameterUtilities.getStringArrayParameter("second hand",secondhandvalues,on);
minutehand=parameterUtilities.getStringArrayParameter("minute hand",handvalues,bound);
hourhand=parameterUtilities.getStringArrayParameter("hour hand",handvalues,slide);
oneminute=parameterUtilities.getStringArrayParameter("1 minute",oneminutevalues,lines);
fiveminute=parameterUtilities.getStringArrayParameter("5 minute",minutevalues,diamonds);
fifteenminute=parameterUtilities.getStringArrayParameter("15 minute",minutevalues,diamonds);
dial=parameterUtilities.getStringArrayParameter("dial",dialvalues,withedge);
dialcolor=parameterUtilities.getColorParameter("dial color",Color.lightGray);
dialedgecolor=parameterUtilities.getColorParameter("dial edge color",Color.darkGray);
if((backgroundcolor=parameterUtilities.getColorParameter("background color",null))!=null)
setBackground(backgroundcolor);
secondcolor=parameterUtilities.getColorParameter("second hand color",Color.red);
minutecolor=parameterUtilities.getColorParameter("minute hand color",hourcolor);
hourcolor=parameterUtilities.getColorParameter("hour hand color",Color.black);
oneminutecolor=parameterUtilities.getColorParameter("1 minute color",Color.darkGray);
fiveminutecolor=parameterUtilities.getColorParameter("5 minute color",Color.white);
fifteenminutecolor=parameterUtilities.getColorParameter("15 minute color",Color.black);
}
Polygon getDiamond(int seconds,double angle,double forwards,double backwards,double sideways)
{
Polygon polygon=new Polygon();
double leftsin=Math.sin((seconds-angle)*Math.PI/30);
double leftcos=Math.cos((seconds-angle)*Math.PI/30);
double middlesin=Math.sin(seconds*Math.PI/30);
double middlecos=Math.cos(seconds*Math.PI/30);
double rightsin=Math.sin((seconds+angle)*Math.PI/30);
double rightcos=Math.cos((seconds+angle)*Math.PI/30);
polygon.addPoint(center_x+(int)(center_x*forwards*middlesin),center_y-(int)(center_y*forwards*middlecos));
polygon.addPoint(center_x+(int)(center_x*sideways*leftsin),center_y-(int)(center_y*sideways*leftcos));
polygon.addPoint(center_x+(int)(center_x*backwards*middlesin),center_y-(int)(center_y*backwards*middlecos));
polygon.addPoint(center_x+(int)(center_x*sideways*rightsin),center_y-(int)(center_y*sideways*rightcos));
return polygon;
}
void drawNumber(Graphics graphics,int seconds,int number,double size,double radius)
{
Font font=new Font("TimesRoman",Font.PLAIN,(int)(Math.min(center_x,center_y)*size));
FontMetrics fontmetrics=getFontMetrics(font);
String string=(new Integer(number)).toString();
int x=center_x+(int)(center_x*radius*Math.sin(seconds*Math.PI/30));
int y=center_y-(int)(center_y*radius*Math.cos(seconds*Math.PI/30));
x-=fontmetrics.stringWidth(string)/2;
y+=fontmetrics.getAscent()/2;
graphics.setFont(font);
graphics.drawString(string,x,y);
}
public void paint(Graphics graphics)
{
int n;
Dimension dimension=size();
center_x=dimension.width/2;
center_y=dimension.height/2;
lastsecondpolygon=new Polygon();
lastminutepolygon=new Polygon();
lasthourpolygon=new Polygon();
if(dial==withedge)
{
graphics.setColor(dialedgecolor);
graphics.fillOval(0,0,dimension.width,dimension.height);
graphics.setColor(dialcolor);
graphics.fillOval((int)(dimension.width*.02),(int)(dimension.height*.02),(int)(dimension.width*.96),(int)(dimension.height*.96));
}
else if(dial==withoutedge)
{
graphics.setColor(dialcolor);
graphics.fillOval(0,0,dimension.width,dimension.height);
}
for(n=0;n<60;n++)
{
if(n%15==0&&fifteenminute==diamonds)
{
graphics.setColor(fifteenminutecolor);
graphics.fillPolygon(getDiamond(n,.4,1,.8,.9));
}
else if(n%15==0&&fifteenminute==numbers)
{
graphics.setColor(fifteenminutecolor);
drawNumber(graphics,n,n==0?12:n/5,.17,.9);
}
else if(n%5==0&&fiveminute==diamonds)
{
graphics.setColor(fiveminutecolor);
graphics.fillPolygon(getDiamond(n,.2,.95,.85,.9));
}
else if(n%5==0&&fiveminute==numbers)
{
graphics.setColor(fiveminutecolor);
drawNumber(graphics,n,n==0?12:n/5,.1,.9);
}
else if(oneminute==lines)
{
double sin=Math.sin(n*Math.PI/30);
double cos=Math.cos(n*Math.PI/30);
graphics.setColor(oneminutecolor);
graphics.drawLine(center_x+(int)(center_x*.88*sin),center_y-(int)(center_y*.88*cos),center_x+(int)(center_x*.92*sin),center_y-(int)(center_y*.92*cos));
}
else if(oneminute==numbers)
{
graphics.setColor(oneminutecolor);
drawNumber(graphics,n,n,.05,.9);
}
}
}
Polygon getHand(double seconds,double forwards,double backwards,double sideways)
{
Polygon polygon=new Polygon();
double sin=Math.sin(seconds*Math.PI/30);
double cos=Math.cos(seconds*Math.PI/30);
polygon.addPoint(center_x+(int)(center_x*forwards*sin),center_y-(int)(center_y*forwards*cos));
polygon.addPoint(center_x+(int)(center_x*sideways*cos),center_y+(int)(center_y*sideways*sin));
polygon.addPoint(center_x-(int)(center_x*backwards*sin),center_y+(int)(center_y*backwards*cos));
polygon.addPoint(center_x-(int)(center_x*sideways*cos),center_y-(int)(center_y*sideways*sin));
return polygon;
}
void drawHand(Graphics graphics,Polygon polygon)
{
graphics.fillPolygon(polygon);
graphics.drawLine(polygon.xpoints[0],polygon.ypoints[0],polygon.xpoints[2],polygon.ypoints[2]);
}
public void update(Graphics graphics)
{
Polygon hourpolygon=new Polygon();
Polygon minutepolygon=new Polygon();
Polygon secondpolygon=new Polygon();
double hours=0;
double minutes;
double seconds;
long time;
Date date=new Date();
if(timezoneoffset!=UNDEFINED)
{
time=date.getTime();
time+=LOCALTIMEZONEOFFSET*60*1000;
time+=timezoneoffset*60*1000;
date.setTime(time);
}
seconds=date.getSeconds();
if(minutehand==slide)
minutes=date.getMinutes()+seconds/60;
else
minutes=date.getMinutes();
if(hourhand==slide)
hours=date.getHours()+minutes/60;
if(hourhand==bound)
hours=date.getHours();
if(hourhand!=none)
hourpolygon=getHand(hours*5,.4,.1,.05);
if(minutehand!=none)
minutepolygon=getHand(minutes,.7,.2,.04);
if(secondhand==on)
secondpolygon=getHand(seconds,.8,.3,.03);
if(dial!=none)
graphics.setColor(dialcolor);
else
graphics.setColor(getBackground());
if(hourhand!=none)
drawHand(graphics,lasthourpolygon);
if(minutehand!=none)
drawHand(graphics,lastminutepolygon);
if(secondhand==on)
drawHand(graphics,lastsecondpolygon);
if(hourhand!=none)
{
graphics.setColor(hourcolor);
drawHand(graphics,hourpolygon);
}
if(minutehand!=none)
{
graphics.setColor(minutecolor);
drawHand(graphics,minutepolygon);
}
if(secondhand==on)
{
graphics.setColor(secondcolor);
drawHand(graphics,secondpolygon);
}
lasthourpolygon=hourpolygon;
lastminutepolygon=minutepolygon;
lastsecondpolygon=secondpolygon;
}
public void run()
{
while(true)
{
repaint();
try
{
thread.sleep(1000-System.currentTimeMillis()%1000);
}
catch(InterruptedException exception)
{
}
}
}
public void start()
{
if(thread==null)
{
thread=new Thread(this);
thread.start();
}
}
public void stop()
{
if(thread!=null)
{
thread.stop();
thread=null;
}
}
}
Back to main applet page
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|