Delphi | Сети | ПК | Маршрутизаторы | Моделирование | Протоколы | Экспертные системы | Удаленный доступ | Доменные имена
Аплеты | SQL | Надежность | Задачи | Информационные процессы | JAVA | Отказы изделия | Расчет надежности показателей | Инфсис

Графические примитивы в Java

Интерфейс в языке Java представляет собой "чисто абстрактный класс", т.е. класс, все методы которого являются абстрактными. Производный от интерфейса класс "раскрывает" (implements) интерфейс, предоставляя коды для всех его методов. Класс может расширять только один базовый класс, но раскрывать он может несколько интерфейсов. Переменные интерфейса могут быть только static (т.е., переменные класса, а не объекта) и final (т.е., константы).

Как задать шрифт

Объекты класса Font хранят начертания (glyphs) символов, образующие шрифт. Их можно создать двумя Конструкторами:

Типографский пункт в России и некоторых европейских странах равен 0,376 мм, Точнее, 1/72 части французского дюйма. В англо-американской системе мер пункт равен 1/72 части английского дюйма, 0,351 мм. Этот-то пункт и применяется в компьютерной графике.

Имя шрифта name может быть строкой с физическим именем шрифта, например, "Courier New", ИЛИ одна ИЗ строк "Dialog", "Dialoglnput",' "Monospaced", "Serif", "SansSerif", "Symbol". Это так называемые логические имена шрифтов (logical font names). Если name == null, то задается шрифт по умолчанию.

Стиль шрифта style — это одна из констант класса Font:

Полужирный курсив (bolditalic) можно задать операцией побитового сложения, Font. BOLD | Font. ITALIC, как это сделано в листинге 8.3.

При выводе текста логическим именам шрифтов и стилям сопоставляются физические имена шрифтов (font face name) или имена семейств шрифтов (font name). Это имена реачьных шрифтов, имеющихся в графической подсистеме операционной системы.

Например, логическому имени "Serif" может быть сопоставлено имя семейства (family) шрифтов Times New Roman, а в сочетании со стилями — конкретные физические имена Times New Roman Bold, Times New Roman Italic. Эти шрифты должны находиться в составе шрифтов графической системы той машины, на которой выполняется приложение.

Список имен доступных шрифтов можно просмотреть следующими операторами:

Font[] fnt = Toolkit.getGraphicsEnvironment.getAHFonts(); 

for (int i = 0; i< fnt.length; i++)

   System.out.println(fnt[i].getFontName());

В состав SUN J2SDK входит семейство шрифтов Lucida. Установив SDK, вы можете быть уверены, что эти шрифты есть в вашей системе.

Таблицы сопоставления логических и физических имен шрифтов находятся в файлах с именами

и т. д. Эти файлы должны быть расположены в JDK в каталоге jdkl.3\jre\lib или каком-либо Другом подкаталоге lib корневого каталога JDK той машины, на которой выполняется приложение.

Нужный файл выбирается виртуальной машиной Java по окончании имени файла. Это окончание совпадает с международным кодом языка, установ-

ленного в локали или в системном свойстве user.language (см. рис. 6.2). Если у вас установлена русская локаль с международным кодом языка "ru", то для сопоставления будет выбран файл font.properties.ru. Если такой файл не найден, то применяется файл font.properties, не соответствующий никакой конкретной локали.

Поэтому можно оставить в системе только один файл font.properties, переписав в него содержимое нужного файла или создав файл заново. Для любой локали будет использоваться этот файл.

В листинге 9.1 показано сокращенное содержимое файла font.propeities.ru из JDK 1.3 для платформы MS Windows.

Листинг 9.1. Примерный файл font.properties.ru :

# %W% %E%

# Это просто комментарии

# AWT Font default Properties for Russian Windows

#

# Три сопоставления логическому имени "Dialog": 

dialog.0=Arial,RUSSIAN_CHARSET

dialog.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED 

dialog.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

# По три сопоставления стилям ITALIC, BOLD, ITALIC+BOLD: 

dialog.italic.0=Arial Italic,RUSSIAN_CHARSET 

dialog.italic.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED 

dialog.italic.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialog.bold.0=Arial Bold,RUSSIAN_CHARSET

dialog.bold.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED

dialog.bold.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialog.bolditalic.0=Arial Bold Italic,RUSSIAN_CHARSET 

dialog.bolditalic.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED 

dialog.bolditalic.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

# По три сопоставления имени "Dialoglnput" и стилям: 

