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