Graphics 클래스 사용

다양한 요소가 사람들이 소프트웨어 프로그램을 작성하도록 영감을줍니다. 많은 사람들에게 동기 부여는 그래픽을 만들거나 이미지를 조작하거나 애니메이션을 적용하려는 욕구에서 비롯된다고 생각합니다. 아케이드 게임, 비행 시뮬레이터 또는 CAD 패키지를 제작하든 개발자는 그리기를 배우는 것으로 시작하는 경우가 많습니다.

Abstract Windowing Toolkit (또는 AWT) 내의 그래픽 도구 상자를 사용하면 Java 프로그래머가 간단한 기하학적 모양을 그리고 텍스트를 인쇄하고 프레임, 패널 또는 캔버스와 같은 구성 요소의 테두리 내에 이미지를 배치 할 수 있습니다.

이 칼럼은 그래픽 주제에 대한 첫 번째 칼럼입니다. Graphics간단한 기하학적 모양을 그리는 클래스와 메서드에 초점을 맞추고 페인팅 (및 다시 페인팅)이 발생하는 프로세스를 소개합니다.

중앙 무대 인 Graphics수업부터 시작합시다 .

Graphics 클래스

프로그래머가 GraphicsJava를 통해 이미지를 그리기 전에 클래스를 이해하는 것이 중요합니다 . 이 Graphics클래스는 AWT 내의 모든 그래픽 작업에 대한 프레임 워크를 제공합니다. 서로 다른 두 가지 역할을합니다. 첫째, 그래픽 컨텍스트입니다. 그래픽 컨텍스트는 그리기 작업에 영향을 미치는 정보입니다. 여기에는 배경색과 전경색, 글꼴, 클리핑 사각형 (그래픽을 그릴 수있는 구성 요소의 영역)의 위치와 치수가 포함됩니다. 그래픽 작업 자체 (화면 또는 이미지)의 최종 목적지에 대한 정보도 포함됩니다. 둘째,Graphics클래스는 그래픽 대상에 간단한 기하학적 모양, 텍스트 및 이미지를 그리는 방법을 제공합니다. 그래픽 대상에 대한 모든 출력은 이러한 메서드 중 하나를 호출하여 발생합니다.

그리려면 프로그램에 유효한 그래픽 컨텍스트 ( Graphics클래스 의 인스턴스로 표시됨)가 필요합니다. 때문에 Graphics클래스는 추상 기본 클래스, 그것은 직접 인스턴스화 할 수 없습니다. 인스턴스는 일반적으로 구성 요소에 의해 생성되고 구성 요소의 update ()paint () 메서드에 대한 인수로 프로그램에 전달됩니다 . 이 두 메서드는 repaint () 메서드 와 함께 다음 섹션에서 설명합니다.

방법

그래픽 표시에는 다음 세 가지 방법이 있습니다. 각각의 기본 버전은 클래스에서 제공합니다 Component. 원하는 그래픽 작업을 수행하려면 update ()paint () 메서드를 재정의해야합니다.

repaint ()

public void repaint () public void repaint (long tm) public void repaint (int x, int y, int w, int h) public void repaint (long tm, int x, int y, int w, int h)

재 페인트 () 메소드 요청은 구성 요소를 다시 칠 수있다. 호출자는 가능한 빨리 다시 그리기를 요청하거나 밀리 초 단위로 시간을 지정할 수 있습니다. 시간을 지정하면 시간이 경과하기 전에 페인팅 작업이 수행됩니다. 호출자는 구성 요소의 일부만 다시 칠하도록 지정할 수도 있습니다. 이 기술은 페인트 작업에 시간이 많이 걸리고 디스플레이의 일부만 다시 페인트해야하는 경우에 유용합니다. 목록 1의 코드 는 프로그램에서 repaint () 메서드를 사용 하는 방법을 보여줍니다 .

부울 mouseDown (이벤트 e, int x, int y) {selected_object.move (x, y); repaint (); }

목록 1 : 마우스 다운 이벤트 핸들러

mouseDown () 이벤트 핸들러 의 코드 는 마우스 위치를 기반으로 디스플레이에서 객체의 위치를 ​​다시 계산하고 repaint () 메서드를 호출하여 가능한 한 빨리 디스플레이를 다시 그려야 함을 나타냅니다.

최신 정보()

공개 무효 업데이트 (그래픽 g)

갱신 () 메소드가 호출에 응답한다 리 페인트 () 요청, 또는 구성 요소의 일부에 응답하여 발견되는 또는 처음 표시. 메서드의 유일한 인수는 Graphics클래스 의 인스턴스입니다 . Graphics인스턴스는의 컨텍스트 내에서 유효 갱신 () 메소드 (그리고 호출하는 방법),하지만 곧 후 폐기 갱신 () 메소드가 복귀. Component클래스에서 제공하는 기본 구현 은 배경을 지우고 paint () 메서드 (아래)를 호출합니다 .

페인트()

