Imprimer une jtable AVEC UN TITRE

Résolu
Signaler
Messages postés
61
Date d'inscription
jeudi 22 juillet 2004
Statut
Membre
Dernière intervention
15 mai 2010
-
Messages postés
237
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
11 juillet 2006
-
slt,
grâce au source que l'on ma donner je suis arriver à imprimer une jtable.
mon probleme est que ça fait depuis 8h ce matin que je cherche comment imprimer un titre.
je pense que la table doit cacher le titre car si je l'imprime plus bas (assez bas pour qu'il soit en dessous de la table) ça marche .
je pense qu'il faut faire la même chose qu'avec les page (je crois que l'on déclare une en tete ) mais au sommet de la feuille.
svp un coup de main serait bien venu.
voici mon code :

package IHMGDE;
import METIERGDE.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import javax.swing.*;

public class Report extends JFrame implements Printable {
//attribut
private JFrame frame;
private JTable tableView;
private String titre;

//méthodes
public Report(JTable tt, String leTitre) {
this.tableView = tt;
this.titre = leTitre;
frame = new JFrame("Rapport des ventes");
final String[] headers = {"Numero", "Nom de l'expedition", "Date", "Valide"};
tableView = new JTable(tt.getModel());
JScrollPane scrollPane = new JScrollPane(tableView);
scrollPane.setPreferredSize(new Dimension(550, 80));
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(BorderLayout.CENTER, scrollPane);
frame.pack();
JButton printButton = new JButton();
printButton.setText("Imprimez moi !");
frame.getContentPane().add(BorderLayout.SOUTH, printButton);
// pour une impression plus rapide nous désactive de double buffering
RepaintManager.currentManager(frame).setDoubleBufferingEnabled(false);

printButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(Report.this);
pj.printDialog();
try {
pj.print();
}
catch (Exception PrintException) {}
}
});
frame.setVisible(true);
}

public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws
PrinterException {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
int fontHeight = g2.getFontMetrics().getHeight();
int fontDescent = g2.getFontMetrics().getDescent();

// laisser de l'espace pour le numero de page
double pageHauteur = pageFormat.getImageableHeight() - fontHeight;
double pageLargeur = pageFormat.getImageableWidth();
double largeurTable = (double) tableView.getColumnModel().getTotalColumnWidth();
double scale = 1; //echelle (pour la redimension de la table)

if (largeurTable >= pageLargeur) {
scale = pageLargeur / largeurTable;
}

double LargeurEnTeteSurPage = tableView.getTableHeader().getHeight() * scale;
double LargeurTableSurPage = largeurTable * scale;
double HauteurUneLigne = (tableView.getRowHeight() + tableView.getRowMargin()) * scale;
int nbLigneSurPage = (int) ( (pageHauteur - LargeurEnTeteSurPage) / HauteurUneLigne);
double HauteurPagePoutTable = HauteurUneLigne * nbLigneSurPage;
int nbTotalPage = (int) Math.ceil( ( (double) tableView.getRowCount()) / nbLigneSurPage);
if (pageIndex >= nbTotalPage) {
return NO_SUCH_PAGE;
}

g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
//test alex
g2.drawString(this.titre, (int) 0, (int) (pageHauteur + fontHeight - fontDescent));
//Fin test
// en bas au centre
g2.drawString("Page: " + (pageIndex + 1), (int) pageLargeur / 2 - 35, (int) (pageHauteur + fontHeight - fontDescent));
g2.translate(0f, LargeurEnTeteSurPage);
g2.translate(0f, -pageIndex * HauteurPagePoutTable);

// si cette partie de la page est plus petite
// que la taille disponible, alors découper les contours appropriés
if (pageIndex + 1 == nbTotalPage) {
int DerniereLignImprime = nbLigneSurPage * pageIndex;
int nbLigneRestante = tableView.getRowCount() - DerniereLignImprime;
g2.setClip(0, (int) (HauteurPagePoutTable * pageIndex), (int) Math.ceil(LargeurTableSurPage), (int) Math.ceil(HauteurUneLigne * nbLigneRestante));
}
// sinon découper la zone disponible toute entière
else {
g2.setClip(0, (int) (HauteurPagePoutTable * pageIndex), (int) Math.ceil(LargeurTableSurPage), (int) Math.ceil(HauteurPagePoutTable));
}

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

// dessiner les entêtes en haut
g2.scale(1 / scale, 1 / scale);
g2.translate(0f, pageIndex * HauteurPagePoutTable);
g2.translate(0f, -LargeurEnTeteSurPage);
g2.setClip(0, 0, (int) Math.ceil(LargeurTableSurPage), (int) Math.ceil(LargeurEnTeteSurPage));
g2.scale(scale, scale);
tableView.getTableHeader().paint(g2);
return Printable.PAGE_EXISTS;
}
}

3 réponses

Messages postés
237
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
11 juillet 2006

essayes ce truc la :
c'est quasiment la meme chose mais avec le titre qui va bien :

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),
(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.setColor(Color.red);
g2.drawString("Historique des cotes sur la station de " + stas ,(int)pageWidth/2 - 35,-10);
g2.setFont(defaultFont);

return Printable.PAGE_EXISTS;
}

a+

cid019
Messages postés
61
Date d'inscription
jeudi 22 juillet 2004
Statut
Membre
Dernière intervention
15 mai 2010

Merci bien cid019,
grâce à toi j'ai réussi à afficher mon titre.

Mais il me reste 2 questions à poser :
quand je lance l'impression de ma table (150 lignes environ), il arrive que l'impression mette un certains temps (jusqu'à 3 ou 4 minutes). Je voulais savoir si ça vte le fait aussi
ensuite sais tu comment faire pour imprimer des informations (en plus de la table) seulement sur la première page.

merci et à+
Messages postés
237
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
11 juillet 2006

non car ce code n'est pas de moi et j'ai trop cherché a comprendre...desolé.
Sinon pour ton histoire de lenteur d'impression, en quelle qualité imprimes-tu? moi je suis actuellement sur une laser et ca me pose pas vraiment de probleme...

cid019