<TIL> java_그래픽

2021.09.29

스윙 컴포넌트 그리기

스윙 컴포넌트 객체에 속하는 컴포넌트들은 자기 자신을 스스로 그릴 수 있다.

자신의 내부를 그리는 메소드는

void paintComponent(Graphics g){...}

위와 같다.

! Tip
이클립스를 사용해 자바코드를 입력한다면
왼쪽 상단의 source 탭을 클릭하고 overriding implements methods 메뉴를 클릭하면 코드를 작성하는 커서의 위치에 맞는 객체들의 메서드들의 목록을 가져와 선택해 적용할 수 있게 된다.

paintCompent 오버라이딩

class Example extends JComponent내 컴포넌트 객체명 {
		...
    public void paintComponent(Graphics g){ // 오버라이딩
    	필요 코드 작성
    }
    	...
}

위처럼 추가할 J컴포넌트를 상속받는 클래스를 생성하고 해당 클래스에 대한 인스턴스를 J프레임을 상속받는 메인클래스에 생성하여 사용한다.

이때 주로 사용하는 컴포넌트가 바로 JPanel이다.

Graphics의 좌표 체계

자바의 그래픽 좌표값은 왼쪽 상단 모서리 기준으로 설정된다.
x축은 우측으로 갈수록 증가하고,
y축은 하단으로 갈수록 증가한다.

Graphics의 기능은 간단히 기술하면

  • 색상 선택하기
  • 문자열 그리기
  • 도형 그리기
  • 도형 칠하기
  • 이미지 그리기
  • 클리핑

이정도로 말할 수 있다.

Graphics 객체 메서드

이클립스의 기능을 가지고 오버라이드 메서드를 생성하면
Graphics 객체를 g라는 레퍼런스 변수로 인자를 받게 된다.
때문에 g.메서드(); 이런 형식으로 사용하게 된다.

문자열 그리기

g.drawString(String str, int x, int y)
문자열을 (x,y) 좌표에 맞게 그린다.

여기서 문자열은 기존의 다른 그래픽들로 생성되는 요소와 다르게 좌측 하단모서리가 기준좌표로 설정된다.

컬러, 폰트 설정하기

g.setColor(컬러객체 내 생성자 및 상수)
다음에 그려질 그래픽요소의 색을 지정한다.

g.setColor(폰트객체 내 생성자 및 상수)
다음에 그려질 그래픽요소 내 글자의 폰트를 지정한다.

Color 객체

색을 표현하는 클래스로

Color(int r, int g, int b)
Color(int rgb)

위처럼 생성자 함수가 오버라이딩되어있다.

사용은

  • g.setColor(new Color(int r, int g, int b))
  • g.setColor(new Color(int rgb))
  • g.setColor(Color.상수이름)

위 세가지 방법으로 사용한다.

Font 객체

문자의 폰트 정보를 나타내는 클래스로

Font(String fontFace, int style, int size)

당일 생성자를 가지며

사용은

g.setColor(new Font(String fontFace, int style, int size))

위 방법으로 사용한다.

도형 그리기

그래픽 객체를 이용해 다양한 도형을 그리는 메서드이다.

선 그리기

g.drawLine(int x1, int y2, int x2, int y2)
(x1,y1)를 기준으로 (x2,y2)까지 선을 그린다.

원 및 타원 그리기

g.drawOval(int x, int y, int w, int h)
(x ,y)를 기준으로 가로가 w, 세로가 h인 원을 그린다.

사각형 그리기

g.drawRect(int x, int y, int w, int h)
(x ,y)를 기준으로 가로가 w, 세로가 h인 사각형을 그린다.

모서리가 둥근 사각형 그리기

g.drawRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight)
(x ,y)를 기준으로 가로가 w, 세로가 h인 사각형을 그리되, 4개의 모서리는 arcWidth, arcHeight를 기준으로 원호로 그린다.

원호 그리기

