Рисуването на текст е лесно с три Java класа

В допълнение към методите за рисуване на примитивни геометрични типове като линии и кръгове, Graphicsкласът предоставя методи за рисуване на текст. Когато се комбинират Fontи FontMetricsкласове, резултатът е набор от инструменти, който прави работата на изготвянето привлекателен текст много по-лесно, отколкото в противен случай може да се окаже. Тази колона ще обхваща всеки от тези класове на свой ред и ще ви покаже как да ги използвате заедно. Преди да започна обаче, е кратък преглед на ролята на Graphicsкласа.

Преглед

За да се използват текстовите методи на Graphicsкласа, се изисква разбиране на ролята на самия Graphicsклас. Този раздел представя кратък преглед на функцията и работата на Graphicsкласа. Читателите, които търсят задълбочено отразяване, трябва да прочетат моята октомврийска рубрика, достъпна тук.

В Graphicsкласа играе два различни, но свързани роли в резюме прозоръчна инструмента (AWT). Първо, той поддържа графичния контекст, който се състои от цялата информация, която ще повлияе на резултата от графична операция. Това включва цвета на чертежа, шрифта и местоположението и размерите на изрязващия правоъгълник (областта, в която могат да се рисуват графики). По-важното е, че графичният контекст определя дестинацията за графичните операции, които предстои да бъдат обсъдени (дестинациите включват компоненти и изображения).

В допълнение към ролята си на графичен контекст, Graphicsкласът предоставя методи за изчертаване на прости геометрични фигури, текст и изображения към графичната дестинация. Всички операции, свързани с графиката, върху компонент или изображение се извършват чрез един от тези методи.

За да рисува, една програма изисква валиден графичен контекст (представен от екземпляр на Graphicsкласа). Тъй като Graphicsкласът е абстрактен базов клас, той не може да бъде директно създаден. Екземпляр обикновено се създава от компонент и след това се предава на програмата като аргумент на компонент update()и paint()методи. Тези два метода се извикват като част от нормалния цикъл на изтегляне, стартиран в AWT.

В Graphicsкласа работи заедно с Fontи FontMetricsкласове, които ще предоставят необходимите инструменти, за да се направи текст в изображение или компонент. Нека започнем с разглеждане на Graphicsметодите на класа за рисуване на текст.

Графика на класа

Най- Graphicsкласа предлага три метода, които привличат текст на компонент или изображение.

void drawString (String str, int x, int y)

В drawString()метода, показан по-долу, се като параметри инстанция на Stringкласа, съдържащ текста да бъде изготвен и двете цели числа, определящи координатите където текста трябва да започне.

публична невалидна боя (Графика g) {g.drawString ("abc", 25, 25); }

Кодът в списъка по-горе показва използвания drawString()метод в метода на компонента paint(). Кодът в този пример изтегля думата "abc" върху компонента, съдържащ този paint()метод. Координатите x и y указват местоположението на долния ляв ъгъл на заграждащото текстово поле. Фигура 1 показва как би изглеждал резултатът, ако този код е част от подходящ обект на AWT компонент.

Фигура 1: Демонстрация на drawString ()

void drawChars (char [] данни, int offset, int length, int x, int y)

Най drawChars()-долу метод отнема като параметри характер масив, съдържащ текста, за да бъде изготвен, цяла стойност, което показва, офсетните в масива, на което да се започне, цяла стойност, което показва броя на знаците, да изготвят и два целочислени стойности, определящи координатите, където текстът трябва да започне.

