Imprimir desde Swing

kiko
11 de Marzo del 2004
Hola a todos, tengo un problema con la impresion, intento imrimir un JPanel, que contiene otros objetos, el problema es que el contenido es mas grande que el panel, por lo que lo pongo en un JScrollPane. Pues bien, cuando lo imprimo (el JPanel) solo me imprime lo que se ve por la pantalla, no el JPanel entero.
Alguien puede ayudarme?
He mirado los manuales de sun y una serie de documentos de JavaWord, pero no consigo dar con la solución.
Muchas Gracias.

franmoreno
11 de Marzo del 2004
Como no muestras tu código no puedo saber que te está pasando pero quizas esta clase te ayude:

import java.awt.*;
import java.awt.geom.*;
import java.awt.print.*;
import javax.swing.*;

public class ComponenteParaImprimir
implements Printable {
private Component mComponent;

boolean isBook;
boolean escala;
boolean visible;

final static boolean PARA_BOOK = true;
final static boolean HARDCOPY = false;
final static boolean CON_ESCALADO = true;
final static boolean SIN_ESCALADO = false;
final static boolean VISIBLE = true;
final static boolean INVISIBLE = false;

public ComponenteParaImprimir(Component c, boolean book, boolean escala,
boolean visible) {
mComponent = c;
isBook = book;
this.escala = escala;
this.visible = visible;
}

public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0 && !isBook) {
return NO_SUCH_PAGE;
}
Graphics2D g2 = (Graphics2D) g;
AffineTransform oldTransform = g2.getTransform();

double x0 = pageFormat.getImageableX(), y0 = pageFormat.getImageableY();
double pw = pageFormat.getImageableWidth(),
ph = pageFormat.getImageableHeight();

g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

int cw = mComponent.getWidth(), ch = mComponent.getHeight();

double scx = ( (double) pw) / cw;
double scy = ( (double) ph) / ch;

if (escala) {
g2.scale(scx, scy);
}

if (!visible) {
JFrame invisibleContainer = new JFrame();
invisibleContainer.getContentPane().add(mComponent);
invisibleContainer.pack();
invisibleContainer.setVisible(false);
}

setDoubleBuffering(mComponent, false);

mComponent.paint(g2);
setDoubleBuffering(mComponent, true);

g2.setTransform(oldTransform);

return PAGE_EXISTS;
}

private boolean disableDoubleBuffering(Component c) {
if (c instanceof JComponent == false) {
return false;
}
JComponent jc = (JComponent) c;
boolean wasBuffered = jc.isDoubleBuffered();
jc.setDoubleBuffered(false);
return wasBuffered;
}

private void restoreDoubleBuffering(Component c, boolean wasBuffered) {
if (c instanceof JComponent) {
( (JComponent) c).setDoubleBuffered(wasBuffered);
}
}

private void setDoubleBuffering(Component c, boolean isEnabled) {
RepaintManager manager = RepaintManager.currentManager(c);
manager.setDoubleBufferingEnabled(isEnabled);
}

}//fin

usala de esta manera, aplicala atu JPanel como sigue:

....
....
ComponenteParaImprimir cp = new ComponenteParaImprimir( (JPanel) reg.
getEntornoDetalle().getPanelDetalle(), ComponenteParaImprimir.HARDCOPY,
ComponenteParaImprimir.CON_ESCALADO, ComponenteParaImprimir.VISIBLE);

y luego ......

Paper papel = new Paper();
double margen = 20;
papel.setSize(900, 1260);
papel.setImageableArea(margen, margen,
papel.getWidth() - margen * 2,
papel.getHeight() - margen * 2);
pf.setPaper(papel);

pj.setPrintable(cp, pf);
if (pj.printDialog()) {
try {
pj.print(attributes);
}
catch (PrinterException pe) {
System.out.println(pe);
}
}

....... etc, espero que te sirva de algo, un saludo.

franmoreno
11 de Marzo del 2004
perdona donde va la expresion: (JPanel) reg.
getEntornoDetalle().getPanelDetalle()

debe ir tu JPanel, ;)