ch11. 그래픽 프로그래밍

728x90

🟩 ch11. 그래픽 프로그래밍

ch11. 그래픽 프로그래밍

11-1. 그래픽 프로그래밍 기초

[자바 그래픽 사용하는 방법]

1) 전통 AWT 패키지 사용

2) 최근 java 2D API 사용_ 2차원 그래픽 구현

  • 자바는 플랫폼에 독립적이기 때문에 어디서나 똑같은 모양의 그래픽 프로그램 작성 O

>> 화면 위에 사각형, 원 그리는 프로그램

[프레임 생성]

  • 스윙에서는 JFrame 클래스의 인스턴스가 바로 프레임이 된다.

[패널 생성]

  • 컨테이너 역할하는 JPanel 클래스의 인스턴스 생성 후 -> 프레임 객체에 추가하면 된다.

  • 패널 내부에는 JPanel 클래스의 paintComponent() 메소드를 재정의

    → 이 메소드 내부에 실질적으로 그림 그리는 코드를 작성해야 한다.

  • paintComponent() 메소드는 Graphics 타입 매개변수 갖는다.

  • 만약 사용자 다시 그림 그리고 싶으면 반드시 repaint() 메소드 호출 거쳐야 함

    → 직접 paintComponent() 메소드 or paint()메소드를 호출하면 절대 안됨

✅ repaint() 메소드 호출 시,

내부적으로 paint()를 호출 → paint()에서 다시 paintBorder() 호출→ paintComponent()를 호출함

[그래픽 좌표계]

  • 자바는 오른쪽으로 갈수록 증가하는 x좌표, 아래로 갈수록 증가하는 y좌표 (좌표계) 사용
  • 모든 좌표값은 양수이며, 단위는 픽셀이다.
  • 도형들의 원점은 왼쪽 상단 좌표값 (도형의 중심점 아님X)

[그림 그리는 메소드]

  • Graphics 클래스는 그림 그리는데 필요한 모든 설정값과 그림 그리는 메소드를 가지고 있기 때문에 자바의 모든 그림 그리기는 Graphics 클래스를 통해야 한다
  • 사각형 그리기 : paintComponent()안에 Graphics객체의 drawRect() 메소드 호출
  • 원 그리기 : paintComponent()안에 Graphics객체의 drawOval() 메소드 호출

[이벤트와 그래픽의 결합]

  • 일반적으로 그래픽은 이벤트 처리와 결합 多

11-2. 기초 도형 그리기

  • Graphics 클래스는 기초도형 그리는 메소드를 제공

1) 외곽선만 그리는 메소드 : draw_

2) 내부 채어서 그리는 메소드 : fill_

[직선 그리기]

//직선 하나 그리기

  • 좌표(x1, y1)에서 좌표 (x2,y2)까지 직선 하나 그림
drawLine( int x1, int y1, int x2, int y2)

//여러 직선 이어서 그리기

drawPolyline(int[] xpoints, int[] ypoints, int numpoints)

[사각형 그리기]

  • 왼쪽 상단 (x,y)좌표이고, 폭과 너비가 width, height인 사각형
  • 매개변수 raised: T(볼록) F(오목) 지정

1) 외곽선만 그리는 사각형

drawRect(int x, int y, int width, int height)

draw3DRect(int x, int y, int width, int height, boolean raised)

drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)

2) 내부 전경색으로 채워진 사각형

fillRect(int x, int y, int width, int height)

fill3DRect(int x, int y, int width, int height, boolean raised)

fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)

[타원 그리기]

  • 타원을 둘러싸는 사각형으로 정의되며, 매개변수는 사각형 좌측 상단 (x,y좌표, 너비 높이)
  • 좌측 상단 좌표 (x,y), width, height인 사각형 안에 내접하는 타원 그린다.

1) 외곽선만 그린 타원

drawOval(int x, int y, int width, int height)

2) 내부 채워 그린 타원

fillOval(int x, int y, int width, int height)

[호(arc) 그리기]

  • 호는 타원의 일부로 간주되며, 사각형 내접 타원을 startAngle(시작각)으로 하여 arcAngle의 각도 만큼 호를 그린다.
  • 단위는 degree 사용
1) drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)

2) fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)

