2017-09-17 80 views
0

我正在使用java awt PrinterJob顯示打印對話框並提交要打印的作業。我想在提交作業之前閱讀用戶從對話框中選擇的屬性,但是我看到'屬性'是一個受保護的變量,因此不確定如何訪問它。我需要對正在提交的打印作業進行一些分析。有沒有解決方法?正在檢索PrinterJob屬性

+0

這是我使用的代碼。 PrinterJob job = PrinterJob.getPrinterJob(); boolean ok = job.printDialog;從打印對話框中選擇作業屬性後,我想閱讀並分析屬性。 – curie

回答

0

代替方法PrinterJob.printDialog() 您應該使用方法PrinterJob.printDialog(PrintRequestAttributeSet)。 在提供的PrintRequestAttributeSet 中,您將收到用戶在打印對話框中選擇的所有屬性。

從這個PrintRequestAttributeSet你就可以

  • 通過調用其toArray()方法得到的所有屬性
  • 或使用get(Class<?>)方法
    (使用來自包實現PrintRequestAttribute類得到各個屬性 javax.print.attribute.standard 作爲鍵)

然後,您可以通過刪除或添加屬性來更改PrintRequestAttributeSet

最後,您通過調用print()方法提交PrinterJob

實施例:

import java.awt.print.PrinterJob; 
import javax.print.attribute.Attribute; 
import javax.print.attribute.HashPrintRequestAttributeSet; 
import javax.print.attribute.PrintRequestAttributeSet; 
import javax.print.attribute.standard.*; 

public static void main(String[] args) throws Exception { 
    PrinterJob job = PrinterJob.getPrinterJob(); 
    PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); 
    boolean ok = job.printDialog(attributes); 

    Attribute[] attributeArray = attributes.toArray(); 
    for (Attribute a : attributeArray) { 
     System.out.println(a.getName() + ": " + a); 
    } 

    System.out.println(); 

    Attribute copies = attributes.get(Copies.class); 
    Attribute media = attributes.get(Media.class); 
    Attribute mediaPrintableArea = attributes.get(MediaPrintableArea.class); 
    Attribute mediaTray = attributes.get(MediaTray.class); 
    Attribute orientationRequested = attributes.get(OrientationRequested.class); 
    Attribute sides = attributes.get(Sides.class); 
    System.out.println("copies: " + copies); 
    System.out.println("media: " + media); 
    System.out.println("mediaPrintableArea: " + mediaPrintableArea); 
    System.out.println("mediaTray: " + mediaTray); 
    System.out.println("orientationRequested: " + orientationRequested); 
    System.out.println("sides: " + sides); 

    attributes.remove(Sides.class); 
    attributes.add(Sides.DUPLEX); 

    job.print(); 
} 

利用上述我的例子中得到這個輸出:

media: iso-a4 
orientation-requested: portrait 
media-printable-area: (25.4,25.4)->(159.2,246.2)mm 
copies: 1 

copies: 1 
media: iso-a4 
mediaPrintableArea: (25.4,25.4)->(159.2,246.2)mm 
mediaTray: null 
orientationRequested: portrait 
sides: null 
+0

非常感謝,工作。我看到「打印對話框」上的「屬性」按鈕被禁用。有關如何啓用它的任何想法? – curie

+0

可能是因爲沒有什麼可打印的。你叫'job.setPrintable(...)'?請參閱[基本打印程序](https://docs.oracle.com/javase/tutorial/2d/printing/printable.html)。 –

+0

對我來說(使用我的打印機,在Windows上)打印對話框中的屬性按鈕已啓用並且正常工作。可能是您的打印機不支持任何屬性。 –