Bonjour,
voilà le problème que je n'arrive pas à démêler :
Pour faire le plus simple possible :
J'ai une fenêtre qui contient une barre d'outil et un JPanel.
Dans ma méthode redéfinie paintComponent() je mets au début :
Après le lancement de l'application la fenêtre de sortie me renvoie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 super.paintComponent( g ); Graphics2D g2D = (Graphics2D) g; System.out.println( g2D.getTransform() );
AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 43.0]].
43 étant l'épaisseur de ma barre d'outil. Ce qui signifie, si j'ai bien compris, qu'en interne, sans rien dire, le contexte graphique passé à paintComponent à déjà subit une translation pour mettre l'origine en haut à gauche du panneau, il a donc tenu compte de l'épaiseur de la barre d'outil.
Bon très bien,
Maintenant, J'ai créé une classe interne au JPanel qui s'appelle EcouteurPanneau et qui est destinée à écouter le Panneau comme son nom l'indique. Elle implémente mouseClicked. Je veux bien sûr appeler repaint() depuis mouseClicked() pour rafraichir le panneau. Ainsi je fais :
Et là surprise : quand je clique dans le panneau, mon instruction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Jpanel.this.repaint();
System.out.println( g2D.getTransform() );
me renvoie maintenant :
AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
Là, je ne comprends plus. maintenant, pourquoi le contexte graphique n'a plus la même origine ?
C'est pourtant toujours le même paintComponent qui est appelé puisque mon instruction System.out.println( g2D.getTransform() ); me renvoie quelque chose !!!
Encore plus fort :
Si, maintenant, je rajoute dans mouseClicked ceci :
et maintenant je clique, voilà ce que j'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 System.out.println( "avant repaint" ); PanneauDessin.this.repaint(); System.out.println( "après repaint" );
avant repaint
après repaint
AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
Alors là, c'est incompréhensible !
La dernière ligne devrait être entre "Avant repaint" et "après repaint" , non ?
Que se passe-t-il ?
Je suis perdu avec ces histoires de contexte graphique...
Merci pour vos explications.
Partager