2015-05-18 40 views
0

我發現了一個有用的代碼,但我不明白它的兩件事。第一個是if (page > 0)。那是什麼意思 ?而且在這裏它應該打印job.print();。爲什麼它沒有任何參數調用這個方法,而不是我之前創建的這個方法? :public int print(Graphics g, PageFormat pf, int page)JAVA使用可打印的打印方法

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.print.*; 

public class HelloWorldPrinter implements Printable, ActionListener { 


    public int print(Graphics g, PageFormat pf, int page) throws 
                 PrinterException { 

     if (page > 0) { //Here 
      return NO_SUCH_PAGE; 
     } 



//this one 
     System.out.println(pf.getWidth()); 

     Graphics2D g2d = (Graphics2D)g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()); 


     g.drawString("Hello world!", 100, 100); 


     return PAGE_EXISTS; 
    } 

    public void actionPerformed(ActionEvent e) { 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(this); 
     boolean ok = job.printDialog(); 
     if (ok) { 
      try { 
        job.print(); //Here 
      } catch (PrinterException ex) { 

      } 
     } 
    } 

    public static void main(String args[]) { 

     UIManager.put("swing.boldMetal", Boolean.FALSE); 
     JFrame f = new JFrame("Hello World Printer"); 
     f.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) {System.exit(0);} 
     }); 
     JButton printButton = new JButton("Print Hello World"); 
     printButton.addActionListener(new HelloWorldPrinter()); 
     f.add("Center", printButton); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

回答

1

第一個是與如果(頁面> 0)。那是什麼意思 ?

印刷可以由多個頁面的 - 在PrinterJob不知道多少頁打印,所以它會叫你Printable實施print方法,直到它被告知這樣做(如返回NO_SUCH_PAGE)。傳遞給您的實施print(例如page)的參數之一會針對每個頁面遞增,並指示正在打印的當前頁碼。因此,此條件限制打印到單個頁面。

而且在這裏它應該打印job.print(); 。爲什麼它沒有任何參數調用這個方法,而不是我之前創建的這個方法?

您在PrinterJob第一次調用printPrinterJob然後創建隨後傳遞到您的print執行變量(有時是多次,這取決於頁數) - 讓您間接調用你Printable實現(例如,方法3參數print方法)。

甲骨文有一個偉大的printing tutorial值得深入閱讀,可能會進一步回答您的問題。

+0

謝謝!真的有幫助 – aNNgeL0

+0

你知道爲什麼我的打印實現被稱爲2次嗎? – aNNgeL0

+0

「PrinterJob」將繼續調用,直到返回「NO_SUCH_PAGE」。第一次調用(例如第一頁)返回'PAGE_EXISTS',所以'PrinterJob'第二次調用該方法,在這種情況下,返回'NO_SUCH_PAGE'(因此,兩次調用Printable'實現) – copeg

0

Q1:if (page > 0)。那是什麼意思 ? - 這確保只打印第一頁。由於您使用的是Printable而不是Pageable,因此它不知道要打印多少頁。 Q2:在這裏它應該打印job.print(); - 它應該在要將打印作業發送到打印機的位置調用job.print。在你的情況下,在按鈕上點擊

Q3:爲什麼它調用這個方法時沒有任何參數,而不是我之前創建的這個方法? - 這是兩個不同的類和對象。您在PrinterJob上調用print(),它會調用您的Printable打印方法來打印頁面。在線上:job.setPrintable(this);這就是它知道如何回電你指定的打印方法

+0

謝謝!它幫助了 – aNNgeL0

+0

你碰巧知道爲什麼我的打印實現被調用兩次? – aNNgeL0

+0

第1頁調用一次,第2頁調用一次。當處理第二頁時,您返回NO_SUCH_PAGE,因此它不會再請求更多頁面 – ControlAltDel