Повторяет попытку печати Java? - PullRequest
0 голосов
/ 13 августа 2010

Если вы запустите следующий код (из здесь ), обе страницы будут вызываться дважды:

class PrintObject implements Printable
{
    public int print (Graphics g, PageFormat f, int pageIndex)
    {
        System.out.println("Page "+pageIndex);
        Graphics2D g2 = (Graphics2D) g; // Allow use of Java 2 graphics on
        // the print pages :

        // A rectangle that shows the printable area of the page, allowing
        // for margins all round. To be drawn on the first page (index = 0).
        Rectangle2D rect = new Rectangle2D.Double(f.getImageableX(),
        f.getImageableY(),
        f.getImageableWidth(),
        f.getImageableHeight());

        // A simple circle to go on the second page (index = 1).
        Ellipse2D circle = new Ellipse2D.Double(100,100,100,100);

        switch (pageIndex)
        {
            case 0 : g2.setColor(Color.black); // Page 1 : print a rectangle
                g2.draw(rect);
                return PAGE_EXISTS;
            case 1 : g2.setColor(Color.red); // Page 2 : print a circle
                g2.draw(circle);
                return PAGE_EXISTS;
            default: return NO_SUCH_PAGE; // No other pages
        }
    }


    public static void main (String[] args)
    {
        // Create an object that will hold all print parameters, such as
        // page size, printer resolution. In addition, it manages the print
        // process (job).
        PrinterJob job = PrinterJob.getPrinterJob();

        // It is first called to tell it what object will print each page.
        job.setPrintable(new PrintObject());

        // Then it is called to display the standard print options dialog.
        if (job.printDialog())
        {
        // If the user has pressed OK (printDialog returns true), then go
        // ahead with the printing. This is started by the simple call to
        // the job print() method. When it runs, it calls the page print
        // object for page index 0. Then page index 1, 2, and so on
        // until NO_SUCH_PAGE is returned.
        try { job.print(); }
        catch (PrinterException e) { System.out.println(e); }
        }
    }
}

Я не знаю, почему это будет сделано в таком простом случаено реальная проблема в том, что у нас есть код, который печатает большой JTable, и он пытается повторить печать более 500 раз, прежде чем это удастся.Даже для относительно небольшого JTable он повторяется 11 раз.Мы используем java.awt.print.PrintJob, отключили двойную буферизацию и тестирование с использованием CutePDF на машине с 2G RAM и 1G Heap (-Xmx1000m)

Кто-нибудь знает, что вызвало бы столько попыток?

1 Ответ

0 голосов
/ 13 августа 2010

Я предполагаю, что вы говорите о том, как часто он вызывает метод print (...) для каждой страницы.

К сожалению, нет реального способа узнать, сколько раз он будет вызываться, многоменьше контролировать его, так как он работает в подсистеме печати JVM для вашей системы.

Все, что вы можете сделать, - это сделать все возможное, чтобы оптимизировать процедуру рисования, зная, что ее можно вызывать более одного раза (или даже чрезмерно)).

Возможно, вам стоит взглянуть и на ClipBounds Graphic2D, она может сказать вам, какое подмножество всей страницы печатается.

В моем простом тесте на Mac с использованием вашегокод, печать вызывается дважды для каждой страницы.Однажды с графикой, которая выглядит так, как будто она использовалась, чтобы получить представление о том, что вы собираетесь печатать, а затем в другой раз с реальной системой Graphics2D, которая выполняет этот фактический рендеринг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...