SSISO Community

시소당

Print Swing components

import  java.awt.Color;
import  java.awt.Component;
import  java.awt.Dimension;
import  java.awt.Event;
import  java.awt.Font;
import  java.awt.GradientPaint;
import  java.awt.Graphics;
import  java.awt.Graphics2D;
import  java.awt.Paint;
import  java.awt.Toolkit;
import  java.awt.event.ActionEvent;
import  java.awt.event.KeyEvent;
import  java.awt.event.WindowAdapter;
import  java.awt.event.WindowEvent;
import  java.awt.font.FontRenderContext;
import  java.awt.font.LineMetrics;
import  java.awt.geom.Rectangle2D;
import  java.awt.print.PageFormat;
import  java.awt.print.Printable;
import  java.awt.print.PrinterException;
import  java.awt.print.PrinterJob;

import  javax.swing.AbstractAction;
import  javax.swing.JComponent;
import  javax.swing.JFrame;
import  javax.swing.JMenu;
import  javax.swing.JMenuBar;
import  javax.swing.KeyStroke;

public  class  SwingPrinter  extends  JFrame  {
    public  static  void  main(String[]  args)  {
        new  SwingPrinter();
    }

    private  PageFormat  mPageFormat;

    public  SwingPrinter()  {
        super("SwingPrinter  v1.0");
        createUI();
        PrinterJob  pj  =  PrinterJob.getPrinterJob();
        mPageFormat  =  pj.defaultPage();
        setVisible(true);
    }

    protected  void  createUI()  {
        setSize(300,  300);
        center();

        //  Add  the  menu  bar.
        JMenuBar  mb  =  new  JMenuBar();
        JMenu  file  =  new  JMenu("File",  true);
        file.add(new  FilePrintAction()).setAccelerator(
                KeyStroke.getKeyStroke(KeyEvent.VK_P,  Event.CTRL_MASK));
        file.add(new  FilePageSetupAction()).setAccelerator(
                KeyStroke.getKeyStroke(KeyEvent.VK_P,  Event.CTRL_MASK
                        |  Event.SHIFT_MASK));
        file.addSeparator();
        file.add(new  FileQuitAction()).setAccelerator(
                KeyStroke.getKeyStroke(KeyEvent.VK_Q,  Event.CTRL_MASK));
        mb.add(file);
        setJMenuBar(mb);

        //  Add  the  contents  of  the  window.
        getContentPane().add(new  PatchworkComponent());

        //  Exit  the  application  when  the  window  is  closed.
        addWindowListener(new  WindowAdapter()  {
            public  void  windowClosing(WindowEvent  e)  {
                System.exit(0);
            }
        });
    }

    protected  void  center()  {
        Dimension  screen  =  Toolkit.getDefaultToolkit().getScreenSize();
        Dimension  us  =  getSize();
        int  x  =  (screen.width  -  us.width)  /  2;
        int  y  =  (screen.height  -  us.height)  /  2;
        setLocation(x,  y);
    }

    public  class  FilePrintAction  extends  AbstractAction  {
        public  FilePrintAction()  {
            super("Print");
        }

        public  void  actionPerformed(ActionEvent  ae)  {
            PrinterJob  pj  =  PrinterJob.getPrinterJob();
            ComponentPrintable  cp  =  new  ComponentPrintable(getContentPane());
            pj.setPrintable(cp,  mPageFormat);
            if  (pj.printDialog())  {
                try  {
                    pj.print();
                }  catch  (PrinterException  e)  {
                    System.out.println(e);
                }
            }
        }
    }

    public  class  FilePageSetupAction  extends  AbstractAction  {
        public  FilePageSetupAction()  {
            super("Page  setup...");
        }

        public  void  actionPerformed(ActionEvent  ae)  {
            PrinterJob  pj  =  PrinterJob.getPrinterJob();
            mPageFormat  =  pj.pageDialog(mPageFormat);
        }
    }

    public  class  FileQuitAction  extends  AbstractAction  {
        public  FileQuitAction()  {
            super("Quit");
        }

        public  void  actionPerformed(ActionEvent  ae)  {
            System.exit(0);
        }
    }
}
class  PatchworkComponent  extends  JComponent  implements  Printable  {

