// // java1334.java // Copyright (c) 1998, Agustin Froufe // Todos los derechos reservados. // // No se asume ninguna responsabilidad por el uso o alteracion de este // software. Este software se proporciona COMO ES, sin garantia de ningun // tipo de su funcionamiento y en ningun caso sera el autor responsable de // da±os o perjuicios que se deriven del mal uso del software, aun cuando // este haya sido notificado de la posibilidad de dicho da±o. // // Compilador: javac 1.2 beta 4 // Autor: Agustin Froufe // Creacion: 28-Aug-1998 08:43:41 // //-------------------------------------------------------------------------- // Esta informacion no es necesariamente definitiva y esta sujeta a cambios // que pueden ser incorporados en cualquier momento, sin avisar. //-------------------------------------------------------------------------- import java.awt.*; import java.awt.event.*; import java.util.*; public class java1334 extends Frame implements ActionListener, WindowListener { Button botonImp; Button botonVer; Impresora impresora; public java1334() { super( "Tutorial de Java, Impresora" ); addWindowListener( this ); // Panel para contener los botones Panel panel = new Panel(); add( "South",panel ); // Se añaden los botones que permiten imrpimir o previsualizar el // texto que se va a imprimir botonImp = new Button( "Imprimir" ); panel.add( "South",botonImp ); botonImp.addActionListener( this ); botonVer = new Button( "Visualizar" ); panel.add( botonVer ); botonVer.addActionListener( this ); // Se crea un objeto de la clase que se ha creado para controlar la // impresión impresora = new Impresora( this ); setBounds( 100,100,250,100 ); setVisible( true ); // Se crea el texto que se va a imprimir, como ejemplo imprimirTexto(); } // Este método es el que crea las líneas de texto que se van a // imprimir, utilizando los métodos de formateo que se han creado // para la clase Impresora, colocando ese texto en el objeto de // tipo Impresora que se ha creado al arrancar private void imprimirTexto() { int i = 1; impresora.setFont( new Font( "SanSerif",Font.PLAIN,12 ) ); impresora.print( i++ + "." ); impresora.tab( 10 ); impresora.println( "Ejemplo para la impresora" ); impresora.print( i++ + "." ); impresora.tab( 10 ); impresora.setFont( new Font( "Helvetica",Font.BOLD,12 ) ); impresora.println( "Texto con otro tipo de fuente, negrilla" ); impresora.print( i++ + "." ); impresora.tab( 10 ); impresora.setFont( new Font( "Helvetica",Font.ITALIC,18 ) ); impresora.println( "Lo mismo pero cayendo a derechas" ); } // Aquí es donde se controla la acción de los botones, para // imprimir o visualizar, según lo que se haya seleccionado public void actionPerformed( ActionEvent evt ) { Object obj = evt.getSource(); // Una vez que se sabe el botón que es, se realiza la acción if( obj == botonImp ) { // Se genera el salto de página y se finaliza el Job, de forma // que la impresora sacará a fuera la página impresora.saltoPagina(); impresora.finImpresion(); } if( obj == botonVer ) { // Se manda lo mismo a la pantalla preVisualizacion(); } } private void preVisualizacion() { Dimension dim = impresora.tamPagina(); setBounds( 0,0,dim.width,dim.height ); impresora.setBounds( 0,0,dim.width,dim.height ); impresora.setVisible( true ); } static public void main( String argv[] ) { new java1334(); } public void windowClosing( WindowEvent evt ) { // Cuando se pica el botón de salir se corta la ejecución System.exit( 0 ); } // Los demás métodos de control de la ventana hay que // sobreescribirlos porque se está utilizando el interfaz // y hay que implementar todos los métodos, aunque no se // haga nada en ellos public void windowClosed( WindowEvent evt ){} public void windowOpened( WindowEvent evt ){} public void windowIconified( WindowEvent evt ){} public void windowDeiconified( WindowEvent evt ){} public void windowActivated( WindowEvent evt ){} public void windowDeactivated( WindowEvent evt ){} } // Esta es la clase Impresora objeto real del ejemplo class Impresora extends Canvas { Frame f; // Frame padre PrintJob pjob; // Objeto de impresión Graphics pg; // Objeto donde pintar lo que se imprimirá Vector objetos; // Array de instrucciones a la impresora Point pt; // Posición actual de la impresión Font fnt; // Font actual Font tabFont; // Font para calcular los tabulados public Impresora( Frame frm ) { // Se crea el Frame y se añade el objeto f = frm; f.add( this ); // Pero no se visualiza setVisible( false ); // Todavía no hay nada que imprimir pjob = null; // Posición inicial de impresión pt = new Point( 0,0 ); // Inicialización del array de instrucciones objetos = new Vector(); // Fuentes a utilizar por defecto // Para los tabuladores utilizamos una fuente "no proporcional" para // que los espacios tengan el mismo tamaño que las letras, de forma // que una "m" ocupe exactamente el mispo espacio que " " tabFont = new Font( "MonoSpaced",Font.PLAIN,12 ); fnt = new Font( "SansSerif",Font.PLAIN,12 ); } // Método para fijar la fuente de caracteres a utilizar en la // impresión hasta que no se indique otro public void setFont( Font f ) { objetos.addElement( new printFont( f ) ); } // Este método imprime una cadena, pero no realiza el salto de // línea, de tal modo que lo que se imprima luego, se hará // a continuación de lo que se envíe a la impresora en este // método public void print( String s ) { objetos.addElement( new printString( s ) ); } // Este método imprime una cadena y salta a la línea siguiente public void println( String s ) { print( s ); objetos.addElement( new saltoLinea() ); } // Este método realiza el salto de página. Como la impresión // se realiza página a página, hay que concluir el trabajo y // posicionarse de nuevo en la posición incial para pintar la // siguiente página public void saltoPagina() { if( pjob == null ) { pjob = getToolkit().getPrintJob( f,"Impresora",null ); } pg = pjob.getGraphics(); print( pg ); pg.dispose(); pt = new Point( 0,0 ); // posición inicial en la página objetos = new Vector(); // objetos a imprimir } // Este método es el que concluye totalmente la impresión // comprobando que ya no quedan objetos que enviar a la // impresora public void finalize() { if( objetos.size() > 0 ) saltoPagina(); finImpresion(); } // Concluye el trabajo de impresión public void finImpresion() { pjob.end(); } // Incluye un tabulador, colocando tantos espacios como // saltos de tabulador public void tab( int tabstop ) { objetos.addElement( new printTab( tabFont,tabstop ) ); } // Este método controla el tamaño de la página que se va a // imprimir, asegurándose de que hay un tamaño por defecto // para poder visualizar el contenido public Dimension tamPagina() { if( pjob == null ) { return( new Dimension( 620,790 ) ); } else { pjob = getToolkit().getPrintJob( f,"Impresora",null ); return( pjob.getPageDimension() ); } } // Sobrescritura del método paint() para que se pueda realizar // la previsualización de lo que se va a imprimir public void paint( Graphics g ) { pt = new Point( 0,0 ); print( g ); } // Este es el método que realmente realiza la impresión sobre // la impresora, recorriendo la lista de objetos que se ha // construido y enviando todos sus elementos al objeto Impresora // que se ha creado, pintándolos igual que si lo estuviese // naciendo en la pantalla public void print( Graphics g ) { objImpresora imp; // Siempre hay que comenzar con alguna fuente f.setFont( fnt ); for( int i=0; i < objetos.size(); i++ ) { imp = (objImpresora)objetos.elementAt( i ); imp.draw( g,pt ); } } } // Clase abstracta que define el método draw() para que // las clases que implementan los distintos objetos que // se van a controlar para facilitar el trabajo de imprimir // con la impresora, lo sobreescriban pintando lo que les // corresponda abstract class objImpresora { abstract void draw( Graphics g,Point p ); } // Salto de linea. Vuelve a la x=0 e incrementa la y en // lo que ocupa la fuente de caracteres con que se está // pintando class saltoLinea extends objImpresora { public void draw( Graphics g,Point p ) { p.x = 0; p.y += g.getFontMetrics( g.getFont() ).getHeight(); } } // Cadena. Pinta una cadena en la posición en que se encuentre // posicionado el puntero de impresión y desplaza a este en la // anchura de la cadena class printString extends objImpresora { String cadena; public printString( String s ) { cadena = s; } public void draw( Graphics g,Point p ) { g.drawString( cadena,p.x,p.y); p.x += g.getFontMetrics( g.getFont() ).stringWidth( cadena ); } } // Fuente de caracteres. Fija la fuente de caracteres que se va a // utilizar para seguir imprimiendo class printFont extends objImpresora { Font fuente; public printFont( Font f ) { fuente = f; } public void draw( Graphics g,Point p ) { g.setFont( fuente ); if( p.y <= 0 ) { p.y = g.getFontMetrics( fuente ).getHeight(); } } } // Tabulador. Desplaza el puntero que recorre el eje de la X en // tantas posiciones como se indique. Para saber el desplazamiento // que corresponde a cada uno de los puntos de tabulación, se // utiliza el ancho de la letra M, que suele ser la más ancha, // en previsión de que la fuente por defecto que se utilice para // la tabulación sea una proporcional class printTab extends objImpresora { static int tabulador = 0; int tab_dist; Font tabFnt; public printTab( Font tbFont,int tabdist ) { tabFnt = tbFont; tab_dist = tabdist; } public void draw( Graphics g,Point p ) { if( tabulador == 0 ) { tabulador = g.getFontMetrics( tabFnt ).stringWidth( "M" ); } if( p.x < ( tab_dist * tabulador ) ) { p.x = tab_dist * tabulador; } } } //------------------------------------------ Final del fichero java1334.java