2013-07-11 3 views
1

Я пишу программу, которая берет мою текстовую область с уже сгенерированными данными, и ее нужно распечатать. Я получил его, чтобы рассчитать, сколько страниц потребуется для печати всего текстового поля, но вместо печати на странице 1 и затем на странице 2 он снова печатает страницу 1, а затем страницу 1. Кажется, я не могу заставить его работать, чтобы спасти мою жизнь. Я просматривал все форумы и помогал в оракуле, но, должно быть, чего-то не хватает. Если бы вы могли быть добрыми и заняли минуту, чтобы посмотреть на мой код, я буду так благодарен. Благодарю. -GarrettПечать нескольких страниц с Swing

private void hardPrintActionPerformed(java.awt.event.ActionEvent evt)  
{           
    int width = printOut.getWidth() ; 
    int height = printOut.getHeight(); 
    System.out.println("width is "+ width); 
    System.out.println("Height is "+height); 

    String font = fontSize.getText(); 
    int FontS = Integer.parseInt(font); 
    Font fonT = new Font("Monospaced", Font.PLAIN, 12); 

    printOut.setFont(new Font("Tahoma", Font.PLAIN, FontS)); 

    PrinterJob pj = PrinterJob.getPrinterJob(); 
    PageFormat pf = pj.defaultPage(); 

    Book bk = new Book(); 
    Paper paper = new Paper(); 

    double margin = 18;  
    pj.setPageable(bk); 

    paper.setSize(612,792); 
    paper.setImageableArea(margin, margin 
       , paper.getWidth() -margin * 2 
       , paper.getHeight() - margin * 2); 
    int lines = printOut.getLineCount(); 
    System.out.println("lines = "+lines); 
    pf.setPaper(paper); 
    int tall = (int) pf.getImageableHeight(); 
    System.out.println("tall ="+tall); 
    System.out.println("orientation "+pf.getOrientation()); 

    int pagenum =bk.getNumberOfPages(); 
    System.out.println("pagenum = "+pagenum); 
    System.out.println("areah = "+height); 
    int numpages =1; 
    if (height >756) { 
     for (int i = 756; i < height;) { 
      numpages = numpages+1; 
      i= i +756; 
     } 
    } 
    System.out.println("numpages ="+numpages); 
    bk.append(new MyPrintable(), pf,numpages); 

    // pj.setPrintable(new MyPrintable(), pf); 
    if (pj.printDialog()) { 
     try { 
      printOut.setBounds(0, 0, printOut.getWidth(), printOut.getHeight()); 
      pj.print(); 
     } catch (PrinterException pp) { 
      System.out.println(pp); 
     } 
    } 
} 

/** 
* @param args the command line arguments 
*/ 
class MyPrintable implements Printable { 
    public int print(Graphics g, PageFormat pf, int pageIndex) { 
     //int pagenum =bk.getNumberOfPages(); 
     int height = printOut.getHeight(); 
     int numpages =1; 
     if (height >756) { 
      for (int i = 756; i < height;) { 
       numpages = numpages+1; 
       i= i +756; 
      } 
     } 
     if (pageIndex >3) 
      return NO_SUCH_PAGE; 
     else{ 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setFont(new Font("Monospaced", Font.PLAIN, 10)); 
      printOut.setBounds(0, 0, printOut.getWidth(), printOut.getHeight()); 
      // paper.getImageableWidth(); 
      g2.translate(pf.getImageableX(), pf.getImageableY()); 
      System.out.println("print " +pf.getImageableY()); 
      Rectangle componentBounds = printOut.getBounds(); 
      g2.translate(-componentBounds.x, -componentBounds.y); 
      g2.scale(1, 1); 
      boolean wasBuffered = printOut.isDoubleBuffered(); 
      printOut.printAll(g2); //printOut is my text area. 
      printOut.setDoubleBuffered(wasBuffered); 

      return PAGE_EXISTS; 
     } 
    } 
} 
+0

crossposted на Java Форумы Ranch и Java – mKorbel

ответ

0

ли вам действительно нужно использовать PrintJob для этого ?, почему не использовать JasperReports, чтобы сделать ваш PDF (как плюс, вы получите библиотеку, сделать PDF, XLS и многие другие форматы), вы не можете дизайна в IReports, а затем использовать его с яшмой, или создать отчет из кода, очень эффективный инструмент: D

3

Вам нужно играть с g2.translate(-componentBounds.x, -componentBounds.y);

Исправьте Y с pageIndex*pageHeight

Смежные вопросы