ColorPicker.java 5.12 KB
package tp2.ColorPicker;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.*;

public class ColorPicker extends JPanel {

    public static final int padding = 15;
    public static final int baseRed = 0;
    public static final int baseGreen = 0;
    public static final int baseBlue = 0;
    public static final int colorMax = 255;
    public static final int maxSize = String.valueOf(colorMax).length();

    Integer r = baseRed;
    Integer g = baseGreen;
    Integer b = baseBlue;

    JSlider redSlider   = new JSlider(0, colorMax, baseRed);
    JSlider greenSlider = new JSlider(0, colorMax, baseGreen);
    JSlider blueSlider  = new JSlider(0, colorMax, baseBlue);

    JTextField redField   = new JTextField(Integer.toString(r), maxSize);
    JTextField greenField = new JTextField(Integer.toString(g), maxSize);
    JTextField blueField  = new JTextField(Integer.toString(b), maxSize);

    JTextField colorField = new JTextField(String.format("%02X%02X%02x", r, g, b), 10);

    JPanel colorPan = new JPanel();

    public class SliderListener extends MouseAdapter {

        @Override
        public void mouseReleased(MouseEvent e) {
            r = redSlider.getValue();
            g = greenSlider.getValue();
            b = blueSlider.getValue();

            updateValues();
        }
    }

    public class ColorFieldListener extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e){
            String total = colorField.getText();
            if (total.length() < 6) return;

            String rs = total.substring(0,2);
            String gs = total.substring(2,4);
            String bs = total.substring(4, 6);
            int rv, gv, bv;

            try {
                rv = Integer.parseInt(rs, 16);
                gv = Integer.parseInt(gs, 16);
                bv = Integer.parseInt(bs, 16);
                System.out.println("field = "+total);
            } catch (NumberFormatException nfe){
                System.out.println("error while parsing");
                return;
            }

            r=rv;
            g=gv;
            b=bv;
            updateValues();
        }
    }

    public class TextFieldListener extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            String rs = redField.getText();
            String gs = greenField.getText();
            String bs = blueField.getText();
            int rv, gv, bv;

            try {
                rv = Integer.parseInt(rs);
                gv = Integer.parseInt(gs);
                bv = Integer.parseInt(bs);
            } catch (NumberFormatException nfe) {
                System.out.println("error parsing");
                return;
            }

            if (rv >= 0 && rv <= 255) r = rv;
            if (gv >= 0 && gv <= 255) g = gv;
            if (bv >= 0 && bv <= 255) b = bv;

            updateValues();
        }
    }

    public void updateValues() {
        redSlider.setValue(r);
        greenSlider.setValue(g);
        blueSlider.setValue(b);

        redField.setText(Integer.toString(r));
        greenField.setText(Integer.toString(g));
        blueField.setText(Integer.toString(b));

        colorField.setText(String.format("%02X%02X%02X", r, g, b));

        colorPan.setBackground(new Color(r, g, b));
    }

    public ColorPicker() {
        super();
        BoxLayout layout = new BoxLayout(this, BoxLayout.X_AXIS);
        this.setLayout(layout);

        this.add(Box.createRigidArea(new Dimension(padding, padding)));

        JPanel leftPan = new JPanel();
        BoxLayout leftPanLayout = new BoxLayout(leftPan, BoxLayout.Y_AXIS);
        leftPan.setLayout(leftPanLayout);

        this.add(leftPan);

        leftPan.add(Box.createRigidArea(new Dimension(padding, padding)));

        JPanel firstRow = new JPanel();
        firstRow.add(redSlider);
        firstRow.add(redField);
        leftPan.add(firstRow);

        JPanel secondRow = new JPanel();
        secondRow.add(greenSlider);
        secondRow.add(greenField);
        leftPan.add(secondRow);

        JPanel thirdRow = new JPanel();
        thirdRow.add(blueSlider);
        thirdRow.add(blueField);
        leftPan.add(thirdRow);

        redSlider.addMouseListener(new SliderListener());
        greenSlider.addMouseListener(new SliderListener());
        blueSlider.addMouseListener(new SliderListener());

        redField.addKeyListener(new TextFieldListener());
        greenField.addKeyListener(new TextFieldListener());
        blueField.addKeyListener(new TextFieldListener());

        colorField.addKeyListener(new ColorFieldListener());

        leftPan.add(Box.createRigidArea(new Dimension(padding, padding)));

        JPanel rightPan = new JPanel();
        BorderLayout rightPanLayout = new BorderLayout();
        rightPan.setLayout(rightPanLayout);

        rightPan.add(colorField, BorderLayout.NORTH);

        colorPan.setBackground(Color.RED);
        rightPan.add(colorPan, BorderLayout.CENTER);

        updateValues();


        this.add(rightPan);
    }

}