Import java. awt. basicStroke; import java. awt. borderLayout; import java. awt. color; import java. awt. component; import java. awt. dimension; import java. awt. font; import java. awt. fontMetrics; import java. awt. graphics; import java. awt. graphics2D; import java. awt. gridLayout; import java. awt. event. actionEvent; import java. awt. event. actionListener; import java. awt. event. mouseAdapter; import java. awt. event. mouseEvent; imp Ort java. awt. print. pageFormat; import java. awt. print. printable; import java. awt. print. printerException; import java. awt. print. printerJob; import javax. swing. JButton; import javax. swing. JDialog; import javax. swing. JFrame; import javax. swing. JPanel; import javax. swing. JScrollPane; import javax. swing. JTextArea; import javax. swing. swingUtilities; import javax. swing. windowConstants; import javax. swing. text. badLoca TionException; import javax. swing. text. Document;/*** uses the original paging method to render JTextArea and provides a print preview mechanism. ** In fact, we can also print JTextArea in other ways :*
*
- {@ Code Component. print (Graphics g);} or * {@ code Component. printAll (Graphics g );}
*
- {@ Code Component. paint (Graphics g);} or * {@ code Component. paintAll (Graphics g);} whose rending may be slightly * different to the previous method (for example,
JFrame
) *
- {@ Code JTable. print () ;}or {@ code JTextComponent. print ();} provide * especially powerful and convenient printing mechanic
*
** @ Author Gaowen */public class PrintUIComponent extends JPanel implements ActionListener, Printable {private static final long serialVersionUID = listener; private static JFrame frame; private JTextArea textAreaToPrint; private PrinterJob job; private int [] pageBreaks; // array of page break line positionsprivate String [] textLines; private Header header; public PrintUIComponent () {super (new BorderLayout (); textAreaToPrint = new JTextArea (50, 20); for (int I = 1; I <= 50; I ++) {textAreaToPrint. append ("Line" + I + "\ n");} JScrollPane scrollPane = new JScrollPane (textAreaToPrint); scrollPane. setPreferredSize (new Dimension (250,200); add (scrollPane, BorderLayout. CENTER); JButton printButton = new JButton ("Print This TextArea"); printButton. setName ("printButton"); printButton. addActionListene R (this); JButton printPreviewButton = new JButton ("Print Preview"); printPreviewButton. setName ("printPreviewButton"); printPreviewButton. addActionListener (this); JPanel buttonGroup = new JPanel (new GridLayout (2, 1); buttonGroup. add (printButton); buttonGroup. add (printPreviewButton); add (buttonGroup, BorderLayout. SOUTH);/* Initialize PrinterJob */initPrinterJob ();} public static void main (String [] args) {S WingUtilities. invokeLater (new Runnable () {@overridepublic void run () {createAndShowGUI () ;}}) ;} private static void createAndShowGUI () {frame = new JFrame ("Print UI Example"); frame. setContentPane (new PrintUIComponent (); frame. pack (); frame. setLocationRelativeTo (null); frame. setdefaclocloseoperation (WindowConstants. EXIT_ON_CLOSE); frame. setVisible (true);} private void initTextLines () {Document doc = text AreaToPrint. getDocument (); try {String text = doc. getText (0, doc. getLength (); textLines = text. split ("\ n");} catch (BadLocationException e) {e. printStackTrace () ;}} private void initPrinterJob () {job = PrinterJob. getPrinterJob (); job. setJobName ("Print TextArea"); // the task list is displayed in the system. job. setPrintable (this) ;}@ Overridepublic int print (Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterExcepti On {/** It is safe to use a copy of this graphics as this will not involve * changes to it. */Graphics2D g2 = (Graphics2D) graphics. create ();/* Calculate "pageBreaks" */Font font = new Font ("Serif", Font. PLAIN, 12); FontMetrics metrics = g2.getFontMetrics (font); int lineHeight = metrics. getHeight (); if (pageBreaks = null) {initTextLines (); int linesPerPage = (int) (pageFormat. getImageableHeight ()/ LineHeight); int numBreaks = (textLines. length-1)/linesPerPage; pageBreaks = new int [numBreaks]; for (int B = 0; B <numBreaks; B ++) {pageBreaks [B] = (B + 1) * linesPerPage;}/* Condition to exit printing */if (pageIndex> pageBreaks. length) {return NO_SUCH_PAGE;}/* (0, 0) is outside the imageable area, translate to avoid clipping */g2.translate (pageFormat. getImageableX (), pageFormat. getImageableY ();/* Draw each line that is on this page */int y = 0; int start = (pageIndex = 0 )? 0: pageBreaks [pageIndex-1]; int end = (pageIndex = pageBreaks. length )? TextLines. length: pageBreaks [pageIndex]; for (int line = start; line <end; line ++) {y + = lineHeight; g2.drawString (textLines [line], 0, y);}/* dispose of the graphics copy */g2.dispose ();/* Tell the caller that this page is part of the printed document */return PAGE_EXISTS ;} @ Overridepublic void actionreceivmed (ActionEvent e) {Object actionEventSource = e. getSource (); if (actionEventSource instanceof JButton) {JButton button = (JButton) actionEventSource; if (button. getName (). equals ("printButton") {pageBreaks = null; // reset paginationboolean OK = job. printDialog (); if (OK) {try {job. print ();} catch (PrinterException ex) {/* The job did not successfully complete */ex. printStackTrace () ;}} else if (button. getName (). equals ("printPreviewButton") {pageBreaks = null; // reset paginationcreateAndShowPreviewDialog () ;}} private void createAndShowPreviewDialog () {JDialog previewDialog = new JDialog (frame, "Print Preview Dialog", true); JPanel contentPane = new JPanel (new BorderLayout (); PreviewArea previewArea = new PreviewArea (); previewArea. addMouseListener (new PreviewAreaMouseAdapter (previewArea); JScrollPane scrollPane = new JScrollPane (previewArea); contentPane. add (scrollPane, BorderLayout. CENTER); header = new Header (previewArea); contentPane. add (header, BorderLayout. NORTH); previewDialog. setContentPane (contentPane); previewDialog. setSize (600,600); previewDialog. setdefaclocloseoperation (WindowConstants. DISPOSE_ON_CLOSE); previewDialog. setVisible (true);} private class Header extends Component {private static final long serialVersionUID =-plaintext; private PreviewArea previewArea; private boolean paintable; private Header (PreviewArea previewArea) {this. previewArea = previewArea;} private void setPaintable (boolean paintable) {this. paintable = paintable;} @ Overridepublic void paint (Graphics g) {if (paintable) {g. setColor (Color. GRAY); g. drawString (String. valueOf (previewArea. getPageIndex () + 1) + "/" + String. valueOf (pageBreaks. length + 1) + "pages (Click left mouse button to preview next page; right to previous)", 10, 15) ;}@ Overridepublic Dimension getPreferredSize () {return new Dimension (super. getPreferredSize (). width, 20) ;}} private class PreviewArea extends Component {private static final long serialVersionUID =-63820.4997251439843l; private PageFormat pageFormat; private int pageIndex; private int w; private int h; private final int marg.pdf = 10; private final int marginY = 20; private PreviewArea () {pageFormat = job. pageDialog (job. defaultPage (); pageIndex = 0; w = (int) pageFormat. getWidth (); h = (int) pageFormat. getHeight ();} private int getPageIndex () {return pageIndex;} private void setPageIndex (int pageIndex) {this. pageIndex = pageIndex;} @ Overridepublic Dimension getPreferredSize () {return new Dimension (w + 2 * margsion, h + 2 * marginY);} @ Overridepublic void paint (Graphics g) {Graphics2D g2 = (Graphics2D) g. create (); g2.translate (margcompare, marginY); g2.drawRect (0, 0, w, h); int ix = (int) (pageFormat. getImageableX ()-1); int iy = (int) (pageFormat. getImageableY ()-1); int iw = (int) (pageFormat. getImageableWidth () + 1); int ih = (int) (pageFormat. getImageableHeight () + 1); g2.setStroke (new BasicStroke (1f, BasicStroke. CAP_ROUND, BasicStroke. JOIN_ROUND, 10f, new float [] {5, 5}, 0f); g2.drawRect (ix, iy, iw, ih); try {PrintUIComponent. this. print (g2, pageFormat, pageIndex);} catch (PrinterException e) {e. printStackTrace ();} g2.dispose (); header. setPaintable (true); header. repaint () ;}} private class PreviewAreaMouseAdapter extends MouseAdapter {private PreviewArea previewArea; private PreviewAreaMouseAdapter (PreviewArea previewArea) {this. previewArea = previewArea;} @ Overridepublic void mouseClicked (MouseEvent e) {int currentIndex = previewArea. getPageIndex (); if (e. getButton () = MouseEvent. BUTTON1) {/* next page */if (currentIndex <pageBreaks. length) {previewArea. setPageIndex (currentIndex + 1); previewArea. repaint () ;}} else if (e. getButton () = MouseEvent. BUTTON3) {/* previous page */if (currentIndex> 0) {previewArea. setPageIndex (currentIndex-1); previewArea. repaint ();}}}}}