Temporisation bug

Résolu
choum20 Messages postés 2 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 22 janvier 2009 - 21 janv. 2009 à 21:26
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 - 22 janv. 2009 à 15:43
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

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
22 janv. 2009 à 07:25
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
3
choum20 Messages postés 2 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 22 janvier 2009
22 janv. 2009 à 12:54
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
3
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
22 janv. 2009 à 15:43
Hello,

la classe SwingWorker  me semble plus appropriée.

++
0
Rejoignez-nous