2011-11-25 75 views
0

以下代碼的問題在於它不打印bk(Java Book),只打印出'g'(用戶界面窗口)。如何打印Java書籍?

有人可以解釋如何打印Java書嗎?

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()); 
       } 
      } 
     } 
} 

回答

1

當書被打印時,打印機作業使用print(Graphics g, PageFormat pageFormat, int pageIndex)。您的print方法調用paint(g),這是您的UI框架的方法。

如果您不想打印UI控件的圖像,則您應使用print方法的g將想要的圖像繪製到頁面。

編輯:例如,繪製文本頁面(未測試)的中間:

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); 
} 

BTW:

在你的代碼,下列的地方需要改變,如果你想打印更頁比一個:

if (pageIndex > 0) { 
     return (NO_SUCH_PAGE); 
+0

那麼,如果我試圖做'繪畫(bk)'產生一個錯誤,我該如何調用本書的方法? – gunmania

+0

非常感謝,非常完美! – gunmania