Слушатель для java.awt.print.PrinterJob - PullRequest
5 голосов
/ 01 ноября 2010

Доступен ли слушатель для java.awt.print.PrinterJob?Я мог найти только PrintJobListener в javax.print.DocPrintJob.Я ищу его эквивалент в java.awt.print.PrinterJob, чтобы я мог отследить, есть ли проблемы при печати. ​​

Ответы [ 3 ]

3 голосов
/ 29 июня 2012

Это будет похоже на решение старого вопроса, но для тех, кто ищет ответ, как я, я надеюсь, что это поможет.

Можно использовать события только для java.awt, конвертировав вашу печатную форму в javax.print. Вот как вы можете сделать это правильно, не нарушая формат страницы.

    // get default service
    PrintService service = PrintServiceLookup.lookupDefaultPrintService();
    // this is your old awt job, which you can use to get default pageFormat
    PrinterJob job = PrinterJob.getPrinterJob();
    // set your printer service to old awt so that you can get the default paper
    job.setPrintService(service);
    // get the default page format from the printer you selected
    PageFormat pageFormat = job.getPageFormat(null);
    // do some paper stuff etc. here
    // get your doc
    DocPrintJob printJob = service.createPrintJob();
    Book book = new Book();
    // Print interface implements printable
    book.append(new PrintInterface(), pageFormat);
    // make your attr here
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    aset.add(PrintQuality.HIGH);
    // Create your doc for pageable
    SimpleDoc doc = new SimpleDoc(book, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);
    /// and voila, print it
    printJob.print(doc, aset);

То же самое можно сделать для одной печатной формы, но в настоящее время я не смог найти способ изменить PageFormat для этого, поэтому я просто пропустил ее. Таким образом, вы можете использовать Pageable или Printable, и вы все равно можете использовать эти события, просто добавив их с помощью printJob.addPrintJobListener ()

Это ни в коем случае не полный код, но он дает вам представление о том, хотите ли вы его.

1 голос
/ 06 февраля 2016

Вдохновленный @ cappytoi answer , я создал ListenablePrinterJob класс, который позволяет вам печатать экземпляры Printable , Pageable и Doc .

Пример использования

PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
ListenablePrinterJob job = new ListenablePrinterJob(defaultPrintService);

job.setPrintJobListener(new PrintJobAdapter() {
    // implement listeners for events that you want
});

// Print Printable with default page format of PrintService
job.print(printable);

// Print Printable with given page format
job.print(printable, pageFormat);

// Print Pageable
job.print(pageable);

// Print Doc
job.print(doc);

Полный исходный код

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.SimpleDoc;
import javax.print.event.PrintJobListener;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;

public class ListenablePrinterJob {

    private final PrintService printService;

    private PrintJobListener printJobListener;


    public ListenablePrinterJob(PrintService printService) {
        this.printService = printService;
    }


    private static PageFormat getDefaultPageFormat() {
        return PrinterJob.getPrinterJob().defaultPage();
    }

    private static Pageable toPageable(Printable printable, PageFormat page, int numPages) {
        Book book = new Book();
        book.append(printable, page, numPages);
        return book;
    }


    /**
     * Prints single-page {@link Printable}.
     */
    public void print(Printable printable) throws PrintException {
        print(printable, getDefaultPageFormat());
    }

    /**
     * Prints {@link Printable} that has {@code numPages} pages.
     */
    public void print(Printable printable, int numPages) throws PrintException {
        print(printable, numPages, getDefaultPageFormat());
    }

    /**
     * Prints single-page {@link Printable}.
     */
    public void print(Printable printable, PageFormat pageFormat) throws PrintException {
        print(toPageable(printable, pageFormat, 1));
    }

    /**
     * Prints {@link Printable} that has {@code numPages} pages.
     */
    public void print(Printable printable, int numPages, PageFormat pageFormat) throws PrintException {
        print(toPageable(printable, pageFormat, numPages));
    }

    public void print(Pageable pageable) throws PrintException {
        print(new SimpleDoc(pageable, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null));
    }

    public void print(Doc doc) throws PrintException {

        DocPrintJob printJob = printService.createPrintJob();
        printJob.addPrintJobListener(printJobListener);
        printJob.print(doc, null);
    }

    public void setPrintJobListener(PrintJobListener printJobListener) {
        this.printJobListener = printJobListener;
    }
}
1 голос
/ 02 ноября 2010

Вызвав getPrintService на PrinterJob, вы можете получить javax.print.PrintService с методом addPrintServiceAttributeListener, который позволит вам прослушивать PrintServiceAttributeEvents.

...