Les dangers du PaintListener avec SWT
Pour information, lorsque vous utilisez l’écouteur PaintListener
pour ajouter des éléments graphiques à des composants, faites attention lorsque vous souhaitez avoir accès aux dimensions du cadre de la zone de dessin.
Il y a deux façons d’obtenir la taille de cette zone de dessin :
- soit en utilisant les attributs
width
etheight
de l’objetPaintEvent
, passé en paramètre de la méthodepaintControl
; - soit en utilisant la source de l’écouteur qui devrait être normalement de type
Control
. Ainsi par l’intermédiaire de la propriétébounds
, il y a possibilité d’avoir accès à la hauteur et à la largeur.
On pourrait penser que les valeurs obtenues sont identiques, et bien non. Dans le premier cas, la taille de la zone de dessin peut changer lors de mise à jour de l’affichage. Le cas classique quand une fenêtre superpose la fenêtre contenant la zone de dessin. On peut obtenir des résultats assez catastrophiques. On se rend compte que la largeur et la hauteur peuvent prendre des valeurs incohérentes (voir capture ci-dessous).
Pour résoudre ce problème, je vous recommande de passer par les dimensions de la source pour déterminer les limites de la zone de dessin.
Pour résumer, il ne faut pas utiliser le code ci-dessous (où e est de type PaintEvent) :
1
2
int width = e.width;
int height = e.height;
Mais le code ci-dessous pour déterminer la hauteur et la largeur de la zone de dessin :
1
2
3
4
5
6
7
8
int width = 0;
int height = 0;
if (e.getSource() != null) {
Control currentSource = (Control)e.getSource();
Rectangle bounds = currentSource.getBounds();
width = bounds.width;
height = bounds.height;
}
Tout ça pour dire que je ne faisais pas attention depuis un certain moment et j’utilisais bêtement les dimensions fournis par l’objet PaintEvent
.
Je suis Mickaël BARON Ingénieur de Recherche en Informatique à l'ISAE-ENSMA et membre du laboratoire LIAS le jour
Veilleur Technologique la nuit
#Java #Container #VueJS #Services #WebSemantic
Derniers articles et billets