⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elevframe.java

📁 电梯调度算法 用java编写 涉及多线程
💻 JAVA
字号:
package elevator;


import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;
import javax.swing.plaf.basic.BasicArrowButton;
public class ElevFrame extends JFrame implements Runnable{

	/**
	 * @param args
	 */
	private static int floornum=20;
	private static int elevnum=5;
	private ElevThread[] elevthread;
	
	Color pressedupdowncolor = Color.RED;
	Color unpressedupdowncolor= Color.WHITE;
	
	Container cp;
	JPanel elevpanel = new JPanel();
	JButton[] floorbtn;
	BasicArrowButton[] upbtn;
	BasicArrowButton[] downbtn;
	
	JButton dispup;
	JButton dispdown;
	JButton dispfloor;
	
	int[] upstat;
	int[] downstat;
	
	public ElevFrame()
	{
		cp = this.getContentPane();
		cp.setLayout(new GridLayout(1,elevnum+1));
		
		elevpanel.setLayout(new GridLayout(floornum+1,3));
		elevpanel.setBorder(new MatteBorder(2,0,2,3,Color.WHITE));
		floorbtn=new JButton[floornum];
		upbtn=new BasicArrowButton[floornum];
		downbtn=new BasicArrowButton[floornum];
		
		dispfloor=new JButton("层");
		dispfloor.setEnabled(false);
		dispup = new JButton("上");
		dispup.setEnabled(false);
		dispdown = new JButton("下");
		dispdown.setEnabled(false);
		elevpanel.add(dispfloor);
		elevpanel.add(dispup);
		elevpanel.add(dispdown);
		
		MouseListener uplistener = new UpButtonPressed();
		
		
		for(int i=floorbtn.length-1; i>=0; i-- )
		{
			floorbtn[i] = new JButton(String.valueOf(i + 1));
			//floorbtn[i].setForeground(Color.green);
			floorbtn[i].setBackground(Color.GRAY);
			floorbtn[i].setFont(new Font("Serif", Font.BOLD, 13));
			floorbtn[i].setEnabled(false);
			if(i!=floorbtn.length-1){
			upbtn[i] = new BasicArrowButton(BasicArrowButton.NORTH);
			upbtn[i].addMouseListener(uplistener);
			upbtn[i].setBackground(unpressedupdowncolor);
			
			}
			else
			{
				upbtn[i] = new BasicArrowButton(BasicArrowButton.CENTER);
				upbtn[i].addMouseListener(uplistener);
				upbtn[i].setBackground(unpressedupdowncolor);
				upbtn[i].setEnabled(false);
			}
			if(i!=0)
			{
			downbtn[i] = new BasicArrowButton(BasicArrowButton.SOUTH);
			downbtn[i].addMouseListener(uplistener);
			downbtn[i].setBackground(unpressedupdowncolor);
			
			}
			else
			{
				downbtn[i] = new BasicArrowButton(BasicArrowButton.CENTER);
				downbtn[i].addMouseListener(uplistener);
				downbtn[i].setBackground(unpressedupdowncolor);
				downbtn[i].setEnabled(false);
			}
			elevpanel.add(floorbtn[i]);
			elevpanel.add(upbtn[i]);
			elevpanel.add(downbtn[i]);
		}
		
		cp.add(elevpanel);
		
		elevthread = new ElevThread[elevnum];
		for (int i = 0; i < elevnum; i++)
		{
			ElevThread elev = new ElevThread();
			cp.add(elev);
			elev.getThread().start();
			elevthread[i] = elev;
			
		}
		upstat = new int[floornum];
		downstat = new int[floornum];
		for(int i=0; i<upstat.length; i++)
		{
			upstat[i]=0;
			downstat[i]=0;
		}
		
		Thread mainthread=new Thread(this);
		mainthread.start();
		
	}
	class UpButtonPressed extends MouseAdapter implements MouseListener
	{
		public void mousePressed(MouseEvent e)
		{
			for (int i = 0; i < upbtn.length; i++)
			{
				if (e.getSource() == upbtn[i])
				{
					if(i!=upbtn.length-1)
					{
					upbtn[i].setBackground(pressedupdowncolor);
					upstat[i] = 1;
					}
				}

				if (e.getSource() == downbtn[i])
				{
					if(i!=0)
					{
					downbtn[i].setBackground(pressedupdowncolor);
					downstat[i] = 1;
					}
				}
			}
		}
	}
	
	
	
	public static int getFloorNum()
	{
		return floornum;
	}
	public void run()
	{
		while (true)
		{
			try
			{
				Thread.sleep(100);
			} catch (InterruptedException e)
			{
				e.printStackTrace();
			}

			
			for (int i = 0; i < upstat.length; i++)
			{
				if (upstat[i] == 1)
				{
					upnearest(i);
				}
				if (upstat[i] >= 5)
				{
					if (i == elevthread[upstat[i] - 5].getnowpos())
					{
						upstat[i] = 0;
						upbtn[i].setBackground(unpressedupdowncolor);
						
					}
				}
			}

			
			for (int i = 0; i < downstat.length; i++)
			{
				if (downstat[i] == 1)
				{
					downnearest(i);
				}
				if (downstat[i] >= 5)
				{
					if (i == elevthread[downstat[i] - 5].getnowpos())
					{
						downstat[i] = 0;
						downbtn[i].setBackground(unpressedupdowncolor);
					}
				}
			}
		}
	}
	
	private boolean upnearest(int floor)
	{
		int whichElev = 0;
		int distance = floornum;

		for (int j = 0; j < elevthread.length; j++)
		{
			if (elevthread[j].isStill()
				|| (elevthread[j].isUp() && floor >= elevthread[j].getnowpos()))
			{
				int temp = Math.abs(floor - elevthread[j].getnowpos());
				if (temp < distance)
				{
					whichElev = j;
					distance = Math.abs(floor - elevthread[j].getnowpos());
				}
			}
		}
		if (distance != floornum)
		{
			upstat[floor] = 5 + whichElev;
			elevthread[whichElev].setDesPos(floor);
			return true;
		} else
		{
			return false;
		}
	}
	
	
	private boolean downnearest(int floor)
	{
		int whichElev = 0;
		int distance = floornum;

		for (int j = 0; j < elevthread.length; j++)
		{
			if (elevthread[j].isStill()
				|| (elevthread[j].isDown() && floor <= elevthread[j].getnowpos()))
			{
				int temp = Math.abs(floor - elevthread[j].getnowpos());
				if (temp < distance)
				{
					whichElev = j;
					distance = Math.abs(floor - elevthread[j].getnowpos());
				}
			}
		}

		if (distance != floornum)
		{
			downstat[floor] = 5 + whichElev;
			elevthread[whichElev].setDesPos(floor);
			return true;
		} else
		{
			return false;
		}

	}
	

}

⌨️ 快捷键说明

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