Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

repaint() bizarre

2 réponses
Avatar
Yvon
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/

2 réponses

Avatar
ibiiztera
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 JTextFie ld
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 su r
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.
Il y a surement une explication logique et je suis preneur.
--
Yvon
http://perso.numericable.fr/vertgalant/
Avatar
Yvon
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/