공공 공극 페인트 (그래픽 g)
페인트 () 메소드가 호출 된 갱신 () 메소드, 실제로 그래픽을 그리기위한 책임이 있습니다. 메서드의 유일한 인수는 Graphics클래스 의 인스턴스입니다 . 클래스에서 제공하는 기본 구현 Component은 아무 작업도 수행하지 않습니다.

구성 요소를 다시 칠하는 방법

디스플레이를 다시 그리는 데 필요한 시간을 줄이기 위해 AWT는 두 가지 단축키를 사용합니다.

  • 첫째, AWT는 덮개가 벗겨 졌거나 다시 칠 해달라고 요청했기 때문에 다시 칠해야하는 구성 요소 만 다시 칠합니다.


    
  • 둘째, 구성 요소가 덮혀 있고 덮히 지 않은 경우 AWT는 이전에 덮었던 구성 요소 부분 만 다시 칠합니다.

그림 1의 애플릿을 사용하면이 프로세스가 발생하는 것을 관찰 할 수 있습니다. 잠시 동안 애플릿 상단의 텍스트 영역을 무시하고 디스플레이의 색상 부분 만보십시오. 다른 창을 사용하여 일시적으로 애플릿의 일부를 덮었다가 드러내십시오. 가려진 애플릿 부분 만 다시 칠해집니다. 또한 구성 요소 계층 구조에서의 위치에 관계없이 커버 된 구성 요소 만 다시 그려집니다. 의도적으로 다른 색상을 사용함으로써 애플릿은이 미묘한 효과를 눈에 띄게 만듭니다. 이 그림의 소스 코드는 여기에 있습니다.

그림 1 : 브라우저 다시 그리기

그래픽 좌표계

다음 섹션에서 설명하는 방법은 모양을 그리는 방법을 지정하는 값을 매개 변수로 사용합니다. 예를 들어 drawLine () 메서드에는 4 개의 매개 변수가 필요합니다. 처음 두 매개 변수는 줄의 시작 위치를 지정하고 마지막 두 매개 변수는 줄의 끝 위치를 지정합니다. drawLine () 메서드에 전달 될 정확한 값 은 적용되는 좌표계에 의해 결정됩니다.

좌표계는 공간에서 점의 위치를 ​​명확하게 지정하는 방법입니다. AWT의 경우이 공간은 평면이라고하는 2 차원 표면입니다. 평면의 각 위치는 xy 좌표 라고하는 두 개의 정수로 지정할 수 있습니다 . xy 좌표 의 값은 원점에서 점의 각각 수평 및 수직 변위를 기준으로 계산됩니다. AWT의 경우 원점은 항상 평면의 왼쪽 상단 모서리에있는 점입니다. 좌표 값 0 ( x ) 및 0 ( y). 그림 2의 그림은 두 지점을 보여줍니다. 하나는 원점에 있고 다른 하나는 원점에서 7 번, 5 번 아래에 있습니다.

그림 2 : 좌표 평면

그래픽 프리미티브

이 섹션에서는 선, 직사각형, 타원 및 호, 다각형을 그리는 방법을 소개합니다. 이러한 메서드는 유효한 Graphics인스턴스에서 호출 될 때만 작동하므로 구성 요소의 update ()paint () 메서드 범위 내에서만 사용할 수 있습니다 . 뒤 따르는 대부분의 방법은 쌍으로 나옵니다. 한 메서드 ( drawX () 메서드)는 지정된 모양의 외곽선 만 그리고 다른 메서드 ( fillX () 메서드)는 지정된 모양의 채워진 버전을 그립니다.

윤곽

void drawLine (int xBegin, int yBegin, int xEnd, int yEnd)

이것은 모든 그래픽 방법 중 가장 간단합니다. 지정된 시작점과 끝점 사이에 단일 픽셀 너비의 직선을 그립니다. 결과 선은 현재 클리핑 영역의 경계에 맞게 잘립니다. 선은 현재 전경색으로 그려집니다.

그림 3의 애플릿은 작동중인 drawLine () 메서드를 보여줍니다 . 소스 코드는 여기에서 사용할 수 있습니다. 이 애플릿과 그림 4, 6 및 7의 애플릿에는 NewCanvas 클래스와 Figure 인터페이스라는 두 가지 지원 클래스의 서비스가 필요합니다. NewCanvas 클래스는 Canvas 클래스를 확장하고 그림에 대한 특수한 그리기 화면을 제공합니다. NewCanvas 클래스의 소스 코드는 여기에서 사용할 수 있습니다. Figure 인터페이스는 NewCanvas와 함께 사용하기 위해 Figure가 제공해야하는 메서드를 정의합니다. Figure 인터페이스의 소스 코드는 여기에서 사용할 수 있습니다.

그림 3 : 선 그리기 데모

직사각형
void drawRect (int x, int y, int w, int h) void fillRect (int x, int y, int w, int h) void drawRect (int x, int y, int w, int h, int arcWidth, int arcHeight ) void fillRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight) void draw3DRect (int x, int y, int w, int h, boolean raised) void fill3DRect (int x, int y, int w, int h, 부울 발생)

