Вывод текста средствами Java 2D
В классе Font есть конструктор Font(Map attributes), которым можно сразу задать нужные атрибуты создаваемому шрифту. Это требует предварительной записи атрибутов в специально созданный для этой цели объект класса, реализующего Интерфейс Map: Класса HashMap, WeakHashMap или Hashtable (см. главу 7). Например:
HashMap hm = new HashMap (); hm.put(TextAttribute.SIZE, new Float(60.Of)); hm.put(TextAttribute.POSTURE, TextAttribute.POSTUREJDBLIQUE); Font f = new Font(hm);
Можно создать шрифт и вторым конструктором, которым мы пользовались в листинге 9.2, а потом добавлять и изменять атрибуты методами deriveFont () Класса Font.
Текст в Java 2D обладает собственным контекстом – объектом класса FontRenderContext, хранящим всю информацию, необходимую для вывода текста. Получить его можно методом getFontRendercontext () класса Graphics2D.
Вся информация о тексте, в том числе и об его контексте, собирается в объекте класса TextLayout. Этот класс в Java 2D заменяет класс FontMetrics.
В конструкторе класса TextLayout задается текст, шрифт и контекст. Начало метода paint () со всеми этими определениями может выглядеть так:
public void paint(Graphics gr){ Graphics2D g = (Graphics2D)gr; FontRenderContext frc = g.getFontRenderContex-t(); Font f = new Font("Serif", Font.BOLD, 15); String s = "Какой-то текст"; TextLayout tl = new TextLayout(s, f, frc); // Продолжение метода }
В классе TextLayout есть не только более двадцати методов getxxxo, позволяющих узнать различные сведения о тексте, его шрифте и контексте, но и метод:
draw(Graphics2D g, float x, float у)
…вычерчивающий содержимое объекта класса TextLayout в графический области g, начиная с точки (х, у).
Еще один интересный метод:
getOutline(AffineTransform at)
…возвращает контур шрифта в виде объекта shape. Этот контур можно затем заполнить по какому-нибудь образцу или вывести только контур, как показано в листинге 9.6.
Листинг 9.6. Вывод текста средствами Java 20.
import java.awt.*; import j ava.awt.font.*; import j ava.awt.geom.*; import java.awt.event.* class StillText extends Frame{ StillText(String s) { super(s); setSize(400, 200); setvisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0); } }); } 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); Shape sh2 = dtl.getOutline(atsh); g.fill(sh2); } public static void main(Stnng[] args) { new StillText(" Эффект тени"); } }
На рис. 9.6 показан вывод этой программы.