Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA] Stampare JTable

  1. #1
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211

    [JAVA] Stampare JTable

    Il problema è quello di stampare un JTable.
    Vorrei dare all'utilizzatore del mio programma la possibilità di visualizzare una anteprima di stampa, impostare margini e intestazioni e piè di pagina, etc...
    Per stampare una JTable (soprattutto se di grosse dimensioni) ho visto che c'è da scrivere un tot di codice e se voglio anche fare l'anteprima non mi passa più, devo scrivere troppa roba e non ho tempo.

    Dove posso trovare una classe già fatta per soddisfare questa esigenza?

    Ho già scandagliato il web e ho trovato diverse cose, ma sono tutte a pagamento (salato!).

    Qualcuno di voi ha già affrontato il problema?

    Grazie
    ghinz

  2. #2
    Up.... ho postato anch'io una richiesta simile un po di tempo fa....

  3. #3
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    ri-UP
    Siamo in due adesso, aiutateci
    ghinz

  4. #4
    se volete siamo in 3!
    0m4r
    http://omar.adobati.it

  5. #5
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Buongiorno, a suo tempo avevo ravanato un po' in giro per la rete fino a trovare un esempio (non ricordo dove), comunque ti posto la classe che ho ricavato:
    codice:
    import javax.swing.*;
    import javax.swing.table.*;
    
    import java.awt.print.*;
    import java.util.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.Dimension;
    
    public class StampaTabella implements Printable {
    
      JFrame frame;
      JTable tableView;
    
      public StampaTabella(JTable Tabella) {
      	tableView = Tabella;
      }
    
    	public void Stampa() {
    	  PrinterJob pj=PrinterJob.getPrinterJob();
    		pj.setPrintable(StampaTabella.this);
    		pj.printDialog();
    		try{
    		    pj.print();
    		}
    		catch (Exception ex) {
    			ex.printStackTrace();
    		}
    	}
    
      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 fontDesent = g2.getFontMetrics().getDescent();
    		//leave room for page number
    		double pageHeight = pageFormat.getImageableHeight()-fontHeight;
    		double pageWidth = pageFormat.getImageableWidth();
    		double tableWidth = (double)tableView.getColumnModel().getTotalColumnWidth();
    		double scale = 1;
    		if (tableWidth >= pageWidth) {
    			scale =  pageWidth / tableWidth;
    		}
    		double headerHeightOnPage = tableView.getTableHeader().getHeight() * scale;
    		double tableWidthOnPage = tableWidth * scale;
    		double oneRowHeight = (tableView.getRowHeight() + tableView.getRowMargin()) * scale;
    		int numRowsOnAPage = (int)((pageHeight - headerHeightOnPage) / oneRowHeight);
    		double pageHeightForTable = oneRowHeight * numRowsOnAPage;
    		int totalNumPages= (int)Math.ceil(((double)tableView.getRowCount()) / numRowsOnAPage);
    		if(pageIndex>=totalNumPages) {
    			return NO_SUCH_PAGE;
    		}
    		g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    		g2.drawString("Page: "+(pageIndex+1),(int)pageWidth/2-35,
    		    (int)(pageHeight+fontHeight-fontDesent));//bottom center
    
    		g2.translate(0f,headerHeightOnPage);
    		g2.translate(0f,-pageIndex*pageHeightForTable);
    		//TODO this next line treats the last page as a full page
    		g2.setClip(0, (int)(pageHeightForTable*pageIndex),(int)
    		    Math.ceil(tableWidthOnPage),
    		    (int) Math.ceil(pageHeightForTable));
    
    		g2.scale(scale,scale);
    		tableView.paint(g2);
    		g2.scale(1/scale,1/scale);
    		g2.translate(0f,pageIndex*pageHeightForTable);
    		g2.translate(0f, -headerHeightOnPage);
    		g2.setClip(0, 0,(int) Math.ceil(tableWidthOnPage),
    			(int)Math.ceil(headerHeightOnPage));
    		g2.scale(scale,scale);
    		tableView.getTableHeader().paint(g2);//paint header at top
    		return Printable.PAGE_EXISTS;
    	}
    
    }
    Fatto questo per stampare una jtable scrivo questo:
    codice:
    StampaTabella prn = new StampaTabella(stat); // stat è la jtable da stampare
    prn.Stampa();
    prn = null;
    Ci mette un po' comunque più o meno funziona.
    Ciao
    ghinz

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    11
    ciao!!! utilissima la tua classe.. volevo chiederti se è possibile stampare eliminando le linee delle tabelle ... non mi è molto chiaro il codice

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303

    Moderazione

    Originariamente inviato da d4niela
    ciao!!! utilissima la tua classe.. volevo chiederti se è possibile stampare eliminando le linee delle tabelle ... non mi è molto chiaro il codice
    E' una discussione del 2002!!
    Come da regolamento interno, non si risollevano discussioni morte, specialmente se c'è un forum dedicato al linguaggio che all'epoca non c'era.

    Apri una nuova discussione nel forum Java, eventualmente linkando questa discussione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.