Temps d'attente entre 3 instructions JAVA

Résolu/Fermé
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016 - Modifié par Whismeril le 28/10/2015 à 14:43
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016 - 10 nov. 2015 à 18:09
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 28/10/2015 à 19:57
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 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016
8 nov. 2015 à 14:38
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 8/11/2015 à 16:04
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 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016
10 nov. 2015 à 18:09
C'es réglé , Merci bcq :D
0
FeelZoR Messages postés 78 Date d'inscription vendredi 30 octobre 2015 Statut Membre Dernière intervention 18 août 2016 4
2 nov. 2015 à 19:01
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