Иллюстрированный самоучитель по Java

Класс FontMetrics

Листинг 9.2. Использование графических примитивов и шрифтов.

import java.awt.*;
import j ava.awt.event.*;
class GraphTest extends Frame{
GraphTest(String s) {
super(s);
setBounds(0, 0, 500, 300);
setVisible(true);
}
public void paint(Graphics g){
Dimension d = getSize();
int dx = d.width / 20, dy – d.height / 20;
g.drawRect(dx, dy + 20,
d.width -2 * dx, d.height -2 * dy -20);
g.drawRoundRect(2 * dx, 2 * dy + 20,
d.width -4 * dx, d.height -4 * dy -20, dx, dy);
g.fillArctd.width / 2 -dx, d.height -2 * dy + 1,
2 * dx, dy -1, 0, 360);
g.drawArctd.width / 2-3 * dx, d.height -3 * dy / 2-5,
dx, dy / 2, 0, 360);
g.drawArctd.width / 2 + 2 * dx, d.height -3 * dy / 2-5,
dx, dy / 2, 0, 360);
Font fl = new Font("Serif", Font.BOLD(Font.ITALIC, 2 * dy);
Font f2 = new Font ("Serif", Font.BOLD, 5 * dy / 2);
FontMetrics fml = getFontMetrics(fl);
FontMetrics fm2 = getFontMetrics(f2);
String s1 = "Всякая последняя ошибка";
String s2 = "является предпоследней.";
String s3 = "Закон отладки";
int firstLine = d.height / 3;
int nextLine = fml.getHeight();
int secondLine = firstLine + nextLine / 2;
g.setFont(f2);
g.drawstring(s3, (d.width-fm2.stringWidth(s3)) / 2, firstLine);
g.drawLine(d.width / 4, secondLine -2,
3 * d.width / 4, secondLine -2);
g.drawLine(d.width / 4, secondLine -1,
3 * d.width / 4, secondLine -1);
g.drawLine(d.width / 4, secondLine,
3 * d.width / 4, secondLine);
g.setFont(fl);
g.drawstring(s1, (d.width – fml.stringWidth(si)) 12,
firstLine + 2 * nextLine);
g.drawString(s2, (d.width – fml.stringWidth(s2)) / 2,
firstLine + 3 * nextLine);
}
public static void main(String[] args){
GraphTest f = new GraphTest(" Пример рисования");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}

В листинге 9.2 использован простой класс Dimension, главная задача которого – хранить ширину и высоту прямоугольного объекта в своих полях width и height. Метод getsize () класса component возвращает размеры компонента в виде объекта класса Dimension. В листинге 9.2 размеры компонента f типа GrapMest установлены в конструкторе методом setBounds() равными 500x300 пикселов.

Еще одна особенность листинга 9.2 – для вычерчивания толстой линии, отделяющей заголовок от текста, пришлось провести три параллельные прямые на расстоянии один пиксел друг от друга.

Как вы увидели из обзора класса Graphics и сопутствующих ему классов, средства рисования и вывода текста в этом классе весьма ограничены. Линии можно проводить только сплошные и только толщиной в один пиксел, текст выводится только горизонтально и слева направо, не учитываются особенности устройства вывода, например, разрешение экрана.

Эти ограничения можно обойти разными хитростями: чертить несколько параллельных линий, прижатых друг к другу, как в листинге 9.2, или узкий заполненный прямоугольник, выводить текст по одной букве, получить разрешение экрана методом getScreenSize() класса Java.awt.Toolkit и использовать его в дальнейшем. Но все это затрудняет программирование, лишает его стройности и естественности, нарушает принцип KISS.

В Java 2 класс Graphics, в рамках системы Java 2D, значительно расширен классом Graphics2D.

Иллюстрированный самоучитель по Java › Графические примитивы › Класс FontMetrics
Рис. 9.2. Пример использования класса Graphics

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.