11-3. 색상

  • Color 클래스 사용
  • 자바 Color 클래스로 생성된 객체 하나가 특정 하나의 색을 나타낸다

[색상 정의 방법]

1) Color 클래스 안 미리 정의된 변수 static으로 바로 접근해 정의

Color c = Color.magenta;

2) Color 객체 생성 후, R,G,B 값 직접 주어 정의

Color c = new Color(255, 0 ,255);
  • Color는 알파값(투명도) 가질 수 O
Color c = new Color(255, 0, 0, 128);

[색상 설정 방법]

  • 컴포넌트 객체에서 아래 메소드 호출하여 사용
setBackground(Color c) : 컴포넌트 객체 배경색 설정

setColor(Color c) : 그림 그리기 전경색 설정

Color getColor() : 현재 전경색 반환

[색상 선택기]

  • 사용자가 색상 팔레트에서 쉽게 색상 선택 가능O
  • JColorChooser 클래스 사용

//색상 선택기 생성후 현재 선택된 색상을 이벤트 리스너에서 가져오는 코드

JColorChooser colorChooser = new JColorChooser(Color.RED);
  • 초기 색상 지정 안할 경우 색상 선택기는 기본적으로 Color.white 표시함
  • 패널에 색상 선택기 객체 추가하여 사용

11-4. 폰트

[문자열 그리기]

  • cf) 콘솔에 텍스트 출력 : System.out.println() 메소드 사용
  • 윈도우 화면(x,y)위치에 텍스트 출력

: Graphics 클래스의 drawString() 메소드 사용

g.drawString(“Hello World!”, x, y );
  • 문자열은 지정된 폰트로 출력되며, 폰트 지정 안하면 디폴트 폰트로 출력

[폰트 객체 생성]

  • 폰트 지정을 위해서는 Font 클래스를 사용해야 함
  • 먼저, Font 클래스의 객체를 생성해야 한다.
  • Font 객체는 (폰트이름, 스타일, 크기) 3가지 속성을 갖고 있다.

//객체 생성 시 생성자 매개값에 주어야 할 값

Font font = new Font(“폰트이름”, 스타일, 크기);

<폰트 스타일 수식자> 3가지

Font.BOLD : 볼드체

Font.ITALIC : 이탤릭체

Font.PLAIN : 표준체

<폰트 크기 단위> ‘포인트’

[논리적인 폰트와 물리적인 폰트]

  • 자바에 의해 논리적 폰트 이름은 물리적 폰트로 매핑된다.
  • 논리적인 폰트 : 실체 폰트 X

: 시스템에 관계없이 항상 사용 가능O

<5가지 폰트 패밀리>

“Serif” : 삐침 갖는 가변폭 글꼴

“SansSerif” : 삐침 없는 가변폭 글꼴

“Monospaced” : 고정폭 글꼴

“Dialog” : 대화상자에 텍스트 출력용 글꼴

“DialogInput” : 대화상자에 텍스트 입력용 글꼴

cf. 물리적인 폰트 : 시스템에 존재하는 실제 폰트 O

<시스템에 존재하는 모든 폰트 이름 얻는 코드>

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

String[] fontFamilies = ge.getAvailableFontFamilyNames();

[폰트 지정]

  • Graphics 객체에서 폰트 지정 : setFont() 메소드 사용

1) 패널(컨테이너) 폰트 지정

: paintComponent() 메소드 내부에서 Graphics 객체 폰트 지정

public void paintComponent( Graphics g)  {
        Font f = new Font(“Serif”, Font.BOLD, 12); //폰트 객체 생성
        g.setFont(f); //해당 객체로 폰트 지정세팅
    }

2) 컴포넌트 폰트 변경

자신이 포함된 컨테이너의 지정된 폰트 그대로 사용 시. setFont(null) 사용

지정된 폰트 변경할 경우, 변경할 폰트객체 생성 후, setFont(f) 사용

Font f1 = new Font(“serif”, Font.BOLD, 12) ;

g.setFont(f1);

g.drawString(“Hello World!”, 10, 50);//변경한 폰트로 텍스트 출력

11-6. 이미지 출력

  • 자바는 이미지를 윈도우 화면에 (출력) 그릴 수 있고, 자바프로그램에 작성된 그림을 이미지 파일로 (읽어서) 저장할 수 있다.

