Imprimir JPanel/JFrame – Print JPanel/JFrame Java

Para realizar las impresiones en Swing es necesario utilizar la interface Printable en el objeto que queremos imprimir.

implements Printable

Se debe sobreescribir el método print(), abajo le pasamos el comoponente que deseamos imprimir que en este caso es un JPanel (pero tambien podemos enviarle el comoponente que querramos :


public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

if (pageIndex > 0) { /* We have only one page, and 'page' is zero-based */
  return NO_SUCH_PAGE;
}

Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

jPanel1.printAll(graphics);

return PAGE_EXISTS;

}

Y por último mandar a ejecutar la impresión:

        try {
  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPrintable(this);
  job.printDialog();
  job.print();
} catch (PrinterException ex) {
  Logger.getLogger(PrintMe.class.getName()).log(Level.SEVERE, null, ex);
}

Update 09/04/2018: he recuperado el código fuente de este y los otros ejemplos para imprimir el Jpanel, lo pueden descargar de github:

https://github.com/jaehoo/oz-ex-swing/tree/master/src/main/java/org/oz/swing/examples/jpanel

Saludos =P

32 comentarios en “Imprimir JPanel/JFrame – Print JPanel/JFrame Java

    • jaehoo dijo:

      Bueno, pues este el primer comentario que recibo y me da mucho gusto que te haya servido.

      He estado retocando las publicaciones para que sean un poco mas claras y entendibles, quiero comenzar a pulir más el sitio, claro cuendo y tenga un rato libre :p

      Saludos

  1. freddy leon dijo:

    hermano muchisimas gracias por su explicacion la verdad estaba cansado de buscar en todas partes una explicacion y ninguna fue tan efectiva y tan certera como la tuya
    gracias nuevamente

  2. Francisco Ramos dijo:

    Hola mira probe tu codigo pero solo me manda a imprimir el label de «Print Me!!!» todo lo demas del frame no me lo imprime y lo probe en mi frame e igual solo me imprime un componente es q creo q no me esta sobre escribiendo el metodo print….. este print lo coloco en la misma clase Jframe que quiero imprimir……… espero me puedan ayudar contactenme mediante mi correo sagato4mx@yahoo.com. Encontre otra forma donde si se imprime todo el frame pero se salen de los margenes y no se imprime completo…..no he encontrado como a chicar el frame en seguida les pongo el codigo:

    private void btnImprimirActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    PrintJob imprime = getToolkit().getPrintJob(this, evt.getClass().getName(), null);
    if(imprime!=null){
    Graphics pag = imprime.getGraphics();
    if(pag!=null){
    paint(pag); //pinta todo los objetos de la ventana mostrada
    pag.dispose();
    }
    }else{
    JOptionPane.showMessageDialog(null, «no se imprimo nada», «imprimir», JOptionPane.INFORMATION_MESSAGE);
    imprime.end();
    }
    imprime.end();
    }

    Esto manda a la impresora todo el frame pero se sale de los margenes. Gracias!!

    • jaehoo dijo:

      ¬_¬ como que pobre!!… mi amigo que el ejemplo que monte efectivamente me imprime todos los componentes, además no hay pierde deje el codigo fuente + la explicación asi que no me da otra cosa a pensar que tu problema es tu maquina virtual, o el programador. Ya he probado el código y no sucede lo que comentas, sim embargo por lo del redimensionado del frame hace tiempo subi un ejemplo que te realiza la impresión a escala, igual y te puede servir.

      Saludos

  3. Francisco Ramos dijo:

    Gracias por la respuesta, primero q nada pido una disculpa porq quiza mal interpretaste mis palabras no quise ofender escribiendo «pobre» ya q lo q de vrdd quise decir es «probé», disculpa el dedazo. 🙂
    Bueno tengo JDK 1.6.13 ocupo netbeans 6.7 y tengo windows vista ultimate y aqui es donde tengo el problema donde solo me imprime un control del frame pero lo probe en un xp y ahi si me imprime todo el frame completo como lo muestra tu imagen; bueno nose si tenga q ver o no el SO y el ejemplo de redimension me hace exactamente lo mismo, en vista, q este ejemplo q tienes aqui, bueno el hecho es q eso me pasaba porq ya lo resolvi usando el codigo q te deje solo agregandole estas lineas:

    PageAttributes pageAttributes = new PageAttributes();
    pageAttributes.setOrientationRequested(PageAttributes.OrientationRequestedType.LANDSCAPE);
    pageAttributes.setPrinterResolution(frame.getToolkit().getScreenResolution());

    y pasandole los atributos al printJob asi logre imprimir el frame completo ademas de q tuve q hacer un poco mas pequeño mi frame, q fue lo feo del asunto. La neta es q no soy un gran programador ni nada parecido y tu explicación es excelente solo q no se q es lo q pasa si es la VM o el SO o q rayos. Bueno gracias de antemano y disculpa el dedazo jeje y si logras reproducir mi error, avisame para no volverme loco jaja, o como te mando unas screenshots para q veas q es real lo q me pasa jeje.
    Bueno gracias.

    • jaehoo dijo:

      jajaja bueno no hay px, pero mm pues la verdad yo no tengo como probar codigo sobre un windows vista (no me agrada ¬¬) , soy linuxero desde hace dos años, lo más que tengo es hasta xp porq siendo sincero me gusta mucho mi linux… pero bueno pues me imagino que el conflicto esta en la implementación de la maquina virtual y windows.

      Y por lo menos lograste la impresion (mañosamente) pero es mejor eso a esperar a que saquen un parche para la JVM, y del contacto he agregado mi mail en la barra derecha del portal.

      Saludos

  4. Daniel dijo:

    Hola amigo, muy bueno el minitutorial. No obstante no consigo solucionar un problema del que no encuentro información. Resulta que para Linux, el Dialog que se muestra es siempre el de Java o cross-platform, y a mi me interesa que aparezca el nativo de Linux ya que éste habilita el botón de propiedades de impresora. En windows, hay diferenciación en hacer:

    job.printDialog() o job.printDialog(pras)

    siendo el primero el que te muestra el Dialog nativo con el botón habilitado. Pero como te digo, en Linux, tanto uno como otro abren el mismo Dialog. ¿Sabes si es un problema de Java para Linux?¿Cual sino es la forma de llamar al Dialog que necesito?

  5. Osvaldo dijo:

    Oye muy buen trabajo. Solo me ha dado un problema. Te lo explico… Cuando se muestra el printDialog y presiono Aceptar hace justo lo que quiero que haga: Imprime!! Pero cuando presiono Cancelar o cierro en printDialog, es decir cuando no quiero imprimir hace justo lo que no quiero que haga: Imprime de igual manera!! Aunque presione Cancelar siempre imprime… Talvez me puedas ayudar un poco.. Gracias de antemano. Exc Bolg!!

    • jaehoo dijo:

      ah es cierto, se me habia olvidado corregir ese detalle, pero no es dificil, el truco esta cuando llamas al metodo job.printDialog();, te regresa un boolean, solo tendiras que recibir el valor en una variable, algo asi:

      boolean imprime=job.printDialog();
      if(imprime){
      job.print();
      }

      saludos

  6. Jose dijo:

    muy bueno, pero hago una consulta, si yo quiero ,dentro de un mismo frame (Por ejemplo) imprimir, con un boton un jpanel y con otro boton otro como hago?? porque el metodo print() esta sobreescrito para jpanel1 y no jpanel2, se entiende mi pregunta?? Disculpen si es media estupida, gracias desde ya

    • jaehoo dijo:

      que bueno que te ayudo, sin embargo ya estoy preparando otro tutorial para imprimir reportes con jasper reports el cual es sencillo de utilizar y los reportes se ven mucho mejor, saludos

  7. Susana dijo:

    Todo ok, me ha sido muy útil. Pero me preguntaba si hay forma de hacer que el componente que se imprime lo haga ajustándose al tamaño de papel, se me imprime a escala normal y claro, se sale xD

  8. DANIEL dijo:

    hola mi estimado oie tu codigo es muy bueno ..programo bajo easy eclipse en linux y tengo una duda tu mencionas que para realizar las impresiones en Swing es necesario utilizar la interface Printable en el objeto que queremos imprimir. esto es al crear la clase me imagino pero solo me aparece swing frame nada sobre interface printable. la creo en frame y inserto tu codigo(all) con la extencion de la clase y funciona pero no le entiendo mucho para quitar tus labels y poder agregar los mios ya que cuando la visualixo no permite mover componentes se mueve todo el frame y quieo add mas y clro cambiar muchas cosas peor no me permite si es posible me gustaria que me dijeras donde puedo sacar esa clase editable o si me tengo que cambiar al nettbeans para consegirlo de ante mano gracias…

    • jaehoo dijo:

      Honestamente, prefiero netbeans para interfaces con swing, desconozco porque no te reconozca la clase, pero deberia probar con netbeans y despues tu regresas a eclipse a programar tu lógica de negocio.

      Saludos

  9. checko dijo:

    hermano no sabes como me sirvio este codigo yo nunca comento pero esta vez te la mamast con este codigo al 100 y mas x q dejast el codigo sin el codigo nunca me hubiera servido al 100 hermano t mereces unas mamadas de pito

  10. jesus dijo:

    Me gusto mucho el codigo…. Te comento, quiero hacer un formulario e imprimirlo para identificar los paquetes que envia una determinada empresa. El formulario consta de 3 campos, Nombre del Cliente, Numero de Factura y Cantidad de Bultos. Siendo este ultimo campo quien determinara cuantas veces se imprimira el formulario. Suponiendo que tenga 3 bultos, necesito que imprima 3 veces el formulario, el nombre del cliente y el numero de factura es el mismo en las 3 copias, pero en el numero de bultos, la primera hojita debera indicar 1/3, la segunda 2/3 y la tercera 3/3… Podrias ayudarme?

    • jaehoo dijo:

      Hola, claro mirá la impresión que necesitas es dinámica y como tal este ejemplo es para contenido estático o fijo. Sin embargo para tu problema puedes utilizar jasper reports, es un framework para reportes que en automático te imprime los valores de las páginas que necesitas.

      Si necesitas algunos ejemplos puedes descargar los que tengo en github:
      https://github.com/jaehoo/oz-mvn-jasper-reports

      Saludos

Replica a gabriel_i3 Cancelar la respuesta

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.