ContainerPrintable: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
Zeile 16: Zeile 16:
 
import javax.print.attribute.*;
 
import javax.print.attribute.*;
 
import javax.print.attribute.standard.*;
 
import javax.print.attribute.standard.*;
 
+
 
public class ContainerPrintable implements Printable {
 
public class ContainerPrintable implements Printable {
 
+
 
     private Container container;//The container to print
 
     private Container container;//The container to print
 
     private int segmentHeight = 10;//The container's segment height
 
     private int segmentHeight = 10;//The container's segment height
Zeile 27: Zeile 27:
 
     private final Rectangle tempRect = new Rectangle(0, 0, 0, 0);
 
     private final Rectangle tempRect = new Rectangle(0, 0, 0, 0);
 
     static private PrintRequestAttributeSet attr;
 
     static private PrintRequestAttributeSet attr;
     private static boolean printDialog;
+
     private static boolean printDialog = true;
 
+
 
     public ContainerPrintable(final Container container) {
 
     public ContainerPrintable(final Container container) {
 
         this.container = container;
 
         this.container = container;
Zeile 34: Zeile 34:
 
         totalWidth = container.getWidth();
 
         totalWidth = container.getWidth();
 
     }
 
     }
 
+
 
     @Override
 
     @Override
 
     public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
 
     public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
Zeile 91: Zeile 91:
 
         return PAGE_EXISTS;
 
         return PAGE_EXISTS;
 
     }
 
     }
 
+
 
     private int getSegmentCount() {
 
     private int getSegmentCount() {
 
         int height = container.getHeight();
 
         int height = container.getHeight();
Zeile 100: Zeile 100:
 
         return count;
 
         return count;
 
     }
 
     }
 
+
 
     public void setSegmentHeight(final int segmentHeight) {
 
     public void setSegmentHeight(final int segmentHeight) {
 
         this.segmentHeight = segmentHeight;
 
         this.segmentHeight = segmentHeight;
 
     }
 
     }
 
+
 
     public int getSegmentHeight() {
 
     public int getSegmentHeight() {
 
         return segmentHeight;
 
         return segmentHeight;
 
     }
 
     }
 
+
 
     public static void setPrintDialog(boolean printDialog) {
 
     public static void setPrintDialog(boolean printDialog) {
 
         ContainerPrintable.printDialog = printDialog;
 
         ContainerPrintable.printDialog = printDialog;
 
     }
 
     }
 
+
 
     public static boolean isPrintDialog() {
 
     public static boolean isPrintDialog() {
 
         return printDialog;
 
         return printDialog;
 
     }
 
     }
 
+
 
     private void nextClip(final int pageHeight) {
 
     private void nextClip(final int pageHeight) {
 
         clip.x = 0;
 
         clip.x = 0;
Zeile 132: Zeile 132:
 
         clip.width = totalWidth;
 
         clip.width = totalWidth;
 
     }
 
     }
 
+
 
     static public void print(final Printable printable) {
 
     static public void print(final Printable printable) {
 
         print(printable, true);
 
         print(printable, true);
 
     }
 
     }
 
+
 
     static public void print(final Printable printable, final boolean portrait) {
 
     static public void print(final Printable printable, final boolean portrait) {
 
         print(printable, portrait, new Insets(10, 10, 10, 10));
 
         print(printable, portrait, new Insets(10, 10, 10, 10));
 
     }
 
     }
 
+
 
     static public void print(final Printable printable, final boolean portrait,
 
     static public void print(final Printable printable, final boolean portrait,
 
             final Insets insets) {
 
             final Insets insets) {
Zeile 182: Zeile 182:
 
         }
 
         }
 
     }
 
     }
}</code=java>
+
}
 +
</code=java>
 
<code=java>
 
<code=java>
 
