Всем доброго времени суток. Возникла такая проблема - необходимо распечатать содержимое 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.
--------------------
Хочешь помочь новичку - делай вместе с ним;Хочешь помочь старику - сделай за него;Хочешь помочь мастеру - отойди в сторону;Хочешь помочь дураку - сам дурак...
|