Mega Code Archive

 
Categories / Java / Swing JFC
 

An applet that counts down from a specified time

/*  * Copyright (c) 2004 David Flanagan.  All rights reserved.  * This code is from the book Java Examples in a Nutshell, 3nd Edition.  * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.  * You may study, use, and modify it for any non-commercial purpose,  * including teaching and use in open-source projects.  * You may distribute it non-commercially as long as you retain this notice.  * For a commercial use license, or to purchase the book,   * please visit http://www.davidflanagan.com/javaexamples3.  */ import java.applet.AudioClip; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.net.MalformedURLException; import java.net.URL; import java.text.NumberFormat; import javax.swing.ImageIcon; import javax.swing.JApplet; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.Timer; /**  * An applet that counts down from a specified time. When it reaches 00:00, it  * optionally plays a sound and optionally moves the browser to a new page.  * Place the mouse over the applet to pause the count; move it off to resume.  * This class demonstrates most applet methods and features.  */ public class Countdown extends JApplet implements ActionListener, MouseListener {   long remaining; // How many milliseconds remain in the countdown.   long lastUpdate; // When count was last updated   JLabel label; // Displays the count   Timer timer; // Updates the count every second   NumberFormat format; // Format minutes:seconds with leading zeros   Image image; // Image to display along with the time   AudioClip sound; // Sound to play when we reach 00:00   // Called when the applet is first loaded   public void init() {     // Figure out how long to count for by reading the "minutes" parameter     // defined in a <param> tag inside the <applet> tag. Convert to ms.     String minutes = getParameter("minutes");     if (minutes != null)       remaining = Integer.parseInt(minutes) * 60000;     else       remaining = 600000; // 10 minutes by default     // Create a JLabel to display remaining time, and set some properties.     label = new JLabel();     label.setHorizontalAlignment(SwingConstants.CENTER);     label.setOpaque(true); // So label draws the background color     // Read some parameters for this JLabel object     String font = getParameter("font");     String foreground = getParameter("foreground");     String background = getParameter("background");     String imageURL = getParameter("image");     // Set label properties based on those parameters     if (font != null)       label.setFont(Font.decode(font));     if (foreground != null)       label.setForeground(Color.decode(foreground));     if (background != null)       label.setBackground(Color.decode(background));     if (imageURL != null) {       // Load the image, and save it so we can release it later       image = getImage(getDocumentBase(), imageURL);       // Now display the image in the JLabel.       label.setIcon(new ImageIcon(image));     }     // Now add the label to the applet. Like JFrame and JDialog, JApplet     // has a content pane that you add children to     getContentPane().add(label, BorderLayout.CENTER);     // Get an optional AudioClip to play when the count expires     String soundURL = getParameter("sound");     if (soundURL != null)       sound = getAudioClip(getDocumentBase(), soundURL);     // Obtain a NumberFormat object to convert number of minutes and     // seconds to strings. Set it up to produce a leading 0 if necessary     format = NumberFormat.getNumberInstance();     format.setMinimumIntegerDigits(2); // pad with 0 if necessary     // Specify a MouseListener to handle mouse events in the applet.     // Note that the applet implements this interface itself     addMouseListener(this);     // Create a timer to call the actionPerformed() method immediately,     // and then every 1000 milliseconds. Note we don't start the timer yet.     timer = new Timer(1000, this);     timer.setInitialDelay(0); // First timer is immediate.   }   // Free up any resources we hold; called when the applet is done   public void destroy() {     if (image != null)       image.flush();   }   // The browser calls this to start the applet running   // The resume() method is defined below.   public void start() {     resume();   } // Start displaying updates   // The browser calls this to stop the applet. It may be restarted later.   // The pause() method is defined below   public void stop() {     pause();   } // Stop displaying updates   // Return information about the applet   public String getAppletInfo() {     return "Countdown applet Copyright (c) 2003 by David Flanagan";   }   // Return information about the applet parameters   public String[][] getParameterInfo() {     return parameterInfo;   }   // This is the parameter information. One array of strings for each   // parameter. The elements are parameter name, type, and description.   static String[][] parameterInfo = {       { "minutes", "number", "time, in minutes, to countdown from" },       { "font", "font", "optional font for the time display" },       { "foreground", "color", "optional foreground color for the time" },       { "background", "color", "optional background color" },       { "image", "image URL", "optional image to display next to countdown" },       { "sound", "sound URL", "optional sound to play when we reach 00:00" },       { "newpage", "document URL", "URL to load when timer expires" }, };   // Start or resume the countdown   void resume() {     // Restore the time we're counting down from and restart the timer.     lastUpdate = System.currentTimeMillis();     timer.start(); // Start the timer   }   // Pause the countdown   void pause() {     // Subtract elapsed time from the remaining time and stop timing     long now = System.currentTimeMillis();     remaining -= (now - lastUpdate);     timer.stop(); // Stop the timer   }   // Update the displayed time. This method is called from actionPerformed()   // which is itself invoked by the timer.   void updateDisplay() {     long now = System.currentTimeMillis(); // current time in ms     long elapsed = now - lastUpdate; // ms elapsed since last update     remaining -= elapsed; // adjust remaining time     lastUpdate = now; // remember this update time     // Convert remaining milliseconds to mm:ss format and display     if (remaining < 0)       remaining = 0;     int minutes = (int) (remaining / 60000);     int seconds = (int) ((remaining % 60000) / 1000);     label.setText(format.format(minutes) + ":" + format.format(seconds));     // If we've completed the countdown beep and display new page     if (remaining == 0) {       // Stop updating now.       timer.stop();       // If we have an alarm sound clip, play it now.       if (sound != null)         sound.play();       // If there is a newpage URL specified, make the browser       // load that page now.       String newpage = getParameter("newpage");       if (newpage != null) {         try {           URL url = new URL(getDocumentBase(), newpage);           getAppletContext().showDocument(url);         } catch (MalformedURLException ex) {           showStatus(ex.toString());         }       }     }   }   // This method implements the ActionListener interface.   // It is invoked once a second by the Timer object   // and updates the JLabel to display minutes and seconds remaining.   public void actionPerformed(ActionEvent e) {     updateDisplay();   }   // The methods below implement the MouseListener interface. We use   // two of them to pause the countdown when the mouse hovers over the timer.   // Note that we also display a message in the statusline   public void mouseEntered(MouseEvent e) {     pause(); // pause countdown     showStatus("Paused"); // display statusline message   }   public void mouseExited(MouseEvent e) {     resume(); // resume countdown     showStatus(""); // clear statusline   }   // These MouseListener methods are unused.   public void mouseClicked(MouseEvent e) {   }   public void mousePressed(MouseEvent e) {   }   public void mouseReleased(MouseEvent e) {   } }