Back to slide -- Keyboard shortcut: 'u'              ColorApplication.java - Swing udgave af farveblanderen.Lecture 13 - slide 10 : 30
Program 1

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;  // Aht. ChangeListener

public class ColorApplication {
  public static void main (String[] args){

      // Select look and feel
      try {
        UIManager.setLookAndFeel(
				 //        UIManager.getCrossPlatformLookAndFeelClassName()
				 //        UIManager.getSystemLookAndFeelClassName()
        "com.sun.java.swing.plaf.motif.MotifLookAndFeel"
        ); } catch(Exception e) {};

      JFrame f = new JFrame("Swing Color Application");
      Container contentPane = f.getContentPane();

      // Arrange for window closing:
      f.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
              System.exit(0);
            }
        });

      ColorPresenter presenter = new ColorPresenter();
      presenter.init();
      contentPane.add("Center", presenter);
      f.pack();
      f.setSize(new Dimension(500,500));
      f.setVisible(true);
  }
} // end ColorModApplication

class ColorPanel extends JPanel {

  public ColorPanel (JLabel lab, JTextField text, 
                     JSlider slider,               // AWT: Scrollbar.
                     ColorListener listener){

     GridBagConstraints c = new GridBagConstraints();
     GridBagLayout gridbag = new GridBagLayout();
     setLayout(gridbag);

     c.fill = GridBagConstraints.HORIZONTAL;

     add(lab); 

     c.gridwidth = GridBagConstraints.REMAINDER;
     gridbag.setConstraints(text, c);
     add(text);

     c.weightx = 1.0;
     c.gridwidth = 1;
     gridbag.setConstraints(slider, c);

     slider.setMajorTickSpacing(50);
     slider.setMinorTickSpacing(5);
     slider.setPaintTicks(true);
     slider.setPaintLabels(true);

     add(slider);

     text.addActionListener (listener);
     slider.addChangeListener (listener);
  }
} // end class ColorPanel


class ColorPresenter extends JPanel {

   public static final int Red = 0;
   public static final int Green = 1;
   public static final int Blue = 2;

   /** Read the color from a text field specified by the parameter */
   public int readColor (int COLOR) {
       String str;
       if (COLOR == Red) str = redTextField.getText();
       else if (COLOR == Green) str = greenTextField.getText();
       else if (COLOR == Blue) str = blueTextField.getText();
       else str = "";
       return Integer.parseInt(str);
   }

   /** Write the color to a text field as specified by the parameters */
   public void writeColor (int COLOR, int val){
       if      (COLOR == Red) redTextField.setText(Integer.toString(val,10));
       else if (COLOR == Green) greenTextField.setText(Integer.toString(val,10));
       else if (COLOR == Blue) blueTextField.setText(Integer.toString(val,10));
   }

   /** Construct individual components */
   private JLabel title = new JLabel ("Color adjuster");

   private JLabel redLabel = new JLabel ("Red:");
   private JTextField redTextField = new JTextField ("0",5);
   private JSlider redSlider = new JSlider(JSlider.HORIZONTAL,0,255,0);

   private JLabel greenLabel = new JLabel ("Green:");
   private JTextField greenTextField = new JTextField ("0",5);
   private JSlider greenSlider = new JSlider(JSlider.HORIZONTAL,0,255,0);

   private JLabel blueLabel = new JLabel ("Blue:");
   private JTextField blueTextField = new JTextField ("0",5);
   private JSlider blueSlider = new JSlider(JSlider.HORIZONTAL,0,255,0);
   
   private JLabel hexTextField = new JLabel ("#000000");
   private ColorBlop colorBlop = new ColorBlop(Color.white);

   private ColorListener listener = new ColorListener (this);

   private ColorPanel redGroup = 
     new ColorPanel(redLabel, redTextField, redSlider, listener);
   private ColorPanel greenGroup = 
     new ColorPanel(greenLabel, greenTextField, greenSlider, listener);
   private ColorPanel blueGroup =
     new ColorPanel(blueLabel, blueTextField, blueSlider, listener);

   /** Color Presenter Init */
   public void init() {

       setLayout(new GridLayout(6,1));

       add(title);
       add(redGroup); add(greenGroup); add(blueGroup); 
       add(colorBlop);    
       add(hexTextField);

       adjust();

   } //end init

   private boolean inColorRange (int c){
       return c >= 0 && c <= 255;
   }

   /* Given the scrollbar sl has changed it's value to val,
       adjust the user interface*/
   public void sliderAdjust (JSlider sl, int val){
     if (sl == redSlider) writeColor(Red, val);
     else if (sl == greenSlider) writeColor(Green, val);
     else if (sl == blueSlider) writeColor(Blue, val);
     adjust();
   }
 
   /* Given that a text field has been changed,
      adjust the user interface */   
   public void adjust() {
      Color newColor;
      int r,g,b;
      r = readColor(Red); g = readColor(Green); b = readColor(Blue);
      if (inColorRange(r) && inColorRange(g) && inColorRange(b)){
         newColor = new INColor(readColor(Red), readColor(Green), readColor(Blue));
         colorBlop.setColor(newColor);
         colorBlop.repaint();
         hexTextField.setText(newColor.toString());

         // adjust scrollbars:
         redSlider.setValue(r); greenSlider.setValue(g); blueSlider.setValue(b);
      } else  hexTextField.setText("ERROR");
    }

  /* Puts a little space between the panel and its contents */
  public Insets getInsets() {
     return new Insets(10,10,10,10);
  }
}

class ColorListener implements ActionListener, ChangeListener {    // AWT: AdjustmentListener. 
  // Listens to events from components of a ColorPresenter

  private ColorPresenter presentation;
  private INColor currentColor;

  public ColorListener (ColorPresenter presentation){
    this.presentation = presentation;
  }

  public void actionPerformed(ActionEvent action){
    presentation.adjust();
  }

  public void stateChanged (ChangeEvent adjustment){
    JSlider source = (JSlider)adjustment.getSource();
    presentation.sliderAdjust(source, (int)source.getValue());
  }
} // end class ColorListener

class ColorBlop extends JPanel {            // AWT: Canvas.

  private Color currentColorOfBlop;

  ColorBlop(Color c){
    currentColorOfBlop = c;
  }

  public void setColor (Color c){
    currentColorOfBlop = c;
  }

  public void paintComponent (Graphics page) {        // AWT: paint.
    super.paintComponent(page);
    page.setColor(currentColorOfBlop);
    page.fillRect(0,0,2000,200);    // bred nok ...
  }

} // end class ColorBlop


/** Color class extended with internet color encoding operation
    which is redefined via toString() */
class INColor extends Color {

  public INColor(int red, int green, int blue) {
    super(red,green,blue);
  }

  private String twoCharColor(int colorNumber){
  /* Convert the parameter, a color, to a hexadecimal number of length exactly two */
     if (colorNumber >= 0 && colorNumber < 16) return "0" + Integer.toHexString(colorNumber);
     else if (colorNumber >= 16 && colorNumber < 256) return  Integer.toHexString(colorNumber);
     else return "??";
  }

  public String toString () {
  /** Return the seven character long internet color encoding of this color */
    return "#" + twoCharColor(getRed()) + twoCharColor(getGreen()) + twoCharColor(getBlue());
  }

}