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

public class RadioButtonDemo extends JFrame implements ItemListener {
    // Declare radio buttons
    protected JRadioButton jrbRed  = new JRadioButton("Red", false);
    protected JRadioButton jrbYellow = new JRadioButton("Yellow", false); 
    protected JRadioButton jrbGreen = new JRadioButton("Green", true); 

    // Declare a radio button group. The ButtonGroup class sets up a
    // multiple-exclusion scope for the buttons so that only one button
    // can be selected at a time.
    protected ButtonGroup btg = new ButtonGroup();

    // Declare a traffic light display panel
    protected Light light;

    JPanel trafficLightPanel = new JPanel();
    JPanel radioButtonPanel = new JPanel();

    // Main method
    public static void main(String[] args) {
	RadioButtonDemo frame = new RadioButtonDemo();
	frame.pack();
	frame.show();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    // Constructor
    public RadioButtonDemo() {
	setTitle("RadioButton Demo");

	// Add traffic light panel to panel trafficLightPanel
	trafficLightPanel.setPreferredSize(new Dimension(250, 120));
	trafficLightPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
	light = new Light();
	trafficLightPanel.add(light);

	// Put the radio button in Panel radioButtonPanel
	radioButtonPanel.setLayout(new FlowLayout());
	radioButtonPanel.add(jrbRed);
	radioButtonPanel.add(jrbYellow);
	radioButtonPanel.add(jrbGreen);
	radioButtonPanel.setPreferredSize(new Dimension(250, 30));

	// Set keyboard mnemonics
	jrbRed.setMnemonic('R');
	jrbYellow.setMnemonic('Y');
	jrbGreen.setMnemonic('G');

	// Group radio buttons
	btg.add(jrbRed);
	btg.add(jrbYellow);
	btg.add(jrbGreen);

	// Place trafficLightPanel and radioButtonPanel in the frame
	getContentPane().setLayout(new BorderLayout());
	getContentPane().add(trafficLightPanel, BorderLayout.CENTER);
	getContentPane().add(radioButtonPanel, BorderLayout.SOUTH);

	// Register listeners for check boxes
	jrbRed.addItemListener(this);
	jrbYellow.addItemListener(this);
	jrbGreen.addItemListener(this);
    }

    // Handle checkbox events
    public void itemStateChanged (ItemEvent e) {
	if (jrbRed.isSelected())
	    light.turnOnRed();  // Set red light
	if (jrbYellow.isSelected())
	    light.turnOnYellow(); // set yellow light
	if (jrbGreen.isSelected()) 
	    light.turnOnGreen();  // set green light
    }

    class Light extends JPanel {

	Ellipse2D redLight = new Ellipse2D.Double(10, 10, 20, 20);
	Ellipse2D yellowLight = new Ellipse2D.Double(10, 35, 20, 20);
	Ellipse2D greenLight = new Ellipse2D.Double(10, 60, 20, 20);

	Color redColor = Color.red;
	Color yellowColor = Color.yellow;
	Color greenColor = Color.green;

	Color color = greenColor;

	Image light = new ImageIcon("light.gif").getImage();

	public Light () {
	    addMouseListener(new changeLightColor());
	}

	// turn red light on
	public void turnOnRed() {
	    color = redColor;
	    repaint();
	}

	// turn yellow light on
	public void turnOnYellow() {
	    color = yellowColor;
	    repaint();
	}

	// turn green light on
	public void turnOnGreen() {
	    color = greenColor;
	    repaint();
	}

	// display traffic light
	public void paintComponent(Graphics g) {
	    Graphics2D g2 = (Graphics2D) g;
	    super.paintComponent(g);
	    g2.drawImage(light, 5, 5, 30, 80, this);
	    g2.setColor(Color.gray);
	    if (color == redColor) {
		g2.setColor(redColor);
		g2.fill(redLight);
		g2.setColor(Color.black);
		g2.draw(redLight);
		g2.setColor(Color.gray);
	    }
	    else
		g2.fill(redLight);

	    if (color == yellowColor) {
		g2.setColor(yellowColor);
		g2.fill(yellowLight);
		g2.setColor(Color.black);
		g2.draw(yellowLight);
		g2.setColor(Color.gray);
	    }
	    else
		g2.fill(yellowLight);

	    if (color == greenColor) {
		g2.setColor(greenColor);
		g2.fill(greenLight);
		g2.setColor(Color.black);
		g2.draw(greenLight);
		g2.setColor(Color.gray);
	    }
	    else
		g2.fill(greenLight);
	}

	// Set preferred size
	public Dimension getPreferredSize()
	{
	    return new Dimension(40, 90);
	}

	class changeLightColor extends MouseAdapter {
	    public void mousePressed(MouseEvent e) {
		Color newColor;
		if (redLight.contains(e.getX(), e.getY())) {
		    newColor = JColorChooser.showDialog(trafficLightPanel,
							"Choose Color",
							redColor);
		    if (newColor != null) {
			redColor = newColor;
			if (jrbRed.isSelected()) {
			    color = redColor;
			}
		    }
		}
	    }
	}
    }
}