Rendre imprimable une jTable[urgent]

asetti Messages postés 61 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 15 mai 2010 - 5 août 2004 à 12:42
libeur Messages postés 36 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 24 décembre 2004 - 10 août 2004 à 11:41
slt,
je viens de terminer mon programme et le gars qui l'utilise me demande de rajouter un bouton pour imprimer une jTable de l'une des fen^tre.
le problème est que le petit stagiaire que je suis n'a jamais appris à imprimer.
alors si quelqu'un peut me dire comment rendre imprimable une jTable ce serai sympa (je pense qu'il faut la déclaré imprimable quelque part comme on rend sérialisable pour sérialiser)

je pense aussi (d'après les infos que j'ai trouvé ou plutôt que l'on m'a donné sur ce site) qu'il faut utilisé le code suivant pour lancerr l'impression mais je sais pas si c'est bon :

PrintJob pj=PrinterJob.getPrinterJob();
pj.setPrintable(jTable1)
if (pj.printDialog()){
try{
pj.print();
}
catch(PrinterException p){
....
}
}

4 réponses

asetti Messages postés 61 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 15 mai 2010
5 août 2004 à 14:29
Je viens d'arriver à imprimer une partie mais elle il m'en manque car je n'arrive pas a mettre en page
ça fait depuis ce matin 10h que je cherche à imprimer alors je suis déjà content que ça imprime une partie
Ce que je ne comprende pas c'est pourquoi on imprime les composant.
Comment faire pour imprimer juste la table MAIS en lui donnant un titre.
Je sais que je parrait chiant avec mes questions mais j'en ai plein le (|) de chercher sur le net
Merci
0
wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
5 août 2004 à 15:47
de toute fcon tu peut faire un panel non visible qui prend juste ton arbre + le titre....
0
asetti Messages postés 61 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 15 mai 2010
6 août 2004 à 09:50
Oui mais ma table contient 150 lignes.
Si j'imprime une autre panel je risque de n'imprime que la partie de ma table qui SERAIT visible si Visible était à 1. (enfin je crois)
0
libeur Messages postés 36 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 24 décembre 2004 2
10 août 2004 à 11:41
Un boutde l'appli de mon stage. Ca imprime la JTable, en numérotant les pages, avec le nombre total de page, avec un titre, ça fait juste pas le café.
La partie de l'export sous excel, je l'envoie pas, c'est pas un vrai fichier excel, mais un txt avec les séparateurs qui vont bien.
Le ContenuGenerique est une implémentation d'AbstractTableModel.
SourceDonneesStockInfo c'est ma base de données.

/*
* Cette fenetre permet d'afficher le résultat d'une requete quelconque, de manière
* à pouvoir retourner toutes les interrogation SQL demandée par l'utilisateur
*/

import javax.swing.table.*;
import java.awt.print.*;
import java.util.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;

