Главная страница
Медицина
Финансы
Экономика
Биология
Ветеринария
Сельское хозяйство
Юриспруденция
Право
Языкознание
Языки
Логика
Философия
Религия
Этика
Политология
Социология
История
Информатика
Вычислительная техника
Физика
Математика
Промышленность
Энергетика
Искусство
Культура
Химия
Электротехника
Связь
Автоматика
Геология
Экология
Начальные классы
Строительство
образование
Механика
Воспитательная работа
Русский язык и литература
Дошкольное образование
Реферат
Урок
Отчет
Программа
Закон
Курсовая
Задача
Занятие
Решение
Лекция
Протокол
Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
Название
С. Н. Тригуб Перевод с английского и редакция
Анкор
Java. Полное руководство. 8-е издание.pdf
Дата
28.02.2017
Размер
25.04 Mb.
Формат файла
Имя файла
Java. Полное руководство. 8-е издание
.pdf
Тип
Документы
#3236
страница
69 из 90
1
...
65
66
67
68
69
70
71
72
...
90
g .drawArc(10, 100, 70, 80, 0, 175);
g .fillArc(100, 100, 70, 90, 0, 270);
g .drawArc(2 00, 80, 80, 80, 0, 180);
}
}
Результат выполнения этого аплета показан на рис. Глава 24. Введение в библиотеку AW T: работа с окнами, графикой и текстом
7 6 3
Applet Рис. 24.8. Пример рисования дуг окружностей
Рисование многоугольников
Можно рисовать фигуры произвольной формы, используя методы d r a w P o l y - g o n (
) и f i l l P o l y g o n ( )
, показанные ниже i d d r a w P o l y g o n (int x[ ], int y[ ], int кол Точек кол Точек Конечные точки многоугольника указываются парами координат в массивах хи у . Количество точек, определенных параметрами хи у , указывается параметром ко лТ о чек Существуют альтернативные формы этих методов, в которых многоугольник определяется объектом класса
P o ly g o n Следующий аплет рисует форму песочных часов Рисование многоугольника
import java.awt.*;
import j a v a . a p p l e t .*;
/*
*/
public class HourGlass extends Applet {
public voi d paint(Graphics g) {
int xpointsf] = {30, 200, 30, 200, 30};
int ypoints[] = {30, 30, 200, 200, 30};
int num = 5;
g .d r a w P o l y g o n ( x p o i n t s ,
ypoints, n u m ) Результат выполнения этого аплета показан на рис. 24.9.
7 6 Д Часть И. Библиотека Java
A p p le t V ie w e r: Но и ..; - Рис. 26.9. Пример рисования многоугольника
Установка размеров графики
Нередко возникает необходимость установить такой размер графического объекта, чтобы он занял текущий размер окна, в котором он нарисован. Чтобы добиться этого, получите текущие размеры окна вызовом метода g e t S i z e () для объекта окна. Этот метод вернет размеры окна, инкапсулируя их в объекте класса
D im en sio n . Получив текущий размер окна, вы можете соответствующим образом масштабировать графику.
Для демонстрации этого приема рассмотрим аплет, который, начиная с квадрата размером 200x200 пикселей, будет увеличивать его с каждым щелчком мыши на 25 пикселей до тех пор, пока тот не получит размер 500x500 пикселей. В этой точке следующий щелчок вернет его к размеру 200x200 пикселей, после чего процесс начнется сначала.
Внутри окна прямоугольник рисуется вдоль внутренних границ окна внутри прямоугольника рисуется символ X, чтобы заполнить его. Этот аплет работает в приложении a p p l e t v ie w e r , но может не работать в окне браузера.
// Изменение размеров для заполнения текущего размера окна
import java.applet.*;
import j a v a .a w t .*;
import j a v a .a w t .event.*;
/*
*/
public class ResizeMe extends Applet {
final int inc = 25;
int max = 500;
int min = 200;
Dimension d;
Глава 24. Введение в библиотеку AW T: работа с окнами, графикой и текстом
7 6 5
public ResizeMe() {
addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
int w = (d.width + inc) > max?min : (d.width + inc);
int h = (d.height + inc) > max?min : (d.height + inc);
setSize(new Dimension(w, h ) );
public void paint(Graphics g) {
d = getSize();
g .drawLine(0, 0, d.width-1, d.height-1);
g .drawLine(0, d.height-1, d.width-1, 0);
g .drawRect(0, 0, d.width-1, Работа с цветом
Язык Java поддерживает цвета в переносимой, независимой от устройства манере. Система цветов библиотеки AWT позволяет задать любой цвет по вашему желанию. Затем она находит наилучшее соответствие этому цвету, учитывая ограничения оборудования дисплея, на котором выполняется ваш аплет или программа. Таким образом, код не должен заботиться о различиях в поддержке цвета различными аппаратными устройствами. Цвет инкапсулирован в классе Как вы уже видели в главе 22, класс
Color определяет несколько констант (вроде
Color .
black) для описания множества наиболее часто используемых цветов. Вы можете также создавать свои собственные цвета, используя один из доступных конструкторов цвета. Ниже приведены три наиболее часто используемые формы таких конструкторов
r e d ,
int
g r e e n ,
int
blu e)
C o l o r (int
значениеЯвВ)
Color(float
r e d ,
float
gr e e n ,
float
blu Первый конструктор принимает три аргумента, задающие цвет как смесь красной, зеленой и синей составляющих. Эти значения должны находиться в пределах от 0 до 255, как в следующем примере Color(255, 100, 100); // светло-красный
Второй конструктор цвета принимает единственный целочисленный аргумент,
содержащий смесь интенсивностей красного
, зеленого и синего, упакованную водно целое число. Это целое число организовано так, что красная составляющая упакована вбиты с 16 по 23, зеленая — спои синяя — с 0 по 7. Вот пример применения этого конструктора newRed = (0xff000000 I
(OxcO << 16) I
(0x00 << 8) I
0x00);
Color darkRed = new И последний конструктор,
Color (float,
float,
float
), принимает три значения с плавающей точкой (в диапазоне от 0,0 до 1,0), указывающие относительные значения смеси красного, зеленого и синего.
Создав подобным образом цвет, вы можете использовать его для установки цвета переднего плана и или фона с помощью методов setForeground
() и set
Background ()
, описанных в главе 22. Также вы можете выбрать его в качестве текущего цвета рисования
7 6 6 Часть II. Библиотека Методы класса c o l o Класс
Color определяет несколько методов, помогающих манипулировать цветами. Рассмотрим некоторые из них.
Использование цвета, насыщенности и яркости
Цветовая модель “
цвет-насыщенность-яркость
(hue-saturation-brightness — HSB) представляет собой альтернативу модели “красный-зеленый-синий” (red-green- blue — RGB) для указания определенного цвета. Образно говоря, цвет в модели
HSB представляет собой цветовой круг. Он может быть задан числом в диапазоне от 0,0 до 1,0, приближенно образуя радугу. (Ее основными цветами будут красный, оранжевый, желтый зеленый, синий, индиго и фиолетовый) Насыщенность вторая шкала в диапазоне от 0,0 до 1,0 — представляет примеси для интенсивности цвета. Значения яркости также лежат в диапазоне от 0,0 до 1,0, где 1 — ярко-белый, а 0 — черный. Класс
Color поддерживает два метода, позволяющие выполнять преобразования между моделями RGB и HSB; методы показаны ниже int H S B t o R G B (float
hue,
float
saturation,
float
brightness)
static f l o a t [ ] R G B t o H S B (int
red,
int
green,
int
blue,
float значения Метод
HSBtoRGB
() возвращает упакованное значение RGB, совместимое с конструктором
Color
(
int
). Метод
RGBtoHSB
() возвращает массив чисел с плавающей точкой, представляющих значения HSB, соответствующие составляющим
RGB. Если массив значения не пуст, то он представляет заданные значения HSB и возвращается. В противном случае создается новый массив, и значения HSB возвращаются в нем. В любом случае массив содержит цвет в элементе с индексом 0, насыщенность — в элементе 1 и яркость — в элементе Методы
getRed
()
,
g etGreen
()
,
getBlue Вы можете получить красную, зеленую и синюю составляющие цвета независимо, используя для этого методы getRed ()
, getGreen (
) и getBlue (
), показанные ниже g e t R e d ()
int g e t G r e e n ()
int g e t B l u e (Каждый из этих методов возвращает компонент цвета RGB, извлеченный из вызывающего объекта класса
Color в нижних 8 бит целого числа.
Метод
getRgb Чтобы получить упакованное представление цвета RGB, предусмотрен метод getRed ()
, показанный ниже g e t R G B (Возвращаемое значение организовано, как было описано выше.
Установка текущего цвета графики
По умолчанию графические объекты рисуются текущим цветом переднего плана. Вы можете изменить этот цвет вызовом метода setColor
() класса
Graphics.
void setColor(Color
новыйЦвет)
Здесь
новыйЦвет
определяет новый цвет рисования. Вы можете получить текущий установленный цвет, вызвав метод getColor ()
, показанный ниже g e t C o l o r ()
Глава 24. Введение в библиотеку
AWT: работа с окнами, графикой и текстом
7 6 7
Аплет, демонстрирующий цвета
Следующий аплет создает несколько цветов и рисует различные объекты, используя эти цвета Демонстрация цветов
import j a v a .a w t .*;
import java.applet.*;
/*
*/
public class ColorDemo extends Applet {
// рисование линий void paint(Graphics g)
{
Color cl =
new
Color(255, 100, 100);
Color c2 =
new
Color(100, 255, 100);
Color c3 =
new
Color(100, 100, 255);
g .
setColor(cl);
g .drawLine(0, 0, 100, 100);
g .drawLine(0, 100, 100, 0);
g .
setColor(c2);
g .drawLine(40, 25, 2 50, 180);
g.drawLine(75, 90, 400, 400);
g .
setColor(c3);
g.drawLine(20, 150, 400, 40);
g .drawLine(5, 2 90, 80, 19);
g. setColor(Color.red) ;
g .drawOval(10, 10, 50, 50);
g .fillOval(70, 90, 140, 100);
g .setColor(Color.blue);
g .drawOval(190, 10, 90, 30);
g .drawRect(10, 10, 60, 50);
g .setColor(Color.cyan);
g.fillRect(100, 10, 60, 50);
g .drawRoundRect(190, 10, 60, 50, 15,
Установка режима рисования
Режим рисования (paint m ode) определяет, как рисуются объекты в окне. По умолчанию новый вывод в окно перекрывает любое существующее содержимое. Однако можно получить новые объекты, объединенные оператором XOR с предыдущим содержимым окна, используя метод setXORM ode
( ), как показано ниже setXORMode(Color
цветХОЯ)
Здесь
цветХОЯ
определяет цвет, который будет соединен оператором XOR с содержимым окна вовремя рисования. Преимущество режима XOR в том, что новый объект всегда будет гарантированно видимым, независимо оттого, какого цвета был объект, нарисованный ранее
7 6 Часть II. Библиотека Чтобы вернуться к методу рисования с перекрытием, вызовите метод s e - trPaintMode().
void Обычно метод перекрытия используется для нормального вывода, а режим
XOR — для специальных целей. Например, следующая программа отображает крестообразный прицел, отслеживающий курсор мыши. Крест отображается рисованием в режиме XOR в поле окна и потому всегда видим, независимо от цвета фона Демонстрация применения режима XOR.
import j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.applet.*;
/*
*/
public class XOR extends Applet {
int chsX=100, chsY=100;
public X O R () {
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent me) {
int x = m e .g e t X ();
int у = m e .g e t Y ();
chsX = x- 1 0 ;
chsY = y-10;
repaint();
}
}) ;
}
public void paint(Graphics g) {
g.drawLine(0, 0, 100, 100);
g .drawLine(0, 100, 100, 0);
g.setColor(Color.blue);
g.drawLine(40, 25, 250, 180);
g .drawLine(75, 90, 400, 400);
g .setColor(Color.green);
g .drawRect(10, 10, 60, 50);
g.fillRect(100, 10, 60, 50);
g .setColor(Color.red);
g .drawRoundRect(190, 10, 60, 50, 15, 15);
g.fillRoundRect(70, 90, 140, 100, 30, 40);
g .setColor(Color.cyan);
g .drawLine(20, 150, 400, 40);
g .drawLine(5, 290, 80, 19);
// xor крестообразный "прицел
g .setXORMode(Color.black);
g .drawLine(chsX- Ю ,
chsY, chsX+10, chsY);
g. drawLine (chsX, chsY- Ю , chsX, chsY+10);
g Пример вывода этого аплета показан на рис. 24.10.
Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом
7 6 Работа со шрифтами
Библиотека AWT поддерживает множество типов шрифтов. Ранее шрифты из области традиционной печати были важной частью создаваемых компьютерами документов и представлений. Гибкость библиотеки AWT обеспечивается за счет абстрагирования операций манипулирования шрифтами и возможности динамического выбора шрифтов pplet Рис. 24.10. Пример применения режима Шрифты имеют имя семейства, логическое имя шрифта и название гарнитуры. Имя семейства — обобщенное имя шрифта, такое как Courier. Логическое имя определяет категорию шрифтов вроде Monospaced. Гарнитура определяет конкретный шрифт, такой как Courier Шрифты инкапсулируются классом
F o n t. Несколько методов, определенных в классе
F o n t, перечислено в табл. Таблица 24.2. Методы, определенные в классе
F o n t
Метод
Описание
static Font
d e c o d e (String строка объектШ рифта g e t F a m i l y O
static Font
getFont(String свойство свойство
стандартныйШрифт)
Возвращает шрифт по заданному имени
Возвращает значение
true, если вызывающий объект содержит тот же шрифт, что и указанный в объектШрифта Возвращает имя семейства шрифтов, к которому относится вызывающий шрифт
Возвращает шрифт, ассоциированный с системным свойством, указанным в свойств о.
Если свойство свойство не существует, возвращается значение Возвращает шрифт, ассоциированный с системным свойством, указанным параметром свойств о.
Если свойство не существует, возвращается стандартныйШрифт
25 Зак 3030
7 7 0 Часть II. Библиотека Окончание табл. Шт од Описание g e t F o n t N a m Возвращает название гарнитуры вызывающего шрифта g e t N a m e (Возвращает логическое имя вызывающего шрифта Возвращает размер в точках вызывающего шрифта g e t S t y l e Возвращает значения стиля вызывающего шрифта h a s h C o d e (Возвращает хеш-код, ассоциированный с вызывающим объектом i s B o l d Возвращает значение
true, если шрифт включает значение стиля
BOLD. В противном случае возвращается значение
false
boolean Возвращает значение
true, если шрифт включает значение стиля
ITALIC. В противном случае возвращается значение
false
boolean i s P l a i n Возвращает значение
true, если шрифт включает значение стиля
PLAIN. В противном случае возвращается значение
false
String t o S t r i n g (Возвращает строковый эквивалент вызывающего шрифта
В классе
F o n t определены переменные, которые описаны в табл. Таблица 24.3. Переменные, определенные в классе
F o n t
Переменная
Значение
String Имя шрифта Размер шрифта в точках Размер шрифта в точках Стиль шрифта 'Определение доступных шрифтов
При работе со шрифтами зачастую нужно знать, какие шрифты присутствуют на конкретной машине. Для получения этой информации служит метод getAvail- ableFontFamilyNames ()
, определенный в классе
GraphicsEnvironment.
String[] Этот метод возвращает массив строк, содержащих имена доступных семейств шрифтов. Кроме того, в классе
GraphicsEnvironment определен метод get
All-
Fonts ()
, показанный ниже [ ] g e t A H F o n t s (Этот метод возвращает массив объектов класса
Font, описывающих все доступные шрифты.
Поскольку эти методы являются членами класса
GraphicsEnvironment, для их вызова вам понадобится ссылка на объект этого класса. Вы можете получить эту ссылку, используя статический метод getLocalGraphicsEnvironment ()
, который определен в классе
GraphicsEnvironment.
static GraphicsEnvironment Рассмотрим пример аплета, который показывает, как получить имена всех доступных семейств шрифтов
Глава 24. Введение в библиотеку AW T: работа с окнами, графикой и текстом
7 7 1
// Отображение шрифтов code="showfonts" width=550 height=60>
*/
import java.applet.*;
import j a v a .a w t .*;
public class ShowFonts extends Applet {
public void paint(Graphics g) {
String msg = "";
String FontList[];
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
FontList = g e .getAvailableFontFamilyNames();
for(int i = 0; i < FontList.length; i++)
msg += FontList[i] + "
g .drawString(msg,
4, Примерный вывод этого аплета показан на рис. 24.11. Однако список шрифтов у вас может отличаться от показанного на рисунке p p let
A badi М Т C o n d e n s e d A badi М Т C o n d e n s e d Extra Bold A b adi M T C o n d e n s e d Light A lg erian
A pplet Рис. 24.11. Пример получения списка доступных шрифтов
Создание и выбор шрифта
Чтобы выбрать новый шрифт, следует сначала создать объект класса
F o n t, описывающий шрифт. Один конструктор класса
F o n t имеет следующую общую форму
имяШрифта
,
int
стильШрифта,
int
размерВпунктах)
Здесь
имяШрифта
определяет имя желаемого шрифта. Имя может быть задано с использованием либо логического имени, либо названия гарнитуры. Все среды Java поддерживают следующие шрифты Dialog, Dialoglnput, Sans Serif и Monospaced. Шрифт используется в диалоговых окнах вашей системы. Шрифт является также шрифтом по умолчанию, когда никакой другой шрифт не установлен явно. Также вы
можете использовать любой другой шрифт
, который поддерживает ваша конкретная среда, однако будьте осторожны — эти шрифты могут быть не всегда доступны.
Стиль шрифта указан параметром
стильШрифта.
Он может состоять из одной или более констант
F o n t .
PLAIN,
F o n t .
BOLD и
F o n t .
ITALIC. Чтобы скомбинировать стили, объединяйте их с помощью оператора ИЛИ. Например,
F o n t .
BOLD и
F o n t .
ITALIC задают полужирный курсив.
С A p p le t V ie w e r: S h ow F o nts
|
» $
U '
i
7 7 Часть II. Библиотека Размер шрифта з точках указывается параметром размер В пунктах iЧтобы использовать только что созданный шрифт, следует выбрать его с помощью метода s e t F o n t ( )
, определенного в классе
C om ponent. Вот его общая форма setFont(Font
объектШрифта)
Здесь
объектШрифта —
это объект, содержащий желаемый шрифт.
Следующая программа выводит примеры каждого стандартного шрифта. Всякий раз, когда вы щелкаете кнопкой мыши внутри окна, выбирается новый шрифт и отображается его имя Отображение шрифтов
import java.applet.*;
import j a v a .a w t .*;
import j a v a .a w t .event.*;
/*
*/
public class SampleFonts extends Applet {
int next = 0;
Font f ;
String msg;
public void i n i t O {
f = new F o n t ("Dialog",
Font.PLAIN, 12);
msg = "Dialog";
setFont(f);
addMouseListener(new MyMouseAdapter(this));
}
public void paint(Graphics g) {
g .drawstring(msg,
4, 20);
}
}
class MyMouseAdapter extends MouseAdapter {
SampleFonts sampleFonts;
public MyMouseAdapter(SampleFonts sampleFonts) {
th i s .sampleFonts = sampleFonts;
}
public void mousePressed(MouseEvent me) {
// Переключать шрифты с каждым щелчком кнопкой мыши
sampleFonts.next++;
switch(sampleFonts.next) {
case 0:
sampleFonts.f = new F o n t ("Dialog",
Font.PLAIN, 12);
sampleFonts.msg = "Dialog";
break;
case 1:
sampleFonts.f = new F o n t ("Dialoglnput", Font.PLAIN, 12);
sampleFonts.msg = "Dialoglnput";
break;
case 2:
sampleFonts. f - new Font
( "SansSerif",
Font. PLAIN, 12/;
sampleFonts.msg = "SansSerif";
break;
case 3:
sampleFonts.f = new F o n t ("Serif", Font.PLAIN, 12);
sampleFonts.msg = "Serif";
break;
Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом
7 7 3
case 4:
sampleFonts.f = new F o n t ("Monospaced",
Font.PLAIN, 12);
sampleFonts.msg = "Monospaced";
break;
}
if(sampleFonts.next == 4) sampleFonts.next = -1;
sampleFonts.setFont(sampleFonts.f );
Пример вывода этого аплета показан на рис. 24.12.
1 A p p le t V ie w e r : S a m p le F o n ts |?
A p p let
S a n s S e rif
A pplet Рис. 24.12. Пример отображения шрифтов
Получение информации о шрифте
Предположим, что вы хотите получить информацию о текущем выбранном шрифте. Для этого следует сначала получить текущий шрифт вызовом метода g e t F o n t ( )
. Этот метод определен в классе
G r a p h i c s , как показано ниже Получив текущий выбранный шрифт, вы можете извлечь информацию о нем с использованием различных методов, определенных в классе
F o n t. Например, следующий аплет отображает имя, семейство, размер и стиль текущего выбранного шрифта Отображение информации о шрифте java.applet.*;
import j a v a .a w t .*;
/*
*/
public class Fontlnfo extends Applet {
public void paint(Graphics g) {
Font f = g.getFont();
String fontName = f.getName();
String fontFamily = f .getFamily();
int fontSize = f.getSizeO;
int fontStyle = f .getStyle();
String msg = "Family: " + fontName;
// String msg = "Семейство " + fontName;
msg += ", Font: " + fontFamily;
7 7 Часть II. Библиотека Java
// msg +
= ", Шрифт " + fontFamily;
msg += ", Size: " + fontSize + ", Style:
// msg += ", Размер " + fontSize + ", Style:
i f ((fontStyle & Font.BOLD) == Font.BOLD)
msg += "Bold
// msg += "Полужирный ";
i f ((fontStyle & Font.ITALIC) == Font.ITALIC)
msg += "Italic ";
// msg +
= "Курсив ";
i f ((fontStyle & Font.PLAIN) == Font.PLAIN)
msg += "Plain ";
// msg += "Обычный ";
g .drawstring(msg,
4, Управление выводом текста с использованием класса Как только что было сказано, язык Java поддерживает множество шрифтов. Для большинства из них символы не имеют одинакового размера — большинство шрифтов пропорциональны. Высота каждого символа, длина подстрочных элементов, таких как нижняя часть некоторых букв, например у а также промежуток между горизонтальными линиями варьируются от шрифта к шрифту. Более того, размер шрифта в точках также может изменяться. Все эти (и другие) атрибуты являются переменными и не представляют особого интереса для вас, как программиста, поскольку язык Java не требует ручного управления почти всем текстовым выводом.
Учитывая, что размер каждого шрифта может отличаться и что шрифты могут изменяться в процессе выполнения вашей программы, должен существовать какой- то способ определения размеров и прочих разнообразных атрибутов текущего выбранного шрифта. Например, чтобы вывести одну строку текста после другой, необходимо каким-то образом узнать высоту шрифта и количество пикселей между строками. Чтобы позволить это, библиотека AWT предусматривает класс
F o n t M e t r i c s , инкапсулирующий разнообразную информацию о шрифте. Начнем с определения общей терминологии, используемой при описании шрифтов (табл. Таблица 24.4. Общая терминология,
используемая при описании шрифтов
Высота (Размер строки текста сверху вниз
Базовая линия (Строка, по которой выровнены нижние грани символов (за исключением подстрочных элементов)
Возвышение (Расстояние от базовой линии до вершины символов
Спуск (Расстояние от базовой линии до нижней точки символов
Междустрочный интервал
Расстояние между нижней точкой строки текста и ее верхней точкой
Как вы, наверняка, заметили, метод d r a w s t r i n g
() использовался во многих предыдущих примерах. Он выводит строку текущего цвета текущим шрифтом, на
Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом
7 7 5
чиная с указанного местоположения. Однако это местоположение находится на левой грани базовой линии символов, а не в верхней левой точке, как это принято в других методах рисования. Часто допускается ошибка, заключающаяся в попытке рисовать строку по тем же координатам, где вы рисовали бы рамку. Например, если вам нужно нарисовать прямоугольник начиная с координаты (0,0), то вы увидите полный прямоугольник. Если же вы попытаетесь вывести строку "Typesetting" начиная с координаты (0,0), то увидите только подстрочные элементы букву Как вы убедитесь далее, используя метрики шрифта, можно определить правильное местоположение каждой строки, подлежащей отображению.
Класс
FontMetrics определяет несколько методов, которые помогают вам управлять текстовым выводом. Несколько наиболее часто используемых методов перечислено в табл. 24.5. Эти методы помогают правильно отобразить текст в окне. Рассмотрим некоторые из них на примерах.
Таблица 24.5. Выборка методов, определенных в классе
F o n t M e t r i c Описание
;
;
*
-;
:
;
7
;/; H t i
int bytesWidth (Возвращает ширину колБайтов символов, содержащихся, int начало в массиве Ь, начиная сна чало кол Байтов Возвращает ширину количСимволов символов, содержа [ ] ,
int начало int
щихся в массиве с, начиная с начало кол ичСимвол ов)
int charWidth(char Возвращает ширину с c h a r W i d t h (int Возвращает ширину с g e t A s c e n t Возвращает возвышение шрифта g e t D e s c e n t (Возвращает спуск шрифта g e t F o n t (Возвращает текущий шрифт g e t H e i g h t (Возвращает высоту строки текста. Это значение может быть использовано для вывода множества строк текста в окно g e t L e a d i n g Возвращает пробел между строками текста g e t M a x A d v a n c e (Возвращает ширину наиболее широкого символа. Если это значение недоступно, возвращается значение
-
1
int g e t M a x A s c e n t (Возвращает максимальное возвышение g e t M a x D e s c e n t (Возвращает максимальный спуск [ ] g e t W i d t h s (Возвращает ширину первых 256 символов s t r i n g W i d t h (Возвращает ширину строки, указанной в строка строка (Возвращает строковый эквивалент вызывающего объекта
Отображение множества строк текста
Возможно, чаще всего класс
FontMetrics используется для определения расстояния между строками текста. Кроме того, он определяет длину строки, которую нужно отобразить. Ниже вы увидите, как решаются эти задачи.
Для того чтобы отобразить многострочный текст, ваша программа должна отслеживать текущую позицию вывода. Всякий раз, когда встречается символ новой строки, координата Y должна быть перенесена в начало следующей строки. Когда
7 7 Часть II.
Библиотека отображается строка
, координата X должна быть установлена в точку, где эта строка заканчивается. Это позволит начать вывод следующей строки так, чтобы она начиналась сразу после окончания предыдущей.
Чтобы определить расстояние между строками, вы можете использовать значение, возвращенное методом getLeading
(). Чтобы определить общую высоту шрифта, добавьте значение, возвращенное методом get
Ascent ()
, к значению, возвращенному методом get
Descent
(). Затем вы можете использовать эти значения для позиционирования каждой строки текста, подлежащего выводу. Однако во многих случаях вам не понадобятся эти значения по отдельности. Зачастую вам нужно знать лишь общую высоту строки, представляющую сумму междустрочного интервала и значений подъема и спуска шрифта. Самый простой путь получения этого значения — вызвать метод getHeight
(). Просто увеличивайте координату Y на эту величину всякий раз, когда хотите перейти наследующую строку выводимого текста.
Чтобы начать вывод с конца предыдущего вывода в той же строке, следует знать длину в пикселях каждой строки, которую отображаете. Чтобы получить это значение, вызовите метод stringWidth()
. Вы можете использовать это значение для вычисления координаты X всякий раз, когда выводите строку.
В следующем аплете показано, как вывести многострочный текст в окно. Он также отображает несколько предложений на одной и той же строке. Обратите внимание на переменные curX и curY. Они отслеживают текущую позицию вывода текста Демонстрация многострочного вывода
import java.applet.*;
import j a v a .a w t .*;
/*
*/
public class MultiLine extends Applet {
int curX=0, curY=0; // текущая позиция
public void ini t () {
Font f = new F o n t ("SansSerif", Font.PLAIN, 12);
setFont(f );
}
public void paint(Graphics g) {
FontMetrics fm = g .getFontMetrics();
nextLine("This is on line one.", g ) ;
nextLine("This is on line two.", g ) ;
sameLine(" This is on same line.", g ) ;
sameLine(" This, too.", g ) ;
nextLine("This is on line three.", g ) ;
curX = curY = 0; // Сбросить координаты для каждой перерисовки Это в строке один, д ) ;
// Это в строке два, д ) ;
// sameLine(" Это в той же строке, д ) ;
// sameLine(" И это тоже, д ) ;
// Это в строке три, д ) ;
}
// Переход наследующую строку
void nextLine(String s, Graphics g) {
FontMetrics fm = g .getFontMetrics();
curY += fm.getHeight(); // переход наследующую строку
curX = 0;
g .drawString(s ,
curX, curY);
curX = fm.stringWidth(s ); // переход к концу строки
Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом
7 7 7
}
// Отображение в той же строке
void sameLine(String s, Graphics g) {
FontMetrics fm = g .getFontMetrics();
g.drawString(s,
curX, curY);
curX += fm.stringWidth(s); // переход к концу строки
}
}
Примерный вывод этого аплета показан на рис. 24.13.
Applet
This is on line one
This is on line two This is on sam e line This, too
This is on line three
Applet Рис. 24.13. Пример многострочного вывода
Центрирование текста
Рассмотрим пример, центрирующий текст в окне слева направо и сверху вниз. Он получает возвышение, спуски ширину строки и вычисляет позицию, в которой он должен быть отображен для центрирования Центрирование текста
import java.applet.*;
import java.awt.*;
/*
*/
public class CenterText extends Applet {
final Font f = new F o n t ("SansSerif", Font.BOLD, 18);
public void paint(Graphics g) {
Dimension d = t h i s .getSize();
g.setColor(Color.white);
g .fillRect(0, 0, d .wi d t h ,d .height);
g.setColor(Color.black);
g .setFont(f );
drawCenteredString("This is centered.", d.width, d.height, g ) ;
// Центрировано, d.width, d.height, g ) ;
g .drawRect(0, 0, d.width-1, d.height-1);
}
public void drawCenteredString(String s, int w, int h, Graphics g) {
FontMetrics fm = g .getFontMetrics();
int x = (w - fm.stringWidth(s))
/ 2;
int у = (fm.getAscent() + (h - (fm.getAscent() +
i Applet Viewer: MultiLine
7 7 Часть II. Библиотека Java
fm.getDescent()))/2);
g .drawString(s ,
x, y ) На рис. 24.14 показан пример вывода этого аплета.
Applet
This is centered.
Applet Рис. 24.14.
Пример центрирования текста
Выравнивание многострочного текста
При использовании текстового процессора обычно вы видите текст выровненным таким образом, что одна или обе его стороны образуют ровную вертикальную линию. Например, большинство текстовых процессоров может выравнивать текст полевому и или по правому краю. Большинство также может центрировать текст. В следующей программе вы увидите, как добиться этого эффекта.
В этой программе строки, подлежащие выравниванию, разбиваются на слова. Для каждого слова программа отслеживает его длину в текущем шрифте и автоматически переходит наследующую строку, когда слово не умещается в текущей. Каждая завершенная строка отображается в окне с текущим выбранным стилем выравнивания. Всякий раз, когда вы щелкаете кнопкой мыши в окне аплета, стиль выравнивания изменяется. Пример вывода этого аплета показан на рис. 24.15.
Of course, you must effectively
utilize these items if you are to
achieve professional results
Applet
Output to a Java window is
actually quite easy As you have
seen, the AWT provides support
for fonts, colors, text, and
graphics.
Applet started
lApplet started
Output to a Java window is
actually quite easy As you have
seen, the AWT provides support
Of course, you must effectively
utilize these items if you are to
achieve professional results.
for fonts, colors, text, Рис. 24.15. Пример выравнивания текста
Глава 24. Введение в библиотеку AWT: работа с окнами, графикой и текстом
7 7 9
// Демонстрация выравнивания текста java.applet.*;
import j a v a .a w t .*;
import j a v a .a w t .event.*;
import java.util.*;
/*
quite easy.
As you have seen, the AWT provides support for
fonts, colors, text, and graphics.
Of course,
you must effectively utilize these items
if you are to achieve professional results.">
*/
public class TextLayout extends Applet {
final int LEFT = 0;
final int RIGHT = 1;
final int CENTER = 2;
final int LEFTRIGHT =
3 ;
int align;
Dimension d;
Font f ;
FontMetrics fm;
int fontSize;
int fh, bl;
int space;
String text;
public void ini t () {
setBackground(Color.white);
text = getParameter("text");
try {
fontSize = Integer.parselnt(getParameter("fontSize"));}
catch (NumberFormatException e) {
fontSize=14;
}
align = LEFT;
addMouseListener(new MyMouseAdapter(this));
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
d = getSize();
g .setColor(getBackground());
g.fillRect(0,0,d.width, d.height);
if(f==null) f = new Font(getParameter("fontname"),
Font.PLAIN, fontSize);
g .setFont(f);
i f (fm == null) {
fm = g .getFontMetrics();
bl = fm.getAscent();
fh = bl + fm.getDescent();
7 8 0 Часть II. Библиотека Java
space = fm.stringWidth(" ");
}
g .setColor(Color.black);
StringTokenizer st = new StringTokenizer(text);
int x = 0;
int nextx;
int у = 0;
String word, sp;
int wordCount = 0;
String line =
while (s t .hasMoreTokens()) {
word = st.nextToken();
if(word.equals("
")) {
drawString(g,
line, wordCount,
fm.stringWidth(line),
y+bl);
line = "";
wordCount = 0;
x = у = у + (f
h * 2 )
;
}
else {
int w = fm.stringWidth(word);
i f (( nextx = (x+space+w))
> d.width )
{
drawString(g,
line, wordCount,
fm.stringWidth(line),
y+bl);
line =
wordCount = 0;
x = 0;
у = у + fh;
}
if(x1=0) {sp = " ";} else {sp = "";}
line = line + sp + word;
x = x + space + w;
wordCount++;
}
}
drawString(g,
line, wordCount, fm.stringWidth(line),
y+bl)
}
public void drawString(Graphics g, String line,
int wc, int lineW, int y) {
switch(align) {
case LEFT: g .drawString(line,
0, y ) ;
break;
case RIGHT: g .drawString(line,
d.width-lineW ,y);
break;
case CENTER: g .drawString(line,
(d.width-lineW)/ 2 ,
y ) ;
break;
case LEFTRIGHT:
if(lineW < (int) (d.width*.75)) {
g .drawString(line,
0, y ) ;
}
else {
int toFill = (d.width - lineW)/wc;
int nudge = d.width - lineW - (toFill*wc);
int s = fm.stringWidth(" ");
StringTokenizer st = new StringTokenizer(line)
int x = 0;
w h i l e (s t .hasMoreTokens()) {
String word = s t .nextToken();
Глава 24. Введение в библиотеку AW T: работа с окнами, графикой и текстом
7 81
g.drawstring(word, х, ух х + fm.stringWidth(word) + space + toFill +
toFill + 1;
nudge--;
} else {
x = x + fm.stringWidth(word) + space + toFill;
}
}
}
break;
}
}
}
class MyMouseAdapter extends MouseAdapter {
TextLayout tl;
public MyMouseAdapter(TextLayout tl) {
this.tl = tl;
}
public void mouseClicked(MouseEvent me) {
tl.align = (tl.align + 1 ) % 4;
t l Давайте разберемся, как работает этот аплет. Сначала в нем создается несколько констант, которые будут использоваться для определения стиля выравнивания, затем объявляется несколько переменных. Метод init
() получает текст, подлежащий отображению. Далее он инициализирует размер шрифта в блоке try- catch, который затем установит размер шрифта равным 14, если параметр font
Size опущен в дескрипторе HTML. Параметр text представляет собой длинную строку текста с дескриптором HTML Р в качестве разделителя абзаца.
Метод update
() — двигатель нашего примера. Он устанавливает шрифт и получает базовую линию и высоту из объекта метрик шрифта. Далее он создает объект класса
StringTokenizer и использует его для извлечения следующей лексемы (строки, отделенной пробелами) из строки, заданной в параметре text. Если следующей лексемой является дескриптор Р, осуществляется вертикальная прокрутка. В противном случае метод update
() проверяет, вписывается ли длина лексемы в текущем шрифте в ширину колонки. Если строка уже заполнена текстом или лексем для вывода более не осталось, строка выводится специальной версией метода drawstring
(). Первые три случая вызова метода drawstring
() просты. Каждый выравнивает строку, переданную переменной line, полевому или правому краю или же по центру колонки, в зависимости от текущего стиля выравнивания. В случае стиля
LEFTRIGHT выравниваются обе стороны строки. Это значит, что необходимо вычислить оставшееся пространство (как разницу между шириной строки и шириной колонки) и распределить его между словами. Последний метод класса переключает стиль выравнивания при каждом щелчке кнопкой мыши в окне аплета.
<«
1
...
65
66
67
68
69
70
71
72
...
90
написать администратору сайта