2011-03-31 16 views
5

Estoy intentando agregar la funcionalidad de impresión a nuestra UI basculante. He intentado lo siguiente:¿Cómo puedo imprimir una ventana abatible para que se ajuste bien en una sola página?

protected void print() { 
    PrinterJob job = PrinterJob.getPrinterJob(); 
    if(job.printDialog()){ 
     try { 
     job.setPrintable(new Printable() { 

      @Override 
      public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 
      if(pageIndex == 0){ 
       Graphics2D g2d = (Graphics2D)graphics; 
       g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 

//    BufferedImage snapshot = AnimUtilities.createSnapshotOfFrame(ApplicationFrame.this, Transparency.TRANSLUCENT); 
//    double scaleX = pageFormat.getWidth()/snapshot.getWidth(); 
//    double scaleY = pageFormat.getHeight()/snapshot.getHeight(); 
//    
//    double scaleValue = Math.min(scaleX, scaleY); 
//    g2d.scale(scaleValue, scaleValue); 
//    g2d.drawImage(snapshot, 0, 0, snapshot.getWidth(), snapshot.getHeight(), ApplicationFrame.this); 
//    ApplicationFrame.this.print(g2d); 
       ApplicationFrame.this.printAll(g2d); 
       return PAGE_EXISTS; 
      } 
      return NO_SUCH_PAGE; 
      } 
     }); 
     job.print(); 
     } catch (PrinterException e) { 
     e.printStackTrace(); 
     } 
    } else { 
     System.err.println("Error printing"); 
    } 
    } 

El código que no está comentada funciona muy bien en que lo que se ve muy bien impresa en el papel. Sin embargo, el JFrame es más grande que el papel, por lo que simplemente lo corta. También probé el código comentado que crea una imagen del JFrame, escala la imagen apropiadamente para que se ajuste a la página y mantenga la misma relación de aspecto, pero la escala hace que el texto en la pantalla se vea horrible. Encontré esto advanced tutorial from Oracle, pero eso indica cómo dividir la pantalla en varias páginas. Solo quiero imprimir una buena captura de pantalla del JFrame. ¿Cómo puedo imprimir el JFrame sin cortarlo o causar que los artefactos se escalen?

Respuesta

4

Puede obtener algún beneficio de RenderingHints. Me gustaría ver KEY_ANTIALIASING, KEY_TEXT_ANTIALIASING y KEY_FRACTIONALMETRICS en particular.

Editar:

RenderingHints.KEY_INTERPOLATION también ayuda, y AffineTransformOp.TYPE_BICUBIC es otra alternativa.

+0

Agregué g2d.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC) y activé el anti-aliasing y eso soluciona el problema de escala. Gracias. Todavía tengo algunos otros problemas, pero probablemente guardaré eso para otra pregunta si no puedo resolverlo. –

+0

¡Excelente! ['AffineTransformOp'] (http://download.oracle.com/javase/6/docs/api/java/awt/image/AffineTransformOp.html) es otra forma de obtener interpolación bicúbica también. – trashgod

Cuestiones relacionadas