import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Exercise15_3 extends JFrame implements ItemListener { // 创建按钮 private JRadioButton jRed, jYellow, jGreen; // 创建 button group private ButtonGroup bt = new ButtonGroup(); // 创建交通灯面板 private Light light = new Light(); public static void main(String[] args) { Exercise15_3 frame = new Exercise15_3(); frame.setTitle("Exercise15_3"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(250, 170); frame.setVisible(true); } public Exercise15_3() { //创建新面板 JPanel p1 = new JPanel(); p1.setLayout(new FlowLayout(FlowLayout.CENTER)); //将交通灯面板添加到按钮面板 p1.add(light); //创建按钮面板 JPanel p2 = new JPanel(); p2.setLayout(new FlowLayout()); p2.add(jRed = new JRadioButton("Red")); p2.add(jYellow = new JRadioButton("Yellow")); p2.add(jGreen = new JRadioButton("Green")); // 设置热键 jRed.setMnemonic('R'); jYellow.setMnemonic('Y'); jGreen.setMnemonic('G'); bt.add(jRed); bt.add(jYellow); bt.add(jGreen); // 将两个面板添加到框架中 getContentPane().setLayout(new BorderLayout()); getContentPane().add(p1, BorderLayout.CENTER); getContentPane().add(p2, BorderLayout.SOUTH); // 注册监听器 jRed.addItemListener(this); jYellow.addItemListener(this); jGreen.addItemListener(this); } //设置交通灯触发器 public void itemStateChanged(ItemEvent e) { if (jRed.isSelected()) { light.turnOnRed(); } if (jYellow.isSelected()) { light.turnOnYellow(); } if (jGreen.isSelected()) { light.turnOnGreen(); } } //绘制交通灯面板类 class Light extends JPanel { private boolean red; private boolean yellow; private boolean green; public Light() { } //设置红灯亮 public void turnOnRed() { red = true; yellow = false; green = false; repaint(); } //设置绿灯亮 public void turnOnYellow() { red = false; yellow = true; green = false; repaint(); } // 设置绿灯亮 public void turnOnGreen() { red = false; yellow = false; green = true; repaint(); } //绘制交通灯 protected void paintComponent(Graphics g) { super.paintComponent(g); if (red) { g.setColor(Color.red); g.fillOval(10, 10, 20, 20); g.setColor(Color.black); g.drawOval(10, 35, 20, 20); g.drawOval(10, 60, 20, 20); g.drawRect(5, 5, 30, 80); } else if (yellow) { g.setColor(Color.yellow); g.fillOval(10, 35, 20, 20); g.setColor(Color.black); g.drawRect(5, 5, 30, 80); g.drawOval(10, 10, 20, 20); g.drawOval(10, 60, 20, 20); } else if (green) { g.setColor(Color.green); g.fillOval(10, 60, 20, 20); g.setColor(Color.black); g.drawRect(5, 5, 30, 80); g.drawOval(10, 10, 20, 20); g.drawOval(10, 35, 20, 20); } else { g.setColor(Color.black); g.drawRect(5, 5, 30, 80); g.drawOval(10, 10, 20, 20); g.drawOval(10, 35, 20, 20); g.drawOval(10, 60, 20, 20); } } public Dimension getPreferredSize() { return new Dimension(40, 90); } } }