Mega Code Archive

 
Categories / Java / Swing JFC
 

JColorChooser dialog with a custom preview pane

/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly  */ // ColorPicker3.java //A quick test of the JColorChooser dialog. This example adds a custom //preview pane. // import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class ColorPicker3 extends JFrame {   Color c;   public ColorPicker3() {     super("JColorChooser Test Frame");     setSize(200, 100);     final JButton go = new JButton("Show JColorChoser");     final Container contentPane = getContentPane();     go.addActionListener(new ActionListener() {       final JColorChooser chooser = new JColorChooser();       boolean first = true;       public void actionPerformed(ActionEvent e) {         if (first) {           first = false;           GrayScalePanel gsp = new GrayScalePanel();           chooser.addChooserPanel(gsp);           chooser.setPreviewPanel(new CustomPane());         }         JDialog dialog = JColorChooser.createDialog(ColorPicker3.this,             "Demo 3", true, chooser, new ActionListener() {               public void actionPerformed(ActionEvent e) {                 c = chooser.getColor();               }             }, null);         dialog.setVisible(true);         contentPane.setBackground(c);       }     });     contentPane.add(go, BorderLayout.SOUTH);     // addWindowListener(new BasicWindowMonitor()); // 1.1 & 1.2     setDefaultCloseOperation(EXIT_ON_CLOSE);   }   public class CustomPane extends JPanel {     JLabel j1 = new JLabel("This is a custom preview pane", JLabel.CENTER);     JLabel j2 = new JLabel("This label previews the background",         JLabel.CENTER);     public CustomPane() {       super(new GridLayout(0, 1));       j2.setOpaque(true);       add(j1);       add(j2);     }     public void setForeground(Color c) {       super.setForeground(c);       if (j1 != null) {         j1.setForeground(c);         j2.setBackground(c);       }     }   }   public static void main(String args[]) {     ColorPicker3 cp3 = new ColorPicker3();     cp3.setVisible(true);   } } //GrayScalePanel.java //A simple implementation of the AbstractColorChooserPanel class. This class //provides a slider and a textfield for picking out a shade of gray. // class GrayScalePanel extends AbstractColorChooserPanel implements     ChangeListener, ActionListener {   JSlider scale;   JTextField percentField;   // Set up our list of grays. We'll assume we have all 256 possible shades,   // and we'll do it when the class is loaded.   static Color[] grays = new Color[256];   static {     for (int i = 0; i < 256; i++) {       grays[i] = new Color(i, i, i);     }   }   public GrayScalePanel() {     setLayout(new GridLayout(0, 1));     // create the slider and attach us as a listener     scale = new JSlider(JSlider.HORIZONTAL, 0, 255, 128);     scale.addChangeListener(this);     // Set up our display for the chooser     add(new JLabel("Pick your shade of gray:", JLabel.CENTER));     JPanel jp = new JPanel();     jp.add(new JLabel("Black"));     jp.add(scale);     jp.add(new JLabel("White"));     add(jp);     JPanel jp2 = new JPanel();     percentField = new JTextField(3);     percentField.setHorizontalAlignment(SwingConstants.RIGHT);     percentField.addActionListener(this);     jp2.add(percentField);     jp2.add(new JLabel("%"));     add(jp2);   }   // We did this work in the constructor so we can skip it here.   protected void buildChooser() {   }   // Make sure the slider is in sync with the other panels.   public void updateChooser() {     Color c = getColorSelectionModel().getSelectedColor();     scale.setValue(toGray(c));   }   protected int toGray(Color c) {     int r = c.getRed();     int g = c.getGreen();     int b = c.getBlue();     // Grab the luminance the same way GIMP does...     return (int) Math.round(0.3 * r + 0.59 * g + 0.11 * b);   }   // Pick a name for our tab in the chooser   public String getDisplayName() {     return "Gray Scale";   }   // No need for an icon.   public Icon getSmallDisplayIcon() {     return null;   }   public Icon getLargeDisplayIcon() {     return null;   }   // And lastly, update the selection model as our slider changes.   public void stateChanged(ChangeEvent ce) {     getColorSelectionModel().setSelectedColor(grays[scale.getValue()]);     percentField.setText(""         + (100 - (int) Math.round(scale.getValue() / 2.55)));   }   public void actionPerformed(ActionEvent ae) {     int val = 100 - Integer.parseInt(ae.getActionCommand());     getColorSelectionModel().setSelectedColor(grays[(int) (val * 2.55)]);   } }