dialoginput.0=Courier New,RUSSIAN_CHARSET 

dialoginput.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED 

dialoginput.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialoginput.italic.0=Courier New Italic,RUSSIAN_CHARSET

# И так далее

#

# По три сопоставления имени "Serif" и стилям: 

serif.0=Times New Roman,RUSSIAN_CHARSET 

serif.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED 

serif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

serif.italic.0=Times New Roman Italic,RUSSIAN_CHARSET

# И так далее

# Прочие логические имена

sansserif. CMArial,RUSSIAN_CHARSET

sansserif.l=WingDings,SVMBOL_CHARSET,NEED_CONVERTED

sansserif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

sansserif.italic. 0=Arial Italic,ROSSIAN_CHARSET

# И так далее

#

monospaced.0=Courier New,RUSSIAN_CHARSET 

monospaced.l=WingDings,SYMBOL_CHARSET,NEED_CONVERTED 

monospaced.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

monospaced.italic.0=Courier New Italic,RUSSIAN_CHARSET

# И так далее

# Default font definition

#

default.char=2751

# for backword compatibility

# Старые логические имена версии JDK 1.0 

timesroman.0=Times New Roman,RUSSIAN_CHARSET 

helvetica.0=Arial,RUSSIAN_CHARSET 

courier.0=Courier New,RUSSIAN_CHARSET 

zapfdingbats.0=WingDings,SYMBOL_CHARSET

# font filenames for reduced initialization time

# Файлы со шрифтами

filename.Arial=ARIAL.TTF

filename.Arial_Bold=ARIALBD.TTF

filename.Arial_Italic=ARIALI.TTF

filename.Arial_Bold_Italic=ARIALBI.TTF

filename.Courier_New=COUR.TTF

filename.Courier_New_Bold=COURBD.TTF

filename.Courier_New_Italic=COURI.TTF

filename.Courier_New_Bold_Italic=COURBI.TTF

filename.Times_New_Roman=TIMES.TTF

filename.Times_New_Roman_Bold=TlMESBD.TTF

filename.Times_New_Roman_Italic=TIMES3.TTF

filename.Times_New_Roman_Bold Italic=TIMESBI.TTF

filename.WingDings=WINGDING.TTF

filename.Symbol=SYMBOl.TTF

# name aliases

# Псевдонимы логических имен закомментированы

# alias.timesroman=serif

# alias.helvetica=sansserif

# alias.courier=monospaced

# Static FontCharset info

#

# Классы преобразования символов в байты

fontcharset.dialog.0=sun.io.CharToByteCP1251

fontcharset.dialog.l=sun.awt.windows.CharToByteWingDings

fontcharset.dialog.2=sun.awt.CharToByteSymbol

fontcharset.dialoginput.0=sun.io.CharToByteCP1251

fontcharset.dialoginput.l=sun.awt.windows.CharToByteWingDings

fontcharset.dialoginput.2=sun.awt.CharToByteSymbol

fontcharset.serif.0=sun.io.CharToByteCP1251

fontcharset.serif.l=sun.awt.windows.CharToByteWingDings

fontcharset.serif.2=sun.awt.CharToByteSymbol

fontcharset.sansserif.0=sun.io.CharToByteCP1251

fontcharset.sansserif.l=sun.awt.windows.CharToByteWingDings

fontcharset.sansserif.2=sun.awt.CharToByteSymbol

fontcharset.monospaced.0=sun.io.CharToByteCP1251

fontcharset.monospaced.l=sun.awt.windows.CharToByteWingDings

fontcharset.monospaced.2=sun.awt.CharToByteSymbol

# Exclusion Range info

#

# He просматривать в этом шрифте указанные диапазоны 

exclusion.dialog.0=0100-0400,0460-ffff 

exclusion.dialoginput.0=0100-0400, 0460-ffff 

exclusion.serif.0=0100-0400,04 60-ffff 

exclusion.sansserif.0=0100-0400, 0460-ffff 

exclusion.monospaced.0=0100-0400,0460-ffff 

# charset for text input 

#

# Вводимые байтовые символы кодируются в кириллический диапазон

# кодировки Unicode 

inputtextcharset=RUSSIAN_CHARSET

Большая часть этого файла занята сопоставлениями логических и физических имен. Вы видите, что под номером 0:

Там, где указан стиль: dialog.italic, dialog.bold и т.д., подставлен соответствующий физический шрифт.

В строках листинга 9.1, начинающихся со слова filename, указаны файлы с соответствующими физическими шрифтами, например:

