Java中的打印问题

| 我有一个可以与USB打印机通信并在销售完成后打印出收据的应用程序。连接到打印机并进行打印时没有问题。我现在遇到的问题是,当我做一些打印时,我只能看到我的邮件的一部分被打印在收据上。我已附上我正在使用的代码。请帮助我查看完整的打印收据:) - 码 -
package utilities;
import javax.swing.JFrame;   
import javax.swing.JOptionPane;    
import java.awt.print.PrinterJob;    
import java.awt.print.PageFormat;  
import java.awt.print.Printable;    
import java.awt.print.PrinterException;  
import java.awt.Color;  
import java.awt.Graphics;  
import java.awt.Graphics2D;      
public class ReceiptPrinter implements Printable {  
    private JFrame printFrame;  
    private String waitMsg;  
    private javax.swing.JTextArea jTextArea1;`  

    /** Inner class for the actual printed object */
    class PrintFrame extends JFrame {

        PrintFrame(String msg) {
            setBackground(new Color(255, 255, 255, 0));

            jTextArea1 = new javax.swing.JTextArea();

            jTextArea1.setColumns(80);

            jTextArea1.setLineWrap(true);

            jTextArea1.setRows(5);

            jTextArea1.setWrapStyleWord(true);

            jTextArea1.setText(msg);

            add(jTextArea1);
            pack();
            setVisible(true);
        }
    }

    /** Creates a new instance of ReceiptPrinter with a default wait message */
    public ReceiptPrinter() {
        waitMsg = \"Wait for the printer to finish\\nClick the OK button when done\";
    }

    /**
     * Creates a new instance of ReceiptPrinter with a wait message.
     *
     * @param   msg     the wait message
     */
    public ReceiptPrinter(String msg) {
        waitMsg = msg;
    }

    /**
     * Sends the actual message to the receipt printer - does not wait.
     *
     * @param   msg     the actual message to be printed
     */
    public void printIt(String msg) {
        printIt(msg, false);
    }

    /**
     * Sends the actual message to the receipt printer.
     *
     * @param   msg     the actual message to be printed
     * @param   wait    show JOptionPane to wait for print to finish
     */
    public void printIt(String msg, boolean wait) {
        printFrame = new PrintFrame(msg);

        PrinterJob job = PrinterJob.getPrinterJob();
        PageFormat format = job.defaultPage();
        format.setOrientation(PageFormat.PORTRAIT);
        //double width = format.getWidth();
        System.out.println(format.getImageableX()+\",\"+format.getImageableY());

        job.setPrintable(this, format);

        try {
            job.print();
            if (wait) {
                JOptionPane.showMessageDialog(null, waitMsg, \"Information\",
                        JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (PrinterException e) {
            e.printStackTrace();
        }
        //printFrame.dispose();
    }

    /**
     * Print method required by Printable interface.
     *
     * @param   g       the graphics context
     * @param   format  the page format
     * @param   pagenum the page number requested to print
     * @return  int     flag indicating page existance
     */

    public int print(Graphics g, PageFormat pf, int pagenum) {
        if (pagenum > 0) {
            return Printable.NO_SUCH_PAGE;
        }
        //g.translate(0, 150);
        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());

        /* Print the entire visible contents of a java.awt.Frame */
        printFrame.printAll(g2d);
        //g.translate((int) format.getImageableX(),
          //      (int) format.getImageableY());
        //printFrame.paint(g);
        return Printable.PAGE_EXISTS;
    }

}
我称之为此类的主要功能是
package utilities;
import forms_helper.global_variables;  
import java.awt.Dimension;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;
import javax.swing.JOptionPane;
public class PrintTest extends javax.swing.JFrame {  
    private ReceiptPrinter receiptPrinter = new ReceiptPrinter();  
    private FileOutputStream fos;  
    public PrintTest() {  
        initComponents();  
        setPreferredSize(new Dimension(300, 200));  
        pack();  
        try {  
            fos = new FileOutputStream(\"USB002\");    
        }  
        catch (FileNotFoundException e) {  
           JOptionPane.showMessageDialog(this, \"Cannot open file\\n\" + e.getMessage(),  
                   \"Warning\", JOptionPane.WARNING_MESSAGE);  
        }  
    }`  

    private void initComponents() {
        openButton = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        display = new javax.swing.JTextArea();
        exitButton = new javax.swing.JButton();

        getContentPane().setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        openButton.setFont(new java.awt.Font(\"Tahoma\", 1, 11));
        openButton.setText(\"Open\");
        openButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openButtonActionPerformed(evt);
            }
        });

        getContentPane().add(openButton);
        openButton.setBounds(151, 120, 80, 23);

        display.setColumns(20);
        display.setRows(5);
        jScrollPane1.setViewportView(display);

        getContentPane().add(jScrollPane1);
        jScrollPane1.setBounds(10, 10, 220, 92);

        exitButton.setFont(new java.awt.Font(\"Tahoma\", 1, 11));
        exitButton.setText(\"Exit\");
        exitButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitButtonActionPerformed(evt);
            }
        });

        getContentPane().add(exitButton);
        exitButton.setBounds(10, 120, 70, 23);

        pack();
    }

    private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            fos.close();
        }
        catch (IOException e) {
            JOptionPane.showMessageDialog(this, \"Unable to close printer port\",
                    \"Warning\", JOptionPane.WARNING_MESSAGE);
        }
        dispose();
    }

    private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {
    // this section attempts to send the BEL character to the printer port
        byte bel = 0x07;
        try {
            fos.write(bel);
            fos.flush();
        }
        catch (IOException e) {
            JOptionPane.showMessageDialog(this, \"Error trying to write\\n\" + e.getMessage(),
                    \"Warning\", JOptionPane.WARNING_MESSAGE);
        }
    // this section appends the BEL to  the printed message and sends it to the Windows printer
        //String msg = \"test \\n test\";
        String msg=global_variables.msg;
        msg += ((char) 0x07);

        receiptPrinter.printIt(msg);
    // this section displays a hex dump of the printed message
    // note that the BEL is being converted to a box and that
    // is what actually prints on the printer instead of the beep
        for (int i = 0; i < msg.length(); i += 5) {
            for (int j = 0; j < 5; j++) {
                if ((i + j) < msg.length()) {
                    int x = msg.charAt(i + j);
                    display.append(String.format(\"%02x \", x));
                }
            }
            display.append(\"   \");
            for (int j = 0; j < 5; j++) {
                if (i + j < msg.length()) {
                    char c = msg.charAt(i + j);
                    display.append(String.format(\" %c\", c));
                }
            }
            display.append(\"\\n\");
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PrintTest().setVisible(true);
            }
        });
    }

    private javax.swing.JTextArea display;
    private javax.swing.JButton exitButton;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton openButton;

}
当我打印时,我得到这样的图像    实际内容是这样的     
已邀请:
  你能告诉我更多吗? 将
g.getClipBounds()
返回的矩形与
PageFormat
中的
getImageableWidth()
getImageableHeight()
进行比较。看起来图像已被裁剪为打印机默认的6英寸大小。     
我不确定这是问题所在,但是我似乎回想起使用Graphics对象时,需要“撤消”完成后对它所做的所有更改。因此,您需要在打印方法的末尾添加此行
g2d.translate(-pf.getImageableX(), -pf.getImageableY());
即使对于同一页面,print方法也可以多次调用-也许您只是将Graphics对象转换得太远了。     

要回复问题请先登录注册