我有一个与USB打印机对话的应用程序,并在销售完成后打印出收据。连接打印机和打印东西没问题。我现在的问题是,当我做一些打印时,我只能看到我的信息的一部分被打印在收据上。我附上了我正在使用的代码。请帮我看看完整的打印收据:)
- CODE--
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;
}
当我打印它时,我得到的图像就像这样
实际内容是这样的
答案 0 :(得分:1)
你能告诉我更多吗?
将g.getClipBounds()
返回的矩形与PageFormat
中找到的getImageableWidth()
和getImageableHeight()
进行比较。看起来您的图像被裁剪为打印机默认Paper
尺寸。
答案 1 :(得分:1)
我不确定这是不是问题,但我似乎记得在使用Graphics对象时,你需要“撤消”你完成后对它所做的所有更改。所以你需要在print方法的末尾添加这一行
g2d.translate(-pf.getImageableX(), -pf.getImageableY());
即使对于同一页面,也可以多次调用print方法 - 也许你只是将Graphics对象翻译得太过分了。