/*
 
/*
Zeile 204: Zeile 205:
 
         btPrint.addActionListener(new ActionListener() {
 
         btPrint.addActionListener(new ActionListener() {
  
             public void actionPerformed(ActionEvent evt) {
+
            @Override
 +
             public void actionPerformed(final ActionEvent evt) {
 
                 ContainerPrintable.print(new ContainerPrintable(colorChooser));
 
                 ContainerPrintable.print(new ContainerPrintable(colorChooser));
 
             }
 
             }
Zeile 217: Zeile 219:
 
         Runnable gui = new Runnable() {
 
         Runnable gui = new Runnable() {
  
 +
            @Override
 
             public void run() {
 
             public void run() {
 
                 new ContainerPrintableDemo().setVisible(true);
 
                 new ContainerPrintableDemo().setVisible(true);
Zeile 224: Zeile 227:
 
         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 28. April 2011, 10:15 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(..)
* 
* We can do the actual printing by calling one of the ContainerPrintable.print(..) methods.
* If no print dialog is desired, we call ContainerPrintable.setPrintDialog(false)
* before calling one of the ContainerPrintable.print(..) methods.
*/

import java.awt.*; import java.awt.print.*; import java.awt.geom.*; import java.util.logging.*; import javax.print.attribute.*; import javax.print.attribute.standard.*;

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);
   static private PrintRequestAttributeSet attr;
   private static boolean printDialog = true;

   public ContainerPrintable(final Container container) {
       this.container = container;
       container.setBackground(Color.WHITE);
       totalWidth = container.getWidth();
   }

   @Override
   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() {
       int height = container.getHeight();
       int count = height / segmentHeight;
       if (count * segmentHeight < height) {
           count++;
       }
       return count;
   }

   public void setSegmentHeight(final int segmentHeight) {
       this.segmentHeight = segmentHeight;
   }

   public int getSegmentHeight() {
       return segmentHeight;
   }

   public static void setPrintDialog(boolean printDialog) {
       ContainerPrintable.printDialog = printDialog;
   }

   public static boolean isPrintDialog() {
       return printDialog;
   }

   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;
           segment++;
           if (segment >= segmentCount) {
               break;
           }
       } while (clip.height + segmentHeight <= pageHeight);
       clip.width = totalWidth;
   }

   static public void print(final Printable printable) {
       print(printable, true);
   }

   static public void print(final Printable printable, final boolean portrait) {
       print(printable, portrait, new Insets(10, 10, 10, 10));
   }

   static public void print(final Printable printable, final boolean portrait,
           final Insets insets) {
       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 = insets.left;
           float rightMargin = insets.right;
           float topMargin = insets.top;
           float bottomMargin = insets.bottom;
           if (portrait) {
               attr.add(OrientationRequested.PORTRAIT);
           } else {
               attr.add(OrientationRequested.LANDSCAPE);
               leftMargin = insets.top;
               rightMargin = insets.bottom;
               topMargin = insets.right;
               bottomMargin = insets.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));
       }
       boolean dialogOk = true;
       if (printDialog) {
           dialogOk = pjob.printDialog(attr);
       }
       if (dialogOk) {
           try {
               pjob.print(attr);
           } catch (PrinterException ex) {
               Logger.getLogger(ContainerPrintable.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
   }

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

* ContainerPrintableDemo.java
*
*/

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

public class ContainerPrintableDemo extends JFrame {

   private JButton btPrint;
   private JColorChooser colorChooser;
   public ContainerPrintableDemo() {
       super("ContainerPrintableDemo");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       btPrint = new JButton("Print...");
       colorChooser = new JColorChooser();
       btPrint.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(final ActionEvent evt) {
               ContainerPrintable.print(new ContainerPrintable(colorChooser));
           }
       });
       getContentPane().add(btPrint, BorderLayout.PAGE_START);
       getContentPane().add(colorChooser, BorderLayout.CENTER);
       pack();
       setLocationRelativeTo(null);
   }
   public static void main(final String[] args) {
       Runnable gui = new Runnable() {
           @Override
           public void run() {
               new ContainerPrintableDemo().setVisible(true);
           }
       };
       //GUI must start on EventDispatchThread:
       SwingUtilities.invokeLater(gui);
   }

}</code=java>