세 가지 Java 클래스로 텍스트 그리기가 쉽습니다.

Graphics클래스는 선과 원과 같은 기본 기하학적 유형을 그리는 방법 외에도 텍스트를 그리는 방법을 제공합니다. FontFontMetrics클래스 와 함께 사용하면 그 결과 매력적인 텍스트를 그리는 작업이 다른 경우보다 훨씬 쉬워지는 도구 세트가됩니다. 이 칼럼에서는 이러한 각 클래스를 차례로 다루고 함께 사용하는 방법을 보여줍니다. 그러나 시작하기 전에 Graphics수업 의 역할에 대한 간단한 검토 가 필요합니다.

리뷰

Graphics클래스 의 텍스트 메소드를 사용하기 위해서는 Graphics클래스 자체 의 역할에 대한 이해 가 필요합니다. 이 섹션에서는 Graphics클래스 의 기능과 작동에 대한 간략한 개요를 제공합니다 . 자세한 내용을 원하는 독자는 여기에서 볼 수있는 10 월 칼럼을 읽어야합니다.

Graphics클래스는 AWT (추상 창 도구 키트) 내에서 서로 다르지만 관련된 두 가지 역할을 수행합니다. 첫째, 그래픽 작업의 결과에 영향을 미칠 모든 정보로 구성된 그래픽 컨텍스트를 유지합니다. 여기에는 그리기 색상, 글꼴, 클리핑 사각형 (그래픽을 그릴 수있는 영역)의 위치와 치수가 포함됩니다. 더 중요한 것은 그래픽 컨텍스트가 논의 할 그래픽 작업의 대상을 정의한다는 것입니다 (대상에는 구성 요소와 이미지가 포함됨).

그래픽 컨텍스트로서의 역할 외에도이 Graphics클래스는 그래픽 대상에 간단한 기하학적 모양, 텍스트 및 이미지 그리는 방법을 제공합니다. 구성 요소 또는 이미지에 대한 모든 그래픽 관련 작업은 이러한 방법 중 하나를 통해 발생합니다.

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

Graphics클래스는 FontFontMetrics클래스 와 함께 작동 하여 이미지 또는 구성 요소 내에서 텍스트를 그리는 데 필요한 도구를 제공합니다. Graphics텍스트를 그리는 클래스의 메서드를 살펴 보겠습니다 .

클래스 그래픽

Graphics클래스는 구성 요소 또는 이미지에 텍스트를 그리는 세 가지 메서드를 제공합니다.

void drawString (문자열 str, int x, int y)

drawString()방법은 아래의 인스턴스를 매개 변수로 얻어 String텍스트를 포함하는 클래스가 인출되도록, 텍스트가 시작되어야 좌표를 지정하는 두 정수 값.

public void paint (Graphics g) {g.drawString ( "abc", 25, 25); }

위 목록의 코드 drawString()는 구성 요소의 paint()메서드 내에서 사용중인 메서드를 보여줍니다 . 이 예제의 코드는이 paint()메서드를 포함하는 구성 요소에 "abc"라는 단어를 그립니다 . XY 좌표는 위치 지정 왼쪽 둘러싸는 텍스트 박스의 코너. 그림 1은이 코드가 적합한 AWT 구성 요소 객체의 일부인 경우 결과가 어떻게 표시되는지 보여줍니다.

그림 1 : drawString () 데모

void drawChars (char [] data, int offset, int length, int x, int y)

drawChars()방법은 아래의 텍스트를 포함하는 문자 배열이 그려 매개 변수로 얻어 좌표를 특정하는, 그릴 문자의 수를 나타내는 정수 값을 개시하는 배열 오프셋, 2 개 개의 정수 값을 나타내는 정수 값이 어디에 텍스트가 시작되어야합니다.

public void paint (Graphics g) {char [] rgc = { 'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', '제이' };

g.drawChars (rgc, 0, 5, 25, 25); g.drawChars (rgc, 5, 5, 25, 50); }

