Java实现的信号灯

 设计实现一个简单的交通信号灯模型,如图 2-1 所示。要求当定时时间到 的时候,该逻辑电路即发出一个信号给交通灯,交通灯模型则根据当前 状态下的信号进行信号颜色切换(当前是绿灯信号,则变为黄灯亮;若 当前是黄灯信号,则切换为红灯亮;若当前是红灯信号,则切换为绿灯 亮)。具体要求如下: 

                                                                     

 

1) 编写函数实现,每次接收到定时时间到消息时,实现三种交通信号间 的正确切换。 
2) 在界面上用“定时”按钮或以系统时间展示信号灯之间的切换功能。 
3) 切换到黄灯信号时考虑闪烁功能,具体时长自行设置。 
4) 考虑现实实际,把握不同信号之间的时间间隔,并增加设置界面,做 到自如修改。

Window_Light.java

package light;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.text.SimpleDateFormat;
import java.util.Date;

class circle extends JPanel {        //圆形
	
	int x,y,width,height;
	Color c=Color.white;

	void get(int x,int y,int width,int height){
		this.x=x;
		this.y=y;
		this.width=width;
		this.height=height;
	}
	
	public void paint(Graphics g) {
		g.setColor(c);
		g.fillOval(x, y, width, height);
	}
	
	public void updata(Graphics g) {
		g.clearRect(x, y, width, height);
		paint(g);
	}
}

public class Window_Light extends JFrame implements ActionListener,Runnable{
	circle green,yellow,red;
	JLabel label_time,label_set,label_g,label_y,label_r;
	JTextField time,text_g,text_y,text_r;
	JButton button_apply,button_exit;
	Thread thread;
	boolean flag=true;
	
	Color state=Color.green; //当前的状态
	
	Window_Light(){
		setLayout(null);
		init();
		setBounds(350,350,350,500);
		setTitle("红绿灯");
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	void init() {
		
		thread=new Thread(this);
		
		green=new circle();
		green.get(20,20,100,100);
		green_change();
		
		yellow=new circle();
		yellow.get(20,20,100,100);
		
		red=new circle();
		red.get(20,20,100,100);
		
		time=new JTextField(120);
		time.setEditable(false);
		//setTimer(time);
		Timer timeAction = new Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				long timemillis = System.currentTimeMillis();
				//转换日期显示格式
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				time.setText(df.format(new Date(timemillis)));
			}
		});
		timeAction.start();
		
		
		text_g=new JTextField(100);
		text_y=new JTextField(100);
		text_r=new JTextField(100);
		
		label_time=new JLabel("系统时间");
		label_set=new JLabel("设置");
		label_g=new JLabel("绿灯");
		label_y=new JLabel("黄灯");
		label_r=new JLabel("红灯");
		
		button_apply=new JButton("应用");
		button_apply.addActionListener(this);
		button_exit=new JButton("结束");
		button_exit.addActionListener(this);
		
		//左边
		add(green);
		add(yellow);
		add(red);
		add(label_time);
		add(time);
		//右边
		add(label_set);
		add(label_g);
		add(label_y);
		add(label_r);
		add(text_g);
		add(text_y);
		add(text_r);
		add(button_apply);
		add(button_exit);
		//左边
		green.setBounds(0,0,140,120);
		yellow.setBounds(0,120,140,120);
		red.setBounds(0,240,140,120);
		label_time.setBounds(50, 380, 90, 20);
		time.setBounds(20,400, 120, 20);
		//右边
		label_set.setBounds(200, 20, 40, 20);
		label_g.setBounds(160, 60, 40, 20);
		label_y.setBounds(160, 170, 40, 20);
		label_r.setBounds(160, 290, 40, 20);
		text_g.setBounds(200, 60, 100, 20);
		text_y.setBounds(200, 170, 100, 20);
		text_r.setBounds(200, 290, 100, 20);
		button_apply.setBounds(150, 400, 60, 20);
		button_exit.setBounds(230, 400, 60, 20);
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==button_apply)
		{
			flag=true;
			if(!(thread.isAlive()))
				thread=new Thread(this);
			try {thread.start();
			}
			catch(Exception ee) {
			}
		}
		else {
			flag=false;
		}
		
	}
	
	//得到时间
	void setTimer(JTextField time){
		final JTextField varTime = time;
		Timer timeAction = new Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				long timemillis = System.currentTimeMillis();
				//转换日期显示格式
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				varTime.setText(df.format(new Date(timemillis)));
			}
		});
		timeAction.start();
	}
	
	void change(int g_time,int y_time,int r_time) {
		while(flag) {
			if(state==Color.green) {
				 try {
					Thread.sleep(g_time*1000);
				 } catch (Exception e) {
				 }
				 
				 green_change();
				 yellow_change();
				 state=Color.yellow;
			}
			else if(state==Color.yellow) {
				for(int i=0;i<y_time*2;i++) {
					try {
						Thread.sleep(500);
					 } catch (Exception e) {
					 }
					yellow_change();
				}
				red_change();
				yellow_change();
				state=Color.red;
			}
			else {
				try {
					Thread.sleep(r_time*1000);
				 } catch (Exception e) {
				 }
				red_change();
				green_change();
				state=Color.green;
			}
		}
	}
	
	void green_change() {
		if(green.c==Color.green) {
			green.c=Color.white;
			green.repaint();
		}
		else {
			green.c=Color.green;
			green.repaint();
		}
	}
	
	void yellow_change() {
		if(yellow.c==Color.yellow) {
			yellow.c=Color.white;
			yellow.repaint();
		}
		else {
			yellow.c=Color.yellow;
			yellow.repaint();
		}
	}
	
	void red_change() {
		if(red.c==Color.red) {
			red.c=Color.white;
			red.repaint();
		}
		else {
			red.c=Color.red;
			red.repaint();
		}
	}

	public void run() {
		int g_time = 0,y_time = 0,r_time = 0;
		try {
			g_time=Integer.parseInt(text_g.getText());
			y_time=Integer.parseInt(text_y.getText());
			r_time=Integer.parseInt(text_r.getText());
		}
		catch(Exception ee) {
			
		}
		change(g_time,y_time,r_time);
		
	}
	
}

Main.java

package light;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		new Window_Light();
	}

}

 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值