Newsgroup: it.comp.java
Titolo: Stampa del contenuto di JTextArea

Gentili iscritti, il seguente metodo grazie a poche funzioni consente
di inviare alla stampante il testo contenuto nell'oggetto JTextArea
"AreaTesto". Peccato che non venga inviato alla stampante *tutto* il
documento, ma sempre e solo la prima pagina, tra l'altro impaginata
molto male (il documento fuoriesce dal foglio in formato A4...).
Qualcuno avrebbe per caso qualche correzione o aggiunta di codice da
proporre? Grazie.
// **** azioneStampaAreaVisibile invia alla stampante l'area visibile
della JTextArea ****
private void azioneStampa()
{
//1.Get a java.awt.PrintJob from the current java.awt.Toolkit
instance:
PrintJob pj = areaTesto.getToolkit().getPrintJob(this, "Stampa",
null);
//2.Ask your PrintJob for a PrintGraphics instance:
Graphics pg = pj.getGraphics();
//3.Call your JTextArea's printAll() method and send the resulting
Graphics object to the printer:
areaTesto.printAll(pg);
pg.dispose();
//4.And ask the PrintJob to do all necessary cleanup:
pj.end();
}
--
Paolo Guagliumi - ICQ 46580228
[ newsletter gratuita infosapere ] - 
http://web.tiscali.it/infosapere


Ciao.



