boa tarde a todos, alguem sabe se é possivel imprimir uma JTable ?
se alguem tiver link’s ou exemplos são bem vindos, valeu!
Imprimir JTable
30 Respostas
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…
keller, vlw mesmo. como o cara aki de cima eu tb tava quebrando a cabeça pra conseguir imprimir um JTextPane porque quando eu fazia.
g.drawString(doc.getText(0, doc.getLength()), 100, 100);
pq esse doc.getText pegava todo o texto sem espaçamento algum, e imprimia-o na mesma linha tb,
antes eu jah havia tentado imprimir um JTable, mas eu estava conseguindo imprimir apenas o JPanel com tudo dentro inclusive o botão imprimir.
muito obrigado, vlw mesmo
Com o livro do Deitel não consegui nem chegar perto de imprimir
Olá, quero apenas agradecer, pois achei através do google este tópico que me ajudou bastante, parabéns pela contribuição da sabedoria um abraço
O código ta bom, só que no meu caso ele só tira uma impressão, depois ele fica dando erro, mesmo se eu fechar e abrir o aplicativo denovo
não consegui adicionar o cabeçalho, tem como me mostrar código dessa implementação?
Uhmn esse codigo é velho!
Fico feliz de saber que ajudou alguns…
Vou ver se pego um tempo pra fazer isso de cabeçalho, isso seria apenas na primeira folha certo?
Vou ver se faco agora pelo fim de semana, nada garantido, valeu pelos comentarios…
Até mais… :thumbup:
boa tarde a todos, alguem sabe se é possivel imprimir uma JTable ?
se alguem tiver link’s ou exemplos são bem vindos, valeu!
Kaaara,
Tua classe é show mesmo kara!
Eu estava com exatamente o mesmo problema.
Muito obrigado mesmo!
Por acaso, tu sabes como faço pra deixar uma margem na impressão? pelo menos um centímetro pra cada lado??
Sabe também como faço pra inserir um texto no cabeçalho e outro no rodapé???
Boa tarde! estou com uma pequena duvida na qual não consegui resolver, usei o codigo a cima para imprimir uma tabela, porem em um mesmo frame eu tenho 2 tabelas que quero imprimir, como faço pra sair na mesma impressão as duas tabelas?
no action do botão coloquei o codigo que foi dito a cima também:
new ImprimirJTable(tabela);
funciona beleza, mas gostaria de imprimir as duas, alguem tem alguma dica?
faça um botao que no clique dele vc faz…
new ImprimirJTable(suaJTable);beleza ? se nao conseguir só postar…
Primeiro, ótimo post! Salvou minha vida, exceto por uma coisa:
Quando eu imprimo a minha tabela, os espaços entre as palavras somem, assim:
Original
FULANO DE TAL DA SILVA
Impresso
FULANODETALDASILVA
Alguma luz? =/
Obrigado
Como faço para mudar o tamanho da fonte e deixar mais espaços nas laterais, no cabeçalho e rodapé? achei muito massa essa classe para impressão
só precisaria saber com fazer para fazer essas alterações. fico no aguardos.
é uma duvida que tive e o que me ajudou foi utilizar o iReport
http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/
Achei esse tutorial bem robusto, espero que ajude como me ajudou.