zoukankan      html  css  js  c++  java
  • JAVA实现打印机

    我这里有以前收藏的代码,两个类实现了简易的文本打印机的功能,包括预览。简单跟你说一下。

    1、PrinterDemo.java主体类,也是入口类,里面有main方法可以直接在Eclipse中调试运行,他实现了从本地磁盘读取文本类文件打印以及打印预览的功能,其中File动作按钮中的PrintPreviw就是打印预览功能,你可以运行看看。

    2、PrintPreview.java打印预览类,这是专门为预览打印设计的类,通过他的构造方法可以构造出一个预览类,PrinterDemo中的预览功能就是调用了这个类。

    两个类的源码:

    【PrinterDemo.java】的源码:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Event;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    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.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.Vector;
    
    import javax.swing.AbstractAction;
    import javax.swing.JComponent;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JScrollPane;
    import javax.swing.KeyStroke;
    
    public class PrinterDemo extends JFrame{
        private static final long serialVersionUID = 1L;
        private PageFormat        pageFormat;
        private FilePageRenderer  pageRenderer;
        private String            title;
        public PrinterDemo(){
            super();
            init();
            PrinterJob pj = PrinterJob.getPrinterJob();
            pageFormat = pj.defaultPage();
            setVisible(true);
        }
        protected void init()
        {
            setSize(350, 300);
            center();
            Container content = getContentPane();
            content.setLayout(new BorderLayout());
            JMenuBar mb = new JMenuBar();
            JMenu file = new JMenu("File", true);
            file.add(new FileOpenAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,Event.CTRL_MASK));
            file.add(new FilePrintPreviwAction()).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.ALT_MASK));
            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);
                JMenu page = new JMenu("Page", true);
                page.add(new PageNextPageAction())
                    .setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0));
                page.add(new PagePreviousPageAction())
                    .setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0));
                mb.add(page);
                setJMenuBar(mb);
                getContentPane().setLayout(new BorderLayout());
                addWindowListener(new WindowAdapter()
                {
                    public void windowClosing(WindowEvent e)
                    {
                        System.exit(0);
                    }
                });
            }
    
            protected void center()
            {
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                Dimension frameSize = getSize();
                int x = (screenSize.width - frameSize.width) / 2;
                int y = (screenSize.height - frameSize.height) / 2;
                setLocation(x, y);
            }
    
            public void showTitle()
            {
                int currentPage = pageRenderer.getCurrentPage() + 1;
                int numPages = pageRenderer.getNumPages();
                setTitle(title + " - page " + currentPage + " of " + numPages);
            }
    
            public class FileOpenAction extends AbstractAction
            {
                private static final long serialVersionUID = 1L;
    
                public FileOpenAction()
                {
                    super("Open...");
                }
    
                public void actionPerformed(ActionEvent ae)
                {
                    // Pop up a file dialog.
                    JFileChooser fc = new JFileChooser(".");
                    int result = fc.showOpenDialog(PrinterDemo.this);
                    if (result != 0)
                    {
                        return;
                    }
                    java.io.File f = fc.getSelectedFile();
                    if (f == null)
                    {
                        return;
                    }
                    // Load the specified file.
                    try
                    {
                        pageRenderer = new FilePageRenderer(f, pageFormat);
                        title = "[" + f.getName() + "]";
                        showTitle();
                        JScrollPane jsp = new JScrollPane(pageRenderer);
                        getContentPane().removeAll();
                        getContentPane().add(jsp, BorderLayout.CENTER);
                        validate();
                    } catch (java.io.IOException ioe)
                    {
                        System.out.println(ioe);
                    }
                }
            }
    
            public static void main(String[] args){
                new PrinterDemo();
            }
    
            public class FilePrintPreviwAction extends AbstractAction{
                private static final long serialVersionUID = 1L;
    
                public FilePrintPreviwAction(){
                    super("PrintPreviw");
                }
    
                public void actionPerformed(ActionEvent ae){
                    new PrintPreview(pageRenderer,"PrintPreviw",pageFormat.getOrientation());
                }
            }
            
            public class FilePrintAction extends AbstractAction{
                private static final long serialVersionUID = 1L;
    
                public FilePrintAction(){
                    super("Print");
                }
    
                public void actionPerformed(ActionEvent ae){
                    PrinterJob pj = PrinterJob.getPrinterJob();
                    pj.setPrintable(pageRenderer, pageFormat);
                    if (pj.printDialog()){
                        try{
                            pj.print();
                        } catch (PrinterException e){
                            System.out.println(e);
                        }
                    }
                }
            }
    
            public class FilePageSetupAction extends AbstractAction {
                private static final long serialVersionUID = 1L;
    
                public FilePageSetupAction(){
                    super("Page setup...");
                }
    
                public void actionPerformed(ActionEvent ae){
                    PrinterJob pj = PrinterJob.getPrinterJob();
                    pageFormat = pj.pageDialog(pageFormat);
                    if (pageRenderer != null){
                        pageRenderer.pageInit(pageFormat);
                        showTitle();
                    }
                }
            }
    
            public class FileQuitAction extends AbstractAction{
                private static final long serialVersionUID = 1L;
    
                public FileQuitAction(){
                    super("Quit");
                }
    
                public void actionPerformed(ActionEvent ae){
                    System.exit(0);
                }
            }
    
            public class PageNextPageAction extends AbstractAction{
                private static final long serialVersionUID = 1L;
    
                public PageNextPageAction(){
                    super("Next page");
                }
    
                public void actionPerformed(ActionEvent ae){
                    if (pageRenderer != null)
                        pageRenderer.nextPage();
                    showTitle();
                }
            }
    
            public class PagePreviousPageAction extends AbstractAction{
                private static final long serialVersionUID = 1L;
    
                public PagePreviousPageAction(){
                    super("Previous page");
                }
    
                public void actionPerformed(ActionEvent ae){
                    if (pageRenderer != null)
                        pageRenderer.previousPage();
                    showTitle();
                }
            }
    
            class FilePageRenderer extends JComponent implements Printable{
                private static final long serialVersionUID = 1L;
                private int       currentPageIndex;
                private Vector    lineVector;
                private Vector    pageVector;
                private Font      font;
                private int       fontSize;
                private Dimension preferredSize;
    
                public FilePageRenderer(File file, PageFormat pageFormat) throws IOException{
                    fontSize = 12;
                    font = new Font("Serif", Font.PLAIN, fontSize);
                    BufferedReader in = new BufferedReader(new FileReader(file));
                    String line;
                    lineVector = new Vector();
                    while ((line = in.readLine()) != null)
                        lineVector.addElement(line);
                    in.close();
                    pageInit(pageFormat);
                }
    
                public void pageInit(PageFormat pageFormat){
                    currentPageIndex = 0;
                    pageVector = new Vector();
                    float y = fontSize;
                    Vector page = new Vector();
                    for (int i = 0; i < lineVector.size(); i++)
                    {
                        String line = (String) lineVector.elementAt(i);
                        page.addElement(line);
                        y += fontSize;
                        if (y + fontSize * 2 > pageFormat.getImageableHeight())
                        {
                            y = 0;
                            pageVector.addElement(page);
                            page = new Vector();
                        }
                    }
                    if (page.size() > 0)
                        pageVector.addElement(page);
                    preferredSize = new Dimension((int) pageFormat.getImageableWidth(),
                                                  (int) pageFormat.getImageableHeight());
                    repaint();
                }
    
                public void paintComponent(Graphics g) {
                    Graphics2D g2 = (Graphics2D) g;
                    java.awt.geom.Rectangle2D r = new java.awt.geom.Rectangle2D.Float(0,
                                                                                      0,
                                                                                      preferredSize.width,
                                                                                      preferredSize.height);
                    g2.setPaint(Color.white);
                    g2.fill(r);
                    Vector page = (Vector) pageVector.elementAt(currentPageIndex);
                    g2.setFont(font);
                    g2.setPaint(Color.black);
                    float x = 0;
                    float y = fontSize;
                    for (int i = 0; i < page.size(); i++){
                        String line = (String) page.elementAt(i);
                        if (line.length() > 0)
                            g2.drawString(line, (int) x, (int) y);
                        y += fontSize;
                    }
                }
    
                public int print(Graphics g, PageFormat pageFormat, int pageIndex){
                    if (pageIndex >= pageVector.size())
                        return NO_SUCH_PAGE;
                    int savedPage = currentPageIndex;
                    currentPageIndex = pageIndex;
                    Graphics2D g2 = (Graphics2D) g;
                    g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                    paint(g2);
                    currentPageIndex = savedPage;
                    return PAGE_EXISTS;
                }
    
                public Dimension getPreferredSize(){
                    return preferredSize;
                }
    
                public int getCurrentPage(){
                    return currentPageIndex;
                }
    
                public int getNumPages(){
                    return pageVector.size();
                }
    
                public void nextPage() {
                    if (currentPageIndex < pageVector.size() - 1)
                        currentPageIndex++;
                    repaint();
                }
                public void previousPage(){
                    if (currentPageIndex > 0)
                        currentPageIndex--;
                    repaint();
                }
            }
        }

    【PrintPreview.java】的源码:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JToolBar;
    import javax.swing.border.MatteBorder;
    
    public class PrintPreview extends JFrame
    {
        private static final long serialVersionUID = 1L;
        protected int              m_wPage;
        protected int              m_hPage;
        protected int              m_orientation;
        protected Printable        m_target;
        protected JComboBox        m_cbScale;
        protected PreviewContainer m_preview;
    
        public PrintPreview(Printable target)
        {
            this(target, "Print   Preview ", PageFormat.PORTRAIT);
        }
    
        public PrintPreview(Printable target, String title, int orientation)
        {
            super(title);
            setSize(600, 400);
            getContentPane().setLayout(new BorderLayout());
            m_target = target;
            m_orientation = orientation;
            JToolBar tb = new JToolBar();
            JButton bt = new JButton("Print ", new ImageIcon("print.gif "));
            ActionListener lst = new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    try
                    {
                        PrinterJob prnJob = PrinterJob.getPrinterJob();
                        PageFormat pageFormat = prnJob.defaultPage();
                        pageFormat.setOrientation(m_orientation);
                        prnJob.setPrintable(m_target, pageFormat);
                        if (!prnJob.printDialog())
                            return;
                        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                        prnJob.print();
                        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                        dispose();
                    } catch (PrinterException ex)
                    {
                        ex.printStackTrace();
                        System.err.println("Printing   error:   " + ex.toString());
                    }
                }
            };
            bt.addActionListener(lst);
            bt.setAlignmentY(0.5f);
            bt.setMargin(new Insets(4, 6, 4, 6));
            tb.add(bt);
            bt = new JButton("Close ");
            lst = new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    dispose();
                }
            };
            bt.addActionListener(lst);
            bt.setAlignmentY(0.5f);
            bt.setMargin(new Insets(2, 6, 2, 6));
            tb.add(bt);
            String[] scales = { "10%", "25%", "50%", "100%" };
            
            m_cbScale = new JComboBox(scales);
            lst = new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    String str = m_cbScale.getSelectedItem().toString();
                    if (str.endsWith("%"))
                        str = str.substring(0, str.length() - 1);
                    str = str.trim();
                    int scale = 0;
                    try
                    {
                        scale = Integer.parseInt(str);
                    } catch (NumberFormatException ex)
                    {
                        return;
                    }
                    int w = (int) (m_wPage * scale / 100);
                    int h = (int) (m_hPage * scale / 100);
                    Component[] comps = m_preview.getComponents();
                    for (int k = 0; k < comps.length; k++)
                    {
                        if (!(comps[k] instanceof PagePreview))
                            continue;
                        PagePreview pp = (PagePreview) comps[k];
                        pp.setScaledSize(w, h);
                    }
                    m_preview.doLayout();
                    m_preview.getParent().getParent().validate();
                }
            };
            m_cbScale.addActionListener(lst);
            m_cbScale.setMaximumSize(m_cbScale.getPreferredSize());
            m_cbScale.setEditable(true);
            tb.addSeparator();
            tb.add(m_cbScale);
            getContentPane().add(tb, BorderLayout.NORTH);
            m_preview = new PreviewContainer();
            PrinterJob prnJob = PrinterJob.getPrinterJob();
            PageFormat pageFormat = prnJob.defaultPage();
            pageFormat.setOrientation(m_orientation);
            if (pageFormat.getHeight() == 0 || pageFormat.getWidth() == 0)
            {
                System.err.println("Unable   to   determine   default   page   size ");
                return;
            }
            m_wPage = (int) (pageFormat.getWidth());
            m_hPage = (int) (pageFormat.getHeight());
            int scale = 10;
            int w = (int) (m_wPage * scale / 100);
            int h = (int) (m_hPage * scale / 100);
            int pageIndex = 0;
            try
            {
                while (true)
                {
                    BufferedImage img = new BufferedImage(m_wPage, m_hPage, BufferedImage.TYPE_INT_RGB);
                    Graphics g = img.getGraphics();
                    g.setColor(Color.white);
                    g.fillRect(0, 0, m_wPage, m_hPage);
                    if (target.print(g, pageFormat, pageIndex) != Printable.PAGE_EXISTS)
                        break;
                    PagePreview pp = new PagePreview(w, h, img);
                    m_preview.add(pp);
                    pageIndex++;
                }
            } catch (PrinterException e)
            {
                e.printStackTrace();
                System.err.println("Printing   error:   " + e.toString());
            }
            JScrollPane ps = new JScrollPane(m_preview);
            getContentPane().add(ps, BorderLayout.CENTER);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setVisible(true);
        }
    
        class PreviewContainer extends JPanel
        {
            private static final long serialVersionUID = 1L;
            protected int H_GAP = 16;
            protected int V_GAP = 10;
    
            public Dimension getPreferredSize()
            {
                int n = getComponentCount();
                if (n == 0)
                    return new Dimension(H_GAP, V_GAP);
                Component comp = getComponent(0);
                Dimension dc = comp.getPreferredSize();
                int w = dc.width;
                int h = dc.height;
                Dimension dp = getParent().getSize();
                int nCol = Math.max((dp.width - H_GAP) / (w + H_GAP), 1);
                int nRow = n / nCol;
                if (nRow * nCol < n)
                    nRow++;
                int ww = nCol * (w + H_GAP) + H_GAP;
                int hh = nRow * (h + V_GAP) + V_GAP;
                Insets ins = getInsets();
                return new Dimension(ww + ins.left + ins.right, hh + ins.top + ins.bottom);
            }
    
            public Dimension getMaximumSize()
            {
                return getPreferredSize();
            }
    
            public Dimension getMinimumSize()
            {
                return getPreferredSize();
            }
    
            public void doLayout()
            {
                Insets ins = getInsets();
                int x = ins.left + H_GAP;
                int y = ins.top + V_GAP;
                int n = getComponentCount();
                if (n == 0)
                    return;
                Component comp = getComponent(0);
                Dimension dc = comp.getPreferredSize();
                int w = dc.width;
                int h = dc.height;
                Dimension dp = getParent().getSize();
                int nCol = Math.max((dp.width - H_GAP) / (w + H_GAP), 1);
                int nRow = n / nCol;
                if (nRow * nCol < n)
                    nRow++;
                int index = 0;
                for (int k = 0; k < nRow; k++)
                {
                    for (int m = 0; m < nCol; m++)
                    {
                        if (index >= n)
                            return;
                        comp = getComponent(index++);
                        comp.setBounds(x, y, w, h);
                        x += w + H_GAP;
                    }
                    y += h + V_GAP;
                    x = ins.left + H_GAP;
                }
            }
        }
    
        class PagePreview extends JPanel
        {
            private static final long serialVersionUID = 1L;
            protected int   m_w;
            protected int   m_h;
            protected Image m_source;
            protected Image m_img;
    
            public PagePreview(int w, int h, Image source)
            {
                m_w = w;
                m_h = h;
                m_source = source;
                m_img = m_source.getScaledInstance(m_w, m_h, Image.SCALE_SMOOTH);
                m_img.flush();
                setBackground(Color.white);
                setBorder(new MatteBorder(1, 1, 2, 2, Color.black));
            }
    
            public void setScaledSize(int w, int h)
            {
                m_w = w;
                m_h = h;
                m_img = m_source.getScaledInstance(m_w, m_h, Image.SCALE_SMOOTH);
                repaint();
            }
    
            public Dimension getPreferredSize()
            {
                Insets ins = getInsets();
                return new Dimension(m_w + ins.left + ins.right, m_h + ins.top + ins.bottom);
            }
    
            public Dimension getMaximumSize()
            {
                return getPreferredSize();
            }
    
            public Dimension getMinimumSize()
            {
                return getPreferredSize();
            }
    
            public void paint(Graphics g)
            {
                g.setColor(getBackground());
                g.fillRect(0, 0, getWidth(), getHeight());
                g.drawImage(m_img, 0, 0, this);
                paintBorder(g);
            }
        }
    }
  • 相关阅读:
    多态
    没有抽象方法的抽象类有什么意义
    抽象类继承(雇员练习)
    怎样在win7中 安装Tomcat7.0
    继承训练
    Java的接口和抽象类
    jQuery插件的学习
    jQuery学习之路-A
    android之路-android事件处理-OnTouchListener
    丢弃的东西,还能否找回?
  • 原文地址:https://www.cnblogs.com/xinxin1994/p/6057503.html
Copyright © 2011-2022 走看看