Shape sh2 = dtl.getOutline(atsh); g.fill(sh2);
}
public static void main(String[] args){ new StillText(" Эффект тени");
}
}
На рис. 9.6 показан вывод этой программы.
Рис. 9.6. Вывод текста средствами Java 2D |
Еще одна возможность создать текст с атрибутами — определить объект класса Attributedstring из пакета java.text. Конструктор этого класса
AttributedString(String text, Map attributes);
задает сразу и текст, и его атрибуты. Затем можно добавить или изменить характеристики текста одним их трех методов addAttibute ( ).
Если текст занимает несколько строк, то встает вопрос его форматирования. Для этого вместо класса TextLayout применяется класс LineBreakMeasurer, методы которого позволяют отформатировать абзац. Для каждого сегмента текста можно получить экземпляр класса TextLayout и вывести текст, используя его атрибуты.
Для редактирования текста необходимо отслеживать курсором (caret) текущую позицию в тексте. Это осуществляется методами класса TextHitinfo, а методы класса TextLayout позволяют получить позицию курсора, выделить блок текста и подсветить его.
Наконец, можно задать отдельные правила для вывода каждого символа текста. Для этого надо получить экземпляр класса GlyphVector методом createGlyphVector ( ) класса Font, изменить позицию символа методом setGlyphPosition (), задать преобразование символа, если это допустимо для данного шрифта, методом setGlyphTransform(), и вывести измененный текст методом drawGlyphVector() класса Graphics2D. Все это показано в листинге 9.7 и на рис. 9.7 — выводе программы листинга 9.7.
Листинг 9.7. Вывод отдельных символов
import java.awt.*; import java.awt.font.*;
import java.awt.geom.*; import javax.swing.*;
class GlyphTest extends JFrame{
GlyphTest(String s){ super(s);
setSize(400, 150); setVisible(true);
setDefaultCloseOperation(JFrame.EXIT ON CLOSE);
}
public void paint(Graphics gr){ int h = 5;
Graphics2D g = (Graphics2D)gr;
FontRenderContext frc = g.getFontRenderContext();
Font f = new Font("Serif", Font.BOLD, 30);
GlyphVector gv = f.createGlyphVector(frc, "Пляшущий текст"); int len = gv.getNumGlyphs(); for (int i = 0; i < len; i++){
Point2D.Double p = new Point2D.Double(25 * i, h = -h); gv.setGlyphPosition(i, p);
}
g.drawGlyphVector(gv, 10, 100);
}
public static void main(String[] args){
new GlyphTest(" Вывод отдельных символов");
}
}
Рис. 9.7. Вывод отдельных символов |
Методы улучшения визуализации
setRenderingHints(RenderingHints.Key key, Object value); setRenderingHints(Map hints);