IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

paint, repaint, thread?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 82
    Par défaut paint, repaint, thread?
    Bonjour, voila un problème que je retrouve souvent et auquel je ne trouve pas de solution. J'ai l'impression que la méthode paint, ou repaint est threadée. Le terme n'est surement pas correct mais je ne sais pas comment appeler ce phénomène.
    Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public void unemethode(){
      repaint();
      end= true;
    }
     
    public void paint(Graphics g){
      g.draw.......
      ......
      g.draw.......
      if (!end){//dessin de ma figure
        g.draw...
        g.draw...
      }
    }
    Le problème est que end est déjà a true lors du test if(!end)
    Résultat, ma figure n'est pas tracée. Alors que dans le principe, end ne devrait être à true qu'aprés que repaint() se termine....
    Bref, je ne sais pas du tout comment résoudre ce problème.
    J'ai déjà essayé les synchronized de repaint et paint, mais ca ne change rien et d'ailleurs à cause de ca je n'arrive pas à comprendre ce qui se passe.

    Si quelqu'un peut m'espliquer ce qui se passe dans le détail et comment résoudre le problème de façon propre...
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    le "dessin" des interfaces est effectivement dans un thread séparé.
    qu'on nomme l'EDT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 82
    Par défaut re
    D'accord, merci.
    Il est facile de régler le problème en utilisant des petites stratégies simples,(par exemple mettre un booléen à vrai en sortant du paint et attendre dans la fonction qui apelle repaint que ce booléen soit vrai pour passer à l'instruction suivante) mais je trouve que ce n'est vraiment pas propre, et d'ailleurs surement pas adapté.
    Connaissez vous des façons "intéressantes" de régler le problème?

    Merci

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    mais je trouve que ce n'est vraiment pas propre, et d'ailleurs surement pas adapté.
    Connaissez vous des façons "intéressantes" de régler le problème?
    je ne sais pas ce que tu cherche a faire, donc ca va etre dur.

    Si l'affichage est dans un autre thread, c'est pour ne pas bloquer l'application (fenetre grise quand on deplace, bouton qui ne reagisse pas) pendant les traitements longs.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 82
    Par défaut re
    Alors imaginons un bout de code comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void afunc(){
      while(c>0){
        repaint();
        c--;
      }
      this.end= true;
    }
     
    public void paint(Graphics g){
      if (!end){
        ...
      }
    }
    je veux que pain soit apelé c fois, or il risque fortement d'être apelé c-1 fois.

    Je pourrais bien sur remplacer ce code par quellque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void afunc(){
      while(!this.end)
        repaint();
    }
     
    public void paint(Graphics g){
      ....
      c--;
      if (c==0) this.end= true; 
    }
    Mais je trouve ca un peu tordu.
    Ce qui m'ennuies un peu, c'est de gérer dans paint des choses qui n'ont plus rien à voir avec l'affichage directement, mais qui sont plutot des tests pour controler l'affichage. En effet, ce n'est pas bien grave, mais si je ppouvais trouver un moyen plus propre d'éxécuter mon premier code en étant sur que l'affichage se fasse c fois, ca serait bien pratique (imaginez l'affichage d'une horloge ou quelque chose comme ca). J'aurais pensé que faire une section critique avec paint serait utile, mais non.
    Donc si vous voyez comment faire...

    Merci

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    J'ai l'impression que tu loupes quelque chose dans la compréhension du paint, mais il est difficile de saisir quoi, car, comme eclesia, je ne vois pas très bien pourquoi tu fais tout ça.

    Pourquoi veux-tu appeler repaint "c" fois ?? Habituellement on appelle repaint quand il y a quelque chose à dessiner, et non pas un nombre déterminé de fois

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 17h38
  2. pb : paint et repaint d'une image à partir d'un thread
    Par zazou0506 dans le forum Graphisme
    Réponses: 1
    Dernier message: 03/01/2008, 00h57
  3. pb paint et repaint d'une image dans un thread
    Par zazou0506 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 02/01/2008, 22h21
  4. Probleme paint() repaint()
    Par Uren dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 27/07/2007, 18h02
  5. Réponses: 4
    Dernier message: 08/10/2006, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo