>  기사  >  Java  >  성능 문제 없이 Java에서 영구 사각형을 그리는 방법은 무엇입니까?

성능 문제 없이 Java에서 영구 사각형을 그리는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-28 07:59:30901검색

How to Draw Persistent Rectangles in Java without Performance Issues?

Java에서 지속되는 직사각형 그리기

문제:
Java에서 JPanel을 생성하여 직사각형을 그립니다. 단일 페인트 주기 이후에도 지속되는 문제는 문제를 야기합니다. 직사각형 목록을 유지 관리하고 모든 페인트 호출에서 모두 다시 그리는 일반적인 접근 방식은 직사각형 수가 많은 경우 성능을 저하시킬 수 있습니다.

기존 접근 방식:
기존 솔루션에는 다음을 사용하는 것이 포함됩니다. repaint(x, y, height, width) 를 사용하면 새 직사각형이 그려지는 영역만 다시 칠할 수 있습니다. 그러나 JPanel이 이전 직사각형을 계속 지우기 때문에 이는 종종 실패합니다.

대체 솔루션 - BufferedImage 사용:
대체 접근 방식은 BufferedImage를 페인팅 표면으로 사용하는 것입니다. 작동 방식은 다음과 같습니다.

  1. BufferedImage를 생성하고 이를 그리기 위한 캔버스로 사용합니다.
  2. 나중에 사용할 수 있도록 원본 BufferedImage에 대한 참조를 생성합니다.
  3. 만들기 이미지를 그리고 선택하고 조작하는 이미지 처리 도구입니다.
  4. 페인트 메서드 내에서 구성 요소에 그리는 대신 BufferedImage를 그리거나 조작합니다.

이점 버퍼링된 이미지 사용:
그리기 위해 버퍼링된 이미지를 사용하면 여러 가지 이점을 얻을 수 있습니다.

  • 페인트 주기 사이에 지속되는 전용 페인팅 표면을 제공합니다.
  • 이를 통해 다음이 가능해집니다. 다시 칠할 영역을 보다 정확하게 제어하여 성능을 향상시킵니다.
  • 고급 이미지 처리 기술을 사용할 수 있습니다.

구현 예:

앞서 언급한 접근 방식을 보여주는 다음 코드 조각을 고려하세요.

<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>

이 예에서 RectangleDrawer 클래스는 canvas라는 BufferedImage를 사용하여 직사각형을 그립니다. 필요한 경우 원본 이미지를 복원하는 데 원본 캔버스가 사용됩니다.

drawRectangle 메서드는 Graphics2D 개체를 사용하여 캔버스에 직사각형을 그리고 repaint 메서드는 drawImage 메서드를 사용하여 수정된 캔버스를 기반으로 구성 요소의 디스플레이를 업데이트합니다.

이러한 방식으로 BufferedImage를 활용하면 후속 페인트 주기에서 지워지지 않고 직사각형을 그리고 표시할 수 있어 원래 문제를 해결할 수 있습니다.

위 내용은 성능 문제 없이 Java에서 영구 사각형을 그리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.