Swing et Thread

Résolu
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 18 janv. 2007 à 01:46
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 19 janv. 2007 à 16:21
Salut:

J'ai un problème de synchronisation de l'affichage du fond des objets de la classe JLabel.

// Classe principale



public class MainClass {



   private Render render;
   // ...
   addKeyListener (this);

   public void keyPressed (KeyEvent e) {
      render.execute (e);
   }



}

// Classe Render
// Elle se charge de colorer les cases qui sont des JLabel
// En fait j'ai six cases (JLabel)
public class Render {
   JLabel label [];
   // ...
   public void execute (KeyEvent e) {
      if (e.getKeyCode () == KeyEvent.VK_ENTER) {
         for (int i=0; i<6; i++) {
             label [i].setBackground (Color.red);
             try {
                Thread.sleep (500);
             }
             catch (InterruptedException e) {
             }
         }
      }
   }
}

Le problème que l'affichage ne se déroule pas comme c'est prévu.
Il y a un retard plus le tout s'affiche en même temps.

Personnellement je pense qu'il y a un problème de synchronisation.

5 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
18 janv. 2007 à 10:06
Salut:

D'après ton code, je pense que je dois réadapter mes méthodes.
J'ai trouvé un article qui parle de "invokeLater ()" et "invokeAndWait ()" je vais jetter un coup d'oeil.

__________________________________________________________
A.B. :  Savoir c'est être heureux ...
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
18 janv. 2007 à 10:15
Salut,

dans swing faut éviter les for, while et autre traitement lourd déclenché dans un callback d'évenement sinon, tu risques soit de freez l'appli, soit d'avoir des affichage non désiré, donc déportes les traitements lourd dans un thread ou timer ainsi les affichages se dérouleront à merveille

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
19 janv. 2007 à 16:21
Salut:



try {




    SwingUtilities.invokeLater (new Runnable () {  
        public void run () {
            // Changements à faire
        }
    });
}
catch (Exception e) {
}





__________________________________________________________
A.B. :  Savoir c'est être heureux ...
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
18 janv. 2007 à 09:44
Salut,

c'est normal ton prob, enfait vu le bout de code tu es en plein dans le thread main et avec les sleep c'est pas le pied tu ralenti tout l'affichage

une solution (ce n'est qu'un exemple et il ne correspondra surement pas à ton code donc inspire toi de l'idée ):

le refresh :

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.Timer;

public class Render implements ActionListener {
    private JLabel    label[];
    private Timer    refresh    = new Timer(100, this);    //ici tu te fou du delai
   
    public Render(JLabel label[]){
        this.label = label;
    }

    public void start() {
        refresh.start();
    }

    public void stop() {
        refresh.stop();
    }

    public void restart() {
        refresh.restart();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(refresh)) {
            for (int i = 0; i < 6; i++) {
                label[i].setBackground(Color.RED);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ie) {
                }
            }
            refresh.stop();
        }
    }

}

// Classe principalepublic class MainClass {

   private Render render;
   // ...
   addKeyListener (this);

   public void keyPressed (KeyEvent e) {
        if (e.getKeyCode () == KeyEvent.VK_ENTER) {
            render.restart ();
   }

}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
18 janv. 2007 à 21:24
Salut:
 
Sais comment rendre un message envoyé par dispatchEvent prioritaire de telle sorte que la JVM le traite et ne retarde pas.

__________________________________________________________
A.B. :  Savoir c'est être heureux ...
0
Rejoignez-nous