1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| import java.awt.Color;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Marcheur implements Runnable{
private String label;
private Color couleur;
private int position;
private int arrivee;//La position de l'arrivé en mètre
private JFrame fen;
private JLabel avancement;//Pour afficher dans l'interface graphique l'avancement actuel
private Object waitingObj;
private int step;
//static Marcheur dernier_arrive;
static RDV prochain_rdv;
static RDV rdv1;
static RDV rdv2;
public Marcheur(String label, Color couleur, int arrive, Object obj) {
//On commence par récupérer des infos sur le prochain rdv pour les afficher
waitingObj = obj;
String label_prochain_rdv = null;
if( prochain_rdv != null){
label_prochain_rdv = "Prochain RDV : " + prochain_rdv.getLabel_rdv();
}else{
label_prochain_rdv = "Prochain RDV : inconnu";
}
this.label = label;
this.couleur = couleur;
this.position = 0;
this.arrivee = arrive;
this.avancement = new JLabel("Marcheur " + label + " " + label_prochain_rdv + " " + position + " / "+arrivee);
//Construction de la fenetre
fen = new JFrame();
fen.getContentPane().add(avancement);
fen.setTitle("Test marcheur");
fen.setSize(290, 80);
fen.setLocation(200, 100+(Integer.parseInt(label)*80));
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setVisible(true);
}
public String getLabel(){
return this.label;
}
/**Permet de réinitialiser un Marcheur pour qu'il soit prêt à repartir
*/
public void initialiser(){
this.position = 0;
//this.avancement.setText("Marcheur " + label + " " + prochain_rdv.getLabel_rdv() + " " + position + " / "+arrivee);
}
//Pour rensigner les rdv connu de tous les marcheurs (variable static)
public void initialiserRDV(RDV rdvA, RDV rdvB, RDV proch_rdv){
Marcheur.rdv1 = rdvA;
Marcheur.rdv2 = rdvB;
Marcheur.prochain_rdv = proch_rdv;
}
//Pour tous les marcheur, indique le prochain rendez-vous
public void setProchainRDV(RDV rdv){
Marcheur.prochain_rdv = rdv;
}
public boolean estArrive(){
return arrivee - position == 0;
}
public int alea(int valeur){
Random generator = new Random();
return generator.nextInt(valeur+1);
}
public void pause(int valeur){
try {
Thread.sleep(valeur);
} catch (InterruptedException ex) {
Logger.getLogger(Marcheur.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void avancer(){
int distance_parcourue = alea(3)*100;//On avance par 100 mètres
this.position += distance_parcourue;
//On arrête le marcheur à l'arrivée si il est en position de la dépasser.
if( position > arrivee){
position = arrivee;
}
avancement.setText("Marcheur " + label + " Step=" + step + ":" +prochain_rdv.getLabel_rdv() + " " + position + " / "+arrivee);
}
/**Pour passer du rdv 1 au 2 ou vice versa */
void changer_rdv(){
if( Marcheur.prochain_rdv == Marcheur.rdv1){
Marcheur.prochain_rdv = Marcheur.rdv2;
}else{
Marcheur.prochain_rdv = Marcheur.rdv1;
}
Marcheur.prochain_rdv.nb_marcheur_arrive = 0;//De nouveau, plus personne n'est arrivé
avancement.setText("Marcheur " + label + " Step=" + step + ":" +prochain_rdv.getLabel_rdv() + " " + position + " / "+arrivee);
}
//Gère l'arrivé au rdv, si on est le dernier on fait un notify sur les autres, sinon on attends
void arriver(){
if( Marcheur.prochain_rdv.tous_arrive()){
synchronized (waitingObj) {
waitingObj.notifyAll();
}
System.out.println("\n RDV suivant ! \n");
changer_rdv();
}else{
try {
synchronized (waitingObj) {
waitingObj.wait();
}
System.out.println("\n RDV suivant ! \n");
changer_rdv();
} catch (InterruptedException ex) {
Logger.getLogger(Marcheur.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
void aller_au_rdv(){
while( !estArrive()){
avancer();
pause(1000);
}
System.out.println(label + "est arrivé.");
Marcheur.prochain_rdv.marcheur_arrive(this);//On indique au rdv qu'on est arrive
arriver();
}
@Override
public void run(){
//aller_au_rdv();
for(step=0 ; step<5 ; step++){
aller_au_rdv();
this.position = 0;//Si on execute cette ligne, c'est qu'on a été reveillé eet qu'on est passé au rdv suivant
}
}
} |
Partager