Sunteți pe pagina 1din 4

Dibujar en Swing.

1.- Dibujar en Swing.


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.

S-ar putea să vă placă și