import java.util.*; import java.awt.*; import java.awt.geom.*; import jdsl.core.api.*; import jdsl.core.ref.*; /** * @author Robert Cohen (rfc) * @version JDSL 2 */ public class CountDownTimer extends Canvas implements Runnable { Thread projector; long delay=1000; //one second int time, timeLeft; int xPos; int yPos; boolean initialized; Sequence listeners = new ArraySequence(); boolean running; public CountDownTimer(int secs) { delay = 1000; // once a second timeLeft = secs; time=secs; setFont( new Font( "Arial", Font.BOLD + Font.ITALIC, 36 ) ); }/* init */ public void start() { if( projector == null ) projector = new Thread( this, "CountDownTimer" ); running=true; projector.start(); }/* start */ public void run() { while(running&&(Thread.currentThread()==projector)&&(timeLeft>0)) { try { Thread.sleep( delay ); } catch( InterruptedException e ) {} if (!running) {break;} timeLeft--; notifyListeners(); repaint(); } } public boolean isRunning() { if (projector==null) return false; else return projector.isAlive(); } public void paint( Graphics g ) { if (!initialized) { setPos(); initialized=true; } g.drawString(String.valueOf(timeLeft),xPos,yPos); }/* update */ public void stop() { running = false; projector=null; }/* stop */ public void reset() { stop(); timeLeft=time; repaint(); } public void addCountDownTimerListener(CountDownTimerListener c) { listeners.insertLast(c); } public void notifyListeners() { CountDownTimerEvent e = new CountDownTimerEvent(this, timeLeft); for(ObjectIterator i=listeners.elements();i.hasNext();) ((CountDownTimerListener)i.nextObject()).timerTicked(e); } private void setPos() { Graphics g = getGraphics(); FontMetrics fm=g.getFontMetrics(); String str=String.valueOf(timeLeft); Rectangle2D bounds = fm.getStringBounds(str,g); int textWidth = (int)bounds.getWidth(); int textHeight = (int)bounds.getHeight(); Dimension canvasSize = getSize(); int canvasHeight=canvasSize.height; int canvasWidth=canvasSize.width; xPos = (canvasWidth<textWidth) ? 0 : (canvasWidth-textWidth)/2; yPos = (canvasHeight<textHeight) ? 0 : (canvasHeight-textHeight)/2 + textHeight; } }