Originariamente inviato da Metflar
dovrei ottenere la stampa su carta del contenuto di un JPanel...cm posso fare?
Se può esserti utile, ecco un programmino di esempio che ho appena scritto che stampa l'intero frame.
codice:
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import javax.swing.*;
public class PrintTestFrame extends JFrame implements ActionListener, Printable
{
private PrinterJob job;
private JButton buttonPrint;
public PrintTestFrame ()
{
super ("Print Test");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (300, 300);
buttonPrint = new JButton ("PRINT");
buttonPrint.addActionListener (this);
add (buttonPrint, BorderLayout.SOUTH);
job = PrinterJob.getPrinterJob ();
job.setPrintable (this);
}
public void actionPerformed (ActionEvent ae)
{
if (job.printDialog ())
{
try {
job.print ();
} catch (Exception e) {
JOptionPane.showMessageDialog (this, "Errore");
}
}
}
public int print (Graphics g, PageFormat pageFormat, int pageIndex)
{
if (pageIndex > 0)
return NO_SUCH_PAGE;
double imageableWidth = pageFormat.getImageableWidth ();
double imageableHeight = pageFormat.getImageableHeight ();
double frameWidth = getWidth ();
double frameHeight = getHeight ();
double scale = imageableWidth / frameWidth; // Modo "Fit width"
Graphics2D g2d = (Graphics2D) g;
g2d.translate (pageFormat.getImageableX (), pageFormat.getImageableY ());
g2d.scale (scale, scale);
printAll (g); // Invoca printAll sul frame (this)
return PAGE_EXISTS;
}
public static void main (String[] args)
{
SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
PrintTestFrame f = new PrintTestFrame ();
f.setVisible (true);
}
});
}
}
Se hai una stampante virtuale che stampa su PDF (tipo PDFCreator o simile), prova a fare la stampa su PDF e visualizzalo, così capisci meglio come fa la stampa.
Nota che per il ridimensionamento ho usato un "fit width", in pratica per calcolare il fattore di scala mi baso solo sulla larghezza del frame e la "spiattello" su tutta la larghezza dell'area stampabile.
È chiaro che se si vogliono fare dei margini, rotazioni, altri modo di scalatura ... beh, è tutto da fare e calcolare.