Thursday, July 7, 2011

Implement Java Clock Using Applet And Thread


In this program we are going to learn how we can make a clock using Java Thread. We are using  the applet for graphical presentations (GUI).We are making a thread which is timer thread .This is for display the time clock. We  implements the class  by Runnable interface to make a thread as we know we can make thread by two ways 1.By extends Thread Class and 2.by implements Runnable interface. We are using Runnable interface because in java we can not make multiple inheritance .We are extend here Applet here for make GUI.   

package org.best.examples;
import java.util.*;
import java.awt.*;
import java.applet.*;
import java.text.*;


public class Clock extends Applet implements
 Runnable {
    private volatile Thread timer;       
// The thread that displays clock
    private int lastxs, lastys, lastxm,
                lastym, lastxh, lastyh;  
// Dimensions used to draw hands 
    private SimpleDateFormat formatter;  
// Formats the date displayed
    private String lastdate;             
// String to hold date displayed
    private Font clockFaceFont;          
// Font for number display on clock
    private Date currentDate;            
// Used to get date to display
    private Color handColor;            
 // Color of main hands and dial
    private Color numberColor;           
// Color of second hand and numbers
    private int xcenter = 80, ycenter = 55; 
// Center position

    public void init() {
        int x,y;
        lastxs = lastys = lastxm = lastym = 
lastxh = lastyh = 0;
        formatter = new SimpleDateFormat 
("EEE MMM dd hh:mm:ss yyyy", 
                                         
 Locale.getDefault());
        currentDate = new Date();
        lastdate = formatter.format(currentDate);
        clockFaceFont = new Font("Serif",
 Font.PLAIN, 14);
       

        try {
            setBackground(Color.green);
        } catch (NullPointerException e) {
        } catch (NumberFormatException e) {
        }
        try {
            handColor = new Color(1,24,16);
        } catch (NullPointerException e) {
        } catch (NumberFormatException e) {
        }
        try {
            numberColor = new Color(6,9,16);
        } catch (NullPointerException e) {
        } catch (NumberFormatException e) {
        }
        resize(300,300);              
// Set clock window size
    }

    // Paint is the main part of the program
    public void update(Graphics g) {
        int xh, yh, xm, ym, xs, ys;
        int s = 0, m = 10, h = 10;
        String today;

        currentDate = new Date();
        
        formatter.applyPattern("s");
        try {
            s = Integer.parseInt(formatter.
format(currentDate));
        } catch (NumberFormatException n) {
            s = 0;
        }
        formatter.applyPattern("m");
        try {
            m = Integer.parseInt(formatter.
format(currentDate));
        } catch (NumberFormatException n) {
            m = 10;
        }    
        formatter.applyPattern("h");
        try {
            h = Integer.parseInt(formatter.
format(currentDate));
        } catch (NumberFormatException n) {
            h = 10;
        }
    
        // Set position of the ends of the hands
        xs = (int) (Math.cos(s * Math.PI / 30 
- Math.PI / 2) * 45 + xcenter);
        ys = (int) (Math.sin(s * Math.PI / 30 
- Math.PI / 2) * 45 + ycenter);
        xm = (int) (Math.cos(m * Math.PI / 30
 - Math.PI / 2) * 40 + xcenter);
        ym = (int) (Math.sin(m * Math.PI / 30 
- Math.PI / 2) * 40 + ycenter);
        xh = (int) (Math.cos((h*30 + m / 2) 
* Math.PI / 180 - Math.PI / 2) * 30
                   + xcenter);
        yh = (int) (Math.sin((h*30 + m / 2) 
* Math.PI / 180 - Math.PI / 2) * 30
                   + ycenter);
    
        // Get the date to print at the bottom
        formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy");
        today = formatter.format(currentDate);

        g.setFont(clockFaceFont);
        // Erase if necessary
        g.setColor(getBackground());
        if (xs != lastxs || ys != lastys) {
            g.drawLine(xcenter, ycenter, lastxs, lastys);
            g.drawString(lastdate, 5, 125);
        }
        if (xm != lastxm || ym != lastym) {
            g.drawLine(xcenter, ycenter-1, lastxm, lastym);
            g.drawLine(xcenter-1, ycenter, lastxm, lastym); 
        }
        if (xh != lastxh || yh != lastyh) {
            g.drawLine(xcenter, ycenter-1, lastxh, lastyh);
            g.drawLine(xcenter-1, ycenter, lastxh, lastyh); 
        }

        // Draw date and hands
        g.setColor(numberColor);
        g.drawString(today, 5, 125);    
        g.drawLine(xcenter, ycenter, xs, ys);
        g.setColor(handColor);
        g.drawLine(xcenter, ycenter-1, xm, ym);
        g.drawLine(xcenter-1, ycenter, xm, ym);
        g.drawLine(xcenter, ycenter-1, xh, yh);
        g.drawLine(xcenter-1, ycenter, xh, yh);
        lastxs = xs; lastys = ys;
        lastxm = xm; lastym = ym;
        lastxh = xh; lastyh = yh;
        lastdate = today;
        currentDate = null;
    }

    public void paint(Graphics g) {
        g.setFont(clockFaceFont);
        // Draw the circle and numbers
        g.setColor(handColor);
        g.drawArc(xcenter-50, ycenter-50, 100, 100, 0, 360);
        g.setColor(numberColor);
        g.drawString("9", xcenter-45, ycenter+3); 
        g.drawString("3", xcenter+40, ycenter+3);
        g.drawString("12", xcenter-5, ycenter-37);
        g.drawString("6", xcenter-3, ycenter+45);

        // Draw date and hands
                g.setColor(numberColor);
        g.drawString(lastdate, 5, 125);    
        g.drawLine(xcenter, ycenter, lastxs, lastys);
        g.setColor(handColor);
        g.drawLine(xcenter, ycenter-1, lastxm, lastym);
        g.drawLine(xcenter-1, ycenter, lastxm, lastym);
        g.drawLine(xcenter, ycenter-1, lastxh, lastyh);
        g.drawLine(xcenter-1, ycenter, lastxh, lastyh); 
    }

    public void start() {
        timer = new Thread(this);
        timer.start();
    }

    public void stop() {
        timer = null;
    }

    public void run() {
        Thread me = Thread.currentThread();
        while (timer == me) {
            try {
                Thread.currentThread().sleep(100);
            } catch (InterruptedException e) {
            }
            repaint();
        }
    }
}

No comments: