View Javadoc

    1   package baseCode.gui;
    2
    3   import java.awt.Color;
    4   import java.awt.Dimension;
    5   import java.awt.FlowLayout;
    6   import java.awt.Font;
    7   import java.awt.GradientPaint;
    8   import java.awt.Graphics;
    9   import java.awt.Graphics2D;
    10  import java.text.DecimalFormat;
    11
    12  import javax.swing.JLabel;
    13  import javax.swing.JPanel;
    14  import javax.swing.SwingConstants;
    15
    16  /***
    17   * A GUI legend component that displays a color map as a color gradient from min to max, traversing all the colors in
    18   * the color map.
    19   *
    20   * @author Will Braynen
    21   * @version $Id: JGradientBar.java,v 1.8 2004/07/27 03:18:58 pavlidis Exp $
    22   */
    23  public class JGradientBar extends JPanel {
    24
    25     protected JNumberLabel m_min;
    26     protected JNumberLabel m_max;
    27     protected JGradientLabel m_gradient;
    28     protected final static Color[] EMPTY = {
    29           Color.GRAY, Color.GRAY
    30     };
    31
    32     /*** Creates a new instance of JGradientBar */
    33     public JGradientBar() {
    34
    35        //      setOpaque( true );
    36        //      setBackground( Color.lightGray );
    37
    38        m_gradient = new JGradientLabel( EMPTY );
    39        m_min = new JNumberLabel();
    40        m_max = new JNumberLabel();
    41        m_min.setHorizontalAlignment( SwingConstants.RIGHT );
    42        m_max.setHorizontalAlignment( SwingConstants.LEFT );
    43
    44        Font font = getFont().deriveFont( Font.BOLD, 13.0f );
    45        m_min.setFont( font );
    46        m_max.setFont( font );
    47
    48        setLayout( new FlowLayout( FlowLayout.LEADING ) );
    49        add( m_min );
    50        add( m_gradient );
    51        add( m_max );
    52     } // end constructor
    53
    54     public void setColorMap( Color[] colorMap ) {
    55        m_gradient.m_colorMap = colorMap;
    56     } // end setColorMap
    57
    58     public void setLabels( double min, double max ) {
    59        m_min.setText( min );
    60        m_max.setText( max );
    61     } // end setLabels
    62
    63  } // end class JGradientBar
    64
    65  class JNumberLabel extends JLabel {
    66
    67     protected static final DecimalFormat m_scientificNotation = new DecimalFormat(
    68           "0.##E0" );
    69     protected static final DecimalFormat m_regular = new DecimalFormat();
    70     protected static final int MINIMUM_WIDTH = 100;
    71     protected static final int WIDTH = 40;
    72
    73     public JNumberLabel() {
    74        super();
    75        init();
    76     }
    77
    78     public JNumberLabel( double number ) {
    79        this();
    80        m_regular.setMaximumFractionDigits( 3 );
    81        setText( number );
    82     }
    83
    84     protected void init() {
    85        //      setOpaque( true );
    86        //      setBackground( Color.lightGray );
    87        Dimension d = new Dimension( WIDTH, JGradientLabel.HEIGHT );
    88        setSize( d );
    89        setPreferredSize( d );
    90     }
    91
    92     public void setText( double number ) {
    93
    94        // Only very small numbers (except for zero) as well as very large numbers
    95        // should be displayed in scientific notation
    96        String text;
    97        if ( ( number != 0 && Math.abs( number ) < 0.01 )
    98              || Math.abs( number ) > 999 ) {
    99           text = m_scientificNotation.format( number );
    100       } else {
    101          text = m_regular.format( number );
    102       }
    103
    104       super.setText( text );
    105    }
    106 }
    107
    108 class JGradientLabel extends JLabel {
    109
    110    // fields
    111    protected static final int WIDTH = 100;
    112    protected static final int HEIGHT = 20;
    113    protected Color[] m_colorMap;
    114
    115    /***
    116     * Creates a new instance of JGradientLabel
    117     *
    118     * @param colorMap Color[]
    119     */
    120    public JGradientLabel( Color[] colorMap ) {
    121
    122       // colorMap should contain at least two colors
    123       if ( 0 == colorMap.length ) {
    124
    125          // if there are no colors, default to grey for both colors
    126
    127          colorMap = new Color[2];
    128          colorMap[0] = colorMap[1] = Color.LIGHT_GRAY;
    129       } else if ( 1 == colorMap.length ) {
    130
    131          // if there is only one color, make the second color the same
    132          Color color = colorMap[0];
    133          colorMap = new Color[2];
    134          colorMap[0] = colorMap[1] = color;
    135       }
    136
    137       m_colorMap = colorMap;
    138
    139       Dimension d = new Dimension( WIDTH, HEIGHT );
    140       setSize( d );
    141       setPreferredSize( d );
    142    } // end constructor
    143
    144    protected void paintComponent( Graphics g ) {
    145
    146       Graphics2D g2 = ( Graphics2D ) g;
    147
    148       final int width = getWidth();
    149       final int height = getHeight();
    150
    151       int x = 0;
    152       int y = 0;
    153
    154       // Go from one color to another, creating a gradient in-between,
    155       // painting from left to right on this component
    156       int intervalCount = m_colorMap.length - 1;
    157       int intervalWidth = width / intervalCount;
    158
    159       for ( int i = 0; i < intervalCount; i++ ) {
    160
    161          Color color1 = m_colorMap[i];
    162          Color color2 = m_colorMap[i + 1];
    163
    164          GradientPaint oneColorToAnother = new GradientPaint( x, y, color1, x
    165                + intervalWidth, y, color2 );
    166          g2.setPaint( oneColorToAnother );
    167          g2.fillRect( x, y, width, height );
    168
    169          // Move to paint the next vertical screen slice of this component
    170          x += ( width / intervalCount );
    171       }
    172    } // end paintComponent
    173 } // end JGradientLabel