Maison  >  Article  >  Java  >  Comment dessiner des rectangles persistants en Java sans problèmes de performances ?

Comment dessiner des rectangles persistants en Java sans problèmes de performances ?

DDD
DDDoriginal
2024-10-28 07:59:30823parcourir

How to Draw Persistent Rectangles in Java without Performance Issues?

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 :

  1. Créez une BufferedImage et utilisez-la comme canevas pour le dessin.
  2. Créez une référence à l'image Buffered originale pour une utilisation ultérieure.
  3. Créez outils de traitement d'image pour dessiner, sélectionner et manipuler l'image.
  4. Dans la méthode paint, dessinez ou manipulez l'image tampon au lieu de dessiner sur le composant.

Avantages d'utilisation d'une BufferedImage :
L'utilisation d'une BufferedImage pour dessiner offre plusieurs avantages :

  • Elle fournit une surface de peinture dédiée qui persiste entre les cycles de peinture.
  • Elle permet contrôle plus précis sur les zones à repeindre, améliorant ainsi les performances.
  • Il permet l'utilisation de techniques avancées de traitement d'image.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn