ContainerPrintable: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 122: Zeile 122:
import javax.print.attribute.standard.*;
import javax.print.attribute.standard.*;
import javax.swing.*;
import javax.swing.*;
import utils.ContainerPrintable;
public class ContainerPrintableDemo extends JFrame {
public class ContainerPrintableDemo extends JFrame {
     private JButton btPrint;
     private JButton btPrint;
Zeile 134: Zeile 135:


             public void actionPerformed(ActionEvent evt) {
             public void actionPerformed(ActionEvent evt) {
                 doPrint(colorChooser, false, 10, 10, 10, 10);
                 doPrint(new ContainerPrintable(colorChooser), false, 10, 10, 10, 10);
             }
             }
         });
         });
Zeile 142: Zeile 143:
         setLocationRelativeTo(null);
         setLocationRelativeTo(null);
     }
     }
     public void doPrint(Container container, final boolean portrait,
     public void doPrint(Printable printable, final boolean portrait,
             final float left, final float right,
             final float left, final float right,
             final float top, final float bottom) {
             final float top, final float bottom) {
         PrinterJob pjob = PrinterJob.getPrinterJob();
         PrinterJob pjob = PrinterJob.getPrinterJob();
         pjob.setPrintable(new ContainerPrintable(container));
         pjob.setPrintable(printable);
         // create an attribute set to store attributes from the print dialog
         // create an attribute set to store attributes from the print dialog
         if (attr == null) {
         if (attr == null) {
Zeile 189: Zeile 190:
         SwingUtilities.invokeLater(gui);
         SwingUtilities.invokeLater(gui);
     }
     }
}
}</code=java>
</code=java>
[[Kategorie:Java]]
[[Kategorie:Java]]
[[Kategorie:Swing]]
[[Kategorie:Swing]]
[[Kategorie:Java-Codeschnipsel]]
[[Kategorie:Java-Codeschnipsel]]

Version vom 26. Oktober 2009, 10:43 Uhr

<code=java> /*

* ContainerPrintable.java
* We can pass the container to be printed in the constructor.
* The printing is done in segments of height 10.
* We can adapt the segment height using method setSegmentHeight(..)
*/

import java.awt.*; import java.awt.print.*; import java.awt.geom.*;

public class ContainerPrintable implements Printable {

   private Container container;//The container to print
   private int segmentHeight = 10;//The container's segment height
   private int totalWidth;//To save total width.
   private int last = -1;//The most recent page index asked to print
   private int segment = 0;//The next segment to print
   private final Rectangle clip = new Rectangle(0, 0, 0, 0);//To store an area to be printed
   private final Rectangle tempRect = new Rectangle(0, 0, 0, 0);
   public ContainerPrintable(final Container container) {
       this.container = container;
       container.setBackground(Color.WHITE);
       totalWidth = container.getWidth();
   }
   public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
           throws PrinterException {
       final int imgWidth = (int) pageFormat.getImageableWidth();
       final int imgHeight = (int) pageFormat.getImageableHeight();
       if (imgWidth <= 0) {
           throw new PrinterException("Width of printable area is too small.");
       }
       // the amount of vertical space available for printing the container
       int availableSpace = imgHeight;
       if (availableSpace <= 0) {
           throw new PrinterException("Height of printable area is too small.");
       }
       // we need a scale factor to fit the container's entire width on the page
       double scaleFactor = 1.0D;
       if (totalWidth > imgWidth) {
           scaleFactor = (double) imgWidth / (double) totalWidth;
       }
       while (last < pageIndex) {
           if (segment >= getSegmentCount()) {// if we are finished with all segments
               return NO_SUCH_PAGE;
           }
           int scaledHeight = (int) (availableSpace / scaleFactor);
           // calculate the area of the container to be printed for this page
           nextClip(scaledHeight);
           last++;
       }
       // translate into the coordinate system of the pageFormat
       Graphics2D g2d = (Graphics2D) graphics;
       g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
       // constrain the container output to the available space
       tempRect.x = 0;
       tempRect.y = 0;
       tempRect.width = imgWidth;
       tempRect.height = availableSpace;
       g2d.clip(tempRect);
       // if we have a scale factor, scale the graphics object to fit the entire width
       if (scaleFactor != 1.0D) {
           g2d.scale(scaleFactor, scaleFactor);
       // otherwise, ensure that the current portion of the container is centered horizontally
       } else {
           int diff = (imgWidth - clip.width) / 2;
           g2d.translate(diff, 0);
       }
       // store the old transform and clip for later restoration
       AffineTransform oldTrans = g2d.getTransform();
       Shape oldClip = g2d.getClip();
       // print the current section of the container
       g2d.translate(-clip.x, -clip.y);
       g2d.clip(clip);
       container.print(g2d);
       // restore the original transform and clip
       g2d.setTransform(oldTrans);
       g2d.setClip(oldClip);
       return PAGE_EXISTS;
   }
   private int getSegmentCount() {
       return container.getHeight() / segmentHeight;
   }
   public void setSegmentHeight(final int segmentHeight) {
       this.segmentHeight = segmentHeight;
   }
   public int getSegmentHeight() {
       return segmentHeight;
   }
   private void nextClip(final int pageHeight) {
       clip.x = 0;
       clip.y += clip.height;// adjust clip to the top of the next set of segments
       clip.height = 0;// adjust clip height to be zero
       // fit as many segments as possible, and at least one
       int segmentCount = getSegmentCount();
       do {
           clip.height += segmentHeight;
           if (++segment >= segmentCount) {
               break;
           }
       } while (clip.height + segmentHeight <= pageHeight);
       clip.width = totalWidth;
   }

} </code=java> <code=java> /*

* ContainerPrintableDemo.java
*
*/