위의 코드 drawChars()는 구성 요소의 paint()메서드 내에서 사용중인 메서드를 보여줍니다 . 문자 배열은 두 부분으로 그려집니다. 에 대한 두 호출 중 첫 번째 drawChars()에서 offset 매개 변수는 그리기가 배열의 첫 번째 문자로 시작되어야 함을 나타내고 length 매개 변수는 총 5 개의 문자가 첫 번째 줄에 그려 져야 함을 나타냅니다. 두 번째 호출 중 두 번째는 비슷한 방식으로 작동하지만 첫 번째 호출 아래 25 픽셀 아래 위치에서 시작하는 문자 배열의 마지막 5 개 문자를 그립니다. 그림 2는이 코드가 적합한 AWT 구성 요소 객체의 일부인 경우 결과가 어떻게 표시되는지 보여줍니다.

그림 2 : drawChars () 데모

void drawBytes (byte [] 데이터, int 오프셋, int 길이, int x, int y)

아래에 표시된 것처럼 drawBytes()메서드는 그릴 텍스트를 포함하는 바이트 배열, 시작할 배열의 오프셋을 나타내는 정수 값, 그릴 바이트 수를 나타내는 정수 값 및 다음을 지정하는 두 개의 정수 값을 매개 변수로 사용합니다. 텍스트가 시작되어야하는 좌표입니다.

