import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ColorDialog extends JDialog {
  // Declare color component values and selected color
  private int redValue, greenValue, blueValue;
  private Color color = null;

  // Create sliders
  private JSlider jslRed = new JSlider(0, 128);
  private JSlider jslGreen = new JSlider(0, 128);
  private JSlider jslBlue = new JSlider(0, 128);

  // Create two buttons
  private JButton jbtOK = new JButton("OK");
  private JButton jbtCancel = new JButton("Cancel");

  // Create a panel to display the selected color
  private JPanel jpSelectedColor = new JPanel();

  public ColorDialog() {
    this(null, true);
  }

  public ColorDialog(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    setTitle("Choose Color");

    // Group two buttons OK and Cancel
    JPanel jpButtons = new JPanel();
    jpButtons.add(jbtOK);
    jpButtons.add(jbtCancel);

    // Group labels
    JPanel jpLabels = new JPanel();
    jpLabels.setLayout(new GridLayout(3, 0));
    jpLabels.add(new JLabel("Red"));
    jpLabels.add(new JLabel("Green"));
    jpLabels.add(new JLabel("Blue"));

    // Group sliders for selecting red, green, and blue colors
    JPanel jpSliders = new JPanel();
    jpSliders.setLayout(new GridLayout(3, 0));
    jpSliders.add(jslRed);
    jpSliders.add(jslGreen);
    jpSliders.add(jslBlue);

    // Group jpLabels and jpSliders
    JPanel jpSelectColor = new JPanel();
    jpSelectColor.setLayout(new BorderLayout());
    jpSelectColor.setBorder(
      BorderFactory.createTitledBorder("Select Color"));
    jpSelectColor.add(jpLabels, BorderLayout.WEST);
    jpSelectColor.add(jpSliders, BorderLayout.CENTER);

    // Group jpSelectColor and jpSelectedColor
    JPanel jpColor = new JPanel();
    jpColor.setLayout(new BorderLayout());
    jpColor.add(jpSelectColor, BorderLayout.SOUTH);
    jpColor.add(jpSelectedColor, BorderLayout.CENTER);

    // Place jpButtons and jpColor into the dialog box
    add(jpButtons, BorderLayout.SOUTH);
    add(jpColor, BorderLayout.CENTER);
    pack();

    jbtOK.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        setVisible(false);
      }
    });

    jbtCancel.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        color = null;
        setVisible(false);
      }
    });

    jslRed.addChangeListener(new ChangeListener() {
      @Override
      public void stateChanged(ChangeEvent e) {
        redValue = jslRed.getValue();
        color = new Color(redValue, greenValue, blueValue);
        jpSelectedColor.setBackground(color);
      }
    });

    jslGreen.addChangeListener(new ChangeListener() {
      @Override
      public void stateChanged(ChangeEvent e) {
        greenValue = jslGreen.getValue();
        color = new Color(redValue, greenValue, blueValue);
        jpSelectedColor.setBackground(color);
      }
    });

    jslBlue.addChangeListener(new ChangeListener() {
      @Override
      public void stateChanged(ChangeEvent e) {
        blueValue = jslBlue.getValue();
        color = new Color(redValue, greenValue, blueValue);
        jpSelectedColor.setBackground(color);
      }
    });
  }

  @Override
  public Dimension getPreferredSize() {
    return new java.awt.Dimension(200, 200);
  }

  /** Return color */
  public Color getColor() {
    return color;
  }
}