Imprimer une jtable AVEC UN TITRE [Résolu]

Messages postés
61
Date d'inscription
jeudi 22 juillet 2004
Dernière intervention
15 mai 2010
- 10 août 2004 à 14:46 - Dernière réponse :
Messages postés
237
Date d'inscription
mercredi 2 juin 2004
Dernière intervention
11 juillet 2006
- 11 août 2004 à 08:00
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;
}
}
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
237
Date d'inscription
mercredi 2 juin 2004
Dernière intervention
11 juillet 2006
- 10 août 2004 à 15:47
3
Merci
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

Merci cid019 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cid019
Messages postés
61
Date d'inscription
jeudi 22 juillet 2004
Dernière intervention
15 mai 2010
- 10 août 2004 à 17:13
0
Merci
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 à+
Commenter la réponse de asetti
Messages postés
237
Date d'inscription
mercredi 2 juin 2004
Dernière intervention
11 juillet 2006
- 11 août 2004 à 08:00
0
Merci
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
Commenter la réponse de cid019

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.