публична невалидна боя (Графика g) {char [] rgc = {'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j'};

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

Кодът по-горе показва използвания drawChars()метод в метода на компонента paint(). Символният масив е съставен от две части. В първата от двете повиквания към drawChars()това компенсира параметър показва, че рисунката трябва да започва с първия знак в масива, а дължината параметър показва, че общо пет знака трябва да бъдат изготвени на първа линия. Второто от двете обаждания работи по подобен начин, но изчертава последните пет знака в масива от символи, започвайки на позиция 25 пиксела под първата. Фигура 2 показва как би изглеждал резултатът, ако този код е част от подходящ обект на AWT компонент.

Фигура 2: Демонстрация на drawChars ()

void drawBytes (byte [] data, int offset, int length, int x, int y)

Както е показано по-долу, drawBytes()методът приема като параметри масив от байтове, съдържащ текста, който трябва да бъде изчертан, целочислена стойност, показваща изместването в масива, с който да започне, целочислена стойност, указваща броя на байтовете за изчертаване, и две целочислени стойности, указващи координати, където трябва да започне текстът.

публична невалидна боя (графика g) {byte [] rgb = {'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 'т' };

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

Горният код показва използвания drawBytes()метод в метода на компонента paint(). Фигура 3 показва как би изглеждал резултатът, ако този код е част от подходящ обект на AWT компонент.

Фигура 3: Демонстрация на drawBytes ()

Поддръжка на Unicode

Една от най-рекламираните функции на Java е нейната поддръжка за международни скриптове чрез Unicode. За съжаление, библиотеката на класове Java, доставена с версия 1.0 на езика за програмиране Java, не поддържа напълно този аспект на езика. Изглежда обаче, че добрите новини са точно зад ъгъла. Предварителният API за интернационализация (вж. Ресурси), достъпен от SunSoft, казва това:

JDK 1.0 беше ограничен до показване само на символите в подмножието Latin-1 на Unicode. Това ограничение е премахнато в JDK 1.1. Програмите на Java вече ще могат да показват всеки Unicode знак, който може да бъде изобразен с хостов шрифт. Java предоставя малък брой предварително дефинирани "виртуални" имена на шрифтове и ги съпоставя с реални шрифтове, достъпни на хоста. В JDK 1.0 всяко име на шрифт на Java се съпоставя с точно един шрифт на хоста. В JDK 1.1 име на шрифт на Java може да се преобразува в поредица от хост шрифтове. Поредицата от хостови шрифтове може да бъде избрана, за да покрие колкото се желае от Unicode набора от символи.

Поставяне на текст

Тъй като текстът е просто друг вид фигура за AWT, ред текст може да бъде поставен навсякъде - дори върху друг ред текст. Ефектът от случайното поставяне обаче не е задължително да е приятен за окото. За да се помогне на програмиста при създаването на естетически приятен текст, определението на шрифта включва насоки за поставяне на редове и символи. Тези указания, ако бъдат спазени, ще помогнат да се получат приятни резултати.

Фигура 4 съдържа ред текст, който е маркиран, за да посочи характеристиките, които предстои да обсъдим.

Фигура 4: Ред текст

Параметърът y координати в методите в предишния раздел указва местоположението на базовата линия на ред текст. На линия е линията, на която повечето от героите в ред от текста покой (изключение правят тези знаци с горни като "г" и "у"). Базовата линия всъщност не е характеристика на шрифт, но е референтната точка, към която се отнасят всички останали характеристики.

В изкачване е разстоянието от началната точка до горната част на повечето от героите с шрифт. Това обикновено е височината на главните букви в шрифта и на символи като "f" и "h". Тази цифра обаче е само ориентир. Някои знаци в шрифта може действително да се простират над това разстояние.

В спускането е разстоянието от базовата линия до края на символите в шрифт, които имат горни - символи като "р", "д" и "у". Както при изкачването, тази цифра е само ориентир. Някои знаци в шрифта може действително да се простират под това разстояние.

Най- водещ (произнася се "ledding") е част от пространството между слизането на един ред текст и изкачване на линията под него. Височината на ред текст (разстоянието от основната линия на един ред текст до основната линия на ред текст над или под него) включва това допълнително пространство.

В допълнение към характеристиките, управляващи шрифта като цяло, всеки знак в шрифта има аванс . Авансът определя колко пиксела разделят началото на символа от началото на символ вдясно; накратко, това е ширина на персонажа. Още веднъж, някои знаци в шрифта може действително да надхвърлят това разстояние.

Чрез събиране на ширините на всички знаци в ред текст може да се изчисли дължината на целия ред текст. В FontMetricsкласа по-долу се отнася до метод, който прави точно това, и повече.

Клас FontMetrics

В FontMetricsкласа предоставя лесен начин да получите най-характеристиките обсъдени по-горе. Ето getFontMetricsметода в действие:

публична невалидна боя (Графика 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 = нов шрифт ("Диалогов прозорец", 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, включително производители на изображения и потребители на изображения.

Бих искал да благодаря на всички вас, които отделихте време да ми пишете с вашите коментари, идеи и предложения. Продължавай с добрата работа.

Тод Съндстед пише програми, откакто компютрите стават достъпни в настолни модели. Въпреки че първоначално се интересуваше от изграждането на разпределени обектни приложения в C ++, Тод премина към езика за програмиране Java, когато Java стана очевидният избор за такъв тип неща. Тод е съавтор на Java Language API SuperBible, който вече е в книжарниците навсякъде. В допълнение към писането, Тод предоставя интернет и уеб консултантски услуги на компании в югоизточната част на САЩ.

Научете повече за тази тема

  • 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

  • Урокът за Java от Мери Кампионе и Кати Уорат:

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

Тази история „Рисуването на текст е лесна с три Java класа“ първоначално е публикувана от JavaWorld.