Асансьор - прост графичен интерфейс


Интерфейсът се отнася за една асансьорна клетка с брой етажи задаван като параметър. 

Асансьорът и етажите, от които може да се вика са реализирани с отделни фрейми. Всеки фрейм включва 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();
        }
    }
}

.