Temps d'attente entre 3 instructions JAVA
Résolu
Nouyou
Messages postés
51
Statut
Membre
-
Nouyou Messages postés 51 Statut Membre -
Nouyou Messages postés 51 Statut Membre -
Bonjour,
J'ai une JFrame qui contient un label et un bouton , je veux changer la couleur du texte du label 3 fois en cliquant sur le bouton .
J'ai fait une boucle for qui contient un Thread avant de changer la couleur du label . Mais le problème qu'il y'a une attente de 3 secondes mais le label prend la couleur cyan sans passer par les couleurs blue et red .
Voici le code et Merci de m'aider :)
J'ai une JFrame qui contient un label et un bouton , je veux changer la couleur du texte du label 3 fois en cliquant sur le bouton .
J'ai fait une boucle for qui contient un Thread avant de changer la couleur du label . Mais le problème qu'il y'a une attente de 3 secondes mais le label prend la couleur cyan sans passer par les couleurs blue et red .
Voici le code et Merci de m'aider :)
public void actionPerformed(ActionEvent e) {
if(e.getSource()==bouton){
Color [] tab = {blue,red,cyan};
int t=0;
for (int i=0;i<3;i++)
{ try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
Logger.getLogger(Fenetre.class.getName()).log(Level.SEVERE, null, ex);
} label.setForeground(tab[i]);
}
| EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI Merci d'y penser dans tes prochains messages. |
2 réponses
-
Bonsoir,
La JFrame ne se rafraîchit qu'une fois l'actionPerformed terminé, donc tant que tu ne rends pas la main ça ne fait rien, et une fois fini (dans ton cas au bout de 3*3000 ms), c'est le dernier état qui est affiché (donc cyan, sans passer par blue ou red).
Il faudrait que tu regardes comment fonctionnes les SwingWorker, c'est le même principe qu'un Thread mais spécifiquement pour les interfaces graphiques, cela permet de déclencher une action, tout en terminant l'action en cours.
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
La confiance n'exclut pas le contrôle-
Merci pour votre réponse KX J'ai essayé de travailler avec les SwingWorker mais ça n'as pas marché , voici mon code si ça ne vous dérange pas de jeter un coup d'oeil :
public void actionPerformed(ActionEvent e) {
if(e.getSource()==bouton){
worker=new SwingWorker(){
@Override
protected Void doInBackground() throws Exception {
Color [] tab = {blue,red,cyan};
int t=0;
for (int i=0;i<3;i++)
{ try {
Thread.sleep(2000);
autopic.setForeground(tab[i]);
} catch (Exception ex) {
Logger.getLogger(Fenetre.class.getName()).log(Level.SEVERE, null, ex);
}
}return null;}
};
}}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
Fenetre F=new Fenetre();
}
});
} -
-
-
-
Je n'ajouterai rien concernant la résolution de ton problème, mais dans ce code il me semble que ton if n'est jamais fermé au même titre que ta méthode actionPerformed(e).. problème d'accolades oubliées peut-être ?