Olá pessoal!
Eu estou usando a classe a seguir para imprimir a minha tela de cadastro.
Só que a imagem da tela de cadastro fica muito grande e fica cortada na folha A4.
Tem como deixar a imagem menor?
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
/**
*
* @author Andreia
*/
public class PrintableDocument implements Printable {
private Component compent;
public static void printComponent(Component c) {
new PrintableDocument(c).print();
}
public PrintableDocument(Component compent) {
this.compent = compent;
}
public void print() {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(this);
if (printJob.printDialog()) {
try {
printJob.print();
} catch (PrinterException ex) {
ex.printStackTrace();
}
}
}
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0) {
return (NO_SUCH_PAGE);
} else {
Graphics2D graph = (Graphics2D) g;
graph.translate(pageFormat.getImageableX(),
pageFormat.getImageableY());
disableBuffering(compent);
compent.paint(graph);
enableBuffering(compent);
return (PAGE_EXISTS);
}
}
private void disableBuffering(Component c) {
RepaintManager currentManager = RepaintManager.currentManager(c);
currentManager.setDoubleBufferingEnabled(false);
}
private void enableBuffering(Component c) {
RepaintManager currentManager = RepaintManager.currentManager(c);
currentManager.setDoubleBufferingEnabled(true);
}
}
Essa classe está incompleta, porque passa um objeto Graphics2D ao componente ( compent.paint(graph); ) mas não ajusta corretamente as coordenadas (“AffineTransform”) do objeto Graphics2D, de forma que o componente seja impresso corretamente.
Esse é meu diagnóstico, mas não sei exatamente como resolver isso.
Outra coisa é que o componente, em si, não informa seu próprio tamanho. Dependendo do gerenciador de layout usado pelo componente, se ele tiver a informação da classe Graphics que o tamanho disponível é muito grande, ele acaba se reformatando de forma que fique gigante, o que foi seu problema.
Conselho: imprimir uma tela Swing (como você fez no seu programa) costuma ser uma má solução, o correto é usar um gerenciador de relatórios (como o JasperReports) para imprimir o que você deseja (no seu caso, dados de um cadastro). Eu concordo que o trabalho é duplicado, mas você não vai mais ter esse problema.
[quote=entanglement]Essa classe está incompleta, porque passa um objeto Graphics2D ao componente ( compent.paint(graph); ) mas não ajusta corretamente as coordenadas (“AffineTransform”) do objeto Graphics2D, de forma que o componente seja impresso corretamente.
Esse é meu diagnóstico, mas não sei exatamente como resolver isso.
Outra coisa é que o componente, em si, não informa seu próprio tamanho. Dependendo do gerenciador de layout usado pelo componente, se ele tiver a informação da classe Graphics que o tamanho disponível é muito grande, ele acaba se reformatando de forma que fique gigante, o que foi seu problema.
Conselho: imprimir uma tela Swing (como você fez no seu programa) costuma ser uma má solução, o correto é usar um gerenciador de relatórios (como o JasperReports) para imprimir o que você deseja (no seu caso, dados de um cadastro). Eu concordo que o trabalho é duplicado, mas você não vai mais ter esse problema. [/quote]
entanglement, obrigada pela sua resposta! Foi muito esclarecedora.
Vou ter que seguir o seu conselho mesmo. Obrigada!