//------------// Introduction to Programming Using Java: An Object-Oriented Approach//	Arnow/Weiss//------------import java.util.*;import java.awt.*;import java.awt.event.*;import java.applet.*;public class ClockApplet extends Applet implements ActionListener {	public void init() {		Color backgroundColor = new Color(200,255,255);		this.setLayout(new FlowLayout(FlowLayout.CENTER,4,1));		clock1 = new Label("EST: 00:00:00.00", Label.CENTER);		clock2 = new Label("GMT: 00:00:00.00", Label.CENTER);		clock1Button = new Button(start1ButtonCommand);		clock1Button.addActionListener(this);		clock2Button = new Button(start2ButtonCommand);		clock2Button.addActionListener(this);		clock1Panel = new Panel();		clock1Panel.setLayout(new BorderLayout(2,2));		clock2Panel = new Panel();		clock2Panel.setLayout(new BorderLayout(2,2));		clock1Panel.add("West",clock1Button);		clock1Panel.add("East",clock1);		clock2Panel.add("West",clock2Button);		clock2Panel.add("East",clock2);		mainPanel = new Panel();		mainPanel.setLayout(new BorderLayout(2,2));		mainPanel.add("North",clock1Panel);		mainPanel.add("South",clock2Panel);		add(mainPanel);		setBackground(backgroundColor);	}	public void actionPerformed(ActionEvent ae) {		String whichButton = ae.getActionCommand();		if (whichButton.equals(start1ButtonCommand))			handleStart(1);		else if (whichButton.equals(resume1ButtonCommand))			handleResume(1);		else if (whichButton.equals(stop1ButtonCommand))			handleStop(1);		else if (whichButton.equals(start2ButtonCommand))			handleStart(2);		else if (whichButton.equals(resume2ButtonCommand))			handleResume(2);		else if (whichButton.equals(stop2ButtonCommand))			handleStop(2);	}	private void handleStart(int n) {		if (n==1) {			clock1Button.setLabel(stop1ButtonCommand);			clockTicker1 = new 			ClockThread(clock1,"EST");			clockTicker1.start();		} else if (n==2) {			clock2Button.setLabel(stop2ButtonCommand);			clockTicker2 = new 			ClockThread(clock2,"GMT");			clockTicker2.start();		}	}	private void handleResume(int n) {		if (n==1) {			clock1Button.setLabel(stop1ButtonCommand);			clockTicker1.myResume();		} else if (n==2) {			clock2Button.setLabel(stop2ButtonCommand);			clockTicker2.myResume();		}	}	private void handleStop(int n) {		if (n==1) {			clock1Button.setLabel(resume1ButtonCommand);			clockTicker1.mySuspend();		} else if (n==2) {			clock2Button.setLabel(resume2ButtonCommand);			clockTicker2.mySuspend();		}	}	private    Panel     clock1Panel, clock2Panel, mainPanel;	private    Button    clock1Button, clock2Button;	private    String    start1ButtonCommand= "Start EST",		resume1ButtonCommand= "Resume EST",		stop1ButtonCommand= "Stop EST",		start2ButtonCommand= "Start GMT",		resume2ButtonCommand= "Resume GMT",		stop2ButtonCommand= "Stop GMT";	private    Label     clock1, clock2;	private    ClockThread   clockTicker1,clockTicker2;}class ClockThread extends Thread {	ClockThread(Label theLabel, String timeZone) {		this.clock = theLabel;		this.timeZone = timeZone;	}	public void run() {		amRunning = true;		while (true)			if (amRunning) {				oneTick();				try {					this.sleep(20);				} catch (Exception e) {;}			}	}	public void mySuspend() {		amRunning = false;	}	public void myResume() {		amRunning = true;	}	private void oneTick() {		GregorianCalendar gc = 		new GregorianCalendar(TimeZone.		getTimeZone(timeZone));		int      h = gc.get(Calendar.HOUR);		int      m = gc.get(Calendar.MINUTE);		int      s = gc.get(Calendar.SECOND);		int      ms= gc.get(Calendar.MILLISECOND);		String  hms = leadingDigit(h," ")+":" +		leadingDigit(m,"0")+":" +		leadingDigit(s,"0")+"." +		leadingDigit(ms/10,"0");		clock.setText(hms);	}	private String leadingDigit(int n, String leader) {		if (n<10)			return leader+n;		return ""+n;	}	private Label   clock;	private boolean amRunning;	private String timeZone;}