Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать содержимого JEditorPane, ошибка при попытке печати 
V
    Опции темы
Ashen
  Дата 12.9.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 1.9.2006

Репутация: нет
Всего: нет



Всем доброго времени суток. Возникла такая проблема - необходимо распечатать содержимое JEditorPane с сохранением форматирования и графикой.

Сразу оговорюсь - в яве не особо силен (стаж ~1 месяца)

Поэтому нашел готовый класс, реализующий печать, и попытался его использовать (до этого перепробывал около 10 различных примеров печати - неудачно).

Вот этот класс:

Код

/*
 * Copied from this tutorial:
 *
 * http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-Printing...
 *
 * And also from a post on the forums at java.swing.com. My apologies that do not have
 * a link to that post, by my hat goes off to the poster because he/she figured out the
 * sticky problem of paging properly when printing a Swing component.
 */

import java.awt.*;
import javax.swing.*;
import java.awt.print.*;

public class PrintContent implements Printable {
  private Component componentToBePrinted;

  public static void printComponent(Component c) {
    new PrintContent(c).print();
  }

  public PrintContent(Component componentToBePrinted) {
    this.componentToBePrinted = componentToBePrinted;
  }

  public void print() {
    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.setPrintable(this);
    if (printJob.printDialog())
      try {
        System.out.println("Calling PrintJob.print()");
        printJob.print();                                                   [color=firebrick]// ПАДАЕТ ЗДЕСЬ[/color]
        System.out.println("End PrintJob.print()");
      }
      catch (PrinterException pe) {
        System.out.println("Error printing: " + pe);
      }
  }

  public int print(Graphics g, PageFormat pf, int pageIndex) {
    int response = NO_SUCH_PAGE;

    Graphics2D g2 = (Graphics2D) g;

    //  for faster printing, turn off double buffering
    disableDoubleBuffering(componentToBePrinted);

    Dimension d = componentToBePrinted.getSize(); //get size of document
    double panelWidth = d.width; //width in pixels
    double panelHeight = d.height; //height in pixels

    double pageHeight = pf.getImageableHeight(); //height of printer page
    double pageWidth = pf.getImageableWidth(); //width of printer page

    double scale = pageWidth / panelWidth;
    int totalNumPages = (int) Math.ceil(scale * panelHeight / pageHeight);

    //  make sure not print empty pages
    if (pageIndex >= totalNumPages) {
      response = NO_SUCH_PAGE;
    }
    else {

      //  shift Graphic to line up with beginning of print-imageable region
      g2.translate(pf.getImageableX(), pf.getImageableY());

      //  shift Graphic to line up with beginning of next page to print
      g2.translate(0f, -pageIndex * pageHeight);

      //  scale the page so the width fits...
      g2.scale(scale, scale);

      componentToBePrinted.paint(g2); //repaint the page for printing

      enableDoubleBuffering(componentToBePrinted);
      response = Printable.PAGE_EXISTS;
    }
    return response;
  }

  public static void disableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(false);
  }

  public static void enableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(true);
  }
}



Использую его так:

Код

PrintContent.printComponent(pdw.dialogArea2); // pdw - JFrame; dialogArea2 - JEditorPane


При попытке печати выдает стандартный дислог печати, после выбора принтера и закрытия окна подвисает и падает с ошибкой:

Код

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at sun.print.Win32PrintService.getMediaTrays(Win32PrintService.java:416)
    at sun.print.Win32PrintService.getSupportedAttributeValues(Win32PrintService.java:1102)
    at sun.print.RasterPrinterJob.updatePageAttributes(RasterPrinterJob.java:496)
    at sun.print.RasterPrinterJob.setPrintable(RasterPrinterJob.java:948)
    at sun.print.RasterPrinterJob.setAttributes(RasterPrinterJob.java:1152)
    at sun.awt.windows.WPrinterJob.setAttributes(WPrinterJob.java:534)
    at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1235)
    at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1196)
    at PrintContent.print(PrintContent.java:32)
    at PrintContent.printComponent(PrintContent.java:19)
    at jbContactsCommandExitEvents.actionPerformed(PromtDetailsWindow.java:234)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:231)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1774)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)



Если важно - принтер сетевой. Просьба подсказать что я сделал неверно, либо кинуть ссылку на бесплатный класс с реализацией печати из JEditorPane.
--------------------
Хочешь помочь новичку - делай вместе с ним;Хочешь помочь старику - сделай за него;Хочешь помочь мастеру - отойди в сторону;Хочешь помочь дураку - сам дурак...
PM MAIL   Вверх
Ashen
Дата 12.9.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 1.9.2006

Репутация: нет
Всего: нет



Вопрос снимается - пример печати рабочий - проблема была в сетевом принтере (странно - в других прогах печатает без проблем). Поставил себе принтер - все заработало. Посему тему закрываю....
--------------------
Хочешь помочь новичку - делай вместе с ним;Хочешь помочь старику - сделай за него;Хочешь помочь мастеру - отойди в сторону;Хочешь помочь дураку - сам дурак...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.