// 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();
}
}
}
|