trafficlight.java

来自「设计一个交通信号灯类: (1)变量:位置、颜色(红、黄、绿)、显示时间(秒)。」· Java 代码 · 共 460 行

JAVA
460
字号
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.Date;

class roadpanel extends JPanel
{
	private Image image;
	JLabel n1,n2,n3,e1,e2,e3,s1,s2,s3,w1,w2,w3,l,per,d;
	Font f1,f2,f3,f4;
	JPanel pn,pe,ps,pw;
	JTextField n,e,s,w,liu,time;
	int num=0,r;
	String np="";
	public roadpanel()
	{
		image=Toolkit.getDefaultToolkit().getImage("road.jpg");
		MediaTracker tracker=new MediaTracker(this);
		tracker.addImage(image,0);
		try{
			tracker.waitForID(0);
		}
		catch(InterruptedException e)
		{
		}
		setLayout(null);		
		f1=new Font("ScansSerif",Font.BOLD,40);
		f2=new Font("ScansSerif",Font.BOLD,35);
		f3=new Font("ScansSerif",Font.BOLD,25);
		f4=new Font("ScansSerif",Font.BOLD,15);
		pn=new JPanel();
		pe=new JPanel();
		ps=new JPanel();
		pw=new JPanel();
		n=new JTextField("00",3);
		e=new JTextField("00",3);
		s=new JTextField("00",3);
		w=new JTextField("00",3);
		liu=new JTextField("",3);
		time=new JTextField("0",3);		
		n1=new JLabel("←",SwingConstants.CENTER);
		n2=new JLabel("↓",SwingConstants.CENTER);
		n3=new JLabel("→",SwingConstants.CENTER);
		e1=new JLabel("↑",SwingConstants.CENTER);
		e2=new JLabel("←",SwingConstants.CENTER);
		e3=new JLabel("↓",SwingConstants.CENTER);
		s1=new JLabel("←",SwingConstants.CENTER);
		s2=new JLabel("↑",SwingConstants.CENTER);
		s3=new JLabel("→",SwingConstants.CENTER);
		w1=new JLabel("↑",SwingConstants.CENTER);
		w2=new JLabel("→",SwingConstants.CENTER);
		w3=new JLabel("↓",SwingConstants.CENTER);
		l=new JLabel("流量控制",SwingConstants.CENTER);
		per=new JLabel("辆/小时",SwingConstants.CENTER);
		d=new JLabel("日期时间",SwingConstants.CENTER);
		add(pn);
		add(pe);
		add(ps);
		add(pw);
		add(l);
		add(per);
		add(liu);
		add(time);
		add(d);
		l.setBounds(10,50,120,30);
		liu.setBounds(130,50,100,30);
		per.setBounds(230,50,120,30);
		time.setBounds(100,100,100,30);
		d.setBounds(530,550,300,20);
		time.setVisible(false);
		l.setFont(f3);
		liu.setFont(f3);
		d.setFont(f4);
		liu.addKeyListener(new KeyAdapter()
		{
			public void keyReleased(KeyEvent evt)
			{
				int keyCode=evt.getKeyCode();
				if(keyCode==KeyEvent.VK_ENTER)
				{
					try{
						num=Integer.parseInt(liu.getText());
						if(num>0)	
							num=num/60;
						else
							num=-1;
						if(num<0)
						{
							JOptionPane.showMessageDialog(null,"请输入正数!","输入错误!",JOptionPane.ERROR_MESSAGE);
							num=0;
							liu.setText("");
						}
						else	
						{
							if(num>50)
								{num=50;}
							else
								if((num<=15)&(num>0))
									num=15;	
							if(num==0)
								num=10;	
							r=JOptionPane.showConfirmDialog(null,"下次执行的时间为"+num+"秒","是否确定?",JOptionPane.YES_NO_OPTION);
							if(r!=0)
								num=0;							
						}						
					}catch(NumberFormatException e)
					{
						JOptionPane.showMessageDialog(null,"只能输入数字,请重新输入!","输入错误!",JOptionPane.ERROR_MESSAGE);
						num=0;
						liu.setText("");
					}			
					time.setText(np.valueOf(num));											
				}
			}
		});
		per.setFont(f3);
		pn.setBounds(290,155,184,45);
		pn.setLayout(new GridLayout(1,4,1,0));
		pn.setBackground(Color.darkGray);
		pe.setBounds(520,216,40,164);
		pe.setLayout(new GridLayout(4,1,0,1));
		pe.setBackground(Color.darkGray);
		ps.setBounds(321,398,184,45);
		ps.setLayout(new GridLayout(1,4,1,0));
		ps.setBackground(Color.darkGray);
		pw.setBounds(239,223,40,164);
		pw.setLayout(new GridLayout(4,1,0,1));
		pw.setBackground(Color.darkGray);
		pn.add(n1);
		pn.add(n2);
		pn.add(n3);	
		pn.add(n);	
		pe.add(e1);
		pe.add(e2);
		pe.add(e3);
		pe.add(e);
		ps.add(s);
		ps.add(s1);
		ps.add(s2);
		ps.add(s3);		
		pw.add(w);
		pw.add(w1);
		pw.add(w2);
		pw.add(w3);		
		n1.setFont(f1);		
		n1.setForeground(Color.darkGray);
		n2.setFont(f1);		
		n2.setForeground(Color.darkGray);
		n3.setFont(f1);		
		n3.setForeground(Color.darkGray);
		e1.setFont(f2);		
		e1.setForeground(Color.darkGray);
		e2.setFont(f2);		
		e2.setForeground(Color.darkGray);
		e3.setFont(f2);		
		e3.setForeground(Color.darkGray);
		s1.setFont(f1);		
		s1.setForeground(Color.darkGray);
		s2.setFont(f1);		
		s2.setForeground(Color.darkGray);
		s3.setFont(f1);		
		s3.setForeground(Color.darkGray);
		w1.setFont(f2);		
		w1.setForeground(Color.darkGray);
		w2.setFont(f2);		
		w2.setForeground(Color.darkGray);
		w3.setFont(f2);		
		w3.setForeground(Color.darkGray);
		n.setFont(f1);		
		n.setEditable(false);
		n.setForeground(Color.red);
		n.setBackground(Color.cyan);
		e.setFont(f2);
		e.setEditable(false);
		e.setForeground(Color.red);
		e.setBackground(Color.cyan);
		s.setFont(f1);
		s.setEditable(false);
		s.setForeground(Color.red);
		s.setBackground(Color.cyan);
		w.setFont(f2);
		w.setEditable(false);
		w.setForeground(Color.red);	
		w.setBackground(Color.cyan);			
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.drawImage(image,0,0,this);
	}
}
class ImageFrame extends JFrame
{
	JMenuBar menubar;
	JMenu editMenu,ed;
	JMenuItem startitem,stopitem,exititem,editem;	
	public ImageFrame(final Thread ns,final Thread ew)
	{
		super("Control Trafficlight!");		
		setSize(808,659);
		addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				ns.stop();
				ew.stop();
				System.exit(0);
			}
		});		
		menubar=new JMenuBar();		
		setJMenuBar(menubar);		
		editMenu=new JMenu("操作(O)");
		ed=new JMenu("作者(M)");
		startitem=new JMenuItem("继续(C)",'C');
		stopitem=new JMenuItem("暂停(S)",'S');
		exititem=new JMenuItem("退出(Q)",'Q');
		editem=new JMenuItem("作者(M)",'M');
		menubar.add(editMenu);
		menubar.add(ed);		
		editMenu.add(startitem);	
		editMenu.add(stopitem);
		editMenu.addSeparator();
		editMenu.add(exititem);
		ed.add(editem);
		editMenu.setMnemonic('O');
		ed.setMnemonic('M');
		startitem.setMnemonic('C');
		stopitem.setMnemonic('S');
		exititem.setMnemonic('Q');
		editem.setMnemonic('M');
		startitem.setEnabled(false);
		startitem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent evt)
			{
				startitem.setEnabled(false);
				stopitem.setEnabled(true);
				ew.resume();
				ns.resume();				
			}
		});
		stopitem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent evt)
			{
				startitem.setEnabled(true);
				stopitem.setEnabled(false);
				ew.suspend();
				ns.suspend();				
			}
		});
		exititem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent evt)
			{
				ns.stop();
				ew.stop();
				System.exit(0);
			}
		});	
		editem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent evt)
			{
				JOptionPane.showMessageDialog(null,"03级信工一班 彭浩宸 23号","作者",JOptionPane.INFORMATION_MESSAGE);
			}
		});			
	}	
}
class Controlew implements Runnable
{
	private int i=0,p,n,e,tp=0;
	private String s="",w="",t="";
	private roadpanel rpanel;
	Date date;
	boolean v=true;
	public Controlew(roadpanel rp)
	{
		rpanel=rp;	
	}
	public void run()
	{
		out:while(true)
		{
			synchronized(this)
			{								
					if(!v)
			    	{
			    		try{
							this.wait();
							}catch(Exception e)
							{e.printStackTrace();}
			    	}
					rpanel.n1.setForeground(Color.green);
					rpanel.n2.setForeground(Color.red);
					rpanel.n3.setForeground(Color.red);
					rpanel.n.setForeground(Color.red);
					rpanel.e1.setForeground(Color.green);
					rpanel.e2.setForeground(Color.green);
					rpanel.e3.setForeground(Color.green);
					rpanel.e.setForeground(Color.green);
					rpanel.s1.setForeground(Color.red);
					rpanel.s2.setForeground(Color.red);
					rpanel.s3.setForeground(Color.green);
					rpanel.s.setForeground(Color.red);
					rpanel.w1.setForeground(Color.green);
					rpanel.w2.setForeground(Color.green);
					rpanel.w3.setForeground(Color.green);
					rpanel.w.setForeground(Color.green);
					tp=Integer.parseInt(rpanel.time.getText());
					if(tp!=0)
						{n=tp+1;}
					else
						{n=11;}
					t.indexOf(n);
					rpanel.n.setText(t);
					rpanel.s.setText(t);
					rpanel.e.setText(t);
					rpanel.w.setText(t);
					while(true)
					{						
						date=new Date();
						rpanel.d.setText(date.toString());
						try{
							Thread.currentThread().sleep(1000);
							}catch(Exception e){}						
						if(n==4)
							{
								rpanel.e2.setForeground(Color.yellow);
								rpanel.e.setForeground(Color.yellow);
								rpanel.e3.setForeground(Color.yellow);
								rpanel.w2.setForeground(Color.yellow);
								rpanel.w.setForeground(Color.yellow);
								rpanel.w1.setForeground(Color.yellow);	
							}
						else
							if(n==1)
								break;
						n--;
						if(n<10)
							s="0"+s.valueOf(n);
						else
							s=s.valueOf(n);
						rpanel.n.setText(s);
						rpanel.s.setText(s);
						rpanel.e.setText(s);
						rpanel.w.setText(s);					
					}
				v=false;
				this.notify();
						
			}	
		}		
	}
}
class Controlns implements Runnable
{
	private int i=0,p,n,e,tp;
	private String s="",w="",t="";
	private roadpanel rpanel;
	private Controlew ew;
	Date date;
	public Controlns(roadpanel rp,Controlew ew)
	{
		rpanel=rp;
		this.ew=ew;	
	}
	public void run()
	{

		out:while(true)
		{
			synchronized(ew)
			{
				
					if(ew.v)
					{
						try{
							ew.wait();
							}catch(Exception e)
							{e.printStackTrace();}
					}
					rpanel.n1.setForeground(Color.green);
					rpanel.n2.setForeground(Color.green);
					rpanel.n3.setForeground(Color.green);
					rpanel.n.setForeground(Color.green);
					rpanel.e1.setForeground(Color.green);
					rpanel.e2.setForeground(Color.red);
					rpanel.e3.setForeground(Color.red);
					rpanel.e.setForeground(Color.red);
					rpanel.s1.setForeground(Color.green);
					rpanel.s2.setForeground(Color.green);
					rpanel.s3.setForeground(Color.green);
					rpanel.s.setForeground(Color.green);
					rpanel.w1.setForeground(Color.red);
					rpanel.w2.setForeground(Color.red);
					rpanel.w3.setForeground(Color.green);
					rpanel.w.setForeground(Color.red);
					tp=Integer.parseInt(rpanel.time.getText());
					if(tp!=0)
						{n=tp+1;}
					else
						{n=11;}
					t.indexOf(n);
					rpanel.n.setText(t);
					rpanel.s.setText(t);
					rpanel.e.setText(t);
					rpanel.w.setText(t);
					while(true)
					{						
						date=new Date();
						rpanel.d.setText(date.toString());
						try{
							Thread.currentThread().sleep(1000);
							}catch(Exception e){}
						if(n==4)
							{
								rpanel.n2.setForeground(Color.yellow);
								rpanel.n.setForeground(Color.yellow);
								rpanel.n3.setForeground(Color.yellow);
								rpanel.s2.setForeground(Color.yellow);
								rpanel.s.setForeground(Color.yellow);
								rpanel.s1.setForeground(Color.yellow);	
							}
						else
							if(n==1)
								break;
						n--;
						if(n<10)
							s="0"+s.valueOf(n);
						else
							s=s.valueOf(n);
						rpanel.n.setText(s);
						rpanel.s.setText(s);
						rpanel.e.setText(s);
						rpanel.w.setText(s);
						ew.v=true;
						ew.notify();	
					}		
			}	
		}		
	}
}
public class trafficlight
{
	public static void main(String[] args)
	{		
		roadpanel rp=new roadpanel();		
		Controlew cew=new Controlew(rp);
		Controlns cns=new Controlns(rp,cew);		
		final Thread ns=new Thread(cns);
		final Thread ew=new Thread(cew);
		JFrame frame=new ImageFrame(ns,ew);
		frame.add(rp);
		frame.setVisible(true);			
		ns.start();
		ew.start();
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?