/** * @(#)WheelsAndSlidersMain.java * * Copyright (c) 2008 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.samples.color; import org.jhotdraw.color.*; import java.awt.*; import java.awt.color.ColorSpace; import java.awt.color.ICC_ColorSpace; import java.awt.color.ICC_Profile; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * A demo of color wheels and color sliders using all kinds of color systems. * * @author Werner Randelshofer * @version $Id$ */ public class WheelsAndSlidersMain extends javax.swing.JPanel { private static final long serialVersionUID = 1L; private Color color; private JLabel colorLabel; private LinkedList<ColorSliderModel> models; private class Handler implements ChangeListener { private int adjusting; @Override public void stateChanged(ChangeEvent e) { if (adjusting++ == 0) { ColorSliderModel m = (ColorSliderModel) e.getSource(); color = m.getColor(); previewLabel.setBackground(color); for (ColorSliderModel c : models) { if (c != m) { if (c.getColorSpace().equals(m.getColorSpace())) { // If the color system is the same, directly set the components (=lossless) for (int i = 0; i < m.getComponentCount(); i++) { c.setComponent(i, m.getComponent(i)); } } else { // If the color system is different, set the RGB color (=lossy) c.setColor(color); } } } } adjusting--; } } private Handler handler; /** * Creates new form. */ public WheelsAndSlidersMain() { initComponents(); models = new LinkedList<ColorSliderModel>(); handler = new Handler(); previewLabel.setOpaque(true); // RGB panels chooserPanel.add(createSliderChooser(ColorSpace.getInstance(ColorSpace.CS_sRGB))); chooserPanel.add(createColorWheelChooser(ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_sRGB), 0, 1, 2, JColorWheel.Type.SQUARE)); //chooserPanel.add(createColorWheelChooser(ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_LINEAR_RGB), 0, 1, 2, JColorWheel.Type.SQUARE)); // CMYK //chooserPanel.add(createSliderChooser(CMYKGenericColorSpace.getInstance())); chooserPanel.add(createSliderChooser(CMYKNominalColorSpace.getInstance())); // Empty panel chooserPanel.add(new JPanel()); // HSB, HSV, HSL, ... variants chooserPanel.add(createColorWheelChooser(HSBColorSpace.getInstance())); chooserPanel.add(createColorWheelChooser(HSVColorSpace.getInstance())); chooserPanel.add(createColorWheelChooser(HSLColorSpace.getInstance())); chooserPanel.add(createColorWheelChooser(HSLColorSpace.getInstance(), 0, 2, 1)); chooserPanel.add(createColorWheelChooser(HSVPhysiologicColorSpace.getInstance())); chooserPanel.add(createColorWheelChooser(HSLPhysiologicColorSpace.getInstance())); chooserPanel.add(createColorWheelChooser(HSLPhysiologicColorSpace.getInstance(), 0, 2, 1)); chooserPanel.add(new JPanel()); // CIELAB ColorSpace cs; cs = new CIELABColorSpace(); chooserPanel.add(createColorWheelChooser(cs, 1, 2, 0, JColorWheel.Type.SQUARE)); cs = new CIELCHabColorSpace(); chooserPanel.add(createColorWheelChooser(cs, 2, 1, 0, JColorWheel.Type.POLAR)); // CIEXYZ chooserPanel.add(createColorWheelChooser(ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_CIEXYZ), 1, 0, 2, JColorWheel.Type.SQUARE)); chooserPanel.add(createColorWheelChooser(ICC_ColorSpace.getInstance(ICC_ColorSpace.CS_PYCC), 1, 2, 0, JColorWheel.Type.SQUARE)); } private JPanel createColorWheelChooser(ColorSpace sys) { return createColorWheelChooser(sys, 0, 1, 2); } private JPanel createColorWheelChooser(ColorSpace sys, int angularIndex, int radialIndex, int verticalIndex) { return createColorWheelChooser(sys, angularIndex, radialIndex, verticalIndex, JColorWheel.Type.POLAR); } private JPanel createColorWheelChooser(ColorSpace sys, int angularIndex, int radialIndex, int verticalIndex, JColorWheel.Type type) { return createColorWheelChooser(sys, angularIndex, radialIndex, verticalIndex, type, false, false); } private JPanel createColorWheelChooser(ColorSpace sys, int angularIndex, int radialIndex, int verticalIndex, JColorWheel.Type type, boolean flipX, boolean flipY) { JPanel p = new JPanel(new BorderLayout()); final DefaultColorSliderModel m = new DefaultColorSliderModel(sys); models.add(m); m.addChangeListener(handler); JColorWheel w = new JColorWheel(); w.setType(type); w.setAngularComponentIndex(angularIndex); w.setRadialComponentIndex(radialIndex); w.setVerticalComponentIndex(verticalIndex); w.setFlipX(flipX); w.setFlipY(flipY); w.setModel(m); JSlider s = new JSlider(JSlider.VERTICAL); m.configureSlider(verticalIndex, s); p.add(new JLabel("<html>" + ColorUtil.getName(sys) + "<br>α:" + angularIndex + " r:" + radialIndex + " v:" + verticalIndex), BorderLayout.NORTH); p.add(w, BorderLayout.CENTER); p.add(s, BorderLayout.EAST); JPanel pp = new JPanel(); p.add(pp, BorderLayout.SOUTH); for (int i = 0; i < m.getComponentCount(); i++) { final int comp = i; final JTextField tf = new JTextField(); tf.setEditable(false); tf.setColumns(4); ChangeListener cl=new ChangeListener() { NumberFormat df = NumberFormat.getNumberInstance(); @Override public void stateChanged(ChangeEvent e) { df.setMaximumFractionDigits(3); tf.setText(df.format(m.getComponent(comp))); } }; cl.stateChanged(null); m.addChangeListener(cl); pp.add(tf); } return p; } private JPanel createSliderChooser(ColorSpace sys) { return createSliderChooser(sys, false); } private JPanel createSliderChooser(ColorSpace sys, boolean vertical) { JPanel p = new JPanel(new GridBagLayout()); final DefaultColorSliderModel m = new DefaultColorSliderModel(sys); models.add(m); GridBagConstraints gbc = new GridBagConstraints(); if (!vertical) { gbc.gridx = 0; gbc.gridy = 0; p.add(new JLabel( "<html>" + ColorUtil.getName(sys)), gbc); } m.addChangeListener(handler); for (int i = 0; i < m.getComponentCount(); i++) { final int comp = i; JSlider s = new JSlider(JSlider.HORIZONTAL); s.setMajorTickSpacing(50); s.setPaintTicks(true); s.setOrientation(vertical ? JSlider.VERTICAL : JSlider.HORIZONTAL); m.configureSlider(comp, s); if (vertical) { gbc.gridx = i; gbc.gridy = 0; } else { gbc.gridy = i + 1; gbc.gridx = 0; } p.add(s, gbc); final JTextField tf = new JTextField(); tf.setEditable(false); tf.setColumns(4); ChangeListener cl=new ChangeListener() { NumberFormat df = NumberFormat.getNumberInstance(); @Override public void stateChanged(ChangeEvent e) { df.setMaximumFractionDigits(3); tf.setText(df.format(m.getComponent(comp))); } }; cl.stateChanged(null); m.addChangeListener(cl); if (vertical) { gbc.gridx = i; gbc.gridy = 1; } else { gbc.gridy = i + 1; gbc.gridx = 1; } p.add(tf, gbc); } return p; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame("Color Wheels, Squares and Sliders"); f.add(new WheelsAndSlidersMain()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { chooserPanel = new javax.swing.JPanel(); previewLabel = new javax.swing.JLabel(); setLayout(new java.awt.BorderLayout()); chooserPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); chooserPanel.setLayout(new java.awt.GridLayout(0, 4, 10, 10)); add(chooserPanel, java.awt.BorderLayout.CENTER); previewLabel.setText("Selected Color"); add(previewLabel, java.awt.BorderLayout.SOUTH); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel chooserPanel; private javax.swing.JLabel previewLabel; // End of variables declaration//GEN-END:variables }