public void paint (Graphics g) {byte [] rgb = { 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'};

g.drawBytes (rgb, 0, 5, 25, 25); g.drawBytes (rgb, 5, 5, 25, 50); }

위의 코드는 drawBytes()구성 요소의 paint()메서드 내에서 사용중인 메서드를 보여줍니다 . 그림 3은이 코드가 적합한 AWT 구성 요소 객체의 일부인 경우 결과가 어떻게 표시되는지 보여줍니다.

그림 3 : drawBytes () 데모

유니 코드 지원

Java의 가장 유명한 기능 중 하나는 유니 코드를 통한 국제 스크립트 지원입니다. 유감스럽게도 Java 프로그래밍 언어 버전 1.0과 함께 제공되는 Java 클래스 라이브러리가이 언어 측면을 완전히 지원하지 않았습니다. 그러나 희소식이 얼마 남지 않은 것 같습니다. SunSoft에서 사용할 수있는 예비 국제화 API (참고 자료 참조)는 다음과 같이 말합니다.

JDK 1.0은 유니 코드의 Latin-1 하위 집합에있는 문자 만 표시하도록 제한되었습니다. 이 제한은 JDK 1.1에서 제거되었습니다. Java 프로그램은 이제 호스트 글꼴로 렌더링 할 수있는 모든 유니 코드 문자를 표시 할 수 있습니다. Java는 미리 정의 된 소수의 "가상"글꼴 이름을 제공하고 호스트에서 사용할 수있는 실제 글꼴에 매핑합니다. JDK 1.0에서 각 Java 글꼴 이름은 정확히 하나의 호스트 글꼴에 매핑됩니다. JDK 1.1에서 Java 글꼴 이름은 일련의 호스트 글꼴에 매핑 될 수 있습니다. 일련의 호스트 글꼴은 원하는만큼 유니 코드 문자 집합을 포함하도록 선택할 수 있습니다.

텍스트 배치

텍스트는 AWT에 대한 또 다른 종류의 그림이기 때문에 텍스트 줄은 다른 텍스트 줄의 맨 위에도 배치 할 수 있습니다. 그러나 우연한 배치의 효과가 반드시 눈을 즐겁게하는 것은 아닙니다. 프로그래머가 미적으로 만족스러운 텍스트를 만드는 데 도움을주기 위해 글꼴 정의에는 줄 및 문자 배치에 대한 지침이 포함됩니다. 이러한 지침을 따르면 만족스러운 결과물을 얻을 수 있습니다.

그림 4에는 논의 할 특성을 표시하기 위해 마크 업 된 텍스트 행이 포함되어 있습니다.

그림 4 : 텍스트 줄

Y는 이전 섹션에서 지정하는 방법에서의 위치 좌표 파라미터 기준 텍스트의 라인을. 기준선 라인이고 나머지 텍스트 라인의 문자들의 대부분시 (예 : "g"및 "Y"로 센더와 해당 문자 인 예외). 기준선은 실제로 글꼴의 특성이 아니라 다른 모든 특성이 참조하는 참조 지점입니다.

상승은 글꼴의 문자 대부분의 맨 위와 기준선 사이의 거리입니다. 일반적으로 글꼴의 대문자와 "f"및 "h"와 같은 문자의 높이입니다. 그러나이 수치는 지침 일뿐입니다. 글꼴의 일부 문자는 실제로이 거리 이상으로 확장 될 수 있습니다.

하강은 "P", "g", 및 "y"를 부호 - 센더가 폰트의 문자의 하단 기준선으로부터의 거리이다. 상승과 마찬가지로이 수치는 단지 지침 일뿐입니다. 글꼴의 일부 문자는 실제로이 거리 아래로 확장 될 수 있습니다.

선도 (발음 "ledding")는 텍스트의 한 줄의 하강과 아래 줄의 상승 사이의 공간의 양입니다. 텍스트 줄의 높이 (텍스트 한 줄의 기준선에서 텍스트 위 또는 아래의 텍스트 줄 기준선까지의 거리)에는이 추가 공간이 포함됩니다.

글꼴 전체를 제어하는 ​​특성 외에도 글꼴의 각 문자에는 고급 기능이 있습니다. 진행은 문자 시작 부분과 오른쪽 문자 시작 부분을 구분하는 픽셀 수를 지정합니다. 요컨대 캐릭터의 너비입니다. 다시 한 번, 글꼴의 일부 문자는 실제로이 거리를 넘어 확장 될 수 있습니다.

텍스트 한 줄에있는 모든 문자의 너비를 더하여 전체 텍스트 줄의 길이를 계산할 수 있습니다. FontMetrics클래스는 아래 그냥이 등을 수행하는 방법을 제공한다.

FontMetrics 클래스

FontMetrics클래스는 위에서 설명한 특성을 얻을 수있는 간단한 방법을 제공합니다. getFontMetrics작동 하는 방법 은 다음과 같습니다 .

public void paint (Graphics g) {FontMetrics fm = g.getFontMetrics (); . . . }

위의 코드는 현재 글꼴을 설명하는 글꼴 메트릭 정보를 얻을 수있는 방법을 보여줍니다. 이 getFontMetrics()메서드는 FontMetrics클래스 의 인스턴스를 반환합니다 . 이 FontMetrics클래스는 다음 메서드를 제공합니다.

int getAscent()

  • 글꼴의 상승을 반환합니다.

int getDescent()

  • 글꼴의 하강을 반환합니다.

int getLeading()

  • 글꼴의 행간을 반환합니다.

int getHeight()

  • 글꼴의 높이를 반환합니다. 높이는 글꼴의 상승, 하강 및 행간의 합계입니다.

int charWidth(int ch)

  • 지정된 문자의 너비를 반환합니다.

int charWidth(char ch)

  • 지정된 문자의 너비를 반환합니다.

int [] getWidths()

  • 글꼴의 처음 256 자 너비를 포함하는 정수 배열을 반환합니다.

위에서 언급했듯이 글꼴을 구성하는 문자는 위의 방법으로보고 된 상승, 하강 및 너비를 넘어서 확장 될 수 있습니다. 정확한 값이 필요한 경우 다음과 같은 방법이 제공됩니다.

int getMaxAscent()

  • 글꼴의 최대 상승을 반환합니다.

int getMaxDescent()

  • 글꼴의 최대 하강을 반환합니다.

int getMaxAdvance()

  • 글꼴에서 가장 넓은 문자의 너비를 반환합니다.

다음 메서드는 일련의 문자가 차지하는 너비에 대한 정보를 제공합니다.

int stringWidth(String str)

  • 문자 시퀀스의 너비를 반환합니다.

int bytesWidth(byte [] rgb, int offset, int length)

  • 의 폭을 돌려줍니다 길이 에서 시작 바이트의 긴 순서 오프셋 .

int charsWidth(char [] rgc, int offset, int length)

  • 의 폭을 돌려줍니다 길이 에서 시작 문자의 긴 순서 오프셋 .

클래스 글꼴

Font클래스는 글꼴에 대한 정보를 캡슐화합니다. Font이름, 스타일 및 포인트 크기 를 사용하여 클래스 의 인스턴스를 만들어 새 글꼴을 만듭니다 .

글꼴 f = new Font ( "Dialog", Font.PLAIN, 12); 

생성 된 글꼴은 Graphics개체 의 인스턴스에 할당 될 수 있습니다 .

g.setFont (f); 

그러면 Graphics개체는 모든 후속 텍스트 관련 그래픽 작업에 글꼴을 사용합니다.

Font클래스는 생성 된 글꼴에 대한 정보를 얻는 방법을 제공합니다.

String getName()

  • 글꼴의 이름을 반환합니다.

String getFamily()

  • 글꼴의 플랫폼 별 이름을 반환합니다.

int getSize()

  • 글꼴의 포인트 크기를 반환합니다.

int getStyle()

  • 글꼴의 스타일을 반환합니다.

boolean isBold()

  • true글꼴이 굵은 경우 반환 합니다.

boolean isItalic()

  • true글꼴이 기울임 꼴이면 반환 합니다.

boolean isPlain()

  • true글꼴이 일반인 경우 반환 합니다.

String getName()

  • 글꼴의 이름을 반환합니다.

데모

그림 5의 애플릿은 위 섹션의 관련 메트릭 값을 나타내는 데 충분한 마크 업이있는 텍스트 줄을 표시합니다. 굵은 검은 색 선이 기준선에 있습니다. 두 개의 추가 선은 해당 글꼴의 상승 및 하강을 나타냅니다. 더 작은 수직선은 문자의 너비를 나타냅니다. 세 개의 풀다운 메뉴에서 글꼴, 스타일 및 포인트 크기를 선택할 수 있습니다.

이 애플릿을 보려면 Java 사용 가능 브라우저가 필요합니다. 그림 5 : 대화 형 글꼴 메트릭 브라우저

애플릿의 사용 Graphics, Font그리고 FontMetrics광범위하게 수업을. 소스는 여기에서 확인할 수 있습니다.

결론

Graphics수업은 탐험하기에 매우 비옥 한 땅으로 판명 된 것 같습니다 . 그리고 탐험은 아직 끝나지 않았습니다. 다음 달 Graphics에는 이미지 지원 방법에 대한 열로 수업을 마치겠습니다.이 열은 이미지 제작자 및 이미지 소비자를 포함하여 이미지 및 AWT와 관련된 다른 주제에 대한 작은 시리즈를 시작할 것입니다.

시간을내어 의견, 아이디어 및 제안 사항을 적어 주신 모든 분들께 감사드립니다. 좋은 일을 계속하십시오.

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

이 주제에 대해 더 알아보기

  • 클래스 GraphicsAPI :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • 클래스 FontAPI :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • 클래스 FontMetricsAPI :

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Graphics수업 사용 :

    //www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html

  • 국제화 API :

    //www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html

  • Mary Campione 및 Kathy Walrath 의 Java 자습서 :

    //www.javasoft.com/books/Series/Tutorial/index.html

이 이야기 "텍스트 그리기는 3 개의 Java 클래스로 쉽습니다"는 원래 JavaWorld에서 게시했습니다.