设计实现一个简单的交通信号灯模型,如图 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();
}
}