收聽列印作業請求狀態更改

對於大多數列印客戶端,瞭解列印作業是否已完成或失敗非常有用。

Java Print Service API 提供了一些功能,可以瞭解這些方案。我們所要做的就是:

  • PrintJobListener 介面提供實現
  • 在列印作業中註冊此實現。

當列印作業狀態發生變化時,我們會收到通知。我們可以做任何事情,例如:

  • 更新使用者介面,
  • 開始另一個業務流程,
  • 記錄資料庫中的內容,
  • 或者只是記錄它。

在下面的示例中,我們將記錄每個列印作業狀態更改:

import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;

public class LoggerPrintJobListener implements PrintJobListener {

    // Your favorite Logger class goes here!
    private static final Logger LOG = Logger.getLogger(LoggerPrintJobListener.class);

    public void printDataTransferCompleted(PrintJobEvent pje) {
        LOG.info("Print data transfer completed ;) ");
    }

    public void printJobCompleted(PrintJobEvent pje) {
        LOG.info("Print job completed =) ");
    }

    public void printJobFailed(PrintJobEvent pje) {
        LOG.info("Print job failed =( ");
    }

    public void printJobCanceled(PrintJobEvent pje) {
        LOG.info("Print job canceled :| ");
    }

    public void printJobNoMoreEvents(PrintJobEvent pje) {
        LOG.info("No more events to the job ");
    }

    public void printJobRequiresAttention(PrintJobEvent pje) {
        LOG.info("Print job requires attention :O ");
    }
}

最後,我們可以在列印請求本身之前在列印作業上新增我們的列印作業偵聽器實現,如下所示:

DocPrintJob printJob = printService.createPrintJob();

printJob.addPrintJobListener(new LoggerPrintJobListener());

printJob.print(doc, pras);

PrintJobEvent 司法警察的說法

請注意,每個方法都有一個 PrintJobEvent pje 引數。出於簡單的目的,我們不在此示例中使用它,但你可以使用它來探索狀態。例如:

pje.getPrintJob().getAttributes();

將返回一個 PrintJobAttributeSet 物件例項,你可以以各種方式執行它們。

實現同一目標的另一種方式

實現相同目標的另一個選擇是擴充套件 PrintJobAdapter 類,正如其名稱所示,是 PrintJobListener 的介面卡。我們強制執行介面必須實現所有這些介面。這種方式的優點是我們只需要覆蓋我們想要的方法。讓我們看看它是如何工作的:

import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobAdapter;

public class LoggerPrintJobAdapter extends PrintJobAdapter {

    // Your favorite Logger class goes here!
    private static final Logger LOG = Logger.getLogger(LoggerPrintJobAdapter.class);

    public void printJobCompleted(PrintJobEvent pje) {
        LOG.info("Print job completed =) ");
    }

    public void printJobFailed(PrintJobEvent pje) {
        LOG.info("Print job failed =( ");
    }
}

請注意,我們只覆蓋一些特定的方法。

在實現介面 PrintJobListener 的示例中,我們將偵聽器新增到列印作業,然後再將其傳送到列印:

printJob.addPrintJobListener(new LoggerPrintJobAdapter());

printJob.print(doc, pras);