Читайте также:
|
|
package ScribblePrinter1.java;import java.awt.*;import java.awt.event.*;import java.util.*; /** * Приложение для рисования, запоминающее фрагмент изображения и * выводящее его на печать. Используется интерфейс AWT API и Java 1.1. **/public class ScribblePrinter1 extends Panel { private short last_x = 0, last_y = 0; // координаты мыши private Vector lines = new Vector(256,256); // сохранить фрагмент private Properties printprefs = new Properties(); // сохранить настройки private Frame frame; public ScribblePrinter1(Frame frame) { // Запомнить кадр для объекта PrintJob this.frame = frame; // регистрация типов событий enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); // Размещаем кнопку print в контейнер и назначаем действие Button b = new Button("Print"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { printScribble(); } }); this.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5)); this.add(b); } /** Перерисовка (или печать) фрагмента с соответствующими /** координатами */ public void paint(Graphics g) { for(int i = 0; i < lines.size(); i++) { Line l = (Line)lines.elementAt(i); g.drawLine(l.x1, l.y1, l.x2, l.y2); } } /** Печать */ public void printScribble() { // Объект PrintJob Toolkit toolkit = this.getToolkit(); PrintJob job = toolkit.getPrintJob(frame, "ScribblePrinter1", printprefs); // Если нажата Cancel, то печать не выполняется if (job == null) return; // Объект Graphics для вывода графики на принтер Graphics g = job.getGraphics(); // Установка отступов для зоны печати // be scrunched up in the upper-left corner of the page. g.translate(100, 100); // Рамка вокруг зоны вывода. Dimension size = this.getSize(); g.drawRect(-1, -1, size.width+2, size.height+2); // Установка зон отсечки, чтобы рисунок не выходил за рамеки g.setClip(0, 0, size.width, size.height); // Печать компонентов // Метод paint() и вывод кнопок. // Метод print() вместо printAll() позволит показать кнопки. this.printAll(g); // Завершение. g.dispose(); // конец страницы job.end(); // конец печати } /** метод начала рисования мышью */ public void processMouseEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_PRESSED) { last_x = (short)e.getX(); // запомнить координаты last_y = (short)e.getY(); } else super.processMouseEvent(e); } /** метод перемещения мыши */ public void processMouseMotionEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_DRAGGED) { Graphics g = getGraphics(); g.drawLine(last_x, last_y, e.getX(), e.getY()); // нарисовать линию lines.addElement(new Line(last_x, last_y, // запомнить линию (short) e.getX(), (short)e.getY())); last_x = (short) e.getX(); last_y = (short) e.getY(); } else super.processMouseMotionEvent(e); } /** Метод main. Создание ScribblePrinter1 */ public static void main(String[] args) { Frame frame = new Frame("ScribblePrinter1"); ScribblePrinter1 s = new ScribblePrinter1(frame); frame.add(s, BorderLayout.CENTER); frame.setSize(400, 400); frame.show(); } /** * Внутренний класс для запоминания координат линии. **/ class Line { public short x1, y1, x2, y2; public Line(short x1, short y1, short x2, short y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; } }}
Пример 4.2. Возможности печати с использованием библиотеки Swing.
package ScribblePrinter2.java;import java.awt.*;import java.awt.event.*;import java.awt.print.*;import java.awt.geom.*;import javax.swing.*;import java.util.*; /** * Приложение, запоминающее рисунок и позволяющее пользователю * распечатать его. Используется интерфейс Swing API для печати * и Java2D для рисования. **/public class ScribblePrinter2 extends JComponent implements Printable { Stroke linestyle = new BasicStroke(3.0f); // Рисование жирными линиями GeneralPath scribble = new GeneralPath(); // место хранения рисунка public ScribblePrinter2() { // регистрация типов событий enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); // добавление кнопки print JButton b = new JButton("Print"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { printScribble(); } }); this.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); this.add(b); } /** перерисовываем (или печатаем) рисунок из памяти */ public void paintComponent(Graphics g) { super.paintComponent(g); // рисуем Graphics2D g2 = (Graphics2D) g; g2.setStroke(linestyle); // толщина линий g2.draw(scribble); // вывод рисунка } /** * печать рисунка. Метод вызывается нажатием Print; **/ public void printScribble() { // объект java.awt.print.PrinterJob (не java.awt.PrintJob) PrinterJob job = PrinterJob.getPrinterJob(); // командуем PrinterJob на печать (интерфейс Printable), // используя параметры по умолчанию job.setPrintable(this, job.defaultPage()); // Вывод диалога печати. // Метод возвращает false при отмене печати if (job.printDialog()) { // начало печати методом print() // из интерфейса Printable. try { job.print(); } catch (PrinterException e) { System.err.println(e); } } } /** * метод интерфейса Printable распечатывает * рисунок объекта Graphics с учетом размеров и полей * определенных PageFormat. Пока страница не равна 0, метод * будет вызываться постоянно. **/ public int print(Graphics g, PageFormat format, int pagenum) { // выбор одной страницы if (pagenum > 0) return Printable.NO_SUCH_PAGE; // Интерфейс печати Java 1.2 передает объект Graphics, // который легко переводится в объект Graphics2D Graphics2D g2 = (Graphics2D) g; // подгоним поля. g2.translate(format.getImageableX(), format.getImageableY()); // сравним рисунок и размер страницы Dimension size = this.getSize(); // размер рисунка double pageWidth = format.getImageableWidth(); // ширина страницы double pageHeight = format.getImageableHeight(); // высота // подгонка размера рисунка под страницу if (size.width > pageWidth) { double factor = pageWidth/size.width; // уменьшение масштаба g2.scale(factor, factor); // настройка системы координат pageWidth /= factor; // настройка размера бумаги pageHeight /= factor; } if (size.height > pageHeight) { // подбор высоты double factor = pageHeight/size.height; g2.scale(factor, factor); pageWidth /= factor; pageHeight /= factor; } // Центрируем рисунок g2.translate((pageWidth-size.width)/2,(pageHeight-size.height)/2); // рисуем линии по внешним сторонам рисунка g2.drawRect(-1, -1, size.width+2, size.height+2); // установка области отсечки g2.setClip(0, 0, size.width, size.height); // печатаем компонент методом paintComponent(). // Метод paint() рисует компонент this.paintComponent(g); // Методу PrinterJob сообщаем номер страницы return Printable.PAGE_EXISTS; } /** метод рисования линии */ public void processMouseEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_PRESSED) { scribble.moveTo(e.getX(), e.getY()); // новая линия } else super.processMouseEvent(e); } /** перемещение мыши */ public void processMouseMotionEvent(MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_DRAGGED) { scribble.lineTo(e.getX(), e.getY()); // добавление линии repaint(); // перерисовка фрагмента } else super.processMouseMotionEvent(e); } /** метод main создает ScribblePrinter2 объект и организует выход */ public static void main(String[] args) { JFrame frame = new JFrame("ScribblePrinter2"); ScribblePrinter2 s = new ScribblePrinter2(); frame.getContentPane().add(s, BorderLayout.CENTER); frame.setSize(400, 400); frame.setVisible(true); }}
Пример 4.3. Печать многостраничных документов с помощью класса HardcopyWriter, являющегося производным потоком java.io.Writer. Класс содержит два внутренних класса: PrintFile для чтения текстового файла и распечатки его в потоке HardcopyWriter; Demo для распечатки демонстрационной страницы с различными шрифтами и табуляцией.
package HardcopyWriter.java;import java.awt.*;import java.awt.event.*;import java.io.*;import java.text.*;import java.util.*; /** * Символьный выходной поток на принтер. **/public class HardcopyWriter extends Writer { // These are the instance variables for the class protected PrintJob job; // объект PrintJob protected Graphics page; // объект Graphics для страницы protected String jobname; // задание печати protected int fontsize; // размер шрифта protected String time; // текущее время protected Dimension pagesize; // размер страниц protected int pagedpi; // разрешение страницы protected Font font, headerfont; // основной шрифт protected FontMetrics metrics; // метрики шрифта protected FontMetrics headermetrics; // метрики заголовка protected int x0, y0; // левый верхний угол protected int width, height; // внутреннее поле protected int headery; // линия заголовка protected int charwidth; // ширина символа protected int lineheight; // высота строки protected int lineascent; // смещение линии шрифта protected int chars_per_line; // число знаков в строке protected int lines_per_page; // число знаков на странице protected int charnum = 0, linenum = 0; // позиция столбца и строки protected int pagenum = 0; // номер страницы // хранение текущего состояния между методами write() private boolean last_char_was_return = false; // переменная для хранения пользовательских настроек protected static Properties printprops = new Properties(); /** * Конструктор и его аргументы: * аргумент frame для печати в Java. * jobname сообщение вверху слева при печати. **/ public HardcopyWriter(Frame frame, String jobname, int fontsize, double leftmargin, double rightmargin, double topmargin, double bottommargin) throws HardcopyWriter.PrintCanceledException { // Объект PrintJob выполняет печать. // синхронизация с помощью объекта printprops // если нажата Cancel, то все отменить. Toolkit toolkit = frame.getToolkit(); // получить Toolkit из Frame synchronized(printprops) { job = toolkit.getPrintJob(frame, jobname, printprops); } if (job == null) throw new PrintCanceledException("отмена печати"); pagesize = job.getPageDimension(); // размер страницы pagedpi = job.getPageResolution(); // разрешение страницы // обработка ошибок: // В ОС windows методы getPageDimension() и getPageResolution не // работают, поэтому моделируем. if (System.getProperty("os.name").regionMatches(true,0,"windows",0,7)){ // используем разрешение экрана для эмуляции в PrintJob pagedpi = toolkit.getScreenResolution(); // размер бумаги 8.5" x 11". Для A4 изменить. pagesize = new Dimension((int)(8.5 * pagedpi), 11*pagedpi); // вычисляем размер шрифта в пунктах // (1 пункт = 1/72 дюйма) но для Windows в пикселах. fontsize = fontsize * pagedpi / 72; } // координаты верхнего левого угла страницы // или координаты (leftmargin, topmargin). вычисляем // ширину и высоту области между полями. x0 = (int)(leftmargin * pagedpi); y0 = (int)(topmargin * pagedpi); width = pagesize.width - (int)((leftmargin + rightmargin) * pagedpi); height = pagesize.height - (int)((topmargin + bottommargin) * pagedpi); // основной шрифт и его размер font = new Font("Monospaced", Font.PLAIN, fontsize); metrics = frame.getFontMetrics(font); lineheight = metrics.getHeight(); lineascent = metrics.getAscent(); charwidth = metrics.charWidth('0'); // шрифт моноширинный! // количество столбцов и строк между полями chars_per_line = width / charwidth; lines_per_page = height / lineheight; // шрифт заголовка // базовая линия заголовка: 1/8" над верхним полем headerfont = new Font("SansSerif", Font.ITALIC, fontsize); headermetrics = frame.getFontMetrics(headerfont); headery = y0 - (int)(0.125 * pagedpi) - headermetrics.getHeight() + headermetrics.getAscent(); // дата и время в заголовке страницы DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT); df.setTimeZone(TimeZone.getDefault()); time = df.format(new Date()); this.jobname = jobname; // имя this.fontsize = fontsize; // размер шрифта } /** * метод потока write(). **/ public void write(char[] buffer, int index, int len) { synchronized(this.lock) { // For thread safety // цикл по символам for(int i = index; i < index + len; i++) { // начало страницы. if (page == null) newpage(); // переход на следующую строку if (buffer[i] == '\n') { if (!last_char_was_return) newline(); continue; } if (buffer[i] == '\r') { newline(); last_char_was_return = true; continue; } else last_char_was_return = false; // все другие символы пропускаем. if (Character.isWhitespace(buffer[i]) &&!Character.isSpaceChar(buffer[i]) && (buffer[i]!= '\t')) continue; // начало новой строки. if (charnum >= chars_per_line) { newline(); // начало новой страницы if (page == null) newpage(); } // печать символов: // пробел; // табуляция; // печать символа // так как значения // FontMetrics не совпадают с принтером, // то позиционируем каждый символ отдельно if (Character.isSpaceChar(buffer[i])) charnum++; else if (buffer[i] == '\t') charnum += 8 - (charnum % 8); else { page.drawChars(buffer, i, 1, x0 + charnum * charwidth, y0 + (linenum*lineheight) + lineascent); charnum++; } } } } /** * метод flush() * выполняет печать объектом PrintJob * до конца страницы. **/ public void flush() { /* do nothing */ } /** * метод close() завершает печать PrintJob. */ public void close() { synchronized(this.lock) { if (page!= null) page.dispose(); // посылка на принтер job.end(); // конец задачи } } /** * установка начертания шрифта аргументами java.awt.Font class. **/ public void setFontStyle(int style) { synchronized (this.lock) { // установка нового шрифта Font current = font; try { font = new Font("Monospaced", style, fontsize); } catch (Exception e) { font = current; } // на новой странице новый шрифт if (page!= null) page.setFont(font); } } /** конец текущей страницы. */ public void pageBreak() { synchronized(this.lock) { newpage(); } } /** возвращение количества символов на одной строке */ public int getCharactersPerLine() { return this.chars_per_line; } /** количество строк на странице */ public int getLinesPerPage() { return this.lines_per_page; } /** начало новой строки */ protected void newline() { charnum = 0; // количество символов = 0 linenum++; // увеличить номер строки if (linenum >= lines_per_page) { // посылка на принтер страницы page.dispose(); // старт page = null; // не начинаем новую } } /** начало новой страницы и печать заголовка. */ protected void newpage() { page = job.getGraphics(); // новая страница linenum = 0; charnum = 0; // сброс номеров строки и символа pagenum++; // увеличение номера страницы page.setFont(headerfont); // шрифт заголовка. page.drawString(jobname, x0, headery); // печать имени задания String s = "- " + pagenum + " -"; // номер по центру. int w = headermetrics.stringWidth(s); page.drawString(s, x0 + (this.width - w)/2, headery); w = headermetrics.stringWidth(time); // дата по правому page.drawString(time, x0 + width - w, headery); // линия заголовка int y = headery + headermetrics.getDescent() + 1; page.drawLine(x0, y, x0+width, y); // основной шрифт до конца страницы. page.setFont(font); } /** * класс, генерируемый конструктором HardcopyWriter * при нажатии "Cancel". **/ public static class PrintCanceledException extends Exception { public PrintCanceledException(String msg) { super(msg); } } /** * печать файла с помощью HardcopyWriter **/ public static class PrintFile { public static void main(String[] args) { try { if (args.length!= 1) throw new IllegalArgumentException("неверное # число аргументов"); FileReader in = new FileReader(args[0]); HardcopyWriter out = null; Frame f = new Frame("PrintFile: " + args[0]); f.setSize(200, 50); f.show(); try { out = new HardcopyWriter(f, args[0], 10,.5,.5,.5,.5); } catch (HardcopyWriter.PrintCanceledException e) { System.exit(0); } f.setVisible(false); char[] buffer = new char[4096]; int numchars; while((numchars = in.read(buffer))!= -1) out.write(buffer, 0, numchars); in.close(); out.close(); } catch (Exception e) { System.err.println(e); System.err.println("формат: " + "java HardcopyWriter$PrintFile <имя файла>"); System.exit(1); } System.exit(0); } } /** * печать демонстрационной страницы HardcopyWriter **/ public static class Demo extends Frame implements ActionListener { /** метод main для создания тестового окна */ public static void main(String[] args) { Frame f = new Demo(); f.show(); } // кнопки программы protected Button print, quit; /** конструктор окна тестовой программы. */ public Demo() { super("HardcopyWriter Test"); // вызов конструктора Panel p = new Panel(); // добавка в окно панели this.add(p, "Center"); // центрирование p.setFont(new Font("SansSerif", // шрифт Font.BOLD, 18)); print = new Button("Print Test Page"); // создание кнопки quit = new Button("Quit"); // кнопка Quit print.addActionListener(this); // действия quit.addActionListener(this); // кнопок p.add(print); // размещение кнопок на панели p.add(quit); this.pack(); // размер окна } /** события нажатия кнопок */ public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if (o == quit) System.exit(0); else if (o == print) printDemoPage(); } /** печать демонстрационной страницы */ public void printDemoPage() { // объект HardcopyWriter и его параметры шрифта. HardcopyWriter hw; try { hw=new HardcopyWriter(this, "Demo Page",14,.75,.75,.75,.75);} catch (HardcopyWriter.PrintCanceledException e) { return; } // вывод в потоке PrintWriter PrintWriter out = new PrintWriter(hw); // уточнение размера страницы int rows = hw.getLinesPerPage(), cols = hw.getCharactersPerLine(); // верхние углы страницы out.print("+"); // левый for(int i=0;i<cols-2;i++) out.print(" "); // пропуск out.print("+"); // правый // заголовок hw.setFontStyle(Font.BOLD + Font.ITALIC); out.println("\n\t\tHardcopy Writer Demo Page\n\n"); // стили шрифтов hw.setFontStyle(Font.BOLD); out.println("Font Styles:"); int[] styles = { Font.PLAIN, Font.BOLD, Font.ITALIC, Font.ITALIC+Font.BOLD }; for(int i = 0; i < styles.length; i++) { hw.setFontStyle(styles[i]); out.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"); out.println("1234567890!@#$%^&*()[]{}<>,.?:;+-=/\\`'\"_~|"); } hw.setFontStyle(Font.PLAIN); out.println("\n"); // табуляция hw.setFontStyle(Font.BOLD); out.println("Tab Stops:"); hw.setFontStyle(Font.PLAIN); out.println(" 1 2 3 4 5"); out.println("012345678901234567890123456789012345678901234567890"); out.println("^\t^\t^\t^\t^\t^\t^"); out.println("\n"); // характеристики страницы hw.setFontStyle(Font.BOLD); out.println("Dimensions:"); hw.setFontStyle(Font.PLAIN); out.println("\tResolution: " + hw.pagedpi + " dots per inch"); out.println("\tPage width (pixels): " + hw.pagesize.width); out.println("\tPage height (pixels): " + hw.pagesize.height); out.println("\tWidth inside margins (pixels): " + hw.width); out.println("\tHeight inside margins (pixels): " + hw.height); out.println("\tCharacters per line: " + cols); out.println("\tLines per page: " + rows); // проходим до конца страницы for(int i = 0; i < rows-30; i++) out.println(); // нижние углы out.print("+"); // левый for(int i=0;i<cols-2;i++) out.print(" "); // пробелы out.print("+"); // правый // закрытие потока out.close(); } }}
Пример 4.4. Печать Swing-документов с помощью класса PrintableDocument.
package PrintableDocument.java;import java.awt.*;import java.awt.print.*;import java.awt.geom.*;import java.awt.font.*;import javax.swing.*;import javax.swing.text.*;import java.util.*; /** * Класс реализует интерфейсы Pageable и Printable и позволяет * распечатывать JTextComponent используя интерфейс java.awt.print**/public class PrintableDocument implements Pageable, Printable { View root; // корневой объект View для печати PageFormat format; // бумага и ориентация страницы double scalefactor; // масштабирование перед печатью int numPages; // количество страниц double printX, printY; // координаты левого верхнего угла double printWidth; // ширина области печати double printHeight; // высота области печати Rectangle drawRect; // область отображения // предотвращение висячих строк static final double MARGIN_ADJUST =.97; // шрифт печати номеров страниц static final Font headerFont = new Font("Serif", Font.PLAIN, 12); /** * конструктор печати компонента JTextComponent * объекта по умолчанию PageFormat * и коэффициент масштабирования 0.75. */ public PrintableDocument(JTextComponent textComponent) { this(textComponent, new PageFormat(),.75); } /** * конструктор печати JTextComponent **/ public PrintableDocument(JTextComponent textComponent, PageFormat format, double scalefactor) { // запомнить формат страницы this.format = format; this.scalefactor = scalefactor; this.printX = format.getImageableX()/scalefactor; this.printY = format.getImageableY()/scalefactor; this.printWidth = format.getImageableWidth()/scalefactor; this.printHeight = format.getImageableHeight()/scalefactor; double paperWidth = format.getWidth()/scalefactor; // получаем документ и его корневой объект Element Document document = textComponent.getDocument(); Element rootElement = document.getDefaultRootElement(); // получение текстовых компонентов EditorKit и ViewFactory EditorKit editorKit =textComponent.getUI().getEditorKit(textComponent); ViewFactory viewFactory = editorKit.getViewFactory(); // используем ViewFactory для создания корневого объекта View root = viewFactory.create(rootElement); // подбираем ширину setParent() root.setParent(new ParentView(root, viewFactory, textComponent)); // теперь высоту root.setSize((float)printWidth, (float)printHeight); // формирование прямоугольника double documentHeight = root.getPreferredSpan(View.Y_AXIS); // установка разрывов страницы drawRect = new Rectangle(0, 0, (int)printWidth, (int)documentHeight); // определение количества страниц // figure out where the page breaks are. if (documentHeight > printHeight) paginate(root, drawRect); // смещение страницы. numPages = pageLengths.size() + 1; } // начало печати double pageStart = 0; /** * метод организации печати **/ protected void paginate(View v, Rectangle2D allocation) { // распределение объектов по странице double myheight = v.getPreferredSpan(View.Y_AXIS); v.setSize((float)printWidth, (float)myheight); // цикл по дочерним элементам int numkids = v.getViewCount(); for(int i = 0; i < numkids; i++) { View kid = v.getView(i); // элемент // размер и положение Shape kidshape = v.getChildAllocation(i, allocation); if (kidshape == null) continue; Rectangle2D kidbox = kidshape.getBounds2D(); // координата Y double kidpos = kidbox.getY() + kidbox.getHeight() - pageStart; // проверка положения if ((numkids > 1) && (i == 0)) { // если не конец страницы if (kidpos < printY + printHeight*MARGIN_ADJUST) continue; // избавление от висячих строк breakPage(kidbox.getY()); continue; } // разрыв страницы if ((numkids > 1) && (i == numkids-1)) { // если нет if (kidpos < printY + printHeight) continue; // поместился ли элемент if (kidpos < printY + printHeight/MARGIN_ADJUST) { breakPage(allocation.getY() + allocation.getHeight()); continue; } } // делаем разрыв и продолжаем печать if (kidpos < printY+printHeight) continue; // элемент не поместился, подбираем поля if (kid.getViewCount() == 0) { breakPage(kidbox.getY()); continue; } // хранение длины страниц paginate(kid, kidbox); } } // смещение страницы ArrayList pageLengths = new ArrayList(); // разрыв страницы ArrayList pageOffsets = new ArrayList(); /** * разрыв по координате Y **/ void breakPage(double y) { double pageLength = y-pageStart-printY; pageStart = y-printY; pageLengths.add(new Double(pageLength)); pageOffsets.add(new Double(pageStart)); } /** количество страниц */ public int getNumberOfPages() { return numPages; } /** * возврат PageFormat для определения области отсечки * методом Pageable. **/ public PageFormat getPageFormat(int pagenum) { // возврат формата if (pagenum == numPages-1) return format; // возврат PageFormat. double pageLength = ((Double)pageLengths.get(pagenum)).doubleValue(); PageFormat f = (PageFormat) format.clone(); Paper p = f.getPaper(); if (f.getOrientation() == PageFormat.PORTRAIT) p.setImageableArea(printX*scalefactor, printY*scalefactor, printWidth*scalefactor, pageLength*scalefactor); else p.setImageableArea(printY*scalefactor, printX*scalefactor, pageLength*scalefactor, printWidth*scalefactor); f.setPaper(p); return f; } /** * метод Pageable возвращает Printable **/ public Printable getPrintable(int pagenum) { return this; } /** * метод Printable, производящий печать **/ public int print(Graphics g, PageFormat format, int pageIndex) { // Return an error code on attempts to print past the end of the doc if (pageIndex >= numPages) return NO_SUCH_PAGE; // приведение Graphics для операций Java2D Graphics2D g2 = (Graphics2D)g; // преобразования для подгонки полей g2.translate(format.getImageableX(), format.getImageableY()); // масштабирование страницы g2.scale(scalefactor, scalefactor); // номер страницы. // установка области отсечки if (pageIndex > 0) { Shape originalClip = g.getClip(); g.setClip(new Rectangle(0, (int)-printY, (int)printWidth, (int)printY)); // заголовок String numString = "- " + (pageIndex+1) + " -"; // размеры строки и шрифта FontRenderContext frc = g2.getFontRenderContext(); Rectangle2D numBounds = headerFont.getStringBounds(numString, frc); LineMetrics metrics = headerFont.getLineMetrics(numString, frc); g.setFont(headerFont); // шрифт g.setColor(Color.black); // печать g.drawString(numString, // строка (int)((printWidth-numBounds.getWidth())/2), (int)(-(printY-numBounds.getHeight())/2 + metrics.getAscent())); g.setClip(originalClip); // область отсечки } // длина страницы в документе double pageStart = 0.0, pageLength = printHeight; if (pageIndex > 0) pageStart = ((Double)pageOffsets.get(pageIndex-1)).doubleValue(); if (pageIndex < numPages-1) pageLength = ((Double)pageLengths.get(pageIndex)).doubleValue(); // выравнивание документа g2.translate(0.0, -pageStart); // печать всего документа root.paint(g, drawRect); // завершение выполнения return PAGE_EXISTS; } /** * класс реализации объекта View **/ static class ParentView extends View { ViewFactory viewFactory; // ViewFactory для иерархии Container container; // контейнер иерархии public ParentView(View v, ViewFactory viewFactory, Container container) { super(v.getElement()); this.viewFactory = viewFactory; this.container = container; } // фрагменты информации иерархии представлений public ViewFactory getViewFactory() { return viewFactory; } public Container getContainer() { return container; } // реализация объекта View public void paint(Graphics g, Shape allocation) {} public float getPreferredSpan(int axis) { return 0.0f; } public int viewToModel(float x,float y,Shape a,Position.Bias[] bias) { return 0; } public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException { return a; } }}
Дата добавления: 2015-09-11; просмотров: 73 | Поможем написать вашу работу | Нарушение авторских прав |