Oi pessoal,
Eu estive apanhando um bocado para conseguir imprimir JTables aqui em casa. Teoricamente, isto deveria ser uma tarefa fácil, visto que a classe possui um método print() desde a versão 1.5. Entretanto, aqui em casa a impressora ou não imprimia nada, ou não imprimia o conteúdo das células da JTable. Depois de pesquisar um bocado vi que o XP pode ter problemas com o javax.swing. Eu não lembro mais o link, mas é um bug relatado inclusive no site da Microsoft.
Resumindo, eu na verdade não tenho dúvidas, apenas criei o tópico para enviar um código que acabei de fazer e testar para imprimir Components apenas usando java.awt.print. Se mais alguém tiver outros códigos mais simples, ou quiser me ajudar a descobrir por que o javax.swing não funciona direito aqui eu agradeço.
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
public class Imprimir implements Printable {
private PageFormat pFormat;
private PrinterJob pJob;
private Component comp;
boolean scaleWidthToFit = true;
public Imprimir(Component comp) {
pFormat = new PageFormat();
pJob = PrinterJob.getPrinterJob();
this.comp = comp;
printDialog();
}
private void printDialog() {
if (pJob.printDialog()) {
pJob.setPrintable(this, pFormat);
try {
pJob.print();
} catch (PrinterException printerException) {
System.out.println("Erro ao imprimir documento.");
}
}
}
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
double scale = 1.0;
Graphics2D graphics2D;
graphics2D = (Graphics2D) graphics;
comp.setSize((int) pageFormat.getImageableWidth(), (int) pageFormat
.getImageableHeight());
comp.validate();
if ((scaleWidthToFit)
&& (comp.getMinimumSize().getWidth() > pageFormat
.getImageableWidth())) {
scale = pageFormat.getImageableWidth()
/ comp.getMinimumSize().getWidth();
graphics2D.scale(scale, scale);
}
graphics2D.setClip((int) (pageFormat.getImageableX() / scale),
(int) (pageFormat.getImageableY() / scale), (int) (pageFormat
.getImageableWidth() / scale), (int) (pageFormat
.getImageableHeight() / scale));
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
graphics2D.translate(graphics2D.getClipBounds().getX(), graphics2D
.getClipBounds().getY());
comp.paint(graphics2D);
return Printable.PAGE_EXISTS;
}
}
Esse código eu fiz baseado em um código que eu encontrei na internet que possuía o seguinte cabeçalho:
/**
- PrintMe is a class that lets you print documents on
- the fly for free
Printing in JDK 1.2 - 1.5 is hard. - With this, you just simply call it in your application
- and add your text component like JTextPane:
- new PrintMe().print(YourJTextComponent);
- Reminder: Just make sure there is a text on your component
- Author : Jan Michael Soan
- WebSite: http://www.jmsoan.com
- Date : 04/17/2004
- Time : 2:20 PM
*/
Printing in JDK 1.2 - 1.5 is hard.