javax.print.eventパッケージおよびサービス上のリスナーを登録するメソッドおよびDocPrintJobを含む)は、AWTで使用される使い慣れたリスナー・モデルに従います。javax.print.event.PrintServiceAttributeListenerインタフェースを実装し、PrintServiceにリスナーとして自身をインストールすることで、印刷サービスのイベントをモニターできます: 
public class PrintPS implements PrintServiceAttributeListener {
        ...
        pservices[0].addPrintServiceAttributeListener(this);
        ...
        public void attributeUpdate(PrintServiceAttributeEvent e){
                // Do something if an attribute is updated
        }
...
 PrintServiceAttributeListener.attributeUpdate()メソッドは、印刷サービス属性が変更されたときに呼び出されます。 このサービスは、PrintServiceAttributeListenerインタフェースを使用して、サポートするイベントを決定します。 
アプリケーションは、サービスがどの要求属性をサポートしているかを検出するために使用するのと同じ照会メソッドを使用して、サービスがどの印刷サービス属性をサポートしているかを検出できます。 たとえば、サービスがQueuedJobCount属性をサポートしているかどうかを検出するには、アプリケーションがコール: service.isAttributeCategorySupported(QueuedJobCount.class). 
PrintJobAttributeListenerとPrintJobListenerの2種類のリスナーをDocPrintJobにインストールできます。PrintJobAttributeListenerは、サービス属性リスナーに似ています: ジョブは、PrintJobAttributeインタフェースを実装する属性の変更を報告します。 通常、これらの属性は、印刷要求属性でもあり、印刷ジョブのライフタイム全体にわたって固定されます。 JobMediaSheetsCompletedなどのいくつかの属性のみが変更される可能性があります。 この詳細度の粒度に関心のあるクライアントはほとんどなく、この機能をサポートするサービスはさらに少ないため、クライアントはPrintJobListenerを使用してジョブの進捗状況を監視する可能性が最も高くなります。PrintJobListener is easier to use than PrintJobAttributeListener because it delivers simple messages, such as printJobCompleted or printJobFailed. このインタフェースには、6個のメソッドだけが組み込まれています。これらのメソッドは、重要で単純な情報をイベントとして報告します。 便宜上、アダプタ・クラスPrintJobAdapterは、これらの6つのメソッドのデフォルト実装を提供します。 
特に1つのメッセージ: printJobNoMoreEventsは異常ですが有用です。 クライアントでは、多くの場合、ジョブの終了または失敗を把握する必要があります。 可能な場合は、サービスはこのような「終了」イベントを配信する必要があります。ただし、ジョブの終了または失敗をサービスが判断できない場合は、「完了」メッセージによって誤った処理が実行されることがあります。 たとえば、あるジョブが、表示されないキューを持つネットワーク印刷サービスにスプールされることがあります。 この場合、「no more events」というメッセージではジョブが成功したことを示すのに十分ではありませんが、クライアントは少なくとも失敗したことがわかっているわけではないことを推測できます。 次の例は、printJobNoMoreEventsメッセージをモニターするリスナーの追加を示しています: 
public class PrintPS extends PrintJobAdapter{
        ...
        pj.addPrintJobListener(this);
        ...
        public void printJobNoMoreEvents(PrintJobEvent e){
                // Do something here
        }
...