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

Composants Java Discussion :

repaint vs paintImmediately


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 60
    Par défaut repaint vs paintImmediately
    Bonjour,

    Pour faire une animation d'un JPanel descendant, j'ai un Timer avec pour action le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setOpaque(false);
    repaint(getVisibleRect());
    setOpaque(true);
    setSize(getWidth(), (getProgressInPercent() * getParent().getHeight()) / 100);
    repaint();
    Déjà ce code me plaît moyennement car je suis obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setOpaque(false);
    repaint(getVisibleRect());
    setOpaque(true);
    juste pour redessiner le composant parent sans le panel en question... On peut pas garder une trace du Graphics correspondant au composant parent avant l'ajout du fils et le faire dessiner quand on en a besoin ?

    Enfin bref, ce n'est pas l'origine de mon post, voici mon problème :
    le premier repaint ne fait strictement rien, alors que si à la place je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paintImmediately(getVisibleRect());
    là ça fonctionne mais avec du clipping très désagréable

    Donc j'aimerais bien savoir pourquoi le premier repaint marche pas

    Si quelqu'un a une idée je suis tout ouïe !
    Merci d'avance à tous ceux qui se pencheront sur mon problème !

  2. #2
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 60
    Par défaut
    J'ai trouvé un exemple plus simple à mettre en œuvre si vous voulez tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setOpaque(false);
    paintImmediately(getVisibleRect());
    setOpaque(true);
    setBackground(new Color(getBackground().getRed(), getBackground().getGreen(), getBackground().getBlue(),
    	2*e.getProgressInPercent()));
    Donc comme ça ça marche mais avec du clipping et maintenant de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setOpaque(false);
    repaint(getVisibleRect());
    setOpaque(true);
    setBackground(new Color(getBackground().getRed(), getBackground().getGreen(), getBackground().getBlue(),
    	2*e.getProgressInPercent()));
    Là ça fait clairement n'importe quoi

    En fait je soupçonne les "optimisations" lors d'un appel à repaint d'être responsables de tout ça...

    Programs should not invoke paintImmediately() directly unless there is a valid need for real-time painting. This is because the asynchronous repaint() will cause multiple overlapping requests to be collapsed efficiently, whereas direct calls to paintImmediately() will not.

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 60
    Par défaut
    Je vous mets ci-dessous les artefacts que j'obtiens avec paintImmediately car je croyais que c'était du clipping mais en fait on dirait plus un problème de rafraichissement vertical, non ?


  4. #4
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    salut.
    est ce que je peux comprendre pourquoi tu met un

    suivit d'un

    de plus quel est l'update JRE que tu utilise et appartement l'ordre d'exécution de la méthode paintComponent est important. en fait quel est le code que tu as écrit dedans ?

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    repaint, comme le dit la javadoc, ça demande au composant de se redessiner, ça ne veux pas dire que le composant sera redessiné à la sortie. En pratique, ton code est équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setOpaque(false);
    setOpaque(true);
    repaint(getVisibleRect());

    Quand à paintImmediately, tu ne peux pas l'appeler depuis ton timer, sauf si c'est un timer swing.

  6. #6
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 60
    Par défaut
    Tout d'abord merci de vous pencher sur mon problème !

    Pour te répondre slim_java, je fais ça pour redessiner l'herbe, que tu vois sur l'image que j'ai mise, sans le panel courant. En fait je suis obligé de le faire car sinon il redessine sur ce qu'il avait déjà dessiné auparavant et ça rend n'importe quoi
    Après pour ta question sur "l'update JRE que j'utilise", ben euh... je comprends pas bien ce que tu veux savoir J'utilise soit update() soit update(Rectangle), mais je ne sais pas si c'est la réponse que tu attendais ?
    Et pour paintComponent dans le second exemple je ne l'ai pas touchée


    Merci tchize_ pour ta précision, je comprends mieux pourquoi il fait rien alors
    Et c'est bien un timer Swing, donc pas de problème normalement alors ?


    Donc la question qui subsiste est : d'où viennent ces foutus artefacts ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 18h38
  2. Lancer repaint() en synchrone
    Par Higestromm dans le forum Interfaces Graphiques en Java
    Réponses: 11
    Dernier message: 06/10/2005, 14h40
  3. [MouseEvent] arret de souris = repaint() ?
    Par n00bi dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 08/06/2005, 12h38
  4. Comment geler le repaint d'un TPageControl ?
    Par qi130 dans le forum Composants VCL
    Réponses: 19
    Dernier message: 20/12/2004, 23h30
  5. [Graphisme][Débutant(e)] Problème sur repaint()
    Par Katyucha dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 08/10/2004, 18h12

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