Imprimer que les lignes rempli d'une jTable

asetti Messages postés 61 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 15 mai 2010 - 11 août 2004 à 09:25
jose185 Messages postés 1 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 22 juin 2007 - 22 juin 2007 à 14:58
salut,
j'ai créer un programme qui, entre autre, imprime une jTable.
mon seul problème c'est qu'il imprime toute les lignes même celle qui n'ont pas été rempli.
Comme ma table fait environ 150 lignes (soit plusieurs page) et que dans certains cas il peut y en avoir qu'une vingtaine, je trouve un peu bête de tout imprimé.
y'a t-il une solution pour n'imprimé que les lignes remplis.
Merci

Je vous passe mon code (ça peu aider ceux qui veulent imprimer avec un titre)

package IHMGDE;

import java.awt.*;
import java.awt.print.*;
import javax.swing.*;

public class Report
extends JFrame
implements Printable {
//attribut
private JFrame frame;
private JTable tableView;
private String titre;
String info2;
private boolean Portrait = true;

//méthodes
public Report(JTable tt, String leTitre, String info2, boolean Portrait) {
this.tableView = tt;
this.titre = leTitre;
this.Portrait = Portrait;
this.info2=info2;
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);
if (Portrait == false) {
tableView.getColumnModel().getColumn(0).setPreferredWidth(95);
tableView.getColumnModel().getColumn(1).setPreferredWidth(158);
tableView.getColumnModel().getColumn(2).setPreferredWidth(158);
tableView.getColumnModel().getColumn(3).setPreferredWidth(158);
tableView.getColumnModel().getColumn(4).setPreferredWidth(158);
tableView.getColumnModel().getColumn(5).setPreferredWidth(158);
tableView.getColumnModel().getColumn(6).setPreferredWidth(158);
tableView.getColumnModel().getColumn(7).setPreferredWidth(507);
scrollPane.setPreferredSize(new Dimension(1550, 80));
}
else {
scrollPane.setPreferredSize(new Dimension(550, 80));
tableView.getColumnModel().getColumn(0).setPreferredWidth(100);
tableView.getColumnModel().getColumn(1).setPreferredWidth(265);
tableView.getColumnModel().getColumn(2).setPreferredWidth(130);
tableView.getColumnModel().getColumn(3).setPreferredWidth(55);

}

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);
//frame.setVisible(true);

PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat ls = pj.defaultPage();
if (Portrait == false) {
ls.setOrientation(PageFormat.LANDSCAPE);
}
else {
ls.setOrientation(PageFormat.PORTRAIT);
}
pj.setPrintable(Report.this, ls);
pj.printDialog();
try {
pj.print();
}
catch (Exception PrintException) {}
frame.dispose();
}

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 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 HauteurEnTeteSurPage = tableView.getTableHeader().getHeight() * scale;
double LargeurTableSurPage = largeurTable * scale;
double HauteurUneLigne = (tableView.getRowHeight() + tableView.getRowMargin() * 2) * scale;
int nbLigneSurPage = (int) ( (pageHauteur - HauteurEnTeteSurPage) / HauteurUneLigne - 2);
double HauteurPagePoutTable = HauteurUneLigne * nbLigneSurPage;
int nbTotalPage = (int) Math.ceil( ( (double) tableView.getRowCount()) / nbLigneSurPage);
if (pageIndex >= nbTotalPage) {
return NO_SUCH_PAGE;
}
//dessine num page (en bas au centre)
g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2.drawString("Page: " + (pageIndex + 1), (int) pageLargeur - 55, (int) (pageHauteur + fontHeight - fontDescent));
g2.drawString(this.info2 ,0,(int) (pageHauteur + fontHeight - fontDescent));
g2.translate(0f, HauteurEnTeteSurPage);
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, -HauteurEnTeteSurPage);
g2.setClip(0, -44, (int) Math.ceil(LargeurTableSurPage), (int) Math.ceil(HauteurEnTeteSurPage) + 44);
g2.scale(scale, scale);
tableView.getTableHeader().paint(g2);

//Dessiner le titre
g2.translate(0f, -10);
Font titleFont = defaultFont.deriveFont(Font.BOLD, 16);
g2.setFont(titleFont);
//g2.setColor(Color.red);
g2.drawString(this.titre, (int) pageLargeur / 2 - 35, -10);
g2.setFont(defaultFont);

//test
return Printable.PAGE_EXISTS;
}
}

3 réponses

cid019 Messages postés 237 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 11 juillet 2006
12 août 2004 à 10:03
voila je te passe tout ca. c'est ma classe pour gerer les tableaux.

// permet de créer un tableau de n colonnes
class LignesModel extends AbstractTableModel
{
private Vector[] vc;
private String[] st;
private int nbcol;
private boolean b;

public int getNbCol() { return nbcol; }
public Vector[] getVector() {return vc; }

public LignesModel(int nbc, String[] ch)
{
nbcol = nbc;
st = new String[nbcol];
vc = new Vector[nbcol];
for (int i = 0; i < nbcol; ++i)
{
st[i] = ch[i];
vc[i] = new Vector();
}
}

public void effacerTout()
{
for (int i = 0; i < nbcol; ++i)
vc[i].clear();
}

public void effacerLigne(int index)
{
for (int i = 0; i < nbcol; i++)
vc[i].removeElementAt(index);
}

public void ajouterLigne(String[] ch)
{
for (int i = 0; i < nbcol; ++i)
vc[i].add(ch[i]);
}

public String[] getColonne(int index)
{
return (String[]) vc[index].toArray(new String[vc[index].size()]);
}

public String[][] getLignes(int nbl)
{
String[][] res = new String[nbl][nbcol];
for (int i = 0; i < nbl; i++)
for (int j = 0; j < nbcol; j++)
res[i][j] = vc[j].elementAt(i).toString();
return res;
}

public String[] getLigne(int index)
{
String[] res = new String[nbcol];
for (int i = 0; i < nbcol; i++)
res[i] = vc[i].elementAt(index).toString();
return res;
}

public int getColumnCount()
{
return nbcol;
}

public int getRowCount()
{
return vc[0].size();
}

public String getColumnName(int col)
{
return st[col];
}

public Object getValueAt(int parm1, int parm2)
{
return vc[parm2].get(parm1);
}

public boolean isCellEditable(int row, int col)
{
return true;
}

public void setValueAt(Object obj, int row, int col)
{
vc[col].set(row, obj);
fireTableCellUpdated(row,col);
}
}


la fonction qui t'interesse devrait etre getLigne(int index)

cid019
0
libeur Messages postés 36 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 24 décembre 2004 2
12 août 2004 à 11:56
Salut,

Apparemment, la Jtable te sert à faire de la saisie. Essaie de repasser par une nouvelle fenêtre (pas nécessairement visible à l'utilisateur), où tu affiche que les lignes remplies (getLigne de cid019 + test si c'est vide). Comme ça tu touche pas à ta fonctions print.

Rien ne sert de partir à point, il vaut mieux courir.
0
jose185 Messages postés 1 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 22 juin 2007
22 juin 2007 à 14:58
en fait je maitrise pas trop les vecteurs donc il y a pas moyen de reglé le problème sans les utiliser?
0
Rejoignez-nous