Newsgroup: it.comp.java
Titolo: Stampare (e andare a capo)

Carissimi,
secondo quesito della giornata
Ho necessità di stampare il contenuto di una text area, NB sempre meno
di una pagina
Seguendo un tutorial in rete ho fatto così
public class Stampa implements Printable {
    public int print(Graphics grap, PageFormat pageFormat, int
pageIndex) throws PrinterException {
        if(pageIndex > 0)
            return NO_SUCH_PAGE;
        grap.drawString(stringaDaStampare,
(int)pageFormat.getImageableX(),
               (int)pageFormat.getImageableY()+10);
                return PAGE_EXISTS;
    }
....
viene correttamente stampata la stringaDaStampare
il tutto viene richiamato da un pulsante in una applet, in questo modo
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.printDialog();
        Stampa s=new Stampa();
        s.setStringa(tabellaTextPane.getText());// fornisco il valore a
stringaDaStampare
        pj.setPrintable(s);
        pj.print();
Strano ma vero, sembra funzionare..
Unico problema: come si vede dal codice, stringaDaStampare è il
contenuto di un textPane
Le righe sono separate da \n, ma quando stampo non va a capo, e al
posto di \n
viene visualizzato un quadratino.....
... si accettano tutti i tipi di consigli, anche gli sporchi trucchi...
Grazie!!!

 ... si accettano tutti i tipi di consigli, anche gli sporchi trucchi...
Prova con "\r\n" (Sporco trucco, solo per Windows) oppure con 
"System.getProperty("line.separator")" (Cosa Buona et Giusta).
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

Giambo ha scritto:

Ti ringrazio, ma non funziona
nb sto parlando proprio di _stampa_,  non stampa su monitor o su file
Grazie!!

 
Allora, premetto che non ho mai provato a stampare con Java, ma ho 
dovuto sviluppare diversi programmi di stampa con altri linguaggi/sistemi.
Da quanto ho capito Java ti mette a disposizione un dispositivo grafico 
dove disegni la pagina da stampare e poi dà il disegno in pasto al 
driver della stampante che lo butta su carta (prassi abbastanza comune), 
giusto?
In questo caso è più che normale (anzi, direi che non dovrebbe essere 
altrimenti) che caratteri come il \n che non hanno una reale 
rappresentazione con i font, siano sostituiti con dei quadrozzi o 
quant'altro.
Dal momento che devi disegnare il testo, potresti procedere così:
(non mi chiedere quali metodi/oggetti utilizzare)
Versione senza "a capo" automatico:
Prendi dalla metrica del font l'altezza in punti del font selezionato.
Spezzi la stringa in una array sul separatore di riga (\r\n o \n, io ti 
consiglierei di verificarli entrambi. Al limite, verifica anche il \r da 
solo)
A partire dalla posizione corrente disegni la prima riga.
Incrementi l'ordinata con l'altezza del carattere (eventualmente 
aggiungi un po' di spazio per aumentare l'interlinea) e disegni la riga 
seguente.
Così via fino a quando non scrivi tutte le righe.
(naturalmente aggiorni la posizione logica per poter scrivere il nuovo 
testo n righe dopo)
Versione con "a capo" automatico:
Come quella di sopra, ma provi a verificare con la metrica del carattere 
se tutte le righe rientrano nell'area di stampa scelta (la dimensione 
della pagina la prendi dalla metrica della pagina)
Quando trovi che la riga è troppo lunga, spezzi la riga in quella 
posizione in 2 righe.
Infine stampi le righe come nella versione precedente.
Puoi personalizzare le regole con cui spezzare la riga in modo che siano 
al carattere, alla parola (sugli spazi bianchi), o quello che preferisci.
Salto pagina:
Questo dovrebbe essere più semplice, quando ti accorgi che la prossima 
riga sarebbe stampata (in verticale) fuori dall'area di stampa (vale a 
dire sotto), cambi pagina.
LP

 dire sotto), cambi pagina.
ti ringrazio molto per il contributo. penso che dovrò passare qualche
altra ora (molte) sulle pagine SUN...
Ultima informazione: penso che il mio problema sia molto semplice,
devo stampare il contenuto di un text pane,
- SICURAMENTE sta tutto su una pagina
- SICURAMENTE ogni riga non è più lunga di una riga di A4,
- NON HO BISOGNO di gestire formati di stampa diversi da A4
Grazie!

 ... si accettano tutti i tipi di consigli, anche gli sporchi trucchi...
si capisce che ti serve qualcosa di molto semplice, ma almeno il controllo
dei caratteri non stampabili dovresti farlo. Puoi costruire una funzione del
tipo:
void drawString(Graphics grap, String s, int x, int y) {
  String sx = "";
  for (int i = 0; i < s.length(); ) {
   char c = s.charAt(i++);
   if (c >= ' ') // space
    sx += c;
   if (c == '\n') {
    grap.drawString(sx, x, y);
    sx = "";
    y += 12; // interlinea
   }
  }
  grap.drawString(sx, x, y);
 }
che dovrā essere richiamata dal metodo print, pių o meno cosė:
public int print(Graphics grap, PageFormat pageFormat, int
  pageIndex) throws PrinterException {
         if(pageIndex > 0)
             return NO_SUCH_PAGE;
         drawString(grap, stringaDaStampare,
 (int)pageFormat.getImageableX(),
                (int)pageFormat.getImageableY()+10);
                 return PAGE_EXISTS;
     }
Mi lascia perplesso che non vengano nemmeno definiti i font.
Ciao,
Maurizio.

 Mi lascia perplesso che non vengano nemmeno definiti i font.
è solo la stampa di una tabella, di accontentiamo del 'default'...
Buona domenica!

...hem...
e se il mio testo fosse lungo DUE pagine?
(lo so sono una rompipalle....)