[JAVA] Mettre a jour variable dans boucle for

annisseur -  
 annisseur -
Bonjour,

j'aimerais créer un bouton sur lequel s'affiche un temps qui baisse chaque seconde.

voici les créateurs du bouton:
int secondes; 

JButton countdown = new JButton("temps restant:" +secondes); 
countdown.setBounds(560,10,150,50); 
countdown.setFocusable(false); 
panneauPrincipal.add(countdown); 



et voici la boucle for avec un thread pour la mettre en pause:

Thread s = new Thread() { 
 public void run() { 
  for (secondes = 300; secondes >= 0; secondes--) { 
                       try { 
   Thread.sleep(1000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
          } 
  } 
 }; 
  s.start(); 


mais lorsque je lance mon programme la valeur affichée sur le bouton ne baisse pas. Je pense que ça vient du fait que la variable secondes ne se met pas à jour.
Comment faire?
Merci


A voir également:

1 réponse

KX Messages postés 19031 Statut Modérateur 3 020
 
La variable secondes se met bien à jour, mais elle est totalement indépendante du titre du bouton. Si tu veux modifier le titre avec la nouvelle valeur du temps il faut actualiser le titre à chaque fois :

for (secondes = 300; secondes >= 0; secondes--)
{
    countdown.setText("temps restant:" +secondes);
    try { Thread.sleep(1000); } catch (InterruptedException e) { } 
}

Attention : si tu fais 300 pauses d'une secondes, ça ne fera pas 300 secondes à cause du temps entre les pauses. Le temps passé en paramètre de Thread.sleep est un temps minimal (sous réserve qu'il n'y ai pas d'interruption), mais en pratique ce sera supérieur, en particulier à causes des opérations que tu fais entre deux opérations (la mise à jour du bouton, le calcul de la boucle, etc.) mais aussi en fonction de la charge du processeur (ce que tu fais avec les autres threads qui peuvent être prioritaire).
0
annisseur
 
Merci ça fonctionne nickel!
Est-ce-qu'il ya un moyen pour que ça soit vraiment égal au nombre de secondes que je décide?
0
KX Messages postés 19031 Statut Modérateur 3 020
 
"vraiment égal" non. Mais on peut s'arranger pour avoir une erreur plus faible, et en particulier pour ne pas les accumuler, c'est à dire que si tu fais une pause de 't' millisecondes, tu auras au pire 't' millisecondes de retard. Pour cela il faut utiliser l'heure du système (voir Décompte de temps en java).
0
annisseur
 
ok merci
0