[이미지 관련 클래스]

  • Image 클래스 : 이미지를 픽셀 2차원 배열로 나타내는 기본 클래스
  • BufferedImage 클래스 : Image 클래스 상속받은 자식 클래스

: 직접 이미지 데이터 처리 (즉, 이미지 픽셀 읽고 쓰기) 사용 多

[이미지 읽기] : 입력

  • 이미지는 일반적으로 JPEG, GIF 등의 이미지 파일 형태로 존재
  • 이미지 파일에서 이미지를 읽어 내부 형식 이미지로 전환
  • javax.imageio 패키지의 Image I/O클래스로 이미지 파일 읽을 수 O
  • 이미지 파일에서 이미지 읽기 코드
BufferedImage img = null;

try {

img = ImageIO.read( new File(“strawberry.jpg”));

}catch(IOException e) {

}

[이미지 그리기] : 출력

  • 이미지를 화면에 그리기 : Graphics 클래스의 drawImage() 메소드 사용

1) 이미지 전체를 화면에 1대 1로 출력

boolean drawImage(Image img,

int x, int y, // 이미지가 그려질 화면의 좌표

ImageObserver ob); //일반적으로 null전달

2) 이미지 일부만 화면에 출력

boolean drawImage(Image img,

int dstx1, int dsty1, int dstx2, int dsty2, //화면 영역

int srcx1, int srcy1, int srcx2, int srcy2,//이미지 영역

ImageObserver ob);

src_변수 : 원본 이미지에서 그리고 싶은 이미지의 영역

dst_변수 : 전체 화면에서 이미지가 그려질 화면의 영역

이미지 폭 (X2 – X1), 높이 (Y2 – Y1)

  • src영역과 dst 영역이 다르면, 이미지는 dst영역에 맞춰서 늘려지거나 줄여져 출력된다

11-7. Java 2D

  • 기존의 AWT는 제한된 그래픽 제공
  • Java 2D는 AWT의 확장, 고성능 그래픽 제공

[Java 2D 사용]

  • Java 2D의 핵심은 Graphics2D클래스
  • Graphics 클래스를 확장한 향상된 기능 제공

  • Java 2D의 Graphics 클래스 사용
  • 들어온 Graphics 객체 변수를 Graphics2D타입으로 형변환시키면 됨

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

}

[Java 2D의 메소드]

  • 이전의 메소드들 변경없이 사용 가능 + 추가 기능 메소드 제공
  • AWT는 도형 그리는 메소드만 제공
  • Java 2D는 도형 객체 개념을 제공하여, 도형 객체 생성 후 도형 그림

1) 그리는 메소드

draw() 메소드 : 도형 객체 외곽선 그리기

fill() 메소드 : 도형 객체 내부 채워서 그리기

drawString() : 텍스트 그리기

drawImage() : 지정된 이미지 그리기

2) 그리기의 속성 설정,변경 메소드

Stroke(폭) 설정 : setStroke()

Stroke(폭) 연결 방식 설정

그려지는 영역 제한 ‘절단 경로’ 설정

도형 변환

도형 내부 채우는 색, 패턴 설정

도형들 조합, 중첩 그리기

[Java 2D로 도형 그리기]

  • Java 2D는 Shape 인터페이스를 구현한 도형 클래스들을 제공

    → Shape 타입 참조변수 이용해 도형 객체 참조 가능O (다형성)

  • Java 2D에서 도형 그리려면 먼저 해당 도형의 객체 생성해야 함

Shape rect = new Rectangle2D.Float(7, 8 , 100, 200) ; //사각형 객체 생성

g2.draw(rect); //사각형 외곽선 그리기

g2.fill(rect); //사각형 내부 채워서 그리기

[Java 2D로 도형 채우기]

1) 단일색상으로 채우기

  • setColor() 로 색상 지정 후 fill()로 채우기
g2.setColor(Color.BLUE);

g2.fill(ellipse);

2) 그라디언트 색상으로 채우기

  • 그라디언트 : 두 색 섞어서 점차 다른 색상으로 변화하는 그라데이션 색상
  • 그라디언트 색상 지정하기 위해서는 : GradientPaint 클래스 사용->그라디언트 객체 생성

( -> 시작위치 (0,0) 화이트색에서부터 직선 따라가 종료 위치 (0,100) 까지 점차 빨간색 변화)

728x90