filename.Arial=ARIAL.TTF

Эти строки необязательны, но они ускоряют поиск файлов со шрифтами. Теперь посмотрите на последние строки листинга 9.1. Строка

exclusion.dialog.0=0100-0400, 0460-ffff

означает, что в шрифте, сопоставленном логическому имени "Dialog" под номером 0, а именно, Arial, не станут отыскиваться начертания (glyphs) символов с кодами в диапазонах '\u0100' —'\u0400' и '\u0460' —'\uFFFF'. Они будут взяты из шрифта, сопоставленного этому имени под номером 1, а именно, WingDings.

То же самое будет происходить, если нужные начертания не найдены в шрифте, сопоставленному логическому имени под номером 0. Не все файлы со шрифтами Unicode содержат начертания (glyphs) всех символов.

Если нужные начертания не найдены и в сопоставлении 1 (в данном примере в шрифте WingDings), они будут отыскиваться в сопоставлении 2 (т. е. в шрифте Symbol) и т. д. Подобных сопоставлений можно написать сколько угодно.

Таким образом, каждому логическому имени шрифта можно сопоставить разные диапазоны различных реальных шрифтов, а также застраховаться от отсутствия начертаний некоторых символов в шрифтах Unicode.

Все сопоставления под номерами 0, 1, 2, 3, 4 следует повторить для всех стилей: bold, italic, bolditalic.

Если в графической системе используются шрифты Unicode, как, например, в MS Windows NT/2000, то больше ни о чем беспокоиться не надо.

Если же графическая система использует байтовые ASCII-шрифты как, например, MS Windows 95/98/ME, то следует позаботиться об их правильной перекодировке в Unicode и обратно.

Для этого на платформе MS Windows используются константы Win32 API RUSSIAN_CHARSET, SYMBOL_CHARSET, ANSI_CHARSET, OEM_CHARSET И др., показывающие , какую кодовую таблицу использовать при перекодировке, так же, как это отмечалось в главе 5 при создании строки из массива байтов.

Если логическим именам сопоставлены байтовые ASCII-шрифты (в примере это шрифты WingDings и Symbol), то необходимость перекодировки отмечается константой NEED_CONVERTED.

Перекодировкой занимаются методы специальных классов charToByteCP1251, TiarToByteWingDings, CharToByteSyrnbol. Они указываются для каждого сопоставления имен в строках, начинающихся со слова fontcharset. Эти строки обязательны для всех шрифтов, помеченных константой NEED_CONVERTED.

В последней строке файла указана кодовая страница для перекодировки в Unicode символов, вводимых в поля ввода:

inputtextcharset = RUSSIAN_CHARSET

Эта запись задает кодовую таблицу СР1251.

Итак, собираясь выводить строку str в графический контекст методом drawstring о, мы создаем текущий шрифт конструктором класса Font, указывая в нем логическое имя шрифта, например, "Serif". Исполняющая система Java отыскивает в файле font.properties, соответствующем локальному языку, сопоставленный этому логическому имени физический шрифт операционной системы, например, Times New Roman. Если это Unicode-шрифт, то из него извлекаются начертания символов строки str по их кодировке Unicode и отображаются в графический контекст. Если это байтовый ASCII-шрифт, то строка str предварительно перекодируется в массив байтов методами класса, указанного в одной из строк fontcharset, например, CharToByteCP1251.

Хорошие примеры файлов font.properties.ru собраны на странице Сергея Астахова, указанной во введении.

Обсуждение этих вопросов и примеры файлов font.properties для X Window System даны в документации SUN J2SDK в файле docs/guide/intl /fontprop.html.

Завершая обсуждение логических и физических имен шрифтов, следует сказать, что в JDK 1.0 использовались логические имена "Helvetica", "TimesRoman", "Courier", замененные В JDK 1.1 НЗ "SansSerif", "Serif", "Monospaced", соответственно, из лицензионных соображений. Старые имена остались в файлах font.properties для совместимости.

При выводе строки в окно приложения очень часто возникает необходимость расположить ее определенным образом относительно других элементов изображения: центрировать, вывести над или под другим графическим объектом. Для этого надо знать метрику строки: ее высоту и ширину. Для измерения размеров отдельных символов и строки в целом разработан класс FontMetrics.

В Java 2D класс FontMetrics заменен классом TextLayout. Его мы рассмотрим в конце этой главы, а сейчас выясним, какую пользу можно извлечь из методов класса FontMetrics.

Математический анализ, лекции по физике Компьютерные сети