StatusLabel.java

package edu.hawaii.ics.yucheng;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.Timer;

/**
 * A status label.
 */
@SuppressWarnings("serial")
class StatusLabel extends JLabel {

    /**
     * A simple class that resets the text when the timer expires.
     */
    class TimerDelegate implements ActionListener {
        /**
         * Executes when the timer expires. Resets the text.
         * 
         * @param arg0 The argument (not used)
         */
        public void actionPerformed(final ActionEvent arg0) {
            resetText();
        }
    }

    /** The default text that appears in the component. */
    private String      myDefaultText;

    /** The timer used to restore the default text. */
    private final Timer myTimer;


    /**
     * Initializes a new instance of the class.
     * 
     * @param text The initial text in the label.
     */
    public StatusLabel(final String text) {
        super(text);

        // Create a timer and listen for events. When the timer expires,
        myTimer = new Timer(0, new TimerDelegate());

        // Do not repeat the timer.
        myTimer.setRepeats(false);
    }


    /**
     * Resets the text in the status label.
     */
    public void resetText() {
        if (myDefaultText != null)
            setText(myDefaultText);
    }


    /**
     * Sets the text that appears when the text is reset or the timer expires.
     * 
     * @param text The text.
     */
    public void setDefaultText(final String text) {
        myDefaultText = text;
    }


    /**
     * Sets the text in the label.
     * 
     * @param text The text.
     */
    @Override
    public void setText(final String text) {
        assert null != text;

        super.setText(text);

        // Stop the timer if it is running. It's possible that it is null since
        // the super's constructor calls this method.
        if (myTimer != null)
            myTimer.stop();
    }


    /**
     * Sets the text in the label with a specified timeout. After the timeout, the
     * default test is displayed.
     * 
     * @param text The text.
     * 
     * @param timeout The timeout in milliseconds.
     */
    public void setText(final String text, final int timeout) {
        assert null != text;
        assert null != myTimer;
        assert timeout >= 0;

        // Set the text and start or restart the timer.
        setText(text);
        myTimer.setInitialDelay(timeout);
        myTimer.restart();
    }
}
Valid HTML 4.01 Valid CSS