1  import java.applet.*;
  2  import javax.swing.*;
  3  import java.awt.event.*;
  4  import java.awt.*;
  5  
  6  public class ClockWithAudioOnSeparateThread extends JApplet {
  7    protected AudioClip[] hourAudio = new AudioClip[12];
  8    protected AudioClip[] minuteAudio = new AudioClip[60];
  9  
 10    // Create audio clips for pronouncing am and pm
 11    protected AudioClip amAudio =
 12      Applet.newAudioClip(this.getClass().getResource("/audio/am.au"));
 13    protected AudioClip pmAudio =
 14      Applet.newAudioClip(this.getClass().getResource("/audio/pm.au"));
 15  
 16    // Create a clock
 17    private StillClock clock = new StillClock();
 18  
 19    // Create a timer
 20    private Timer timer = new Timer(1000, new TimerListener());
 21  
 22    // Create a label to display time
 23    private JLabel jlblDigitTime = new JLabel("", JLabel.CENTER);
 24  
 25    @Override /** Initialize the applet */
 26    public void init() {
 27      // Create audio clips for pronouncing hours
 28      for (int i = 0; i < 12; i++)
 29        hourAudio[i] = Applet.newAudioClip(
 30          this.getClass().getResource("/audio/hour" + i + ".au"));
 31  
 32      // Create audio clips for pronouncing minutes
 33      for (int i = 0; i < 60; i++)
 34        minuteAudio[i] = Applet.newAudioClip(
 35          this.getClass().getResource("/audio/minute" + i + ".au"));
 36  
 37      // Add clock and time label to the content pane of the applet
 38      add(clock, BorderLayout.CENTER);
 39      add(jlblDigitTime, BorderLayout.SOUTH);
 40    }
 41  
 42    @Override /** Override the applet's start method */
 43    public void start() {
 44      timer.start(); // Resume clock
 45    }
 46  
 47    @Override /** Override the applet's stop method */
 48    public void stop() {
 49      timer.stop(); // Suspend clock
 50    }
 51  
 52    private class TimerListener implements ActionListener {
 53      @Override
 54      public void actionPerformed(ActionEvent e) {
 55        clock.setCurrentTime();
 56        clock.repaint();
 57        jlblDigitTime.setText(clock.getHour() + ":" + clock.getMinute()
 58          + ":" + clock.getSecond());
 59        if (clock.getSecond() == 0)
 60          announceTime(clock.getHour(), clock.getMinute());
 61      }
 62    }
 63  
 64    /** Announce the current time at every minute */
 65    public void announceTime(int h, int m) {
 66      new Thread(new AnnounceTimeOnSeparateThread(h, m)).start();
 67    }
 68  
 69    /** Inner class for announcing time */
 70    class AnnounceTimeOnSeparateThread implements Runnable {
 71      private int hour, minute;
 72  
 73      /** Get Audio clips */
 74      public AnnounceTimeOnSeparateThread(int hour, int minute) {
 75        this.hour = hour;
 76        this.minute = minute;
 77      }
 78  
 79      public void run() {
 80        // Announce hour
 81        hourAudio[hour % 12].play();
 82  
 83        try {
 84          // Time delay to allow hourAudio play to finish
 85          Thread.sleep(1500);
 86  
 87          // Announce minute
 88          minuteAudio[minute].play();
 89  
 90          // Time delay to allow minuteAudio play to finish
 91          Thread.sleep(1500);
 92        }
 93        catch (InterruptedException ex) {
 94        }
 95  
 96        // Announce am or pm
 97        if (hour < 12)
 98          amAudio.play();
 99        else
100          pmAudio.play();
101      }
102    }
103  
104    public static void main(String[] args) {
105      ClockWithAudioOnSeparateThread applet = new ClockWithAudioOnSeparateThread();
106      applet.init();
107      applet.start();
108      JFrame frame = new JFrame();
109      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
110      frame.setTitle("ClockWithAudio");
111      frame.getContentPane().add(applet, BorderLayout.CENTER);
112      frame.setSize(400, 320);
113      frame.setVisible(true);
114    }
115  }