boa tarde a todos, alguem sabe se é possivel imprimir uma JTable ?
se alguem tiver link’s ou exemplos são bem vindos, valeu!
consegui imprimir uma JTable segue como fiz…
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.PrintJob;
import java.awt.Toolkit;
import javax.swing.JTable;
public
class ImprimirJTable{
private Frame
frame;
private Toolkit
toolKit;
private PrintJob
printJob;
private Graphics
graphics;
public ImprimirJTable(JTable ao_tabela){
frame = new Frame();
toolKit = frame.getToolkit();
printJob = toolKit.getPrintJob( frame,
"",
null
);
if (printJob != null){
graphics = printJob.getGraphics();
ao_tabela.print(graphics);
printJob.end();
}
frame.dispose();
}
}
mas a impressao sai errada, a primeira linha sai cortada no meio…
alguem já passou por isso ? alguma solução ?
acabei descobrindo que o problema esta no tamanho que a tabela é impressa ela sai muito grande disproporcional a folha, se alguem por ventura :lol: saber como se arruma isso da uma luz :idea: ae… 
A classe JTable do J2SE 1.5 vem com um novo método print() (sobrecarregado) para imprimir… veja na API! 
ainda usamos J2SDK 1.4 aqui na empresa, mas valeu a intenção… 
*continuo sem uma solução…
consegui! :lol: após uma noite de sono e uma boa procurada no google consegui um exemplo de AdvancedPrinting e imprimi a JTable!
agradeço a todos que pelo menos olharam o topico, com a intenção de tentar ajudar… 
import java.awt.Color;
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;
import javax.swing.JOptionPane;
import javax.swing.JTable;
/**
* Classe que imprime uma JTable
@author Guilherme I. Keller
TODO - Uma melhor explicacao & comentarios.
*/
public
class ImprimirJTable
implements Printable{
private JTable
tabela;
private PrinterJob
printerJob;
private Graphics
graphics;
private Graphics2D
graphics2d;
/**
* Metodo construtor da classe
@param tabela
Uma JTable a ser impressa
*/
public ImprimirJTable(JTable tabela){
this.tabela = tabela;
printerJob = printerJob.getPrinterJob();
printerJob.setPrintable(this);
printerJob.setJobName("Imprimindo uma JTable");
if (printerJob.printDialog())
{
try
{
printerJob.print();
}
catch (PrinterException ex)
{
JOptionPane.showMessageDialog( null,
"Ocorreu um erro durante a impressão. \n"+ex.toString(),
"Erro do Sistema",
JOptionPane.ERROR_MESSAGE
);
}
}
}
/**
* Metodo responsavel pela impressao da JTable
*/
public
int print( Graphics g,
PageFormat pageFormat,
int pageIndex
)
throws PrinterException{
graphics2d = (Graphics2D) g;
graphics2d.setColor(Color.black);
int
fontHeight = graphics2d.getFontMetrics().getHeight();
int
fontDesent = graphics2d.getFontMetrics().getDescent();
// leave room for page number
double
pageHeight = pageFormat.getImageableHeight()-fontHeight;
double
pageWidth = pageFormat.getImageableWidth();
double
tableWidth = (double) tabela.getColumnModel().getTotalColumnWidth();
double
scale = 1;
if (tableWidth >= pageWidth){
scale = pageWidth / tableWidth;
}
double
headerHeightOnPage = tabela.getTableHeader().getHeight()*scale;
double
tableWidthOnPage = tableWidth*scale;
double
oneRowHeight = (tabela.getRowHeight()+ tabela.getRowMargin())*scale;
int
numRowsOnAPage = (int) ((pageHeight-headerHeightOnPage)/oneRowHeight);
double
pageHeightForTable = oneRowHeight*numRowsOnAPage;
int
totalNumPages = (int) Math.ceil( ( (double)tabela.getRowCount() ) / numRowsOnAPage);
if (pageIndex >= totalNumPages){
return NO_SUCH_PAGE; //No more pages
}
graphics2d.translate( pageFormat.getImageableX(),
pageFormat.getImageableY()
);
graphics2d.translate( 0f,
headerHeightOnPage
);
graphics2d.translate( 0f,
-pageIndex*pageHeightForTable
);
// If this piece of the table is smaller than the size available,
// clip to the appropriate bounds.
if (pageIndex + 1 == totalNumPages){
int
lastRowPrinted = numRowsOnAPage * pageIndex;
int
numRowsLeft = tabela.getRowCount() - lastRowPrinted;
graphics2d.setClip( 0,
(int) (pageHeightForTable * pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(oneRowHeight * numRowsLeft)
);
}
// else clip to the entire area available.
else{
graphics2d.setClip( 0,
(int) (pageHeightForTable*pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(pageHeightForTable)
);
}
graphics2d.scale( scale,
scale
);
tabela.paint(graphics2d);
graphics2d.scale( 1 / scale,
1 / scale
);
graphics2d.translate( 0f,
pageIndex * pageHeightForTable
);
graphics2d.translate( 0f,
-headerHeightOnPage
);
graphics2d.setClip( 0,
0,
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(headerHeightOnPage)
);
graphics2d.scale( scale,
scale
);
tabela.getTableHeader().paint(graphics2d); // paint header at top
return Printable.PAGE_EXISTS; // continues printing
}
}
- tá faltando fazer os comentarios e tal mas o mais importante ela já faz… []'s
Mas como faço quando eu crio um objeto desta classe, e tento mandar imprimir ele diz que o método ImprimirJTable(passo uma JTable) não existe… e Ai???
faça um botao que no clique dele vc faz…
new ImprimirJTable(suaJTable);
beleza ? se nao conseguir só postar…
aleeeee topico de numero 300! o mais novo JavaEvangelist! :lol:
Olá,
Alguém poderia me ajudar? Esse código funcionou perfeitamente, porém ao invés de diminuir a escala para enquadrar a tabela numa folha, eu preciso que ocorra a paginação para os lados…
Alguém sabe como fazer isso?
Abraços,
Rodnei Couto
Moitas gracias, o método funciona moi ben, pero ¿como podo facer para conseguir unha marxen na parte superior do papel? (quero deixar un espazo para o logotipo da empresa)
Moitas gracias
P.D.: Son español, perdoade o meu mal idioma
¿Ninguen sabe?
Oi,
Sua classe que imprime Jtable e achei perfeita.
Eu preciso escrever algumas palavras antes da Jtable. Como eu faço isso?
Obrigada.
Patty
Como assim “Antes” da JTable?
Cria um JPanel e adiciona um Label antes ué?Explica mellhr se for o caso…
Na impressão deve estar a Jtable e algumas palavras antes (data do dia da impressao). Entendeu?
Obrigada 
Se for “antes” da impressão, vc terá que criar um Label mesmo, e adicionar ao seu componente, mas se for “na impressão”, eu sugiro a vc criar uma string que servirá de Cabeçalho que deve ser passada ao método drawString dentro do método print.Algo mais ou - assim:
Graphics2D g2=(Graphics2D) graphics;
String s="RELATÓRIO DE MUTRETAS DO CONGRESSO NACIONAL"
g2.drawString(s,coluna,10);
s= “Núm Data Valor Vencimento “;
g2.drawString(s,coluna,50);
s=”___ ___ ____ ____”;
g2.drawString(s,coluna,65);
//faz busca, preenche componentes blbalbla…
return Printable.PAGE_EXISTS;
Acho melhor vc dar uma olhada nessa página que possui vários exemplos:
http://www.java2s.com/ExampleCode/2D-Graphics-GUI/PrintinJava2PrinterJob.htm
Vi o que postou mas na verdade não sei nada sobre isso e por isso não consegui fazer.
As palavras são para estar como cabeçalho na impressão da JTable
Se puder me ajudem
Obrigada
Bom dia
eu ja utlizo este codigo a um tempinho
porem me ocorreu a mesma necessidade da patty, preciso imprimir na folha, uma string antes da jtable.
Algueim sabe como posso alterar isso?
obrigado
keller você é o cara! Tava num fosso e pirando com isso, olhei o primeiro código fonte tão fácil que chega a dá raiva, vou olhar o segundo e acredito que vou conseguir desenrolar; o ruim é que não tem um livro que fale em detalhes sobre o assunto.
Valeu!!!
Só falta desenrolar o assunto de JTextArea para impressão…