Печать средствами Java 2D
Расширенная графическая система Java 2D предлагает новые интерфейсы и классы для печати, собранные в пакет java.awt.print. Эти классы полностью перекрывают все стандартные возможности печати библиотеки AWT. Более того, они удобнее в работе и предлагают дополнительные возможности. Если этот пакет установлен в вашей вычислительной системе, то, безусловно, нужно применять его, а не стандартные средства печати AWT.
Как и стандартные средства AWT, методы классов Java 2D выводят на печать содержимое графического контекста, заполненного методами класса Graphics или класса Graphics2D.
Всякий класс Java 2D, собирающийся печатать хотя бы одну страницу текста, графики или изображения называется классом, рисующим страницы (page painter). Такой класс должен реализовать интерфейс Printable. В этом интерфейсе описаны две константы и только один метод print о. Класс, рисующий страницы, должен реализовать этот метод. Метод print о возвращает целое типа int и имеет три аргумента:
print(Graphics g, PageFormat pf, int ind);
Первый аргумент g – это графический контекст, выводимый на лист бумаги, второй аргумент pf – экземпляр класса PageFormat, определяющий размер и ориентацию страницы, третий аргумент ind – порядковый номер страницы, начинающийся с нуля.
Метод print () класса, рисующего страницы, заменяет собой метод paint (), использовавшийся стандартными средствами печати AWT. Класс, рисующий страницы, не обязан расширять класс Frame и переопределять метод paint (). Все заполнение графического контекста методами класса Graphics или Graphics2D теперь выполняется в методе print ().
Когда печать страницы будет закончена, метод print () должен возвратить целое значение, заданное константой PAGE_EXISTS. Будет сделано повторное обращение к методу print () для печати следующей страницы. Аргумент ind при этом возрастет на 1. Когда ind превысит количество страниц, метод print () должен возвратить значение NO_SUCH_PAGE, что служит сигналом окончания печати.
Следует помнить, что система печати может несколько раз обратиться к методу paint () для печати одной и той же страницы. При этом аргумент ind не меняется, а метод print () должен создать тот же графический контекст.
Класс PageFormat определяет параметры страницы. На странице вводится система координат с единицей длины 1/72 дюйма, начало которой и направление осей определяется одной из трех констант:
- PORTRAIT – начало координат расположено в левом верхнем углу страницы, ось Ох направлена вправо, ось Оу – вниз;
- LANDSCAPE – начало координат в левом нижнем углу, ось Ох идет вверх, ось Оу – вправо;
- REVERSE_LANDSCAPE – начало координат в правом верхнем углу, ось Ох идет вниз, ось Оу – влево.
Большинство принтеров не может печатать без полей, на всей странице, а осуществляет вывод только в некоторой области печати (imageable area), координаты левого верхнего угла которой возвращаются методами getimageabiex() и getlmageableY(), а ширина и высота – методами getlmageableWidth() и getlmageableHeight().
Эти значения надо учитывать при расположении элементов в графическом контексте, например, при размещении строк текста методом drawstring (), как это сделано в листинге 18.9.
В классе только один конструктор по умолчанию PageFormat (), задающий стандартные параметры страницы, определенные для принтера по умолчанию вычислительной системы.
Читатель, добравшийся до этого места книги, уже настолько поднаторел в Java, что у него возникает вопрос: "Как же тогда задать параметры страницы?" Ответ простой: "С помощью стандартного окна операционной системы".
Метод pageDialog(PageDialog pd) открывает на экране стандартное окно Параметры страницы (Page Setup) операционной системы, в котором уже заданы параметры, определенные в объекте pd. Если пользователь выбрал в этом окне кнопку Отмена, то возвращается ссылка на объект pd, если кнопку ОК, то создается и возвращается ссылка на новый объект. Объект pd в любом случае не меняется. Он обычно создается конструктором.