Интерфейсът се отнася за една асансьорна клетка с брой етажи задаван като параметър.
Асансьорът и етажите, от които може да се вика са реализирани с отделни фрейми. Всеки фрейм включва 4 панела разположени отгоре, отдолу, в ляво и в дясно (BorderLayout). В горния панел на всички фрейми има текстово поле, показващо текущия етаж на асансьора. В десния фрейм на асансьора са разположени бутоните за заявка за етаж, рализирани като CheckBox. При етажите в десния панел има само един CheckBox за повикване на асансьора. Панелите в ляво и отдолу във всички фрейми не съдържат компоненти и са въведени за симетрия. Вратата на асансьора е реализирана като JTextBox разположен в средата на фреймите. Отварянето и затварянето на вратата във фреймите се симулира чрез надпис и промяна на цвета на полето.
За да се покаже работоспособността на интефейса са въведени два таймера, които симулират движението на асансьора. Първият се използва за движение на аснасьора - той се движи неперекъснато от нулевия към последния етаж и обратно (промяна на етажа показван от JTextBox) , а вторият - симулира едновременното отваряне на вратата на асансьора и на етажа, ако при преминаването на асансьора през етажа е имало заявка на етажа или в асансьора. Показано е как програмно се изчистват заявките
Това е само интерфейс - не са въведени нишки за потребителите, които трябва да се синхронизират с движението на асансьора.
import
java.awt.*; import javax.swing.*; import java.util.Timer; import java.util.TimerTask; public class Lift { int nfl; // //number of floors JFrame lift, floor[]; JTextField crfl,lDoor,dir ; //current lift place on the floors, lift Door, direction JCheckBox lcb[]; //check boxes in the lift boolean up = true; // move direction on the lift Timer move = new Timer(); Timer close; JTextField fcrfl[]; //current lift place (on the floors) JCheckBox flcb[]; //check boxes on the floors JTextField fDoor[]; //doors on the floors Lift(int nfl){ this.nfl=nfl; lift = new JFrame("IN LIFT"); lift.setBounds(10, 10, 300, 900); lift.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel up= new JPanel(new FlowLayout()); crfl=new JTextField("0",2); dir = new JTextField("^",1); up.add(crfl); up.add(dir); lift.add("North",up); JPanel rght = new JPanel(new GridLayout(nfl,1)); lcb = new JCheckBox[nfl]; //check boxes in the lift for(int i=nfl-1;i>=0;i--) { lcb[i]=new JCheckBox("f"+i); rght.add(lcb[i]); } lift.add("East",rght); lDoor=new JTextField("CLOSED DOOR"); lDoor.setBackground(Color.red); lDoor.setEditable(false); lift.add("Center",lDoor); lift.add("West",new JPanel()); lift.add("South",new JPanel()); lift.setVisible(true); floor = new JFrame [nfl]; // frames on the floors JPanel fup[] = new JPanel[nfl]; //up panels on the floors fcrfl = new JTextField[nfl]; //current lift place on the floors JPanel frght[] = new JPanel[nfl]; // right panels (on the floors) flcb = new JCheckBox[nfl]; //check boxes on the floors fDoor= new JTextField[nfl]; //doors on the floors for(int i=0;i<nfl;i++) { floor[i] = new JFrame("FLOOR "+i); floor[i].setBounds(300*(i%5+1)+10, i/5*250+10, 300, 250); floor[i].setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fup[i]= new JPanel(new FlowLayout()); fcrfl[i]= new JTextField("0",3); fup[i].add(fcrfl[i]); floor[i].add("North",fup[i]); frght[i] = new JPanel(new GridLayout(1,1)); flcb[i] = new JCheckBox("call"); frght[i].add(flcb[i]); floor[i].add("East",frght[i]); fDoor[i]=new JTextField("CLOSED DOOR"); fDoor[i].setBackground(Color.red); fDoor[i].setEditable(false); floor[i].add("Center",fDoor[i]); floor[i].add("West",new JPanel()); floor[i].add("South",new JPanel()); floor[i].setVisible(true); } move.schedule(new MoveTask(), 5000, 6000); } public static void main (String[] arg) { Lift l =new Lift(5); } class MoveTask extends TimerTask { public void run() { int i= Integer.parseInt(crfl.getText()); if (up) { crfl.setText(++i +""); if(i==(nfl-1)) { up=false; dir.setText("v"); } } else { crfl.setText(--i +""); if(i==0) { up=true; dir.setText("^"); } } for(int j=0;j<nfl;j++) { fcrfl[j].setText(crfl.getText()); if((i==j)&&(flcb[i].isSelected() || lcb[i].isSelected() ) ){ //if the floor is checked - open & close fDoor[i].setText("OPEN DOOR"); fDoor[i].setBackground(Color.green); lDoor.setText("OPEN DOOR"); // open lift door lDoor.setBackground(Color.green); flcb[i].setSelected(false); lcb[i].setSelected(false); close = new Timer(); close.schedule(new CloseTask(i), 2000); } } } } class CloseTask extends TimerTask { int num; CloseTask(int num){ this.num=num; } public void run() { fDoor[num].setText("CLOSED DOOR"); fDoor[num].setBackground(Color.red); lDoor.setText("CLOSED DOOR"); lDoor.setBackground(Color.red); close.cancel(); } } } |
.