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.setVisible(true); 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; } } repaint(); } } } } }