Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

A widget to manipulate an RGBA colour

//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<ChangeListener> listeners = new LinkedList<ChangeListener>();   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 );   } }