Bonjour
je viens vous demander votre aide pour un petit souci de composants swing personnalisés.
Je suis en train de faire quelques tests pour un look d'application un peu plus personnalisé et pour ce faire j'ai créé un composant JImage (extends Jpanel ) ou je peint des images.
Dans le constructeur je charge une BufferedImage avec ImageIO.read(File)
J'ai overloadé la méthode paintComponant(Graphics g) de ce composant où je
créé une BufferedImage de la taille du composant, je fais du dessin G2D pour peindre l'image originale dedans ( la placer à un endroit défini, répéter l'image ou le dernier pixel dans un certain sens en fonction du placement ... )
Puis je peint cette BufferedImage générée dans le graphics g;
Je suis obligé de passer par cette BufferedImage car j'utilise un appel JNA pour créer des fenêtres transparentes, je met des images png avec des coins arrondis et une ombre portée translucente
et si je peint directement dans le graphics le composant ne prends pas la couche inférieure et je me retrouve avec des bouts de zones transparentes un peu partout, je règlerait ce problème plus tard
Mon plus gros soucis est que chaque composant peint celui du dessous qui peint celui d'à côté ...
Au final la consomation CPU est de 100% et l'affichage peine un peu
Pour mieux comprendre voici un exemple :
Ma fenêtre est composée de 9 zones : les 4 coins, les 4 bordures et une zone centrale ( en vert sur l'image ) avec des boutons et une autre zone ( en orange ) composée de 9 composants ( coins ... )
si je passe la souris sur un des boutons, il va être repeint, ce qui va appeler la méthode paint du composant inférieur ( zone rouge ), qui va peindre les composants à côté de lui pour finalement repeindre la fenêtre entière
Je le sais car j'ai mis des affichages console dans la méthode paintComponent de ma classe qui affiche quel composant est peint à tel instant
donc sur l'image suivante, du rouge le plus opaque au plus tranparent, on voit la propagation des appels a la méthode paint
Quel idée me proposez vous pour bloquer cette propagation d'appels de paint ?
Peut on retrouver la graphics correspondant à la fenêtre à l'instant d'avant et juste repeindre la zone concernée sans être obligé de repeindre la fenêtre entière ?
Merci d'avance pour votre aide
Yann
Partager