logo
файлы

1.13Печать в Java

Поскольку принтер — устройство графическое, вывод на печать очень похож на вывод графических объектов на экран.

В графическом компоненте кроме графического контекста — объекта класса Graphics, создается еще "печатный контекст". Это тоже объект класса Graphics, но реализующий интерфейс printGraphics и полученный из другого источника — объекта класса PrintJob, входящего в пакет java.awt. Сам же этот объект создается с помощью класса Toolkit пакета java.awt. На практике это выглядит так:

PrintJob pj = getToolkit().get,PrintJob (this, "Job Title", null);

Graphics pg = pj.getGraphics();

Метод getPrintJob () сначала выводит на экран стандартное окно "Печать" (Print) операционной системы. Когда пользователь выберет в этом окне параметры печати и начнет печать кнопкой ОК, создается объект pj. Если пользователь отказывается от печати при помощи кнопки Отмена (Cancel), то метод возвращает null.

В классе Toolkit два метода getPrintJob ():

getPrintJob(Frame frame, String jobTitle, JobAttributes jobAttr,

PageAttributes pageAttr)

getPrintJob(Frame frame, String jobTitle, Properties prop)

Аргумент frame указывает на окно верхнего уровня, управляющее печатью. Этот аргумент не может быть null. Строка jobTitle задает заголовок задания, который не печатается, и может быть равна null. Аргумент prop зависит от реализации системы печати, часто это просто null, в данном случае задаются стандартные параметры печати.

Аргумент jobAttr задает параметры печати.

Аргумент pageAttr задает параметры страницы. Класс pageProperties содержит пять подклассов со статическими константами, которые и задают параметры страницы и используются в конструкторе класса. Если для печати достаточно стандартных параметров, то можно воспользоваться конструктором по умолчанию.

После того как "печатный контекст" — объект pg класса Graphics — определен, можно вызывать метод print(pg) или printAll(pg) класса Component. Этот метод устанавливает связь с принтером по умолчанию и вызывает метод paint (pg). На печать выводится все то, что задано этим методом.

Например, чтобы распечатать текстовый файл, надо в процессе ввода разбить его текст на строки и в методе paint (pg) вывести строки методом pg.drawstring() так же, как выводят на экран. При этом следует учесть, что в "печатном контексте" нет шрифта по умолчанию, всегда надо устанавливать шрифт методом pg.setFont ().

После выполнения всех методов print() применяется метод pg.dispose(), вызывающий прогон страницы, и метод pj.end(), заканчивающий печать.

Например:

import java.awt.*;

import java.awt.event.*;

class PrintTest extends Frame{

PrintTest(String s){

super(s);

setSize(400, 400);

setVisible(true);

}

public void simplePrint(){

PrintJob pj =getToolkit().getPrintJob(this, "JobTitle", null);

if (pj != null){

Graphics pg = pj.getGraphics();

if (pg != null){

print(pg);

pg.dispose();

}

else System.err.println("Graphics's null");

pj.end();

}

else System.err.println("Job's null");

}

public void paint(Graphics g){

g.setFont(new Font("Serif", Font.ITALIC, 30));

g.setColor(Color.black);

g.drawArc(0, 100, 200, 200, 0, 360);

g.drawString("Страница 1", 100, 100);

}

public static void main(String[] args){

PrintTest pt = new PrintTest(" Простой гфимер печати");

pt.simplePrint();

pt.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev){

System.exit(0);

}

});

}

}