import java.awt.*; import java.awt.event.*; import java.awt.print.*; import javax.print.attribute.*; import javax.print.attribute.standard.*; import javax.swing.*; import utils.ContainerPrintable; public class ContainerPrintableDemo extends JFrame {

   private JButton btPrint;
   private JColorChooser colorChooser;
   private PrintRequestAttributeSet attr;
   public ContainerPrintableDemo() {
       super("ContainerPrintableDemo");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       btPrint = new JButton("Print...");
       colorChooser = new JColorChooser();
       btPrint.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent evt) {
               doPrint(new ContainerPrintable(colorChooser), false, 10, 10, 10, 10);
           }
       });
       getContentPane().add(btPrint, BorderLayout.PAGE_START);
       getContentPane().add(colorChooser, BorderLayout.CENTER);
       pack();
       setLocationRelativeTo(null);
   }
   public void doPrint(Printable printable, final boolean portrait,
           final float left, final float right,
           final float top, final float bottom) {
       PrinterJob pjob = PrinterJob.getPrinterJob();
       pjob.setPrintable(printable);
       // create an attribute set to store attributes from the print dialog
       if (attr == null) {
           attr = new HashPrintRequestAttributeSet();
           float leftMargin = left;
           float rightMargin = right;
           float topMargin = top;
           float bottomMargin = bottom;
           if (portrait) {
               attr.add(OrientationRequested.PORTRAIT);
           } else {
               attr.add(OrientationRequested.LANDSCAPE);
               leftMargin = top;
               rightMargin = bottom;
               topMargin = right;
               bottomMargin = left;
           }
           attr.add(MediaSizeName.ISO_A4);
           MediaSize mediaSize = MediaSize.ISO.A4;
           float mediaWidth = mediaSize.getX(Size2DSyntax.MM);
           float mediaHeight = mediaSize.getY(Size2DSyntax.MM);
           attr.add(new MediaPrintableArea(
                   leftMargin, topMargin,
                   (mediaWidth - leftMargin - rightMargin),
                   (mediaHeight - topMargin - bottomMargin), Size2DSyntax.MM));
       }
       if (pjob.printDialog(attr)) {
           try {
               pjob.print(attr);
           } catch (PrinterException ex) {
               ex.printStackTrace();
           }
       }
   }
   public static void main(final String[] args) {
       Runnable gui = new Runnable() {
           public void run() {
               new ContainerPrintableDemo().setVisible(true);
           }
       };
       //GUI must start on EventDispatchThread:
       SwingUtilities.invokeLater(gui);
   }

}</code=java>