FileDocCategorySizeDatePackage
ClockDriver.javaAPI DocExample4626Thu Feb 03 08:18:08 GMT 2000None

ClockDriver.java

// File: ClockDriver.java
// T Balls
// Feb 1998
// Create a clock and some viewers


import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class ClockDriver
{	public static void main( String[] args )
	{  new Controller();
	}
}

// Controller
class Controller extends Frame
{  public Controller()
   {  setTitle( "Controller" );
      // essential parts of the clock app:
      // The "ticker"
      c = new Clock();
      // Views
		c.addObserver( new DigitalClock() );
		c.addObserver( new AnalogClock() );
		c.addObserver( new AnalogClock( "Paris", +1 ) );
		c.addObserver( new AnalogClock( "New York", -5 ) );
		

      // Now complete the controller
      Font f = new Font( "Monospaced", Font.BOLD, 15 );
		hr = new TextField( "00" );
		hr.setFont( f );
		min = new TextField( "00" );
		min.setFont( f );
		sec = new TextField( "00" );
		sec.setFont( f );
      
		Panel displayLine = new Panel();
		
		displayLine.add( hr );
		displayLine.add( min );
		displayLine.add( sec );

		add( "North", displayLine );

		Button b = new Button( "Set Time" );
		add( "Center", b );
		b.addActionListener( new ActionListener() {
		   public void actionPerformed( ActionEvent e )
		   {  int h = Integer.parseInt( hr.getText() );
		      int m = Integer.parseInt( min.getText() );
		      int s = Integer.parseInt( sec.getText() );
            c.setTime( h, m, s ); // ho hum!
		   }
		});
      pack();
      setVisible( true );
		
		addWindowListener( new WindowAdapter() {
		   public void windowClosing( WindowEvent e )
		   {  System.exit(0);		      
		   }
		});
   }
   
   private Clock c;
   private TextField hr;
   private TextField min;
   private TextField sec;
   
}



// Views:

class DigitalClock extends Frame implements Observer
{	public DigitalClock()
	{	setTitle( "Digital" );
	   setLayout( new FlowLayout() );
		display = new Label( "00:00:00" );
		display.setFont( new Font( "Monospaced", Font.BOLD, 36 ) );
		add( display );
		pack();
		setVisible( true );
	}
	
	Label display;
	
	public void update( Observable o, Object t )
	{	if( t instanceof TimeStamp )
		{  display.setText( t.toString() );
			repaint();
		}	
	}
}

class AnalogClock extends Frame implements Observer
{  public AnalogClock( String title, int offset )
   {  setTitle( title );
      setSize( 100, 100 );
      setVisible( true );
      adj = offset;
      i = null;
   }
   
   public AnalogClock()
   {  this( "Analog", 0 );
   }

   private Canvas display;
   private Image i;

   public void update( Graphics g)
   {  paint( g );
   }
   
   public void paint( Graphics g )
   {  if( i != null )
      {  g.drawImage( i, 0, 0, null );
      }
   }

   private int adj;
   public void update( Observable o, Object t )
   {  if( t instanceof TimeStamp )  // alternative
      {  Dimension d = getSize();
         i = createImage( d.width, d.height );
         Insets in = getInsets();
         int dialW = d.width - in.left - in.right;
         int dialH = d.height - in.top -in.bottom;
         int r = (Math.min( dialW, dialH ) - 10 ) / 2;
         int midX = d.width / 2;
         int midY = ( d.height - in.top - in.bottom ) / 2 + in.top;
         Graphics g = i.getGraphics();
         g.setColor( Color.blue );
         g.drawOval( midX-r, midY-r, 2*r, 2*r );
         int endX;
         int endY;

         // for hour
         g.setColor( Color.black );
         int hr = ((TimeStamp)t).getHour() % 12;
         // Time zone adjustment
         hr += adj;
         if( hr < 0 )
         {  hr += 12;
         }
         if( hr > 11 )
         {  hr -= 12;
         }
         
         endX = midX + (int)(75*r/100 * Math.sin( (5*hr+((TimeStamp)t).getMin()/12.0) * Math.PI / 30));
         endY = midY - (int)(75*r/100 * Math.cos( (5*hr+((TimeStamp)t).getMin()/12.0) * Math.PI / 30));
         g.drawLine( midX, midY, endX, endY );

         // for min
         endX = midX + (int)(90*r/100 * Math.sin( ((TimeStamp)t).getMin() * Math.PI / 30));
         endY = midY - (int)(90*r/100 * Math.cos( ((TimeStamp)t).getMin() * Math.PI / 30));
         g.drawLine( midX, midY, endX, endY );
         
         // for sec
         g.setColor( Color.red );
         endX = midX + (int)(95*r/100 * Math.sin( ((TimeStamp)t).getSec() * Math.PI / 30));
         endY = midY - (int)(95*r/100 * Math.cos( ((TimeStamp)t).getSec() * Math.PI / 30));
         g.drawLine( midX, midY, endX, endY );
         g.dispose();
         repaint();
      }
   }
}