Для большинства шрифтов не все символы имеют одинаковую ширину (такие шрифты называют пропорциональными). Кроме того, высота каждого символа, длина выносных элементов (свисающих частей, как у символов g или р, например) и величина пробела между горизонтальными строками изменяется от шрифта к шрифту. Далее, может быть изменен размер шрифта (в пунктах). Переменный характер этих (и других) атрибутов не имел бы слишком больших последствий, если бы Java не требовал от программиста ручного управления фактически всем текстовым выводом.
Учитывая, что размеры каждого шрифта могут отличаться и что шрифты могут быть изменены во время выполнения программы, должен существовать некоторый способ для определения размеров и различных других, атрибутов текущего шрифта. Например, для записи одной строки текста после другой необходимо как-то узнать, какова высота шрифта и сколько пикселов необходимо иметь между строками. Чтобы заполнить эту потребность, AWT включает класс FontMetrics, который инкапсулирует различную информацию о шрифте. Начнем с определения общей терминологии, используемой при описании шрифтов:
□ Высота (Height) — размер (от верха до низа) самого высокого символа в шрифте.
□ Базовая линия (Baseline) — линия, по которой выровнен низ всех символов (не считая десцендера).
□ Высота надстрочного элемента, асцендер (Ascent) — расстояние от базовой линии до верха символа.
□ Высота подстрочного элемента, десцендер (Descent) — расстояние от базовой линии до низа символа.
□ Интерлиньяж (Leading) — расстояния между самым низом одной строки текста и самым верхом следующей строки.
Во многих из предыдущих примеров использовался метод drawString().
Он выводит строку в текущем шрифте и цвете, начиная с определенного положения в окне. Однако точка вывода находится слева на базовой линии, а не в левом верхнем углу окна, как обычно в других рисующих методах. Общая ошибка — рисовать строку в той же самой координате, в которой вы рисовали бы прямоугольник. Например, при рисовании прямоугольника начиная с точки 0,0 в окне апплета будет изображен полный прямоугольник. Но при рисовании строки "Typesetting" с координатами 0, 0 будут изображены только нижние выносные элементы (или десцендеры) символов у, р, и g. Используя метрику шрифта, можно определять надлежащее размещение каждой отображаемой строки.
Класс FontMetrics определяет несколько методов, которые помогают управлять текстовым выводом. Наиболее используемые методы перечислены в табл. 14.4. Они помогают должным образом отобразить текст в окне.
Таблица 14.4. Некоторые методы класса FontMetrics
Метод
Описание
int bytesWidth (byte b[ ], int start, int numBytes)
Возвращает ширину строки, состоящей из numBytes символов, содержащихся в массиве b. Параметр start указывает номер начального символа этой строки в массиве b
int charWidth(char c[], int start, int numChars)
Возвращает ширину строки, состоящей из numChars символов, содержащихся в массиве с. Параметр start указывает номер начального символа этой строки в массиве с
int charWidth (char c)
Возвращает ширину с
int charWidth (int c)
Возвращает ширину с
int getAscent()
Возвращает асцендер шрифта
int getDescent ()
Возвращает десцендер шрифта
Font getFont()
Возвращает шрифт
int getHeight()
Возвращает высоту строки текста. Это значение можно использовать для вывода в окно многострочного текста
int getLeading()
Возвращает размер интерлиньяжа
int getMaxAdvance ()
Возвращает ширину самого широкого символа. Возвращает -1, если это значение недоступно
int getMaxAscent()
Возвращает максимальный асцендер
int getMaxDescent()
Возвращает максимальный десцендер
int[ ] getWidths()
Возвращает ширины первых 256 символов
int stringWidth(String str)
Возвращает ширину строки, указанной в параметре str
String toString()
Возвращает строчный эквивалент вызывающего объекта