Temporisation bug

Résolu
Signaler
Messages postés
2
Date d'inscription
mardi 25 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2009
-
Messages postés
764
Date d'inscription
mardi 25 mai 2004
Statut
Membre
Dernière intervention
8 mars 2011
-
Bonsoir,

mon problème est que j'active du code à partir d'un actionPerformed sur un menu. Dans ce code, il y a une tempo et mon application freeze. Concraitement, mon programme semble correctement fonctionner car la boucle s'exécute et m'affiche un résultat à chaque tour dans l'invite de commande mais des images doivent bouger dans l'application et celles-là ne bougent pas.
Quand je clique, le menu reste ouvert et rien ne réagit. Si la boucle se stoppe, je vois le dernier résultat mais pas les intermédiaires.
[http://img168.imageshack.us/my.php?image=tempown3.jpg [img=http://img168.imageshack.us/img168/1198/tempown3.th.jpg]]
Voici mon code:

<hr size="2" width="100%" /><hr size="2" width="100%" />public void tempo(int temps)
    {
        try {
            Thread.currentThread();
            Thread.sleep(temps);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }
   
    public void autto()
    {
        do
        {
            appli("auto");
           
            incre=incre+1;
            System.out.println(incre);
            tempo(500);
        }while(jMode.getText() != "Mode automatique");
    }
   
    public void appli(String choix)
    {
       
        if(choix == "manuel")
        {
            jMode.setText("Mode manuel");
            manuBouton.setVisible(true);
            incre=0;
        }
        else if(choix == "auto")
        {
            jMode.setText("Mode automatique");
            manuBouton.setVisible(false);
        }
        else if(choix == "clign")
        {
            jMode.setText("Mode clignotant");
            manuBouton.setVisible(false);
        }
        else if(choix == "fin")
        {
            jMode.setText("");
            manuBouton.setVisible(false);
            Rouge1.setBackground(Color.gray);
            Rouge2.setBackground(Color.gray);
            Orange1.setBackground(Color.gray);
            Orange2.setBackground(Color.gray);
            Vert1.setBackground(Color.gray);
            Vert2.setBackground(Color.gray);
            incre=-1;
        }
        switch (incre)
        {
        case 0: Rouge1.setBackground(Color.red);
                Rouge2.setBackground(Color.red);
                Orange1.setBackground(Color.gray);
                Orange2.setBackground(Color.gray);
                Vert1.setBackground(Color.gray);
                Vert2.setBackground(Color.gray);
                break;
        case 1: Rouge1.setBackground(Color.gray);
                Vert1.setBackground(Color.green);
                break;
        case 2: Vert1.setBackground(Color.gray);
                Orange1.setBackground(Color.orange);
                break;
        case 3: Orange1.setBackground(Color.gray);
                Rouge1.setBackground(Color.red);
                Rouge2.setBackground(Color.red);
                break;
        case 4: Rouge2.setBackground(Color.gray);
                Vert2.setBackground(Color.green);
                break;
        case 5: Vert2.setBackground(Color.gray);
                Orange2.setBackground(Color.orange);
                incre=-1;
                break;       
        }
       
               
    }
<hr size="2" width="100%" /><hr size="2" width="100%" />Lorsque j'appuie sur mon bouton, ça exécute le code suivant:
{
incre = incre + 1;
appli("");
}

Merci à celui qui sait me dire pourquoi mon interface graphique freeze et comment je pourrai régler ça.

Bonne soirée

Choum

3 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
Salut,

C'est que tu ne respecte pas les threads de SWING : SWING utilise un seul thread pour raffraichir les interfaces graphiques des programmes, si tu exécute du code dans ce thread là, ca bloque le raffraîchissement de ton interface graphique, et tu as donc l'impression qu'elle est freezée.

Voir ceci :
http://gfx.developpez.com/tutoriel/java/swing/swing-threading/
______________________________________
DarK Sidious
Messages postés
2
Date d'inscription
mardi 25 mars 2008
Statut
Membre
Dernière intervention
22 janvier 2009

Merci pour ta réponse,

pour passer  mon problème j'ai changé mon code en utilisant plutôt un Timer comme suit:

<hr size="2" width="100%" />    public void tempo(int temps)
    {
        timer = new javax.swing.Timer(temps, new ActionListener() {

            @Override
                public void actionPerformed(ActionEvent e) {
                    timer.stop();
                    //Mon code
                }
            });
        timer.start();
    }
<hr size="2" width="100%" />
J'espère que ça aidera quelqu'un d'autre ayant un tel problème.

Bonne journée

Choum20
Messages postés
764
Date d'inscription
mardi 25 mai 2004
Statut
Membre
Dernière intervention
8 mars 2011
8
Hello,

la classe SwingWorker  me semble plus appropriée.

++