class FenetreRequeteGenerique extends JInternalFrame implements ActionListener, Printable
{
protected ContenuGenerique resultat;
protected JTable table;
protected JScrollPane ascenceur;
protected JButton fermer, exporter, imprimer;
protected SourceDonneesStockInfo dataSource;
protected String nomRequete;

public FenetreRequeteGenerique(){}

public FenetreRequeteGenerique(SourceDonneesStockInfo source,String titre, String requete)
{
super(titre);
nomRequete = new String(titre);
setSize(500,200);
setResizable(true);
Container ppal = getContentPane();
ppal.setLayout(new BorderLayout());

dataSource = source;
resultat = dataSource.requeteSelectParametre(requete, "Erreur dans la requete");
table = new JTable(resultat);

int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER;

ascenceur = new JScrollPane(table, v,h);
fermer = new JButton("Fermer");
fermer.addActionListener(this);
imprimer = new JButton("Imprimer");
imprimer.addActionListener(this);
exporter = new JButton("Exporter");
exporter.addActionListener(this);

Container cBoutons = new Container();
cBoutons.setLayout(new FlowLayout());
cBoutons.add(imprimer);
cBoutons.add(exporter);
cBoutons.add(fermer);

ppal.add(ascenceur, BorderLayout.CENTER);
ppal.add(cBoutons, BorderLayout.SOUTH);
}

public void actionPerformed(ActionEvent ae)
{
if(ae.getSource()==fermer)
{
System.out.println(getSize());
try{setClosed(true);}catch(Exception e) {}
}
else if(ae.getSource()==imprimer)
{
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(this);
pj.printDialog();
try
{
pj.print();
} catch (Exception PrintException) { }
}
else if(ae.getSource()==exporter)
{
Exportation e = new Exportation(resultat.toTableString(), getDesktopPane());
dispose();
}
}

// fonction permettant d'impirmer le réseultat de la requete sur papier.
public int print(Graphics g, PageFormat pageFormat, int pageIndex)
throws PrinterException {
Graphics2D g2 = (Graphics2D)g;
Font defaultFont = g2.getFont();
g2.setColor(Color.black);
int fontHeight = g2.getFontMetrics().getHeight();
int fontDescent = g2.getFontMetrics().getDescent();

// laisser de l'espace pour le numero de page
double pageHeight = pageFormat.getImageableHeight() - fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth = (double)
table.getColumnModel().getTotalColumnWidth();
double scale = 1;

if (tableWidth >= pageWidth)
{
scale = pageWidth / tableWidth;
}

double headerHeightOnPage = table.getTableHeader().getHeight()*scale;
double tableWidthOnPage = tableWidth * scale;

double oneRowHeight = (table.getRowHeight() +
table.getRowMargin()*2)*scale;

int numRowsOnAPage = (int)((pageHeight-headerHeightOnPage) /
oneRowHeight)-2;

double pageHeightForTable = oneRowHeight * numRowsOnAPage;

int totalNumPages = (int)Math.ceil(((double)table.getRowCount()) /
numRowsOnAPage);

if (pageIndex >= totalNumPages)
return NO_SUCH_PAGE;

g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()+22);

// en bas au centre
g2.drawString("Page: " + (pageIndex +1)+"/"+totalNumPages,
(int)pageWidth/2 - 35, (int)(pageHeight + fontHeight - fontDescent)-20);

g2.translate(0f, headerHeightOnPage);
g2.translate(0f, -pageIndex*pageHeightForTable);

// si cette partie de la page est plus petite
// que la taille disponible, alors découper les contours appropriés
if (pageIndex + 1 == totalNumPages) {
int lastRowPrinted = numRowsOnAPage * pageIndex;
int numRowsLeft = table.getRowCount() - lastRowPrinted;

g2.setClip(0, (int)(pageHeightForTable * pageIndex),
(int)Math.ceil(tableWidthOnPage),
(int)Math.ceil(oneRowHeight * numRowsLeft));
}
// sinon découper la zone disponible toute entière
else
{
g2.setClip(0, (int)(pageHeightForTable * pageIndex),
(int)Math.ceil(tableWidthOnPage),
(int)Math.ceil(pageHeightForTable));
}

g2.scale(scale, scale);
table.paint(g2);

// dessiner les entêtes en haut
g2.scale(1/scale, 1/scale);
g2.translate(0f, pageIndex*pageHeightForTable);
g2.translate(0f, -headerHeightOnPage);
g2.setClip(0,-22,
(int)Math.ceil(tableWidthOnPage),
(int)Math.ceil(headerHeightOnPage)+22);
g2.scale(scale, scale);
table.getTableHeader().paint(g2);

g2.translate(0f, 0);
Font titleFont = defaultFont.deriveFont(Font.BOLD, 16);
g2.setFont(titleFont);
g2.drawString(nomRequete,(int)pageWidth/2 - 35,-14);
g2.setFont(defaultFont);

return Printable.PAGE_EXISTS;
}
}
Rien ne sert de partir à point, il vaut mieux courir.
0
Rejoignez-nous