View Full Version : [Java] stampa
Fire Fox II
23-01-2010, 21:22
Salve raga
dovrei effettuare la stampa di un JFrame
Il problema è che se il frame lo visualizzo e poi stampo tramite bottone, allora tutto ok...
Se invece mando direttamente la stampa questa risulta vuota...
La classe usata per la stampa è questa
http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Printing/PrintUtilities.java
e viene utilizzata sempre allo stesso modo (new PrintUtilities(this))
Come potrei risolvere?
Thanks
Orpolà che bel segone mentale che si è fatto quello lì.
Per stampare un componente invochi il suo metodo print sul "graphics" di un Printable. Per stampare il componente e tutti i suoi figli invochi printAll.
Ergo:
printerJob.setPrintable(new Printable() {
public int print(Graphics g, PageFormat pf, int index) {
componente.printAll(g);
return index == 0 ? PAGE_EXISTS : NO_SUCH_PAGE;
}
});
printerJob.print();
Fire Fox II
23-01-2010, 22:50
mmm, forse non mi sono spiegato...
Faccio un esempio molto rudimentale...
Mettiamo caso avvii questa classe
public class Examples extends JFrame implements ActionListener {
public Examples(){
this.setLayout(new FlowLayout());
JButton stampa = new JButton("stampa");
stampa.setActionCommand("stampa");
stampa.addActionListener(this);
add(new JLabel("prova"));
add(stampa);
pack();
setSize(new Dimension(100,120));
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
PrintUtilities pj = new PrintUtilities(this);
pj.print();
}}
ottengo la stampa...
Se invece la modifico in questo modo
public class Examples extends JFrame {
public Examples(){
this.setLayout(new FlowLayout());
add(new JLabel("prova"));
setSize(new Dimension(100,120));
PrintUtilities pj = new PrintUtilities(this);
pj.print();
}}
pagina bianca...
Nel secondo caso la finestra non è visibile. A differenza dei componenti le finestre hanno un aspetto definito dal gestore delle finestre di sistema, che entra in gioco solo quando la finestra viene visualizzata. O ci metti un set visibile o stampi un jpanel.
Fire Fox II
24-01-2010, 00:59
Non so se sbaglio io, ma anche con il JPanel non mi stampa nulla...
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
*
* @author pgi
*/
public class PrintTest extends JFrame {
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new PrintTest();
}
});
}
public PrintTest() {
JLabel label = new JLabel("hello world");
label.setSize(100, 100);
JPanel panel = new JPanel(new FlowLayout());
panel.add(label);
panel.setSize(100, 100);
final Component component = panel;
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(new Printable() {
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
component.printAll(graphics);
return pageIndex == 0 ? PAGE_EXISTS : NO_SUCH_PAGE;
}
});
if(pj.printDialog()) {
try {
pj.print();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
Tieni d'occhio le dimensioni. E' un po' strano però che tu debba stampare dei componenti non visibili: forse dovresti usare un report (nel senso che disegni tu il contenuto anzichè lasciare che siano i componenti AWT/Swing a farlo).
Fire Fox II
24-01-2010, 17:22
Ti ringrazio per l'aiuto...
Per i JPanel, la dimensione è obbligatoria definirla?
Praticamente nella stampa ci sono parecchi JPanel che all'interno di un frame si adattavano automaticamente e venivano visualizzati...
Ma ora se il contenitore principale è proprio un JPanel, quelli interni non vengono visualizzati a meno che non vengano dimensionati...
E' obbligatorio per tutto. Il problema di fondo è che i componenti assumono una dimensione in base a ciò che stabilisce il layout manager il quale deve considerare sia quanto spazio c'è nel contenitore sia quanto vorrebbero essere grandi i componenti. Molti di questi "vorrebbero" dipendono da impostazioni del contesto grafico in cui esiste il componente e questo contesto grafico entra in gioco solo dopo che il componente radice dell'albero di contenuti viene alla luce (cioè dopo un pack o un set visible).
Personalmente ti consiglierei lo sviluppo di una piccola libreria per la stampa di report anzichè appoggiarti all'aspetto dei componenti Swing: creare un rapporto di stampa dall'aspetto predefinito in cui poi andare ad infilare contenuti diversi è questione di poche classi e qualche centinaio di linee.
Fire Fox II
02-02-2010, 22:12
Ti ringrazio per l'aiuto, anche nell'altro thread :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.