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