Атрибут | Значение |
TRAKING | Трекинг — пропорциональное изменение расстояний между буквами. Константа TRAKING TIGHT увеличивает расстояния, а константаtraking loose уменьшает их |
TRANSFORM | Преобразование шрифта. Объект класса AffineTransform |
UNDERLINE | Подчеркивание шрифта. Константы: UNDERLINE ON,UNDERLINE LOW DASHED, UNDERLINE LOW DOTTED, UNDERLINE LOW GRAY, UNDERLINE LOW ONE PIXEL, UNDERLINE LOW TWO PIXEL |
WEIGHT | Толщина шрифта. Константы: WEIGHT ULTRA LIGHT,WEIGHT EXTRA LIGHT, WEIGHT LIGHT, WEIGHT DEMILIGHT,WEIGHT REGULAR, WEIGHT SEMIBOLD, WEIGHT MEDIUM,WEIGHT DEMIBOLD, WEIGHT BOLD, WEIGHT HEAVY, WEIGHT EXTRABOLD, WEIGHT__ULTRABOLD |
WIDTH | Ширина шрифта. Константы: width condensed, width semi condensed, WIDTH REGULAR, WIDTH SEMI EXTENDED, WIDTH EXTENDED |
К сожалению, не все шрифты позволяют задать все атрибуты. Посмотреть список допустимых атрибутов для данного шрифта можно методом getAvailableAttributes ( ) класса Font. Например:Font f = new Font("Times New Roman", Font.BOLD, 12);AttributedCharacterIterator.Attribute[] a = f.getAvailableAttributes(); for (int i = 0; i < a.length; i++)System.out.println(a[i]); |
В классе Font есть конструктор Font (Map attributes), которым можно сразу задать нужные атрибуты создаваемому шрифту. Это требует предварительной записи атрибутов в специально созданный для этой цели объект класса, реализующего интерфейс Map: класса HashMap, WeakHashMap или Hashtable
HashMap hm = new HashMap();
hm.put(TextAttribute.SIZE, new Float(60.0f));
hm.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
Font f = new Font(hm);
Можно создать шрифт и вторым конструктором, которым мы пользовались в листинге 9.2, а потом добавлять и изменять атрибуты методами deriveFont ( ) класса Font.
Текст в Java 2D обладает собственным контекстом- объектом класса FontRenderContext,
хранящим всю информацию, необходимую для вывода текста. Получить его можно методом getFontRenderContext () класса Graphics2D.
Вся информация о тексте, в том числе и о его контексте, собирается в объекте класса TextLayout. Этот класс в Java 2D заменяет класс FontMetrics.
В конструкторе класса TextLa^out задается текст, шрифт и контекст. Начало метода paint () со всеми этими определениями может выглядеть так:
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
FontRenderContext frc = g.getFontRenderContext();
Font f = new Font("Serif", Font.BOLD, 15);
String s = "Какой-то текст";
TextLayout tl = new TextLayout(s, f, frc);
// Продолжение метода
}
draw(Graphics2D g, float x, float y);
getOutline(AffineTransform at);
import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import javax.swing.*;
class StillText extends JFrame{
StillText(String s){ super(s);
setSize(400, 200); setVisible(true);
setDefaultCloseOperation(JFrame.EXIT ON CLOSE);
}
public void paint(Graphics gr){
Graphics2D g = (Graphics2D)gr;
int w = getSize().width, h = getSize().height;
FontRenderContext frc = g.getFontRenderContext();
String s = "Тень";
Font f = new Font("Serif", Font.BOLD, h/3);
TextLayout tl = new TextLayout(s, f, frc);
AffineTransform at = new AffineTransform(); at.setToTranslation(w/2-tl.getBounds().getWidth()/2, h/2);
Shape sh = tl.getOutline(at); g.draw(sh);
AffineTransform atsh = new AffineTransform(1, 0.0, 1.5, -1, 0.0, 0.0); g.transform(at); g.transform(atsh);
Font df = f.deriveFont(atsh);
TextLayout dtl = new TextLayout(s, df, frc);