Temps d'attente entre 3 instructions JAVA

Résolu
Nouyou Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -  
Nouyou Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -
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 :)


  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.
A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
0
Nouyou Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
 
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();
}
});



}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
L'actionPerformed doit permettre de démarrer le SwingWorker, via la méthode execute(), et c'est ce qu'il te manque ici.

worker.execute();
0
Nouyou Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
 
C'es réglé , Merci bcq :D
0
FeelZoR Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   4
 
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 ?
0