问题描述
题目大意:做一个简单的交通灯,要求框架里有三个单选按钮(red,green,yellow),一组交通指示灯(三个灯泡)。选择单选按钮后,相应的灯会亮,一次只能亮一种灯。以下是我的程序,执行以后面板上有按钮,可就是没有图像,求各位指点啊import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class TrafficLight extends JFrame{PaintPanel paintPanel=new PaintPanel();//申请画图面板,按钮面板和三个单选按钮JPanel buttons=new JPanel();JRadioButton red=new JRadioButton("red");JRadioButton green=new JRadioButton("green");JRadioButton yellow=new JRadioButton("yellow");TrafficLight(){ButtonGroup ni=new ButtonGroup();//将单选按钮加入按钮组ni.add(red);ni.add(green);ni.add(yellow);buttons.setLayout(new FlowLayout());//将单选按钮加入按钮面板buttons.add(red);buttons.add(green);buttons.add(yellow);setLayout(new BorderLayout());//将按钮面板和画图面板加入框架add(paintPanel,BorderLayout.NORTH);add(buttons,BorderLayout.SOUTH);red.addActionListener(new ActionListener(){//为三个单选按钮设置监听public void actionPerformed(ActionEvent e){repaint();}});yellow.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){repaint();}});green.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){repaint();}});}public class PaintPanel extends JPanel{protected void paintComponent(Graphics g){super.paintComponents(g);g.drawRect(getWidth()/2-10,20, 20, 60);//按要求绘制交通灯if(!red.isSelected())g.drawOval(getWidth()/2,30,15,15);//亮红灯elseg.fillOval(getWidth()/2,30,15,15);//熄灭红灯if(!green.isSelected())g.drawOval(getWidth()/2,50,15,15);//亮绿灯elseg.fillOval(getWidth()/2,50,15,15);//熄灭绿灯if(!yellow.isSelected())g.drawOval(getWidth()/2,70,15,15);//亮黄灯elseg.fillOval(getWidth()/2,70,15,15);//熄灭黄灯}}public static void main(String [] args)//主函数{TrafficLight mine=new TrafficLight();mine.setTitle("TrafficLight");mine.setSize(800,500);mine.setVisible(true);}}
解决方案
import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class TrafficLight extends JFrame {PaintPanel paintPanel = new PaintPanel();// 申请画图面板,按钮面板和三个单选按钮JPanel buttons = new JPanel();JRadioButton red = new JRadioButton("red", true);JRadioButton green = new JRadioButton("green");JRadioButton yellow = new JRadioButton("yellow");TrafficLight() {paintPanel.setPreferredSize(new Dimension(600, 400));ButtonGroup ni = new ButtonGroup();// 将单选按钮加入按钮组ni.add(red);ni.add(green);ni.add(yellow);buttons.setLayout(new FlowLayout());// 将单选按钮加入按钮面板buttons.add(red);buttons.add(green);buttons.add(yellow);setLayout(new BorderLayout());// 将按钮面板和画图面板加入框架add(paintPanel, BorderLayout.NORTH);add(buttons, BorderLayout.SOUTH);red.addActionListener(new ActionListener() {// 为三个单选按钮设置监听public void actionPerformed(ActionEvent e) {repaint();}});yellow.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {repaint();}});green.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {repaint();}});}public class PaintPanel extends JPanel {protected void paintComponent(Graphics g) {super.paintComponents(g);g.clearRect(0, 0, getWidth(), getHeight());g.drawRect(getWidth() / 2, 20, 30, 80);// 按要求绘制交通灯if (red.isSelected()) {lightRed(g);} else if (green.isSelected()) {lightGreen(g);} elselightYellow(g);}}private void lightRed(Graphics g) {g.setColor(Color.red);g.fillOval(getWidth() / 2, 30, 15, 15);g.setColor(Color.black);g.drawOval(getWidth() / 2, 50, 15, 15);g.drawOval(getWidth() / 2, 70, 15, 15);}private void lightGreen(Graphics g) {g.setColor(Color.green);g.fillOval(getWidth() / 2, 50, 15, 15);g.setColor(Color.black);g.drawOval(getWidth() / 2, 30, 15, 15);g.drawOval(getWidth() / 2, 70, 15, 15);}private void lightYellow(Graphics g) {g.setColor(Color.yellow);g.fillOval(getWidth() / 2, 70, 15, 15);g.setColor(Color.black);g.drawOval(getWidth() / 2, 30, 15, 15);g.drawOval(getWidth() / 2, 50, 15, 15);}public static void main(String[] args)// 主函数{TrafficLight mine = new TrafficLight();mine.setTitle("TrafficLight");mine.setSize(800, 600);mine.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mine.setVisible(true);}}代码还是有很多地方待改进