|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
[Java] stampa
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/Sw...Utilities.java e viene utilizzata sempre allo stesso modo (new PrintUtilities(this)) Come potrei risolvere? Thanks
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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: Codice:
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();
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
mmm, forse non mi sono spiegato...
Faccio un esempio molto rudimentale... Mettiamo caso avvii questa classe Codice:
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();
}}
Se invece la modifico in questo modo Codice:
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();
}}
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Non so se sbaglio io, ma anche con il JPanel non mi stampa nulla...
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Codice:
/*
* 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();
}
}
}
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
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...
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Ti ringrazio per l'aiuto, anche nell'altro thread
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:26.



















