paint Methode

Programming/Java 2011. 7. 13. 12:34 |

화면(Panel,Canvas 등등)에 어떤 이미지를 그리고자 할때 public void paint(Graphics g) 를 오버라이드 합니다.

해당 component가 다시 그려질때 paint를 호출하게 되는데 이때 paint 메소드에서 처음부터 다시 그리도록 하게 하면

그리게 되는 작업이 수십개 정도일때는 큰 문제가 없지만 수백, 수천 개가 넘어가게되면 꽤 큰 문제가 된다.

이것을 해결하기 위해서 더블버퍼링 이라거나 이런저런 기법이 있다고 하는데 간단한 방법을 하나 소개 하고자 한다.

 

일단 페인트의 사용법을 알아봅시다.

public void paint(Graphics g) {

       g.drawRect(0, 0, 100, 100);

}


이런식으로 하면

항상 0,0 을 왼쪽 위 점으로 하고 100,100 을 오른쪽 아래로 하는 사각형이 그려집니다.

그런데 이것을

public void paint(Graphics g) {

       for(int i=0;i<1000;i++){

              g.drawRect(i, i, i+1, i+1);

       }
}


 

같은 형태로 바꿔봅시다. 이렇게 하면 새로고침이 될때마다 1000번을 그려야 하기때문에 매우 비효율 적이죠

이것에 대한 해결책은 따로 어딘가에 저장을 하는겁니다.

일단 Panel 이나 Frame 에서

Image img = null;

Graphics gImg = null;


이 두가지를 선언 합니다.
그다음 생성자라던가 초기화 구문에서

img = createImage(getWidth(), getHeight());

gImg = img.getGraphics();

를 적용합니다.

물론 창의 크기가 변한다거나 하면 새로운 img를 생성해주어야 합니다만
이부분은 한쪽으로 넘겨두고 크기가 변하지 않는다는 가정하에서 합시다.

위처럼 한 다음에

public void paint(Graphics g) {

       if (img == null)

             return;

       getGraphics().drawImage(img, 0, 0, this);

       for(int i=0;i<1000;i++){

             g.drawRect(i, i, i+1, i+1);

       }

}

이렇게 paint 를 오버라이드 한다음에 g.drawImage() 를 호출해주면 됩니다.

가끔 제대로 그려지지 않는 경우가 있는데 g 대신 getGraphics() 를 해주면 해결될때도 있습니다.

그리고 어떤 이벤트에 의해서 draw를 하게될때 gImg에다가 그려주고 repaint()를 호출해주면 됩니다.

위의 1000번 그리기에 대해서 해보자면

 

img = createImage(getWidth(), getHeight());

gImg = img.getGraphics();

를 한다음에

for(int i=0;i<1000;i++){

       g.drawRect(i, i, i+1, i+1);

}
repaint();
 


를 한번 해주면 끝납니다.

Posted by 동적할당
: