2D Graphics GUI Java

//package com.ryanm.util.swing;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.LinkedList;
import java.util.List;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
 * A widget to manipulate an RGBA colour.
 * 
 * @author ryanm
 */
public class RGBAColourChooser extends Box implements ChangeListener
{
  private JLabel redLabel = new JLabel( "R" );
  private JSlider redSlider = new JSlider( 0, 255 );
  private JLabel greenLabel = new JLabel( "G" );
  private JSlider greenSlider = new JSlider( 0, 255 );
  private JLabel blueLabel = new JLabel( "B" );
  private JSlider blueSlider = new JSlider( 0, 255 );
  private JLabel alphaLabel = new JLabel( "A" );
  private JSlider alphaSlider = new JSlider( 0, 255 );
  private Box sliderBox;
  private Color oldValue = Color.WHITE;
  private List listeners = new LinkedList();
  private JPanel previewer = new JPanel() {
    @Override
    public void paint( Graphics g )
    {
      int width = getWidth();
      int height = getHeight();
      g.setColor( Color.white );
      g.fillRect( 0, 0, width, height );
      g.setColor( Color.black );
      g.fillRect( 0, height / 2, width / 2, height / 2 );
      g.fillRect( width / 2, 0, width / 2, height / 2 );
      g.setColor( oldValue );
      g.fillRect( width / 4, height / 4, width / 2, height / 2 );
    }
    @Override
    public Dimension getPreferredSize()
    {
      int size = sliderBox.getHeight();
      size = size == 0 ? 64 : size;
      return new Dimension( size, size );
    }
    @Override
    public Dimension getMaximumSize()
    {
      return getPreferredSize();
    }
  };
  /**
   * Constructs a new RGBAColourChooser
   */
  public RGBAColourChooser()
  {
    super( BoxLayout.X_AXIS );
    Box rb = new Box( BoxLayout.X_AXIS );
    rb.add( redLabel );
    rb.add( redSlider );
    Box gb = new Box( BoxLayout.X_AXIS );
    gb.add( greenLabel );
    gb.add( greenSlider );
    Box bb = new Box( BoxLayout.X_AXIS );
    bb.add( blueLabel );
    bb.add( blueSlider );
    Box ab = new Box( BoxLayout.X_AXIS );
    ab.add( alphaLabel );
    ab.add( alphaSlider );
    redSlider.setValue( oldValue.getRed() );
    greenSlider.setValue( oldValue.getGreen() );
    blueSlider.setValue( oldValue.getBlue() );
    alphaSlider.setValue( oldValue.getAlpha() );
    redSlider.addChangeListener( this );
    greenSlider.addChangeListener( this );
    blueSlider.addChangeListener( this );
    alphaSlider.addChangeListener( this );
    redSlider.setToolTipText( String.valueOf( redSlider.getValue() ) );
    greenSlider.setToolTipText( String.valueOf( greenSlider.getValue() ) );
    blueSlider.setToolTipText( String.valueOf( blueSlider.getValue() ) );
    alphaSlider.setToolTipText( String.valueOf( alphaSlider.getValue() ) );
    sliderBox = new Box( BoxLayout.Y_AXIS );
    sliderBox.add( rb );
    sliderBox.add( gb );
    sliderBox.add( bb );
    sliderBox.add( ab );
    add( previewer );
    add( Box.createHorizontalStrut( 5 ) );
    add( sliderBox );
  }
  /**
   * Sets the widget's selected colour
   * 
   * @param color
   *           The new colour
   */
  public void setColour( Color color )
  {
    if( !oldValue.equals( color ) )
    {
      // copy the values
      oldValue = color;
      redSlider.removeChangeListener( this );
      greenSlider.removeChangeListener( this );
      blueSlider.removeChangeListener( this );
      alphaSlider.removeChangeListener( this );
      redSlider.setValue( oldValue.getRed() );
      greenSlider.setValue( oldValue.getGreen() );
      blueSlider.setValue( oldValue.getBlue() );
      alphaSlider.setValue( oldValue.getAlpha() );
      redSlider.setToolTipText( String.valueOf( redSlider.getValue() ) );
      greenSlider.setToolTipText( String.valueOf( greenSlider.getValue() ) );
      blueSlider.setToolTipText( String.valueOf( blueSlider.getValue() ) );
      alphaSlider.setToolTipText( String.valueOf( alphaSlider.getValue() ) );
      redSlider.addChangeListener( this );
      greenSlider.addChangeListener( this );
      blueSlider.addChangeListener( this );
      alphaSlider.addChangeListener( this );
      previewer.repaint();
      ChangeEvent ce = new ChangeEvent( this );
      for( ChangeListener listener : listeners )
      {
        listener.stateChanged( ce );
      }
    }
  }
  /**
   * Gets the widget's currently selected colour
   * 
   * @return The current colour
   */
  public Color getColour()
  {
    return oldValue;
  }
  @Override
  public void stateChanged( ChangeEvent e )
  {
    int red = redSlider.getValue();
    int green = greenSlider.getValue();
    int blue = blueSlider.getValue();
    int alpha = alphaSlider.getValue();
    setColour( new Color( red, green, blue, alpha ) );
  }
  @Override
  public void setEnabled( boolean b )
  {
    alphaLabel.setEnabled( b );
    alphaSlider.setEnabled( b );
    blueLabel.setEnabled( b );
    blueSlider.setEnabled( b );
    greenLabel.setEnabled( b );
    greenSlider.setEnabled( b );
    redLabel.setEnabled( b );
    redSlider.setEnabled( b );
  }
  @Override
  public boolean isEnabled()
  {
    return alphaSlider.isEnabled();
  }
  /**
   * Adds a change listener to this widget. The ChangeListener will
   * be appraised of any changes to the selected colour
   * 
   * @param listener
   *           The listener to add
   */
  public void addChangeListener( ChangeListener listener )
  {
    listeners.add( listener );
  }
  /**
   * Removes a ChangeListener from this widget. The ChangeListener
   * will no longer be appraised of changes to the selected colour
   * 
   * @param listener
   *           The listener to remove
   */
  public void removeChangeListener( ChangeListener listener )
  {
    listeners.remove( listener );
  }
}