Grazie agli esempi riportati in suddetta pagina ho realizzato una
classe e un metodo che metto a disposizione. Grazie ad essi e'
possibile stampare il contenuto di un oggetto, ad esempio JTextArea.
La stampa e' in modalita' grafica. Segue il codice che a causa delle
limitazioni dei newsgroup non e' ben impaginato, comunque e'
funzionante. Se qualcuno desiderasse segnalare correzioni o
miglioramenti, sono i benvenuti.
Un saluto, ciao.
/*******************************************************************************
    · StampaGrafica.java - Classe per la stampa del documento in modo
grafico
******************************************************************************
*/
// **** importa i packages utili ****
import java.awt.*; // libreria grafica AWT
import java.io.StringReader; // uno stream di caratteri il cui input
e' una stringa
import java.io.LineNumberReader; // tiene traccia dei numeri di linea:
setLineNumber e getLineNumber imposta e restituisce il numero di linea
import java.io.EOFException; // segnala che la fine del file o dello
stream e' stata raggiunta inaspettatamente durante l'input
// **** definizione classe per impostare effettuare la stampa del
documento utilizzando la metodologia grafica ****
// stampa del testo grazie all'uso di PrintJob; non considera il Word
Wrap o i tab
public class StampaGrafica
{
  	// costruttore della classe StampaGrafica
  	public StampaGrafica(PrintJob jobStampa, Graphics
oggettoGrafico, String testo, String nomeDocumento)
  	{
    		int numeroPagina = 1; // numero della pagina corrente
da stampare; numero di pagine complessive
    		int lineePagina = 0; // numero di linee della pagina
corrente
    		int lineeComplessive = 0; // numero di linee
dell'itero documento
    		int altezzaCorrente = 0; // altezza corrente del testo
stampato nella pagina
    		String lineaSuccessiva; // contiene una linea di testo
letta dal parametro "testo"
    		// nota: String non e' mutabile e quindi non muta
durante la stampa
    		if (!(oggettoGrafico instanceof PrintGraphics))
    		{
      		throw new IllegalArgumentException ("Errore di istanza
PrintGraphics.");
    		}
    		StringReader readerStringa = new StringReader (testo);
// oggetto stream di carattere il cui parametro in input e' stringa
    		LineNumberReader readerNumeriLinea = new
LineNumberReader (readerStringa); // crea un nuovo reader di numeri di
linea
    		int altezzaPagina =
jobStampa.getPageDimension().height;
    		// e' necessario impostare il font per poter avere
l'output
    		Font carattereHelvetica = new
Font("carattereHelveticaetica", Font.PLAIN, 12);
    		oggettoGrafico.setFont(carattereHelvetica); // imposta
Helvetica come carattere di stampa
    		FontMetrics oggettofm =
oggettoGrafico.getFontMetrics(carattereHelvetica); // restituisce
oggetto LineMetrics per lo specifico carattere
    		int altezzaFont = oggettofm.getHeight(); //
restituisce l'altezza standard di una linea di testo che usa questo
carattere
    		int descentFont = oggettofm.getDescent(); //
restituisce il font descent per questo carattere
    		try
    		{
	    		System.out.println ("----> Stampa del
documento " + nomeDocumento + " in corso <----");
      		do // fai mentre vi sono righe da stampare nel
documento
      		{
        			lineaSuccessiva =
readerNumeriLinea.readLine(); // legge una linea di testo
        			if (lineaSuccessiva != null) // se vi
e' ancora del testo da stampare
        			{
	          		if ((altezzaCorrente + altezzaFont) >
altezzaPagina) // inizia una nuova pagina
          			{
	            			System.out.println ("" +
lineePagina + " linee stampate nella pagina " + numeroPagina);
            				numeroPagina++; // incrementa
il numero di pagina
            				lineePagina = 0; // il numero
di linee e' reinizializzato a zero
            				altezzaCorrente = 0; //
altezza corrente del testo stampato nella pagina
            				oggettoGrafico.dispose(); //
rilascia risorse legate al precedente oggettoGrafico
            				oggettoGrafico =
jobStampa.getGraphics(); // preleva il successivo oggettoGrafico
            				if (oggettoGrafico != null) //
se l'oggettoGrafico non e' nullo
            				{
oggettoGrafico.setFont(carattereHelvetica); // imposta questo
carattere a oggettoGrafico
            				}
          			}
          			altezzaCorrente += altezzaFont; //
altezzaCorrente della pagina e' incrementato dall'altezza del Font
attuale
          			if (oggettoGrafico != null) // se
l'oggettoGrafico non e' null allora
          			{
	          			// scrive il testo incluso in
lineaSuccessiva utilizzando l'attuale font e colore
	          			// la base del carattere piu'
a sinistra ha coordinate x = 0 e y = altezzaCorrente - descentFont
oggettoGrafico.drawString(lineaSuccessiva, 0, altezzaCorrente -
descentFont);
            				lineePagina++; // e' stata
appena stampata una linea della pagina
            				lineeComplessive++; // e'
stata appena stampata una linea del documento
          			}
          			else
          			{
	            			System.out.println
("oggettoGrafico e' vuoto: errore di stampa.");
          			}
        			}
      		} while (lineaSuccessiva != null);
      	} catch (EOFException eof)
      	{
	      	System.out.println ("Errore nella lettura del
documento da stampare.");
      	}
      	catch (Throwable e)
    		{
    			System.out.println ("Eccezione rilevata
durante la stampa del documento: " + e);
      		e.printStackTrace();
    		}
    		System.out.println ("" + lineePagina + " linee
stampate nella pagina " + numeroPagina);
    		System.out.println ("Numero complessivo di linee
stampate: " + lineeComplessive);
    		System.out.println ("Numero di pagine stampate: " +
numeroPagina);
  	}
}
Metodo nel programma principale che richiama la classe:
// **** azioneStampaGrafica invia alla stampante il documento
contenuto nella JTextArea di nome areaTesto ****
	private void azioneStampaGrafica()
	{
		if (!areaTesto.getText().equals("")) // se vi e' del
testo in areaTesto
		{
			stato.setText("Stampa del documento in
modalita' grafica.");
			PrintJob jobStampa =
getToolkit().getPrintJob(this, "Stampa documento", null); // attiva un
PrintJob per la corrente istanza di java.awt.Toolkit
      		if (jobStampa != null)
      		{
	        		Graphics oggettoGrafico =
jobStampa.getGraphics(); // richiede al PrintJob un oggetto grafico
per stampare la pagina
        			if (oggettoGrafico != null)
        			{
	          		String testo = areaTesto.getText(); //
in testo viene inserito il testo della JTextArea
          			StampaGrafica oggettoStampaGrafica =
new StampaGrafica(jobStampa, oggettoGrafico, testo,
fileCorrente.getName());
	          		oggettoGrafico.dispose(); // rilascio
di tutte le risorse che usavano questo contesto grafico
        			}
        			jobStampa.end(); // termina il
PrintJob
			}
		}
		else
		{
JOptionPane.showInternalMessageDialog(getContentPane(), "Non vi e'
testo da stampare.", "Informazione", JOptionPane.INFORMATION_MESSAGE);
