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

📄 elevthread.java

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

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;
import javax.swing.border.MatteBorder;



public class ElevThread extends JPanel implements Runnable {
	private int stat;//-1:下       1:上         0:静止

	private static int floornum;

	private int nowpos;

	private int despos;

	private boolean[] numstat;

	private Thread thread;

	JButton[] elevbtn;

	JLabel dispfloor;

	public ElevThread() {
		floornum = ElevFrame.getFloorNum();
		stat = 0;
		nowpos = 0;
		despos = 0;

		numstat = new boolean[floornum];
		for (int i = 0; i < numstat.length; i++) {
			numstat[i] = false;

		}

		thread = new Thread(this);
		setLayout(new GridLayout(floornum + 1, 2));
		this.setBorder(new MatteBorder(2, 80, 2, 2, Color.LIGHT_GRAY));

		elevbtn = new JButton[floornum];

		dispfloor = new JLabel("楼层号", SwingConstants.CENTER);
		
		this.add(dispfloor);
		

		MouseListener numListener = new NumButtonPressed();
		
		for (int j=elevbtn.length-1; j >= 0; j--)
		{
			
			elevbtn[j] = new JButton(String.valueOf(j + 1));
			
			elevbtn[j].addMouseListener(numListener);
			
			elevbtn[j].setBackground(Color.WHITE);
			
			this.add(elevbtn[j]);
		}
		
		elevbtn[nowpos].setBackground(Color.CYAN);

	}

	class NumButtonPressed extends MouseAdapter implements MouseListener {

		public void mousePressed(MouseEvent e) {
			for (int i = 0; i < elevbtn.length; i++) {
				if (e.getSource() == elevbtn[i]) {
					numstat[i] = true;
					elevbtn[i].setBackground(Color.DARK_GRAY);
					if (stat == 0) {
						despos = i;
					}

					if (stat == 1) {
						despos = getMaxPressedNum();
					}
					if (stat == -1) {
						despos = getMinPressedNum();
					}
				}
			}
		}
	}

	public void run() {
		while (true) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if (stat == 1 || stat == -1) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				stat = 0;
				
			}

			if (despos > nowpos) {
				stat = 1;
			    moveUp();
				stat = 0;
			
			} else if (despos < nowpos) {
				stat = -1;
				moveDn();
				stat = 0;
			
			}

		}
	}

	public void moveUp() {
		int oldpos = nowpos;
		for (int i = nowpos + 1; i <= despos; i++) {
			try {
				
				elevbtn[i].setText("上行");
				elevbtn[i].setBackground(Color.CYAN);
				Thread.sleep(600);
				elevbtn[i].setText(String.valueOf(i+1));
				elevbtn[i].setBackground(Color.WHITE);
				
				if (i > oldpos) {
					elevbtn[i - 1].setBackground(Color.WHITE);
				}

				if (numstat[i]) {
				
					elevbtn[i].setText("开门");
					elevbtn[i].setBackground(Color.CYAN);
					Thread.sleep(1500);
					elevbtn[i].setText("关门");
					Thread.sleep(1000);
					elevbtn[i].setText(String.valueOf(i+1));
				}
				nowpos = i;

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		clearState();
	}

	
	public void moveDn() {
		int oldpos = nowpos;
		for (int i = nowpos - 1; i >= despos; i--) {
			try {
				elevbtn[i].setText("下行");
				elevbtn[i].setBackground(Color.CYAN);
				Thread.sleep(600);
				elevbtn[i].setText(String.valueOf(i+1));
				elevbtn[i].setBackground(Color.WHITE);
				

				if (i < oldpos) {
					elevbtn[i + 1].setBackground(Color.WHITE);
				}

				if (numstat[i]) {
					
					elevbtn[i].setText("开门");
					elevbtn[i].setBackground(Color.CYAN);
					Thread.sleep(1500);
					elevbtn[i].setText("关门");
					Thread.sleep(1000);
					elevbtn[i].setText(String.valueOf(i+1));
				}
				nowpos = i;

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		clearState();
	}

	public Thread getThread() {
		return thread;
	}

	private int getMinPressedNum() {
		int min = 0;
		for (int i = 0; i < numstat.length; i++) {
			if (numstat[i]) {
				min = i;
				break;
			}
		}
		return min;
	}

	private int getMaxPressedNum() {
		int max = 0;
		for (int i = numstat.length - 1; i >= 0; i--) {
			if (numstat[i]) {
				max = i;
				break;
			}
		}
		return max;
	}

	private void clearState() {
		for (int i = 0; i < numstat.length; i++) {
			if (numstat[i]) {
				numstat[i] = false;
				
			}
		}
	}

	public void setDesPos(int i) {
		if (stat == 0) {
			despos = i;
			numstat[i] = true;
			if (nowpos > despos) {
				stat = -1;
			}
			if (nowpos < despos) {
				stat = 1;
			}
		}

		if (stat == 1 && i > despos) {
			despos = i;
			numstat[i] = true;
		}

		if (stat == -1 && i < despos) {
			despos = i;
			numstat[i] = true;
		}
	}
	
	public int getnowpos() {
		return nowpos;
	}
	
	public boolean isStill() {
		return stat == 0;
	}
	
	public boolean isUp() {
		return stat == 1;
	}

	public boolean isDown() {
		return stat == -1;
	}
}

⌨️ 快捷键说明

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