Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

miércoles, 9 de mayo de 2012

Imprimir un jPanel y con todos sus componentes internos.

Usando el Netbeans creamos un jDialog y le agregamos un jPanel. Dentro de ese jPanel le agregamos por ejemplo una jTable, un label y un jButton. Tal y como muestra la siguiente captura:

















Codigo:

//Imprimir un jPanel y con todos sus componentes internos.
package imprimir;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

public class Impresiones extends javax.swing.JDialog implements Printable {
    public Impresiones(java.awt.Frame parent, boolean modal) {
        initComponents();
    }
    private void initComponents() {...}//aqui va codigo generado por Netbeans
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        try {
            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPrintable(this);
            job.printDialog();
            job.print();

        } catch (PrinterException ex) { }       
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Impresiones dialog = new Impresiones(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                    
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                  
   
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        if (pageIndex > 0) return NO_SUCH_PAGE;
        Graphics2D g2d = (Graphics2D)graphics;

        //Punto donde empezará a imprimir dentro la pagina (100, 50)
        g2d.translate(  pageFormat.getImageableX()+100,
                        pageFormat.getImageableY()+50);
        g2d.scale(0.50,0.50);
//Reducción de la impresión al 50%
        jPanel1.printAll(graphics);
        return PAGE_EXISTS;               
    }
}


Resultado:















18 comentarios:

  1. hola que tal, buen aporte pero tengo dos dudas? que hace el NO_SUCH_PAGE y el PAGE_EXIST? lo que pasa es que me marca dos errores precisamente en eso :S

    ResponderEliminar
    Respuestas
    1. Hola Ivonne, si te marca ese error es que seguramente te has dejado de implementar "Printable" en la clase principal (hay que ponerlo manualmente). Debe quedar así:

      public class Impresiones extends javax.swing.JDialog implements Printable {

      Un saludo,

      Eliminar
  2. Hola podes poner los .jar es que me sale el mismo error o tal ves peor

    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE
    at javax.swing.JDialog.setDefaultCloseOperation(JDialog.java:753)
    at imprimir.Impresiones.initComponents(Impresiones.java:106)
    at imprimir.Impresiones.(Impresiones.java:16)
    at imprimir.Impresiones$2.run(Impresiones.java:162)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    GENERACIÓN CORRECTA (total time: 1 second)

    ResponderEliminar
  3. ya logre imprimir Pero ahora me surge otra duda en la impresion sale con poca resolucion algo asi como pocos pixeles abra alguna manera de qque se note mejor la resolucion o mejor que se imprima tal y como es en el monitor.

    ResponderEliminar
    Respuestas
    1. Prueba de cambiar la escala de la imagen, pasar del 0.50 al 1:

      g2d.scale(0.50, 0.50); //50%
      g2d.scale(1, 1); //100%

      Eliminar
  4. gracias por el aporte

    ResponderEliminar
  5. Disculpa yo trabajo con el IDE ECLIPSE y me gustaría saber en:

    private void initComponents() {...}

    Que podría poner por ejemplo para ver el funcionamiento de la impresión.

    Gracias.

    ResponderEliminar
    Respuestas
    1. ahí va solo el diseño del panel, que en netbeans te lo autogenera, No se como haras tus paneles en eclipse, si con algun layout, o le pones setbounds, cualquiera de las dos formas, esas construcciones irian en el initComponents()

      Eliminar
  6. Hola soy principiante con JAVA y estoy ya apunto de terminar un proyecto y me sale estos errores por fa colaboren me

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at consulcorreo.Grafconsul.cargar(Grafconsul.java:53)
    at consulcorreo.Grafconsul.(Grafconsul.java:27)
    at consulcorreo.Grafconsul$5.run(Grafconsul.java:227)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

    ResponderEliminar
  7. private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    try {
    PrinterJob job = PrinterJob.getPrinterJob();
    Robot robot = new Robot();
    robot.mouseMove(385, 355);
    // robot.delay(20000);
    // robot.mousePress(InputEvent.BUTTON1_MASK);
    // robot.mouseRelease(InputEvent.BUTTON1_MASK);
    if ( job.printDialog())
    {
    // robot.mousePress(InputEvent.BUTTON1_MASK);
    // robot.mouseRelease(InputEvent.BUTTON1_MASK);
    try {

    job.setPrintable((Printable) this);
    job.print();
    } catch (PrinterException ex) { }
    }
    //ANIMACION PROGRES BAR
    // int x =500;
    // new Thread(new Job1( Integer.valueOf(50))).start();
    // new Thread(new jcThreadI( this.jProgressBar1 , Integer.valueOf(500) ) ).start();
    } catch (AWTException ex) {
    Logger.getLogger(Imprime.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    if (pageIndex == 0)
    {
    Graphics2D g2d = (Graphics2D) graphics;
    g2d.translate(pageFormat.getImageableX()+20,
    pageFormat.getImageableY()+30);
    g2d.scale(0.77,0.77); //Reducción de la impresión al 50%
    panelImprime.printAll(graphics);

    Graphics2D g3d = (Graphics2D) graphics;
    g3d.translate(pageFormat.getImageableX()+0.1,
    pageFormat.getImageableY()+500);
    g3d.scale(1,1); //Reducción de la impresión al 50%
    panelImprime.printAll(graphics);
    return PAGE_EXISTS;
    }
    else
    return NO_SUCH_PAGE;
    }


    Pero en la clase debes poner
    public class Imprime extends javax.swing.JFrame implements Printable {
    .
    .
    .

    ResponderEliminar
  8. http://tingsystems.com/2012/08/31/imprimir-con-java-2da-parte/

    ResponderEliminar
  9. Hola, quisiera hacerte una pregunta:
    como puedo imprimir todo el contenido del jdialog form?
    desde ya muy agradecido
    saludos!!

    ResponderEliminar
  10. Te amo.
    Eres mi dios, me has salvado la vida.
    Eres el puto amo.

    ResponderEliminar
  11. hola tengo este error como lo soluciono ??
    java.awt.print.PrinterException: Paper's imageable height is too small.

    ResponderEliminar
  12. buenas soy nuevo en java y estoy trabajando con formularios y necesito imprimir los datos que contiene un formulario solo los datos no los componentes

    ResponderEliminar
  13. Excelente aporte, me salvaste, el código funciona perfecto !!!! Muchas gracias

    ResponderEliminar
  14. hola como esta, estuve provando el codigo me marca un error en el this

    ResponderEliminar

Con la tecnología de Blogger.