    private  float  mSide  =  36;

    private  float  mOffset  =  36;

    private  int  mColumns  =  8;

    private  int  mRows  =  4;

    private  String  mString  =  "Java  Source  and  Support";

    private  Font  mFont  =  new  Font("Serif",  Font.PLAIN,  64);

    private  Paint  mHorizontalGradient,  mVerticalGradient;

    public  PatchworkComponent()  {
        float  x  =  mOffset;
        float  y  =  mOffset;
        float  halfSide  =  mSide  /  2;
        float  x0  =  x  +  halfSide;
        float  y0  =  y;
        float  x1  =  x  +  halfSide;
        float  y1  =  y  +  (mRows  *  mSide);
        mVerticalGradient  =  new  GradientPaint(x0,  y0,  Color.darkGray,  x1,  y1,
                Color.lightGray,  true);
        x0  =  x;
        y0  =  y  +  halfSide;
        x1  =  x  +  (mColumns  *  mSide);
        y1  =  y  +  halfSide;
        mHorizontalGradient  =  new  GradientPaint(x0,  y0,  Color.darkGray,  x1,  y1,
                Color.lightGray,  true);
    }

    public  PatchworkComponent(String  s)  {
        this();
        mString  =  s;
    }

    public  void  paintComponent(Graphics  g)  {
        Graphics2D  g2  =  (Graphics2D)  g;

        g2.rotate(Math.PI  /  24,  mOffset,  mOffset);

        for  (int  row  =  0;  row  <  mRows;  row++)  {
            for  (int  column  =  0;  column  <  mColumns;  column++)  {
                float  x  =  column  *  mSide  +  mOffset;
                float  y  =  row  *  mSide  +  mOffset;

                if  (((column  +  row)  %  2)  ==  0)
                    g2.setPaint(mVerticalGradient);
                else
                    g2.setPaint(mHorizontalGradient);

                Rectangle2D  r  =  new  Rectangle2D.Float(x,  y,  mSide,  mSide);
                g2.fill(r);
            }
        }

        FontRenderContext  frc  =  g2.getFontRenderContext();
        float  width  =  (float)  mFont.getStringBounds(mString,  frc).getWidth();
        LineMetrics  lm  =  mFont.getLineMetrics(mString,  frc);
        float  x  =  ((mColumns  *  mSide)  -  width)  /  2  +  mOffset;
        float  y  =  ((mRows  *  mSide)  +  lm.getAscent())  /  2  +  mOffset;
        g2.setFont(mFont);
        g2.setPaint(Color.white);
        g2.drawString(mString,  x,  y);
    }

    public  int  print(Graphics  g,  PageFormat  pageFormat,  int  pageIndex)  {
        if  (pageIndex  !=  0)
            return  NO_SUCH_PAGE;
        paintComponent(g);
        return  PAGE_EXISTS;
    }
}
class  ComponentPrintable  implements  Printable  {
    private  Component  mComponent;

    public  ComponentPrintable(Component  c)  {
        mComponent  =  c;
    }

    public  int  print(Graphics  g,  PageFormat  pageFormat,  int  pageIndex)  {
        if  (pageIndex  >  0)
            return  NO_SUCH_PAGE;
        Graphics2D  g2  =  (Graphics2D)  g;
        g2.translate(pageFormat.getImageableX(),  pageFormat.getImageableY());
        boolean  wasBuffered  =  disableDoubleBuffering(mComponent);
        mComponent.paint(g2);
        restoreDoubleBuffering(mComponent,  wasBuffered);
        return  PAGE_EXISTS;
    }

    private  boolean  disableDoubleBuffering(Component  c)  {
        if  (c  instanceof  JComponent  ==  false)
            return  false;
        JComponent  jc  =  (JComponent)  c;
        boolean  wasBuffered  =  jc.isDoubleBuffered();
        jc.setDoubleBuffered(false);
        return  wasBuffered;
    }

    private  void  restoreDoubleBuffering(Component  c,  boolean  wasBuffered)  {
        if  (c  instanceof  JComponent)
            ((JComponent)  c).setDoubleBuffered(wasBuffered);
    }
}

[2008년  03월  23일  21:19:42  수정되었습니다.]

524 view

4.0 stars