Dessiner des rectangles persistants en Java
Problème :
En Java, créer un JPanel pour dessiner des rectangles qui persistent au-delà d’un seul cycle de peinture présente des défis. L'approche courante consistant à conserver une liste de rectangles et à tout repeindre à chaque appel de peinture peut ralentir les performances si le nombre de rectangles est important.
Approche traditionnelle :
Une solution traditionnelle consiste à utiliser repaint(x, y, height, width) pour repeindre uniquement la zone où le nouveau rectangle est dessiné. Cependant, cela échoue souvent, car JPanel continue d'effacer les rectangles précédents.
Solution alternative - Utiliser une BufferedImage :
Une approche alternative consiste à utiliser une BufferedImage comme surface de peinture. Voici comment cela fonctionne :
Avantages d'utilisation d'une BufferedImage :
L'utilisation d'une BufferedImage pour dessiner offre plusieurs avantages :
Exemple de mise en œuvre :
Considérez l'extrait de code suivant, qui illustre l'approche susmentionnée :
<code class="java">import java.awt.Graphics2D; import java.awt.image.BufferedImage; public class RectangleDrawer { private BufferedImage canvas; private BufferedImage originalCanvas; public void drawRectangle(int x, int y, int width, int height, Color color) { Graphics2D g = canvas.createGraphics(); g.setColor(color); g.fillRect(x, y, width, height); g.dispose(); } public void repaint() { g.drawImage(canvas, 0, 0, null); } // Other methods for drawing, selecting, and manipulating the image // would go here. }</code>
Dans cet exemple, la classe RectangleDrawer utilise une BufferedImage nommée canvas pour dessiner des rectangles. L'originalCanvas est utilisé pour restaurer l'image d'origine si nécessaire.
La méthode drawRectangle utilise un objet Graphics2D pour dessiner le rectangle sur le canevas et la méthode repaint utilise la méthode drawImage pour mettre à jour l'affichage du composant en fonction du canevas modifié.
En utilisant une BufferedImage de cette manière, les rectangles peuvent être dessinés et affichés sans être effacés lors des cycles de peinture ultérieurs, résolvant ainsi le problème d'origine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!