Aunque los componentes de Swing son bastantes y poderosos, no se est limitado a utilizarlo, ya que Swing permite escribir directamente en el rea de visualizcin de un frame, panel o alguno de los componentes de Swing. Aunque muchos componentes que utiliza Swing no incluyen la posibilidad de dibujar directamente en la superficie del mismo, est disponible para aquellas aplicaciones que lo requieran. ara escribir directamente en la superficie de un componente, se necesita conocer cules son los m!todos de dibujar definidos en A"#, como $draw%ine&'$ o $draw(ect&'$. )l alcance de dibujar en Swing est basado en el mecanismo original de A"#, pero Swing ofrece mejores implementaciones obtenidas por parte del control. Antes de dibujar en Swing conviene comprender los mecanismos de dibujar de A"#. %a clase *omponent de A"# define un m!todo llamado $paint&'$ que es utilizado para dibujar una salida directamente en la pantalla de la computadora. )n la mayor parte, $paint&'$ no es invocado por el programa, sino que es invocado por el sistema de ejecucin donde un componente es generado. )sta situacin puede ocurrir por varias razones, por ejemplo, la ventana en la cual el componente es desplegado puede ser sobreescrita por otra ventana que la cubre. + bien, la ventana puede ser minimizada y despu!s puede ser restaurada. )l m!todo $paint&'$ es adems invocado cuando un programa se est ejecutando. *uando se escribe un cdigo basado en A"#, una aplicacin sobrecargar el m!todo $paint&'$ donde lo necesite, para escribir directamente en la superficie del componente. ,ebido a que -component &de Swing' hereda de *omponent, todos los componentes ligeros de Swing heredan del m!todo $paint&'$. Sin embargo, no se debe dibujar directamente en la superficie del componente. %a razn de esto es que Swing tiene un alcance ms sofisticado para dibujar que incluye tres m!todos. paint*omponent&' paint/order&' paint*hildren&' )stos m!todos dibujan la porcin indicada sobre un componente, y divide el proceso de dibujar en tres distintas acciones lgicas. )n un componente ligero, un m!todo original de A"# &$paint&'$' simplemente ejecuta las llamadas a estos m!todos. ara dibujar la superficie de un componente Swing se debe crear una sub$clase del componente e invocar al m!todo $paint*omponent&'$. )ste m!todo dibuja el interior del componente. 0eneralmente no se usan los otros dos m!todos de dibujar, y cuando se invoca a $paint*omponent&'$ lo primero que hay que hacer es llamar a $super.paint*omponent&'$ &es el constructor o m!todo de la clase padre', as1 toma lugar la parte de dibujar de la super$clase. ara escribir la salida que se desea mostrar se utiliza el m!todo $paint*omponent&0raphics g'$, el cual indica mediante la $g$ qu! salida ser escrita. ara indicar que un componente ser dibujado bajo el control de un programa se llama al m!todo $repaint&'$. 2.- Computar el rea de dibujo. *uando se dibuja la superficie de un componente, hay que tener cuidado en restringir la salida sobre el rea que est dentro del borde. Aunque Swing automticamente vincula cualquier salida buscando que no e2ceda los l1mites, es posible que se pinte el borde &lo que har que se sobreescriba cuando el borde es dibujado'. ara evitar esto, se debe computar el rea dibujable del componente. 3sta rea est definida por el tama4o actual del componente menos el espacio usado por el borde. )sms, antes de dibujar un componente se debe obtener el ancho del borde y despu!s ajustar el dibujo acorde a el. ara obtener el ancho del borde se invoca el m!todo $get5nsets&'$. 5nsets get5nsets&' 3ste m!todo est definido por $*ontainer$ y se invoca por $-component$. (egresa un objeto $5nsets$ que contiene las dimensiones del borde. )ste valor puede obtenerse utilizando estos campos. int top6 int bottom6 int left6 int right6 )stos valores son usados para computar el rea de dibujo dada por el ancho y el alto de un componente. ara ello, se puede obtener ambos valores usando $get"idth&'$ y $get7eight&'$ en el componente &que regresan un entero'. 3.- Un ejemplo de -paint-. 8amos a ver un programa que ubica la creacin de un panel de dibujo &que e2tender de la clase -panel'. )l programa usa un objeto para mostrar l1neas &cuyos puntos sern ubicados aleatoriamente'. import java.awt.96 import java.awt.event.96 import java2.swing.96 import java.util.96 class anel,ibujo e2tends -anel : 5nsets ins6 (andom rand6 anel,ibujo&' : set/order&/order;actory.create%ine/order&*olor.(),, <''6 rand=new (andom&'6 > protected void paint*omponent &0raphics g' : super.paint*omponent&g'6 int 2, y, 2?, y?6 int height=get7eight&'6 int width=get"idth&'6 ins=get5nsets&'6 for &int i=@6 iAB@6 iCC' : 2=rand.ne2t5nt&width$ins.left'6 y=rand.ne2t5nt&height$ins.bottom'6 2?=rand.ne2t5nt&width$ins.left'6 y?=rand.ne2t5nt&height$ins.bottom'6 g.draw%ine&2,y,2?,y?'6 > > > %o anterior implic el uso del panel de dibujo. Ahora vamos con la clase que contiene el m!todo principal &y que es la que utilizar y gestionar la ejecucin'. import java2.swing.96 class ruebaaint : -%abel etiqueta6 anel,ibujo pd6 ruebaaint&' : -;rame marco = new -;rame&Drueba aintD'6 marco.setSize&?@@,B<@'6 marco.set,efault*lose+peration&-;rame.)E5#F+GF*%+S)'6 pd = new anel,ibujo&'6 marco.add&pd'6 marco.set8isible&true'6 > public static void main &String HI args' : SwingJtilities.invoKe%ater&new (unnable &' : public void run&' : new ruebaaint&'6 > >'6 > > rimero el $anel,ibujo$ e2tiende del -panel. -panel es uno de los contenedores ligeros de -ava, lo que significa que el componente puede ser a4adido al contenedor de -frame. ara manejar el dibujo, $anel,ibujo$ invoca al m!todo $paint*omponent&'$, esto habilida que $anel,ibujo$ escriba directamente en la superficie del componente cuando esto se indique. )l tama4o del panel no est especificado ya que el programa utiliza la ubicacin por defecto y es a4adido en el centro. )sto resulta que el panel est ajustado para ocupar el centro. Si se cambia el tama4o de la ventana, el tama4o del panel ser ajustado acorde al nuevo tama4o. Aqu1, el constructor especifica un borde rojo de < pi2eles de ancho, mediante la invocacin del m!todo $set/order$, siendo precisamente $/order$ la interfaz de Swing que encapsula un borde. Se puede obtener el borde invocando uno de los m!todos definidos en la clase $/order;actory$. )l que se utiliza en el ejemplo es $create%ine/order&'$, el cual crea un borde simple con l1nea. static /order create%ine/order &*olor color, int ancho' ,entro de la invocacin de $paint*omponent&'$, primero se llama a $super.paint*omponent&'$, siendo necesario para asegurar que el componente ser dibujado adecuadamente. ,espu!s se obtiene el ancho y alto del panel mediante el uso de $insets$. )stos valores se utilizan para asegurar que se dibujara dentro del rea de dibujo acordada en el panel. %os clculos son dise4ados para trabajar de manera efectiva con distintos $anel,ibujo$ y bordes. ara probar el programa, cambia el tama4o de la ventana, con esto, las l1neas aLn estarn dentro de los bordes del panel. *uando la aplicacin se muestra por primera vez, se invoca el m!todo $paintcomponent&' y se dibujan las l1neas. *ada vez que se cambia el tama4o, o bien se oculta &o restablece' la ventana, se vuelve a dibujar un nuevo conjunto de l1neas. )n todos los casos, las l1neas son dibujadas dentro del rea de dibujo establecida.