Graphic Programming
1. Graphics 클래스
⑴ Graphics 객체
- AWT 컴포넌트 위에 그림을 그리는 데 필요한 정보를 유지하고, 다양한 그리기 메소드를 제공하는 클래스 이다.
- 실제 컴포넌트에 그림을 그리기 위해서는 먼저 Graphics 객체 인스턴스를 얻어야 한다.
- Graphics 객체에 접근하는 방법
- ① paint(),update()등의 메소드를 사용
- ② 컴포넌트의 getGraphics() 메소드를 호출하는 방법
- 반환값으로 넘겨 받는 Graphics 객체는 기본 Graphics 객체의 복사본이기 때문에 사용한 다음에 프로그래머가 해지해줘야 한다.(리소스 손실 방지) :
dispose()를 사용해서 리소스를 해지 해야 한다.(but paint()에서처럼 시스템이 인자로 넘겨준 그래픽개체는 해지 하면 않된다)
- Graphics 객체에 대한 자세한 설명
실제 원도우 시스템의 그래픽에 관련된 제어를 행하는 그래픽 컨텍스트(마이크로 원도우에서는 디바이스 컨텍스트라고도 한다.)라는 시스템 리소스를 자바에서 접근, 제어 할 수 있는 객체이다.
전급하고 제어 할 수 있는 속성.
- 그림을 그릴 때 사용할 색깔.
- 텍스트를 그릴 때 사용할 글꼴.
- 클리핑 사각형
- 그래픽 모드(Java XOR모드, Paint 모드)
- 그리기에 사용할 좌표의 원점.
-XOR mode 와 Paint mode
관련 메소드 Graphics 의 setPaintMode()
- Paint mode: 새로운 그림을 그리면 바탕의 그림을 무시하고 덮어 쓰는 방식.(기본 모드)
- XOR mode : 현재 그리기 새과 그려질 점이 가지고 있던 색 간에 비트 단위의 XOR 연산을 통해 색을 결정한다는 것
==> 두 번 XOR mode로 동일한 위치에 도형을 그리면 이전 상태로 돌아간다는 것.
2. paint() method와 깜빡임 줄이기
⑴ paint() 메소드와 클립 영역
paint() method :
- 정의
자바의 AWT 시스템이 컴포넌트가 다시 그려져야 할 필요가 있을 때 자동으로 호출되는 메소드이다.
(정확히는 AWT 이벤트중 PaintEvent 가 발생하면 paint() 메소드가 호출됨.) - PaintEvent는 다른 AWT event와 달리 event 처리 객체를 등록하는 방식으로는 사용될 수 없고
paint() 메소드가 호출됨으로써 이벤트가 발생한다. - 하는일
컴포넌트별로 Graphics 컨텍스트가 유지하고 있는 어떤 영역에 다시 칠을 하는 일이다. - Clipping Area : 그래픽 컨텍스트가 유지하고 있는 영역 (MS Window에서는 Invalid Area or Invalid Rectangle) MS Window에서는 항상 사각형을 유지 한다.
자바나 UNIX의 X - Window에서는 사각형의 배열 or 최소 사각형으로 나타남. - paint() method가 호출되는 경우
- 원도우가 처음 만들어 질 때 원도우를 처음 그리기 위해. --> 클립영역 : 원도우 전체
- 원도우의 크기가 변경되었을 때 --> 클립영역 : 원도우 전체
- 원도우가 아이콘화 될 때 --> 클립영역 : 원도우 전체(시스템마다 조금씩 차이가 남)
- 원도우의 일부 or 전부가 다른 원도우에 의해서 가려졌다가 다시 보일 때
--> 클립영역 : 최소사각형(가린부분)or 사각형의 배열 - 사용자가 repaint() method를 호출할 때. 인자가 없는 repaint()메소드는 원도우 전체를 클립 영역으로 한다. 인자사용해서 클립 사각형을 지정할 수 있다.
- paint() 메소드가 호출되어 실제로 paint() method는 원도우 전체에 대해서 동작을 하지만 화면이 갱신 되는 부분은 클립 영역 뿐이다.
- update() --> repaint()를 호출함에 따라 AWT system에 의해 호출된다.
- Component Class 의 update() 메소드의 역할
- 먼저 배경색으로 컴포넌트를 칠함으로써 컴포넌트의 내용을 지운다.
- 현재 이 컴포넌트의 전경색으로 그래픽 컨텍스트의 현재 색을 지정한다.
- 컴포넌트를 다시 그리도록 컴포넌트의 paint()메소드를 호출한다.