g.drawArc(int x, int y, int w, int h, int startAngle, int arcAngle)
startAngle = 원호 시작 각도
arcAngle = 원호각도 즉, 그리는 양 (max 360도까지)
(x ,y)를 기준으로 가로가 w, 세로가 h인 원 중 지정해준 원호각도에 준해서 원호를 그린다.

다각형 그리기

g.drawArc(int [] x, int [] y, int n)
배열로 넣어준 x와 y를 각각 인덱스 0부터 짝을 지어 좌표를 설정이후 그중 n개를 연결해 다각형을 그려준다.

도형칠하기

위의 draw로 시작한 메서드를 fill로만 바꾸어 주면 색상이 채워진 도형이 그려진다.

Ex) g.drawRect() 👉 g.fillRect()

이미지 그리기

이미지를 동일 자바 프로젝트 파일에서 불러와 J컴포넌트 내부에 그려주는 메서드이다.

원본 크기로 그리기

1. g.drawImage(Image img, int x, int y, Color bgColor, ImageObserver observer)
2. g.drawImage(Image img, int x, int y, ImageObserver observer)
img = 이미지 객체
x, y = 이미지 그려질 좌표
bgColor = 이미지가 투명한 부분을 가지고 있을때 그 부분에 칠해지는 색상
observer = 그려진 이미지를 받아주는 객체, 대부분 컴포넌트의 내부에 직접 그리는 것이라 this를 사용한다.

크기 조절하여 그리기

1. g.drawImage(Image img, int x, int y, int width, int height, Color bgColor, ImageObserver observer)
2. g.drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
width = 그려지는 이미지 너비
height = 그려지는 이미지 높이

원본의 일부분을 크기 조절하여 그리기

1. g.drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgColor, ImageObserver observer)
2. g.drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
dx1, dy1 = 그래픽 영역상의 왼쪽 상단 모서리 좌표
dx2, dy2 = 그래픽 영역상의 오른쪽 하단 모서리 좌표
sx1, sy1 = 소스 이미지상의 왼쪽 상단 모서리 좌표
sx2, sy2 = 소스 이미지상의 오른쪽 하단 모서리 좌표
원본 이미지 파일의 좌표를 지정하여 해당 영역의 이미지만 지정해준 그래픽 영역에 그려준다.

Image 객체 생성

ImageIcon icon = new ImageIcon("파일 경로명");
파일로부터 이미지 로딩
Image img = icon.getImage();
이미지 정보 추출

클리핑

컴포넌트 내 그래픽이 보여지는 영역을 지정하여 해당 영역과 겹치게 그려진 그래픽만 보여주게 하는 기능이다.

클리핑 영역 설정 메서드

setClip(int x, int y, int w, int h)
그래픽 대상 컴포넌트의 (x, y) 위치에서 너비가 w이고 높이가 h인 클리핑 영역으로 지정하는 메서드
clipRect(int x, int y, int w, int h)
기존의 유지된 클리핑 영역과 clipRect()으로 생성된 클리핑 영역과 겹치는 영역을 새로운 클리핑 영역으로 설정하는 메소드

페인팅 메커니즘

그래픽 페인팅은 최상위 부모부터 순서대로 자식으로 내려가며 요소들이 그려진다.

최상위 컨테이너 👉 자식 컨테이너 👉 자식 컴포넌트

다시 그리기

이벤트가 발생하거나 변화를 주어 기존 요소에 추가적으로 무언가를 더해 그려줄때 컴퓨터는 추가할 부분만 그려주는 것이 아니라 처음부터 기존의 요소를 시작으로 추가된 부분까지 구현하기 때문에 다시 그리거나 배치하는 메서드가 필요하다.

container.revalidate();
부착된 컴포넌트 재배치
container.repaint();
컨테이너 다시 그리기

위 두 메서드는 전체 창의 크기가 바뀌면 자동으로 호출되지만, 그 외의 경우에는 새로 그려줄 컨테이너에 직접 수동으로 메서드를 호출해야한다.

좋은 웹페이지 즐겨찾기