1. 스윙 컴포넌트 그리기
-
그리기 기본 철학: 모든 컴포넌트는 자신의 모양을 스스로 그리며, 컨테이너는 자신을 그린 후 자식 컴포넌트에게 그리기를 지시한다.
-
paintComponent(Graphics g)메소드- 스윙 컴포넌트가 자신의 모양을 그릴 때 호출되는 핵심 메소드이다. (
JComponent소속) - 컴포넌트의 크기나 위치가 변경되거나, 가려졌던 것이 다시 나타날 때 자동으로 호출된다.
- 사용자가 원하는 모양을 그리려면 이 메소드를 오버라이딩하여 구현해야 한다.
- 주의: 오버라이딩 시 반드시
super.paintComponent(g)를 먼저 호출하여 부모 컴포넌트가 기본적인 영역(배경 등)을 지우거나 그리도록 해야 한다.
- 스윙 컴포넌트가 자신의 모양을 그릴 때 호출되는 핵심 메소드이다. (
-
그래픽 기반 프로그래밍의 장점: 스윙 컴포넌트로 만들 수 없는 자유로운 차트나 게임 화면 등을 제작할 수 있으며, 컴포넌트 생성보다 처리 속도가 빠르다.
2. Graphics
-
Graphics 객체:
java.awt.Graphics클래스로, 컴포넌트 그리기에 필요한 도구(색상, 폰트, 그리기 메소드 등)를 제공한다. -
좌표 체계: 왼쪽 위 모서리가
(0, 0)이며, 오른쪽으로 갈수록 X값 증가, 아래쪽으로 갈수록 Y값이 증가한다. -
문자열 출력:
drawString(String str, int x, int y)를 사용하여 현재 색상과 폰트로 텍스트를 그린다. -
Color와 Font
- Color:
new Color(r, g, b)또는Color.BLUE같은 상수를 사용해 색상을 지정한다. (g.setColor()) - Font:
new Font(서체, 스타일, 크기)를 생성하여 폰트를 지정한다. (g.setFont())
- Color:
3. 도형 그리기와 칠하기
-
도형 그리기 (외곽선)
drawLine(x1, y1, x2, y2): 선 그리기drawRect(x, y, w, h): 사각형 그리기drawOval(x, y, w, h): 타원 그리기 (사각형에 내접)drawRoundRect(...): 둥근 모서리 사각형 그리기drawArc(...): 원호 그리기drawPolygon(...): 다각형 그리기
-
도형 칠하기 (내부 채우기)
- 도형 그리기 메소드 명의
draw를fill로 변경하여 사용한다. (예:fillRect,fillOval등) - 도형의 외곽선과 내부를 동시에 처리하는 메소드는 없으므로, 필요 시 외곽선 그리기와 칠하기를 각각 호출해야 한다.
- 도형 그리기 메소드 명의
4. 이미지 그리기
스윙에서 이미지를 그리는 방법은 크게 두 가지이다.
-
JLabel 이용
ImageIcon을 생성하여JLabel에 부착한다.- 장점: 구현이 쉽고 마우스 이벤트 처리가 가능하다.
- 단점: 이미지 크기 조절이 불가능(원본 크기)하다.
-
Graphics의
drawImage()이용JPanel등의paintComponent내에서 직접 그린다.- 장점: 이미지의 크기 조절(확대/축소), 일부분만 그리기(크롭) 등이 가능하다.
- 단점: 개발자가 위치나 크기를 직접 관리해야 한다.
- 주요 메소드
drawImage(img, x, y, observer): 원본 크기로 그리기drawImage(img, x, y, w, h, observer): 크기를 조절하여 그리기drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer): 원본의 일부분을 잘라서 그리기
5. 클리핑(Clipping)
-
클리핑(Clipping)
- 컴포넌트 내의 특정 사각형 영역(클리핑 영역)에서만 그래픽 작업이 이루어지도록 제한하는 기능
- 클리핑 영역 밖에서 수행된 그리기 작업은 화면에 표시되지 않는다.
-
메소드
setClip(x, y, w, h): 새로운 클리핑 영역을 설정한다.clipRect(x, y, w, h): 기존 클리핑 영역과 새로운 영역의 교집합을 클리핑 영역으로 설정한다.
6. 스윙의 페인팅 메커니즘
-
그리기 순서:
paint()메소드가 호출되면 내부적으로 다음 순서대로 메소드들이 전달(g객체 전달)된다.paintComponent(g): 컴포넌트 자신의 내부 모양 그리기paintBorder(g): 외곽선 그리기paintChildren(g): 자식 컴포넌트들 그리기
-
호출 규칙: 개발자는
paintComponent()를 직접 호출하면 안 되며, 시스템에 의해 호출되도록 해야 한다. -
재그리기 요청
repaint(): 컴포넌트의 모양이나 위치가 변경되었을 때 자바 플랫폼에 다시 그리기를 요청하는 메소드 (비동기적 처리)revalidate(): 컴포넌트의 추가/삭제 등으로 컨테이너의 레이아웃(배치) 변화가 필요할 때 호출한다. (보통repaint()와 함께 사용)