Imprimer une jtable AVEC UN TITRE [Résolu]

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

3 réponses

Répondre au sujet
cid019 237 Messages postés mercredi 2 juin 2004Date d'inscription 11 juillet 2006 Dernière intervention - 10 août 2004 à 15:47
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cid019
asetti 61 Messages postés jeudi 22 juillet 2004Date d'inscription 15 mai 2010 Dernière intervention - 10 août 2004 à 17:13
0
Utile
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
cid019 237 Messages postés mercredi 2 juin 2004Date d'inscription 11 juillet 2006 Dernière intervention - 11 août 2004 à 08:00
0
Utile
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.