Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

repaint() bizarre

7 views
Skip to first unread message

Yvon

unread,
Mar 13, 2012, 6:34:39 AM3/13/12
to
Bonjour.

J'ai un Jdialog (maMachine) qui comporte un bouton (calcul), des JTextField
pour y entrer des paramètres, et un jpanel (ecran) pour afficher des
dessins.

Le fonctionnement est simple :
Entrer des paramètres puis presser calcul pour visualiser une courbe sur
l'écran de maMachine.
maMachine récupère les paramètres et les utilise pour calculer une courbe
sous forme d'une Liste de points (x,y).
maMachine passe ensuite la Liste à l'écran dont la méthode
paintComponent(Graphics g) a été surchargée pour dessiner la courbe.
Enfin maMachine appelle repaint()

La bizarrerie :
Si JDialog (maMachine) demande au JPanel (ecran) de se repeindre
( ecran.repaint() ) : les courbes successives se supperposent sur ecran.
Si JDialog (maMachine) se repeint lui même ( this.repaint() ) l'ancien
affichage du JPanel (écran) est remplacé par le nouveau.

Il y a surement une explication logique et je suis preneur.
--
Yvon
http://perso.numericable.fr/vertgalant/

ibiiztera

unread,
Mar 14, 2012, 5:41:54 PM3/14/12
to vertg...@numericable.fr
Le mardi 13 mars 2012 11:34:39 UTC+1, Yvon a écrit :
> Bonjour.
>
> J'ai un Jdialog (maMachine) qui comporte un bouton (calcul), des JTextField
> pour y entrer des paramètres, et un jpanel (ecran) pour afficher des
> dessins.
>
> Le fonctionnement est simple :
> Entrer des paramètres puis presser calcul pour visualiser une courbe sur
> l'écran de maMachine.
> maMachine récupère les paramètres et les utilise pour calculer une courbe
> sous forme d'une Liste de points (x,y).
> maMachine passe ensuite la Liste à l'écran dont la méthode
> paintComponent(Graphics g) a été surchargée pour dessiner la courbe.
> Enfin maMachine appelle repaint()
>
> La bizarrerie :
> Si JDialog (maMachine) demande au JPanel (ecran) de se repeindre
> ( ecran.repaint() ) : les courbes successives se supperposent sur ecran.
> Si JDialog (maMachine) se repeint lui même ( this.repaint() ) l'ancien
> affichage du JPanel (écran) est remplacé par le nouveau.
>
oui il y a une explication et il me semble que c'est celle-ci:
maMachine.repaint() repeint tous les composants à partir de rien.
ecran.repaint() peindra les nouveaux points selon la méthode surchargée paintComponent(). S'il n'y a pas de 'efface ecran' explicite, les anciens points seront conservés et les nouveaux viendront s'ajouter.
Je rajouterais dans ecran.paintComponent() en premier lieu:
getGraphics().setColor(Color.White);
getGraphics().fillRect(0,0,ecran.getWidth(),ecran.getHeight());

Mais donnez des détails sur l'implémentation, ca aidera au débogage.

Yvon

unread,
Mar 15, 2012, 5:26:13 PM3/15/12
to
ibiiztera wrote:

> oui il y a une explication et il me semble que c'est celle-ci:
> maMachine.repaint() repeint tous les composants à partir de rien.
> ecran.repaint() peindra les nouveaux points selon la méthode surchargée
> paintComponent(). S'il n'y a pas de 'efface ecran' explicite, les anciens
> points seront conservés et les nouveaux viendront s'ajouter. Je
> rajouterais dans ecran.paintComponent() en premier lieu:
> getGraphics().setColor(Color.White);
> getGraphics().fillRect(0,0,ecran.getWidth(),ecran.getHeight());
>
> Mais donnez des détails sur l'implémentation, ca aidera au débogage.

Bonsoir.
Vous avez probablement raison. Quand on lit attentivement les spécifications
il y a des différences subtiles pour le repaint() entre les conteneurs
lourds et les légers. Mais c'est une lecture assez ésotérique que j'ai du
mal à interpréter.
Ceci dit ce n'est pas un bogue mais une erreur due au manque de connaissance
du système : on approxime 20 fois sans problème et ça coince à la 21 ème
quand les conditions sont un peu différentes.

J'ai récupéré 3 classes qui démontrent le problème, mais c'est encore un peu
gros pour les news, je les envoie en pièces jointes par email.
--
Yvon
http://perso.numericable.fr/vertgalant/
0 new messages