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

3. 도형 그리기와 칠하기

  • 도형 그리기 (외곽선)

    • drawLine(x1, y1, x2, y2): 선 그리기
    • drawRect(x, y, w, h): 사각형 그리기
    • drawOval(x, y, w, h): 타원 그리기 (사각형에 내접)
    • drawRoundRect(...): 둥근 모서리 사각형 그리기
    • drawArc(...): 원호 그리기
    • drawPolygon(...): 다각형 그리기
  • 도형 칠하기 (내부 채우기)

    • 도형 그리기 메소드 명의 drawfill로 변경하여 사용한다. (예: fillRect, fillOval 등)
    • 도형의 외곽선과 내부를 동시에 처리하는 메소드는 없으므로, 필요 시 외곽선 그리기와 칠하기를 각각 호출해야 한다.

4. 이미지 그리기

스윙에서 이미지를 그리는 방법은 크게 두 가지이다.

  1. JLabel 이용

    • ImageIcon을 생성하여 JLabel에 부착한다.
    • 장점: 구현이 쉽고 마우스 이벤트 처리가 가능하다.
    • 단점: 이미지 크기 조절이 불가능(원본 크기)하다.
  2. 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 객체 전달)된다.

    1. paintComponent(g): 컴포넌트 자신의 내부 모양 그리기
    2. paintBorder(g): 외곽선 그리기
    3. paintChildren(g): 자식 컴포넌트들 그리기
  • 호출 규칙: 개발자는 paintComponent()직접 호출하면 안 되며, 시스템에 의해 호출되도록 해야 한다.

  • 재그리기 요청

    • repaint(): 컴포넌트의 모양이나 위치가 변경되었을 때 자바 플랫폼에 다시 그리기를 요청하는 메소드 (비동기적 처리)
    • revalidate(): 컴포넌트의 추가/삭제 등으로 컨테이너의 레이아웃(배치) 변화가 필요할 때 호출한다. (보통 repaint()와 함께 사용)