以下代码的问题在于它不打印bk(Java Book)并且只打印掉'g'这是用户界面窗口。
有人可以解释如何打印Java Book吗?
public class printInvoice extends javax.swing.JFrame implements Printable {
JFrame frameToPrint;
/** Creates new form SimplePrint */
public void SimplePrint(JFrame f) {
frameToPrint = f;
}
/** Creates new form NewJFrame */
public printInvoice() {
initComponents();
this.setVisible(true);
print2();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new printInvoice().setVisible(true);
}
});
}
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0) {
return (NO_SUCH_PAGE);
} else {
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
// Turn off double buffering
//componentToBePrinted.paint(g2d);
//frameToPrint.print(g);
paint(g);
// this.print(g);
// this.print(g);
// Turn double buffering back on
return (PAGE_EXISTS);
}
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JComboBox jComboBox1;
private javax.swing.JLabel jLabel1;
private javax.swing.JList jList1;
private javax.swing.JRadioButton jRadioButton1;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration
int userCountAmount;
dataBase data = new dataBase();
Book bk = new Book();
PrinterJob PJ = PrinterJob.getPrinterJob();
public void print2() {
userCountAmount = data.getAmountOfUsers();
PageFormat portrait = PJ.defaultPage();
portrait.setOrientation(PageFormat.PORTRAIT);
jLabel1.setText("Print number: "+0);
bk.append((Printable) this, PJ.defaultPage(),1);
jLabel1.setText("Print number: "+1);
bk.append((Printable) this, PJ.defaultPage(),2);
jLabel1.setText("Print number: "+2);
bk.append((Printable) this, PJ.defaultPage(),3);
System.out.println(bk.toString());
//PageFormat PF = PJ.pageDialog(PJ.defaultPage());
PJ.setPageable(bk);
// PJ.setPrintable((Printable) this);
boolean doPrint = PJ.printDialog();
//JOptionPane.showMessageDialog(null, doPrint);
if (doPrint) {
try {
PJ.print();
} catch (PrinterException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
}
}
}
}
答案 0 :(得分:1)
打印书籍时,打印机作业正在使用print(Graphics g, PageFormat pageFormat, int pageIndex)
。您的print
方法会调用paint(g)
,这就是您的UI框架的方法。
如果您不想打印UI控件的图像,则应使用g
方法的print
将所需图像绘制到页面上。
编辑:例如,将文本绘制到页面中间(未测试):
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
Graphics2D g2d = (Graphics2D) g;
double x1 = pf.getImageableX();
double y1 = pf.getImageableY();
double x2 = pf.getImageableWidth();
double y2 = pf.getImageableHeight();
g2d.drawString( "Page #" + pageIndex, (int)((x2-x1)/2+x1), (int)((y2-y1)/2+y1) );
return (PAGE_EXISTS);
}
顺便说一句:
在您的代码中,如果您想要打印的页面多于一个,则需要更改以下位置:
if (pageIndex > 0) {
return (NO_SUCH_PAGE);