Imprimir exatamente a tela como aparece, no SWING, JFRAME, JPANEL, JInternalFrame, tanto faz

12 respostas
R

Então…

Digamos que tenho um formulário em swing, está dentro de um JPanel, que está dentro de JinternalFrame, eu gostaria de imprimir exatamente o que tem na tela.

Por exemplo, se fosse um formulário web, era só ir em arquivo e imprimir a tela, como está página por exemplo… agora no java eu não sei se da de fazer…

Tem como?

12 Respostas

J

Além de ter como, eu por acaso tenho a classe pronta aqui. Pequei isso de site há algum tempo (não lembro mais qual) e dei um modificada.

package com.powernet.jprint;

import java.awt.*;
import javax.swing.*;
import java.awt.print.*;


/** A simple utility class that lets you very simply print
 *  an arbitrary component. Just pass the component to the
 *  Printer.printComponent. The component you want to
 *  print doesn't need a print method and doesn't have to
 *  implement any interface or do anything special at all.
 *  If you are going to be printing many times, it is
 *  marginally more efficient to first do the following:
 *  <code>
 *  Printer printHelper = new Printer(theComponent);
 *  </code>
 *  then later do <code>printHelper.print()</code>. But
 *  this is a very tiny difference, so in most cases
 *  just do the simpler: 
 *  <code>
 *  Printer.printComponent(componentToBePrinted).
 *  </code>
 */
public class Printer implements Printable {
  
  private Component componentToBePrinted;
  
  private PrinterJob printJob;
  
  private PageFormat page;
  
  public Printer(Component componentToBePrinted) {
    
    this.componentToBePrinted = componentToBePrinted;
    
    this.printJob = PrinterJob.getPrinterJob();
    
    page = printJob.defaultPage();
    
  }//method()
  
  
  public Printer(Component componentToBePrinted, String jobName) {
    
    this(componentToBePrinted);
    
    this.setJobName(jobName);
    
  }//method()
  
  
  public static void printComponent(Component c) {
    
    new Printer(c).print();
    
  }//method()
  
  
  public void print() {
    
    printJob.setPrintable(this, page);
    
    if (printJob.printDialog())
      
      try {
        
        printJob.print();
        
      } catch(PrinterException pe) {
        
        System.out.println("Error printing: " + pe);
        
      }
      
  }//method()
  
  
  /**
   * Este metodo eh invocado por PrintJob para imprimir
   * a instância de <code>Printable</code>.
   */
  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    
    if (pageIndex > 0) {
      
      return(NO_SUCH_PAGE);
      
    } else {
      
      Graphics2D g2d = (Graphics2D)g;
      
      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
      
      disableDoubleBuffering(componentToBePrinted);
      
      componentToBePrinted.paint(g2d);
      
      enableDoubleBuffering(componentToBePrinted);
      
      return(PAGE_EXISTS);
      
    }//if-else
    
  }//method()
  
  
  public void setJobName(String jobName) {
    
    printJob.setJobName(jobName);
    
  }//method()
  
  
  public void pageSetup() {
    
    page = printJob.pageDialog(page);
    
  }//method()
  
  
  /** The speed and quality of printing suffers dramatically if
   *  any of the containers have double buffering turned on.
   *  So this turns if off globally.
   *  @see enableDoubleBuffering
   */
  public static void disableDoubleBuffering(Component c) {
    
    RepaintManager currentManager = RepaintManager.currentManager(c);
    
    currentManager.setDoubleBufferingEnabled(false);
    
  }//method()
  
  
  /** Re-enables double buffering globally. */
  public static void enableDoubleBuffering(Component c) {
    
    RepaintManager currentManager = RepaintManager.currentManager(c);
    
    currentManager.setDoubleBufferingEnabled(true);
    
  }//method()
  
}//class
R

Além de ter como, eu por acaso tenho a classe pronta aqui. Pequei isso de site há algum tempo (não lembro mais qual) e dei um modificada.

...

Opa, assim que testar coloco o retorno de como ficou…abraço

R

Além de ter como, eu por acaso tenho a classe pronta aqui. Pequei isso de site há algum tempo (não lembro mais qual) e dei um modificada.

...

Opa, assim que testar coloco o retorno de como ficou…abraço

Então… Ele imprime, porém na´fica nada bom, fica ampliado e tals, será que tem algum componente que é mais ideal pra ele?

Ou alguém mais ja teve esse problema em imprimir a tela do programa, formulário, Jpanl, Jframe, ou qualquer coisa assim??

E

