📄 groupcontroler.java
字号:
package a;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class GroupControler extends JPanel implements ActionListener{
//Timer gateTimer,cageTimer;
int gateCycle=20,cageCycle=30,reassignCycle=1000,gateWaitCycle=5000;
final int GOUP =1,GODOWN =-1,FREE =0;
int numOfFloor, numOfLift;
Lift[] group;
int[] distance,minOrder;
int[] upCalls,downCalls,upServer,downServer,upAlloateFail,downAlloateFail;
Timer reassignTimer;
Timer[] waitCloseGate;
OutButton outBtn;
int LiftsHeight, LiftsWidth, outBtnHeight, outBtnWidth;
GroupControler(int numOfFloor,int numOfLift){
this.numOfFloor=numOfFloor;
this.numOfLift=numOfLift;
init();
JPanel liftGroup=new JPanel();
liftGroup.setLayout(new GridLayout(1,numOfLift,10,8));
for(int i=1;i<=numOfLift;i++)
liftGroup.add(group[i]);
liftGroup.setBackground(Color.WHITE);
liftGroup.setBounds(1, 1, LiftsWidth, LiftsHeight);
outBtn.setBounds(LiftsWidth+3, 1, outBtnWidth, outBtnHeight);
setLayout(null);
add(liftGroup);
add(outBtn);
}
//初始化各个变量
protected void init(){
outBtn=new OutButton(numOfFloor);
distance=new int[numOfFloor+1];
minOrder=new int[numOfFloor+1];
upAlloateFail=new int[numOfFloor+1];
downAlloateFail=new int[numOfFloor+1];
group=new Lift[numOfLift+1];
for(int i=1;i<=numOfLift;i++)
group[i]=new Lift(numOfFloor);
upCalls=new int[numOfFloor+1];
downCalls=new int[numOfFloor+1];
for(int i=0;i<=numOfFloor;i++){
upCalls[i]=downCalls[i]=0;
upAlloateFail[i]=downAlloateFail[i]=0;
}
for(int i=1;i<=numOfLift;i++){
group[i].gateTimer=new Timer(gateCycle,this);
group[i].cageTimer=new Timer(cageCycle,this);
group[i].cageTimer.start();
}
for(int i=1;i<=numOfLift;i++){
for(int j=1;j<=numOfFloor;j++){
group[i].innerBtn.stopButton[j].addActionListener(this);
}
group[i].innerBtn.closeButton.addActionListener(this);
group[i].innerBtn.openButton.addActionListener(this);
}
for(int j=1;j<=numOfFloor;j++){
outBtn.UP[j].addActionListener(this);
outBtn.DOWN[j].addActionListener(this);
}
for(int i=1; i<=numOfLift; i++) {
group[i].liftState.enterButton.addActionListener(this);
group[i].liftState.exitButton.addActionListener(this);
}
reassignTimer=new Timer(reassignCycle,this);
reassignTimer.start();
waitCloseGate=new Timer[numOfFloor+1];
for(int i=1;i<=numOfLift;i++)
waitCloseGate[i]=new Timer(gateWaitCycle,this);
LiftsHeight=group[1].PanelHeight+30;
LiftsWidth=numOfLift*(group[1].PanelWidth+20);
outBtnHeight=group[1].PanelHeight;
outBtnWidth=145;
}
public void actionPerformed(ActionEvent e){
// listen to UP buttons
for(int i=1;i<numOfFloor;i++){
if(e.getSource()==outBtn.UP[i]){
if(upCalls[i]==0){
upCalls[i]=1;
upChoose(i);
}
}
// if(i==2)System.out.println("relativeHeeight 2: "+group[2].cage.relativeHeight);
}
//listen to DOWN buttons
for(int i=2;i<=numOfFloor;i++){
if(e.getSource()==outBtn.DOWN[i]){
if(downCalls[i]==0) {
downCalls[i]=1;
downChoose(i);
}
}
}
//listen to cageTimer
for (int j=1;j<=numOfLift;j++ ){
if(e.getSource()==group[j].cageTimer){
group[j].liftState.liftInfo3.setText("");
if(group[j].state==GOUP){
group[j].liftState.liftInfo3.setForeground(Color.BLACK);
group[j].liftState.liftInfo3.setText("运动方向:↑");
group[j].cage.moveUp();
if(group[j].cage.relativeHeight<-group[j].cage.heightOfFloor){
group[j].floor++;
group[j].cage.floor++;
setColorFloorNum(j,group[j].floor);
group[j].cage.relativeHeight=0;
testStop(j,group[j].floor);
}
//###################
}else if(group[j].state==GODOWN){
group[j].liftState.liftInfo3.setForeground(Color.BLACK);
group[j].liftState.liftInfo3.setText("运动方向:↓");
group[j].cage.moveDown();
if(group[j].cage.relativeHeight>group[j].cage.heightOfFloor){
group[j].floor--;
group[j].cage.floor--;
setColorFloorNum(j,group[j].floor);
group[j].cage.relativeHeight=0;
testStop(j,group[j].floor);
}
//##########################
}
}
}
//listen to open button
for (int j=1;j<=numOfLift;j++ ){
if(e.getSource()==group[j].innerBtn.openButton){
group[j].ifOpen=true;
if(group[j].state==FREE)
group[j].gateTimer.start();
}
}
//listen to close button
for (int j=1;j<=numOfLift;j++ ){
if(e.getSource()==group[j].innerBtn.closeButton){
group[j].ifOpen=false;
group[j].gateTimer.start();
}
}
//listen to stop button
for (int j=1;j<=numOfLift;j++ ){
for(int i=1;i<=numOfFloor;i++){
if(e.getSource()== group[j].innerBtn.stopButton[i]){
if(group[j].state==FREE&&group[j].floor==i){
group[j].ifOpen=true;
group[j].gateTimer.start();
}else{
if((group[j].floor!=i)||((group[j].floor==i)&&(group[j].cage.relativeHeight!=0))){
group[j].stop[i]=1;
group[j].innerBtn.stopButton[i].setForeground(Color.RED);
getToppestLowestCalls(j,i);
}
}
}
}
}
//listen to gateTimer
for (int j=1;j<=numOfLift;j++ ){
if(e.getSource()==group[j].gateTimer){
if(group[j].ifOpen){
openGate(j);
}
else
closeGate(j);
}
}
//listen to reassignTimer
if(e.getSource()==reassignTimer){
for(int i=1;i<=numOfFloor;i++){
if(downAlloateFail[i]==1){
downChoose(i);
}
if(upAlloateFail[i]==1){
upChoose(i);
}
}
}
for(int j=1;j<=numOfLift;j++){
if(e.getSource()==waitCloseGate[j]){
group[j].gateTimer.start();
closeGate(j);
waitCloseGate[j].stop();
}
}
//listen to the stateButton
for (int i = 1; i<= numOfLift; i++) {
int m = group[i].liftState.getNum();
if(group[i].cage.movement>0) {
if (e.getSource() == group[i].liftState.enterButton){
group[i].ifOpen=true;
if (m+1 <= 10) {
m += 1;
if(m >= 0) group[i].liftState.liftInfo3.setText("");
group[i].liftState.setNum(m);
}
else {
group[i].liftState.liftInfo3.setText("警告:已经满人了!");
group[i].liftState.liftInfo3.setForeground(Color.RED);
m = 10;
}
}
else if (e.getSource() == group[i].liftState.exitButton){
group[i].ifOpen=true;
if (m-1>=0) {
m -=1;
group[i].liftState.setNum(m);
if(m <=10) group[i].liftState.liftInfo3.setText("");
}
else {
m = 0;
group[i].liftState.liftInfo3.setText("警告:已经没有人");
group[i].liftState.liftInfo3.setForeground(Color.RED);
}
}
}
if(m == 0) group[i].liftState.liftInfo1.setText("电梯空闲中.");
else group[i].liftState.liftInfo1.setText("电梯里有"+m+ "个人");
group[i].liftState.liftInfo2.setText("现在电梯处于第"+group[i].floor+"层");
}
}
//open gate
void openGate(int j){
group[j].cageTimer.stop();
if((group[j].cage.movement>group[j].cage.widthUpBound)){
group[j].gateTimer.stop();
if(group[j].ifOpen==true){
waitCloseGate[j].start();
group[j].ifOpen=false;
}
}else{
group[j].cage.openGate();
}
}
//close gate
void closeGate(int j){
group[j].cageTimer.stop();
if((group[j].cage.movement<group[j].cage.widthLowBound)){
group[j].gateTimer.stop();
searchToppestLowest(j);
group[j].cageTimer.start();
}else{
group[j].cage.closeGate();
}
}
// 每次按钮按后设定最高与最低请求并设定状态
/************************************************/
public void getToppestLowestCalls(int callLift,int callfloor){
if(group[callLift].toppestCall>numOfFloor||group[callLift].toppestCall<callfloor)
group[callLift].toppestCall=callfloor;
if(group[callLift].lowestCall==0||group[callLift].lowestCall>callfloor)
group[callLift].lowestCall=callfloor;
setState(callLift,callfloor);
}
//设定状态函数
/***********************************************/
public void setState(int callLift,int callfloor){
int floor=group[callLift].floor;
if(floor==numOfFloor||floor==1)
group[callLift].state=FREE;
if(group[callLift].toppestCall>numOfFloor||group[callLift].lowestCall==0){
group[callLift].state=FREE;
}else if(group[callLift].state==FREE){
if(group[callLift].toppestCall<floor){
group[callLift].state=GODOWN;
}else if(group[callLift].toppestCall>floor){
group[callLift].state=GOUP;
}else{
/*group[callLift].upStop[floor]=group[callLift].downStop[floor]=0;
//#################upCalls test
upCalls[floor]=0;
// #################downCalls test
downCalls[floor]=0;
setUpButtonBlack(floor);
setDownButtonBlack(floor);*/
group[callLift].cageTimer.stop();
if(group[callLift].upStop[floor]==1){
group[callLift].state=GOUP;
group[callLift].upStop[floor]=0;
upCalls[floor]=0;
setUpButtonBlack(floor);
}
if(group[callLift].downStop[floor]==1){
group[callLift].state=GODOWN;
group[callLift].downStop[floor]=0;
downCalls[floor]=0;
setDownButtonBlack(floor);
}
group[callLift].gateTimer.start();
group[callLift].ifOpen=true;
}
}else if(group[callLift].state==GOUP){
if(floor>group[callLift].toppestCall){
group[callLift].state=GODOWN;
/****/ }
}else if(group[callLift].state==GODOWN){
if(floor<group[callLift].lowestCall)
group[callLift].state=GOUP;
}
}
//每次关门后检测状态
/**********************************************/
void searchToppestLowest(int callLift){
int t=callLift;
for(int i=numOfFloor;i>0;i--){
if(group[t].stop[i]==1||group[t].upStop[i]==1||group[t].downStop[i]==1){
group[t].toppestCall=i;
break;
}else{
group[t].toppestCall=10000;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -