Ascenseur - interface graphique simple


L'interface fait référence à une cabine d'ascenseur avec le nombre d'étages défini comme paramètre.

L'ascenseur et les étages à partir desquels il peut être appelé sont réalisés avec des frames séparés. Chaque frame comprend 4 panneaux situés en haut, en bas, à gauche et à droite (BorderLayout). Dans le panneau supérieur de tous les cadres, il y a une zone de texte indiquant l'étage actuel de l'ascenseur. Dans le frame droit de l'ascenseur se trouvent les boutons de demande d'étage, réalisés sous forme de CheckBox. Pour les étages du panneau de droite, il n'y a qu'une seule case à cocher pour appeler l'ascenseur. Les panneaux gauche et inférieur de tous les frames ne contiennent aucun composant et sont introduits pour la symétrie. La porte de l'ascenseur est implémentée sous la forme d'un JTextBox situé au milieu des cadres. L'ouverture et la fermeture de la porte dans les cadres sont simulées en affichant le texte correspondant et en changeant la couleur du champ.

Afin de montrer la fonctionnalité de l'interface, deux timers ont été introduits qui simulent le mouvement de l'ascenseur. Le premier est utilisé pour le mouvement de l'ascenseur - il se déplace en continu du zéro au dernier étage et vice versa (changement d'étage affiché par JTextBox), et le second - simule l'ouverture simultanée de la porte de l'ascenseur et l'étage (si lors du passage de l'ascenseur à l'étage il y a eu une requête à l'étage ou dans l'ascenseur). L'interface simule également l'enlèvement des requêtes soumises

Il s'agit simplement d'une interface - aucun fil n'est introduit pour que les utilisateurs se synchronisent avec le mouvement de l'ascenseur.

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 pup= new JPanel(new FlowLayout());
        crfl=new JTextField("0",2);
        dir = new JTextField("^",1);
        pup.add(crfl);
        pup.add(dir);
        lift.add("North",pup);
     
        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) {
        new Lift(4);   
    }

    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), 3000);
                }
            }         
        }
    }

    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();
            close.purge();
        }
    }
}

.