Experimente tirar um Shift+PrintScreen dessa tela, abrir o MS-Paint ou outro programa que permita pegar uma imagem do clipboard, e mandar imprimir para mostrar a tela completa. Vai ver que vai ficar tão tosco quanto essa classe que lhe passaram gentilmente.

O correto, é claro, é você desenhar especialmente o que você quer mostrar na impressora. Como devem ter lhe dito, simplesmente tirar uma cópia da tela e mandar imprimir vai ficar sempre tosco - e isso é porque a resolução da tela (usualmente 96 pontos por polegada, ou menos) é muito pior que a da impressora (usualmente 600 ou 1200 pontos por polegada). Quando você amplia essa resolução da tela, vai ter uma imagem tosca mesmo.

E

Uma forma de ter uma tela impressa perfeitamente é você trabalhar com WPF (Windows Presentation Foundation) - há um módulo do Eclipse RCP que permite usar o WPF. Entretanto, ele aparenta ter sido descontinuado.

http://dev.eclipse.org/mhonarc/lists/eclipse.org-committers/msg00800.html

R

entanglement:
rcipriani:

Então… Ele imprime, porém na´fica nada bom, fica ampliado e tals, será que tem algum componente que é mais ideal pra ele?

Experimente tirar um Shift+PrintScreen dessa tela, abrir o MS-Paint ou outro programa que permita pegar uma imagem do clipboard, e mandar imprimir para mostrar a tela completa. Vai ver que vai ficar tão tosco quanto essa classe que lhe passaram gentilmente.

O correto, é claro, é você desenhar especialmente o que você quer mostrar na impressora. Como devem ter lhe dito, simplesmente tirar uma cópia da tela e mandar imprimir vai ficar sempre tosco - e isso é porque a resolução da tela (usualmente 96 pontos por polegada, ou menos) é muito pior que a da impressora (usualmente 600 ou 1200 pontos por polegada). Quando você amplia essa resolução da tela, vai ter uma imagem tosca mesmo.

Vlw pela atenção ai…

Então, o que essa classe faz é:
Pegar a tela e imprimir…

Porém se tiver barra de rolagem ou algo do tipo ja ferra…

o que eu to precisando e não estou conseguindo fazer é o seguinte:
Imprimir um relatório, que pode ter várias páginas e tals… se fosse um relatório com texto simples, é fácil fazer com XML, String mesmo, Jasper, IReport, porém gostaria de criar visualmente a tela do relatório, e completa-la com as variaveis na hora, ou uma tabela com valores do banco de dados, etc etc etc…

Abraço

J

Amigo, para o que vc quer, acho que seria mais indicado criar o relatório em pdf para mandar imprimir, ou mesmo para ser visualizado depois de pronto.
Vc pode usar o iText (http://itextpdf.com/) para gerar o pdf e o JPedal(http://www.jpedal.org/) para exibi-lo em sua aplicação.
Curiosamente tenho um projeto parecido e é o que pretendo usar.

R

juno.rr:
Amigo, para o que vc quer, acho que seria mais indicado criar o relatório em pdf para mandar imprimir, ou mesmo para ser visualizado depois de pronto.
Vc pode usar o iText (http://itextpdf.com/) para gerar o pdf e o JPedal(http://www.jpedal.org/) para exibi-lo em sua aplicação.
Curiosamente tenho um projeto parecido e é o que pretendo usar.

Opa, imagino que isso pode ajudar sim…
Mas tem uma coisa, no iText, pra fazer esse relatório, vai ser todo em código, não vo pode criar as tabelas e locais pros dados no relatório visualmente…

Entende? Tipo um Template de relatório que é preenchido com os dados do banco…

J

É verdade, mas a lógica de funcionamento do iText é parecida com html, só que muito melhor, então não é muito difícil criar um documento a partir de um modelo visual criado com swing, por exemplo.

R

Humm… vo da uma textada então, depois coloco os resultados…

Obrigado

R

Cara, por acaso tu conseguiu resolver este problema de imprimir o conteúdo de um JFrame por completo, usando paginaçõa ou algo assim?

Pergunto, pois estou com o mesmo problema…

Abraço.

R

Cara, por acaso tu conseguiu resolver este problema de imprimir o conteúdo de um JFrame por completo, usando paginaçõa ou algo assim?

Pergunto, pois estou com o mesmo problema…

Abraço.

Não consegui não.
Se eu me lembro bem eu fiz um documento HTML e jogava o relatório la dentro, então imprimia ele…

Criado 2 de setembro de 2010
Ultima resposta 1 de fev. de 2011
Respostas 12
Participantes 4