화면(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);
}
}
이것에 대한 해결책은 따로 어딘가에 저장을 하는겁니다.
일단 Panel 이나 Frame 에서
Graphics gImg = null;
이 두가지를 선언 합니다.
그다음 생성자라던가 초기화 구문에서
img = createImage(getWidth(), getHeight());
gImg = img.getGraphics();
를 적용합니다.
물론 창의 크기가 변한다거나 하면 새로운 img를 생성해주어야 합니다만
이부분은 한쪽으로 넘겨두고 크기가 변하지 않는다는 가정하에서 합시다.
위처럼 한 다음에
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();
를 한번 해주면 끝납니다.
'Programming > Java' 카테고리의 다른 글
JAVA 로 System Information 알아내기 (0) | 2011.08.23 |
---|---|
JTable 해더가 안나올때 (0) | 2011.07.13 |
Java SWING 종료하기 (0) | 2011.06.29 |
자주보는 Execption 들 (0) | 2011.06.13 |
Exception java.lang.OutOfMemoryError: Java heap space 이 뜰때 (0) | 2011.06.03 |