001    /*
002     * LAPIS lightweight structured text processing system
003     *
004     * Copyright (C) 1998-2002 Carnegie Mellon University,
005     * Copyright (C) 2003 Massachusetts Institute of Technology.
006     * All rights reserved.
007     *
008     * This library is free software; you can redistribute it
009     * and/or modify it under the terms of the GNU General
010     * Public License as published by the Free Software
011     * Foundation, version 2.
012     *
013     * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/
014     */
015    package lapisx.swing;
016    
017    import java.awt.Color;
018    import java.awt.event.ActionEvent;
019    import java.awt.event.ActionListener;
020    
021    import javax.swing.JLabel;
022    import javax.swing.Timer;
023    
024     /**
025       * Label that can flash (change color briefly) on demand.
026       * Useful for status messages that need to call attention to themselves.
027       */    
028    public class FlashingLabel extends JLabel {
029        Timer timer;
030        Color flashColor;
031        Color normalColor;
032    
033        static int DELAY = 500; // milliseconds
034        
035        /**
036         * Make a FlashingLabel.
037         * @param text Text for label
038         */
039        public FlashingLabel (String text) {
040            super (text);
041            timer = new Timer (DELAY, new ActionListener () {
042                public void actionPerformed (ActionEvent event) {
043                    stopFlashing ();
044                }
045            });
046            timer.setCoalesce (true);
047            timer.setRepeats (false);
048            
049            flashColor = Color.red;
050            normalColor = getForeground ();
051        }
052        
053        public void setForeground (Color c) {
054            super.setForeground (c);
055            normalColor = c;
056        }
057        
058        /**
059         * Set the color used when the label flashes. 
060         * @param c flash color
061         */
062        public void setFlashColor (Color c) {
063            flashColor = c;
064        }
065        
066        /**
067         * Get the color used when the label flashes. 
068         * @return flash color
069         */
070        public Color getFlashColor (Color c) {
071            return flashColor;
072        }
073        
074        /**
075         * Flash the label.  Automatically stops flashing after a delay.
076         */
077        public void startFlashing () {
078            if (flashColor == null)
079                return;
080            super.setForeground (flashColor);
081            timer.restart ();
082        }
083    
084        /**
085         * Force the label to stop flashing, if it's currently flashing.
086         * Normally happens automatically after a delay, so it's
087         * not usually necessary to call this.
088         */ 
089        public void stopFlashing () {
090            super.setForeground (normalColor);
091            timer.stop ();
092        }
093    }