Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160

    [JAVA] Stampa e dimensione caratteri

    Ciao a tutti!

    Ho un problema riguardo alla stampa di alcuni JPanel. La classe per stampare è la seguente:

    codice:
    package MyPackage;
    
    import java.awt.*;
    import javax.swing.*;
    import java.awt.print.*;
    
    public class PrintUtilities implements Printable {
      private Component componentToBePrinted;
    
      public static void printComponent(Component c) {
        new PrintUtilities(c).print();
      }
    
      public PrintUtilities(Component componentToBePrinted) {
        this.componentToBePrinted = componentToBePrinted;
      }
    
      public void print() {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setPrintable(this);
        if (printJob.printDialog())
          try {
            printJob.print();
          }
          catch (PrinterException pe) {
            System.out.println("Error printing: " + pe);
          }
      }
    
      public int print(Graphics g, PageFormat pf, int pageIndex) {
        int response = NO_SUCH_PAGE;
        Graphics2D g2 = (Graphics2D) g;
        disableDoubleBuffering(componentToBePrinted);
        Dimension d = componentToBePrinted.getSize(); 
        double panelWidth = d.width;
        double panelHeight = d.height;
        double pageHeight = pf.getImageableHeight();
        double pageWidth = pf.getImageableWidth();
        double scale = pageWidth / panelWidth;
        int totalNumPages = (int) Math.ceil(scale * panelHeight / pageHeight);
        if (pageIndex >= totalNumPages) {
        	response = NO_SUCH_PAGE;
        }
        else {
        	g2.translate(pf.getImageableX(), pf.getImageableY());
        	g2.translate(0f, -pageIndex * pageHeight);
            g2.scale(scale, scale);
            componentToBePrinted.paint(g2); 
            enableDoubleBuffering(componentToBePrinted);
            response = Printable.PAGE_EXISTS;
        }
        return response;
      }
    
      public static void disableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(false);
      }
    
      public static void enableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(true);
      }
    }
    Il problema è che il JPanel mi viene stampato a caratteri cubitali e quindi sono costretto a impostare un Font con dimensione 10 per poterlo stampare decentemente. Questo però va a scapito della leggibilità a schermo (infatti i caratteri a schermo si vedono piccoli, mentre quando vengono stampati sono molto più grandi). Come mai questa disparità? Come posso risolvere?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Stampa e dimensione caratteri

    Originariamente inviato da Manugal
    codice:
        double scale = pageWidth / panelWidth;
    
            g2.scale(scale, scale);
    Come mai questa disparità? Come posso risolvere?
    Il codice imposta un fattore di "scaling" e il calcolo è tale per cui la larghezza del pannello viene "spalmata" su tutta la larghezza dell'area usabile nella pagina.

    Non ti va bene? Puoi cambiare fattore di scala. Ad esempio potresti stabilire: in stampa la larghezza del pannello è sempre di X centimetri.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    E' vero hai ragione. Ma togliendo g2.scale() mi può compromettere la stampa di JPanel più grandi di una pagina per caso?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    Ma togliendo g2.scale() mi può compromettere la stampa di JPanel più grandi di una pagina per caso?
    Se non imposti tu un fattore di scaling, rimane il fattore di default ovvero 1 unità = 1/72 inch. Quindi se avessi un pannello di 100 x 100 pixel, avresti in stampa il pannello grande circa 3,53 x 3,53 centimetri (100 * 2,54 / 72).

    Ripeto: puoi impostare tu un fattore di scala. Puoi imporre che solo un lato del pannello (larghezza o altezza) sia fissato ad una certa dimensione fisica oppure imporre che il fattore di scala sia tale per cui il pannello stia comunque dentro una "scatola" di una certa dimensione. Bastano solo dei calcoli.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ok, grazie. Ma il fattore di scala come viene calcolato? Cioè ad esempio se io metto g2.scale(2.0f,2.0f) come mi viene scalata la pagina?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    Cioè ad esempio se io metto g2.scale(2.0f,2.0f) come mi viene scalata la pagina?
    Tutte le coordinate saranno moltiplicate per 2 .... quindi il disegno diventerà 2 volte più grande!

    Ma scusa se lo ripeto: quale è il problema preciso? Vuoi ad esempio "fissare" la larghezza in stampa del pannello? Basta usare una costante nel sorgente e fare il calcolo del fattore di scaling.

    codice:
    final double LARGHEZZA_PANNELLO = 10;   // 10 cm
    ...
    double scale = (LARGHEZZA_PANNELLO * 72 / 2.54) / panelWidth;
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Il problema era quello che avevo descritto ossia che l'utente quando apre una finestra con dei dati da inserire vede i caratteri troppo piccoli e questo l'ho dovuto fare perché sennò quando vado a stampare il JPanel relativo a quella finestra me lo stampa con caratteri enormi. Ho commentato momentaneamente l'istruzione g2.scale() e in questo modo stampa correttamente. Devo fare quindi in modo che l'utente veda i caratteri a dimensione normale e che la stampa non venga fuori con caratteri cubitali.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ciao a tutti.

    Ritorno con un problema sulla stampa. Il problema è che stampando alcuni JPanel (che contengono vari componenti, tra cui JLabel), alcune label vengono stampate con le parole scritte tutte attaccate (come se non avessi inserito spazi). Non riesco a capire perché lo fa con alcune e con altre no. A titolo d'esempio allego un documento che ho stampato tramite Java:



    P.S.: La classe utilizzata per stampare è sempre la stessa postata in questo thread.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.