이러한 각 그래픽 메서드에는 매개 변수로 사각형을 시작할 x 및 y 좌표와 사각형의 너비 및 높이가 필요합니다. 너비와 높이는 모두 양의 정수 여야합니다. 결과 사각형은 현재 클리핑 영역의 경계에 맞게 잘립니다. 사각형은 현재 전경색으로 그려집니다. 직사각형은 세 가지 다른 스타일로 제공됩니다. 일반, 둥근 모서리, 약간의 (하지만 종종보기 힘든) 3 차원 효과가 있습니다.

둥근 직사각형 그래픽 방법에는 두 개의 추가 매개 변수, 호 너비와 호 높이가 필요하며, 두 매개 변수는 모두 모서리의 둥글 림을 제어합니다. 3 차원 사각형 메서드에는 사각형을 가라 앉히거나 올려야하는지 여부를 나타내는 추가 매개 변수가 필요합니다.

그림 4의 애플릿은 이러한 방법의 작동을 보여줍니다. 소스 코드는 여기에서 사용할 수 있습니다.

그림 4 : 직사각형 그리기 데모

타원과 호

void drawOval (int x, int y, int w, int h) void fillOval (int x, int y, int w, int h) void drawArc (int x, int y, int w, int h, int startAngle, int arcAngle ) void fillArc (int x, int y, int w, int h, int startAngle, int arcAngle)

이러한 각 그래픽 방법에는 타원 또는 호 중심의 x 및 y 좌표와 타원 또는 호의 너비 및 높이가 매개 변수로 필요합니다. 너비와 높이는 모두 양의 정수 여야합니다. 결과 모양은 현재 클리핑 영역의 경계에 맞도록 잘립니다. 모양은 현재 전경색으로 그려집니다.

호 그래픽 방법에는 호의 시작과 호의 크기 (라디안 아님)를 지정하기 위해 두 개의 추가 매개 변수 (시작 각도와 호 각도)가 필요합니다. 그림 5는 각도 지정 방법을 보여줍니다.

그림 5 : 각도 사양

그림 6의 애플릿은 이러한 방법의 작동을 보여줍니다. 소스 코드는 여기에서 사용할 수 있습니다.

그림 6 : 타원형 및 호 그리기 데모

다각형

void drawPolygon (int xPoints [], int yPoints [], int nPoints) void drawPolygon (Polygon p) void fillPolygon (int xPoints [], int yPoints [], int nPoints) void fillPolygon (Polygon p)

다각형은 일련의 선분으로 형성된 모양입니다. 각 다각형 그래픽 방법에는 다각형을 구성하는 선분의 ​​끝점 좌표가 매개 변수로 필요합니다. 이러한 끝점은 두 가지 방법 중 하나로 지정할 수 있습니다. 하나는 연속적인 x 좌표를 나타내고 다른 하나는 연속적인 y 좌표를 나타내는 두 개의 병렬 정수 배열로 지정됩니다 . 또는 Polygon클래스 의 인스턴스와 함께 . 이 Polygon클래스는 다각형 정의를 포인트별로 어셈블 할 수있는 addPoint () 메서드를 제공합니다 . 결과 모양은 현재 클리핑 영역의 경계에 맞게 잘립니다.

그림 7의 애플릿은 이러한 방법의 작동을 보여줍니다. 소스 코드는 여기에서 사용할 수 있습니다.

그림 7 : 다각형 그리기 데모

결론

믿거 나 말거나 지난 몇 달 동안 우리가 다룬 모든 것 (AWT, 이벤트 처리, 관찰자 ​​등)과 결합 된이 몇 가지 간단한 그래픽 프리미티브는 다음과 같은 유용한 애플리케이션을 작성하는 데 필요한 모든 것입니다. CAD 시스템에 대한 게임. 다음 달에는이 모든 정보를 모아서 제가 의미하는 바를 보여 드리겠습니다.

계속 지켜봐주세요.

Todd Sundsted는 데스크탑 모델에서 컴퓨터를 사용할 수있게 된 이후로 프로그램을 작성해 왔습니다. 원래는 C ++로 분산 된 객체 애플리케이션을 구축하는 데 관심이 있었지만 Todd는 Java가 이러한 종류의 확실한 선택이되었을 때 Java 프로그래밍 언어로 전환했습니다. 글을 쓰는 것 외에도 Todd는 미국 남동부에있는 회사에 인터넷 및 웹 컨설팅 서비스를 제공합니다. : END_BIO

이 주제에 대해 더 알아보기

  • 자바 클래스 GraphicsAPI

    //java.sun.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • 관찰자 및 관찰자 //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • 효과적인 사용자 인터페이스 //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java 및 이벤트 처리 //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • AWT 소개 //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

이 이야기 "Using the Graphics class"는 원래 JavaWorld에 의해 출판되었습니다.