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
Perfecto, gracias =)
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
oye esta bueniiiisima pero le falta una mejor enseñanza para los novatos
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
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!!
¬_¬ 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
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.
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
Muy buen aporte, funka perfecto gracias..!
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?
Excelente trabajo. Pero tengo un problema se demora mucho al enviar la informacion a la impresora
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!!
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
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
Gracias por el codigo, a mi no me causo ningun problema. De hecho es exactamento lo que estaba buscando.
Se puede utilizar este codigo para imprimir tickets?
mmm no estoy seguro, en realidad imprime lo que vez en pantalla, si quieres imprimir tickets creo q deberia ser en texto plano basado en coordenadas
Muchas gracias, me sirvio para imprimir facturas en una aplicacion de ventas. A mi tambien me gusta linux desde hace mucho.
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
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
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…
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
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
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?
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
muy buen ejemplo amigo, me sirvio pero necesito generar una venta y de esta imprimir el ticket me podrias ayudar con otro ejemplo
gracias desde puebla
Que onda, el ejemplo es para imprimir el frame como tal en swing, si lo que quieres es imprimir tickets te recomiento utilizar Jasper Reports. Hay muchos ejemplos en internet y es fácil de utilizar.
Si quieres puedes encontrar unos ejecicios básicos que tengo en github:
https://github.com/jaehoo/oz-mvn-jasper-reports
Saludos!
Me marca error en los import
Ah que raro… tienes bien configurado tu java_path o si utilizas un IDE tienes configurada la JDK?
me sirvio perfectamente muchas gracias!
por nada, que bueno que te sirvió
necesito imprimir un dato tipo long..,. ayuda