FileDocCategorySizeDatePackage
ColourChooser.javaAPI DocExample6241Thu Feb 03 08:18:02 GMT 2000None

ColourChooser.java

// File: ColourChooser.java

// T Balls : March 1998

// A ColourChooser implemented as a modal Dialog

// Changes the background colour of the Frame that lanches it

// Scrollbars are used to adjust the colour which is displayed

// on the ColourChooser.  The ColourChooser may update the parent's

// background colour.  Cancelling the Dialog will restore the parent

// backgound colour - Closing will leave it changed.



import java.awt.*;

import java.awt.event.*;



public class ColourChooser extends Dialog 

                           implements AdjustmentListener, 

                                      ActionListener

{  public ColourChooser( Frame f, boolean m )

   {  super( f, "Colour Chooser", m );  // pass to parent.

      // save reference to parent

      parent = f;

      // and current background colour

      oldBkg = f.getBackground();

      

      // Controls and labels to add to West of Dialog

      Panel p = new Panel();

      p.setLayout( new BorderLayout() );

      

      // Labels

      Panel ppN = new Panel();

      ppN.setLayout( new GridLayout( 1, 3 ) );

      ppN.add( redL );

      ppN.add( greenL );

      ppN.add( blueL );

      p.add( "North", ppN );

      

      // Scrollbars

      Panel ppC = new Panel();

      ppC.setLayout( new GridLayout( 1, 3 ) );

      redSB.setValues( 127, 1, 0, 256 );

      redSB.setBlockIncrement( 8 );

      redSB.addAdjustmentListener( this );

      ppC.add( redSB );



      greenSB.setValues( 127, 1, 0, 256 );

      greenSB.setBlockIncrement( 8 );

      greenSB.addAdjustmentListener( this );

      ppC.add( greenSB );



      blueSB.setValues( 127, 1, 0, 256 );

      blueSB.setBlockIncrement( 8 );

      blueSB.addAdjustmentListener( this );

      ppC.add( blueSB );

      

      p.add( "Center", ppC );



      Panel ppS = new Panel();

      ppS.setLayout( new GridLayout( 1, 3 ) );

      ppS.add( new Label( "R", Label.CENTER ) );

      ppS.add( new Label( "G", Label.CENTER ) );

      ppS.add( new Label( "B", Label.CENTER ) );

      p.add( "South", ppS );

      

      add( "West", p );

      

      // Canvas that is used to show current colour

      disp.setSize( 50, 150 );

      add( "Center", disp );



      // buttons to control interaction with parent

      Panel buttons = new Panel();

      Button dismiss = new Button( "Close" );

      dismiss.addActionListener( this );

      buttons.add( dismiss );

      Button apply = new Button( "Apply" );

      apply.addActionListener( this );

      buttons.add( apply );

      Button cancel = new Button( "Cancel" );

      cancel.addActionListener( this );

      buttons.add( cancel );

      

      add( "South", buttons );

      

      // ensure that disp has corrent colour

      setColour();



      pack();

      setVisible( true );      

   }

   

   // Method called when any of the Scrollbars is altered

   public void adjustmentValueChanged( AdjustmentEvent e )

   {  if( e.getAdjustable() instanceof Scrollbar )

      // get the actual Scrollbar responsible for this change

      {  Scrollbar s = (Scrollbar)(e.getAdjustable() );

         int value = 255-e.getValue(); // 0 at top!

         if( s == redSB )

         {  red = value;

            redL.setText( "" + value );

         }

         if( s == greenSB )

         {  green = value;

            greenL.setText( "" + value );

         }

         if( s == blueSB )

         {  blue = value;

            blueL.setText( "" + value );

         }

         setColour(); // update disp

      }

   }

   

   // Method called by interaction Buttons

   public void actionPerformed( ActionEvent e )

   {  String label = e.getActionCommand();

      if( label.equals( "Close" ) )

      {  setVisible( false ); // disappear and cease

         dispose();   // release resources

      }

      if( label.equals( "Apply" ) )

      {  parent.setBackground( new Color( red, green, blue ) );

         parent.repaint(); // update parent

      }

      if( label.equals( "Cancel" ) )

      {  parent.setBackground( oldBkg ); // restore 

         parent.repaint(); // original parent colour

         setVisible( false );

         dispose();

      }

   }

   

   // update local display panel - local "View"

   private void setColour()

   {  Color c = new Color( red, green, blue );

      disp.setBackground( c );

      disp.repaint();

   }

   

   // local data

   private Frame parent;

   private Color oldBkg;

   private Canvas disp = new Canvas();

   private Label redL = new Label ( "128", Label.CENTER ); 

   private Label greenL = new Label ( "128", Label.CENTER ); 

   private Label blueL = new Label ( "128", Label.CENTER ); 

   private Scrollbar redSB = new Scrollbar( Scrollbar.VERTICAL );

   private Scrollbar greenSB = new Scrollbar( Scrollbar.VERTICAL );

   private Scrollbar blueSB = new Scrollbar( Scrollbar.VERTICAL );

   

   // the "Model"

   private int red = 127;

   private int green = 127;

   private int blue = 127;   

}



// Class to test the ColourChooser object

class TestColChoose extends Frame

{  public TestColChoose()

   {  setTitle( "Test Colour Chooser" );

      setSize( 300, 300 );

      Button colour = new Button( "Change Colour" );

      add( "South", colour );

      colour.setForeground( Color.black );

      colour.setBackground( Color.lightGray );

      colour.addActionListener( new ActionListener() {

         public void actionPerformed( ActionEvent e )

         {  new ColourChooser( TestColChoose.this, true );

            // First parameter needs scoping to get reference for

            // the enclosing Frame object

            // Change second parameter to false for non-modal Dialog

         }

      });

      

      addWindowListener( new WindowAdapter() {

         public void windowClosing( WindowEvent e )

         {  System.exit( 0 );

         }

      });

      setVisible( true );   

   }

   

   public static void main( String[] args )

   {  new TestColChoose();

   }

}