Você está na página 1de 93

ITSON Manuel Domitsu Kono

Tema 13
Grficas en Java
API de Java para Grficas

En la actualidad, se usan intensivamente las grficas e imgenes en computacin
tanto en la interfaz del usuario con la computadora, como un medio para que el
usuario le suministre informacin a un programa o para que el programa
despliegue los resultados. Lo anterior ha motivado la cracin de bibliotecas
especializadas en el manejo de grficas e imgenes para casi cualquier lenguaje
de programacin, incluyendo J ava que posee un conjunto de clases llamadas la
Interfaz de Programacin de Aplicaciones 2D de J ava (la API 2D de J ava). Esas
clases se encuentran en los siguientes paquetes:

j ava. awt
j ava. awt . i mage
j ava. awt . col or
j ava. awt . f ont
j ava. awt . geom
j ava. awt . pr i nt
j ava. awt i i mage. r ender abl e
com. sun. i mage. codec. j peg

Todos los paquetes a excepcin del ltimo forman parte del nucleo de la
plataforma de J ava, por lo que estan disponibles en todas las implementaciones
de java 2. La API de J ava 2D nos permite hacer, entre otras cosas, lo siguiente:

Representar figuras geomtricas arbitrarias usando combinaciones de
lneas y curvas. Tambin hay un conjunto de herramientas para construir
figuras estndar como rectngulos, arcos, elipses, etc.
Dibujar contornos a figuras usando lineas slidas o punteadas.
Rellenar figuras usando colores slidos, patrones, gradientes de color, etc.
Estirar, comprimir, rotar figuras, imgenes o texto.
Agregarle nuevos elementos a un dibulo existente.
Limitar o recortar la extencin de los dibujos.
Suavizar las orillas de las imgenes quitando los bordes zizagueados.
Usar las fuentes TrueType y type 1 instaladas en la computadora y
manipular cadenas de caracteres en la misma forma en que se manipulan a
las figuras.
Representar colores independientemente del hardware.
454 Grficas en Java

ITSON Manuel Domitsu Kono
Manipular imgenes en la misma forma en que se manipulan a las figuras.
Procesar imgenes para resaltar ciertas caractersticas o para limpiar
imgenes.
Imprimir (enviar la salida a una impresora).
La Clase Graphics2D

La clase Gr aphi cs2D es la clase medular de la API 2D de J ava. Es la mquina
de presentacin, encargada de desplegar las primitivas grficas (figuras, texto o
imgenes) en los dispositivos de salida (pantalla o impresora). La mquina de
presentacin se encarga de tomar una coleccin de primitivas y de decidir de que
color sern los pixeles en un dispositivo de salida.

Adicionalmente, la clase Gr aphi cs2D representa una superficie de dibujo, que es
simplemente una coleccin de pixeles, cada uno de un color. Esa superficie puede
estar dentro de una ventana o ser una pgina en una impresora o una imagen an
no desplegada.

Para desplegar figuras, texto o imgenes se requiere de un objeto del tipo
Gr aphi cs2D. Ese objeto no se puede crear usando el operador new. En lugar de
ello debemos obtenerlo de los objetos sobre los cuales se pueden desplegar
figuras, texto o imgenes: Objetos de las subclases de Component .

La clase Component , Figura 13.1, tiene el mtodo pai nt ( gr aphi cs g) que
recibe del sistema un objeto del tipo Gr aphi cs2D a travs del parmetro g. En la
subclase de en la que deseamos dibujar debemos sobreescribir su mtodo
pai nt ( ) . Para tener acceso a los mtodos de Gr aphi cs2 hay que hacer una
conversin explcita a Gr aphi cs2:

publ i c voi d pai nt ( Gr aphi cs g) {
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Usamos g2 par a despl egar f i gur as, t ext o o i mgenes.
}

Si el componente sobre el que deseamos dibujar pertenece al paquete swing,
debemos utilizar el mtodo pai nt Component ( gr aphi cs g) que trabaja en
forma similar al mtodo pai nt ( ) .

Una forma alternativa para obtener el objeto Gr aphi cs2 es usando el mtodo
Gr aphi c get Gr aphi cs( ) de la clase Component .
Tema 13 Grficas en Java 455

ITSON Manuel Domitsu Kono


Figura 13.1 Clases sobre las que se puede dibujar
Procedimiento de Presentacin

La figura 13.2 muestra el procedimiento empleado por la clase Gr aphi cs2D para
decidir como las primitivas grficas se convertirn en colores de pixeles. Este
procedimiento consta de cinco pasos:

1. Determine la figura a ser presentada. Es diferente para cada operacin de
representacin:

Si la figura va a rellenarse, la figura se transforma (mueve, estira,
comprime, rota) usando la transformacin actual. Todas las primitivas
son transformadas antes de presentarse. La transformacin convierte
las primitivas del espacio del usuario al espacio del dispositivo. Por
ausencia, la transformacin mapea 72 coordenadas del usuario a una
pulgada del dispositivo de salida.
Para las figuras cuyo contorno es dibujado por el mtodo draw(), se usa
el trazo (stroke) actual para convertir el contorno en una figura. Luego el
contorno se transforma de igual forma que una figura rellena.
456 Grficas en Java

ITSON Manuel Domitsu Kono
El texto se despliega traduciendo los caracteres a figuras usando la
fuente actual. Las figuras resultantes se transforman de igual forma que
una figura rellena.
En las imgenes, el contorno de la imagen se transforma usando la
transformacin actual.


Figura 13.2 Procedimiento de Presentacin

Como puede verse, la mquina de presentacin slo sabe rellenar figuras y
dibujar imgenes. En realidad dibujar contornos de figuras y dibujar texto
son casos especiales de rellenar figuras.

2. Entramar (rasterize) la figura. Es el proceso de convertir una figura ideal a
un conjunto de valores de pixeles. En el caso de luna imagen, el contorno
de la imagen es entramado. Para controlar el comportamiento del
entramado, se emplean las sugerencias de Presentacin (Rendering hints)
que son un conjunto tcnicas para desplegar primitivas.

3. Recorta los resultados usando la figura de recorte (clipping) actual. Slo los
pixeles dentro de la figura de recorte sern desplegados.

4. Determine los colores a usar. Para una figura rellena utilice el objeto pai nt
actual para determinar los colores a usar para rellenar la figura. Para una
imagen los colores provienen de la misma imagen.

5. Combine los colores con el dibujo existente, usando la regla de composicin
actual.


Tema 13 Grficas en Java 457

ITSON Manuel Domitsu Kono
Valores Alfa

El proceso de despliegue es una aproximacin. Al pedirle a la mquina de
despliegue que rellene una figura, sta determina cmo el dispositivo de salida
debe colorearse para aproximar en lo mejor posible a la figura.
Efecto dentado y Suavizado de Bordes

Por ejemplo supongamos que le pedimos que llene a la figura con un color. Hay
dos formas de hacerlo: la forma fcil y la forma correcta. En la forma fcil, slo los
pixeles que caen dentro de la figura son coloreados. Usando este algoritmo los
pixeles son coloreados o dejados sin cambio. En la figura 13.3 (izquierda) se
muestra un ejemplo de esta tcnica. El contorno ideal tambin se muestra. La
figura rellena muestra un efecto dentado (aliasing) no muy agradable.


Figura 13.3. Efecto Dentado (izquierda) y Suavizado de bordes (derecha)

La forma correcta de rellenar la figura involucra un poco ms de trabajo. La idea
bsica es calcular la interseccin de la figura con cada pixel del dispositivo de
salida y colorearlo en proporcin a la cantidad en que son cubiertos por la figura.
Esto reduce el efecto dentado, figura 13.3 (derecha). En este ejemplo los pixeles
en los bordes no solo son negros o blancos sino tienen varios tonos de grises.
esta tctica se conoce como suavizamiento de bordes (antialiasing). La mquina
de presentacin se encarga del suavisado si se especifica en las sugerencias de
presentacin.
Entramado
El entramador toma una figura ideal y produce un valor de cobertura para cada
pixel. Un valor de cobertura representa que tanto del pixel est cubierto por la
figura. Ese valor se conoce como valor Alfa. Un pixel est definido por un color y
su valor alfa. El valor alfo indica la transparencia del pixel. Se puede pensar que el
valor alfa es parte del color. Los colores a veces se definen con un valor alfa
asociado. En estos casos el valor alfa indica la transparencia del color.

458 Grficas en Java

ITSON Manuel Domitsu Kono
Los valores tpicos de los valores alfa van de 0.0 para no cobertura hasta 1.0 para
cobertura completa. En la figura 13.3, el entramador no uso suavizado de bordes y
produjo valores alfa de 0.0 o 1.0.

En la figura 13.3 /derecha) se us suavizado de bordes y el entramador produjo
valores alfa desde 0.0 en el exterior de la figura hasta 1.0 en el interior de la figura.
En la figura 13.4 muestra los valores alfa de cada pixel en la esquina superior
izquierda de la misma figura. Se sobreimpuso una cuadrcula por claridad.


Figura 13.4. Valores Alfa Producidos por el Entramador
Composicin

Despues de determinar los valores alfa para cada pixel de la figura, se usa una
tcnica llamada composicin para determinar cmo esos valores alfa se traducen
en informacin de color. para determinar cmo los colores de una nueva primitiva
grfica se combinan con los colores existentes en la superficie en la que se est
dibujando, como se muestra en la figura 13.5.

Tema 13 Grficas en Java 459

ITSON Manuel Domitsu Kono

Figura 13.5 Composicin
Espacio Coordenado
Los objetos 2D de J ava viven en un plano definido por coordenadas Cartesianas.
Este plano se llama el Espacio Coordenado del Usuario o simplemente Espacio
del Usuario. Cuando los objetos se dibujan en la pantalla o en una impresora, las
coordenadas del Espacio del Usuario se transforman en coordenadas del Espacio
del Dispositivo. El Espacio del Dispositivo corresponde a un monitor o impresora
en particular. Por lo general, una unidad en el Espacio del Dispositivo corresponde
a un pixel de un dispositivo. Normalmente el Espacio del Usuario y el Espacio del
Dispositivo estn alineados con los ejes x y y como se muestran en la figura 13.6.


Figura 13.6. Sistema Coordenado del Espacio del Dispositivo

El eje x se incrementa de izquierda a derecha y el eje y de arriba hacia abajo. El
origen se coloca en la izquierda superior derecha de la superficie de dibujo. Esto
aplica para cualquier dispositivo.

Aunque el Espacio del Usuario y el Espacio del Dispositivo estn alineados por
ausencia, debe haber un cierto escalamiento para asegurarse que los objetos se
dibujan del mismo tamao sin importar el dispositivo de salida. el Espacio del
Dispositivo est determinado por la resulucin del dispositivo en particular. Un
monitor, por ejemplo, por lo general tiene 72 pixeles por pulgada, mientras que
una impresora laser por lo general tiene 300 0 600 pixeles por pulgada.

460 Grficas en Java

ITSON Manuel Domitsu Kono
El Espacio del Usuario se convierte al Espacio del Dispositivo cuando se dibujan
los objetos. Se utiliza una transformacin para convertir de un sistema a otro. La
conversin por ausencia convierte 72 coordenadas del Espacio del Usuario a una
pulgada fsica.
Dibujo de Figuras

En esta seccin se ver como se puede desplegar el primer tipo de las primitivas
grficas: las figuras. La clase Graphics2D tiene el mtodo dr aw( ) que nos
permite dibujar figuras. Su sintaxis se muestra en la Tabla 13.1.

Tabla 13.1 Mtodo para Dibujar Figuras de la Clase Graphics2D
publ i c abst r act voi d draw( Shape s)

Despliega el contorno de la figura del parmetro en el contexto actual de Gr aphi cs2D

La API 2D de J ava permite la presentacin de cualquier figura mediante una
combinacin de segmentos de linea rectos y curvos. Estos elementos de grficas
estn contenidos en las interfaces, clases abstractas y clases de la figura 13.7.

Figura 13.7 Clases que Representan Figuras
Puntos
Las clases Punt o2D y Punt o2D. Doubl e encapsulan un solo punto (x, y) en el
Espacio del Usuario. La clase Punt o2D es una clase abstracta mientras que
Punt o2D. Doubl e es una de sus subclases que implementa los mtodos
abstractos de Punt o2D y est definida como una clase interna de Punt o2D. El
diagrama de clases de sas clases se muestra en la figura 13.8.

Punt o2D es la clase ms bsica de la API 2D de J ava y se usa extensamente a lo
largo de la API. Un punto no es un pixel. Un punto no tiene una superficie y por lo
tanto no puede presentarse. Los puntos se usan para construir figuras que que si
tienen superficie y por lo tanto s pueden presentarse. La tabla 13.2 muestra los
mtodos de la clase Punt o2D y la tabla 13.3 muestra los mtodos de la clase
clase Punt o2D. Doubl e.
Tema 13 Grficas en Java 461

ITSON Manuel Domitsu Kono

Figura 13.8 Clases que Representan un Punto

Tabla 13.2 Mtodos de la Clase Punto2D
publ i c abst r act voi d setLocation( doubl e x, doubl e y)
publ i c voi d setLocation( Poi nt 2D pt )

Establecen la posicin de este punto a las coordenadas de sus parmetros.
publ i c abst r act doubl e getX( )
publ i c abst r act doubl e getY( )

Regresan las coordenadas X o Y de este punto, respectivamente.
publ i c doubl e distance( doubl e px, doubl e py)
publ i c doubl e distance( Poi nt 2D pt )

Regresan la distancia de este punto al punto con las coordenadas de sus parmetros.
publ i c st at i c doubl e distance( doubl e x1, doubl e y1, doubl e x2, doubl e y2)

Regresa la distancia entre los dos puntos cuyas coordenadas estn dadas por sus parmetros.
publ i c doubl e distanceSq( doubl e px, doubl e py)
publ i c doubl e distanceSq( Poi nt 2D pt )

Regresan el cuadrado de la distancia de este punto al punto con las coordenadas de sus
parmetros.
publ i c st at i c doubl e distanceSq( doubl e x1, doubl e y1,
doubl e x2, doubl e y2)

Regresa el cuadrado de la distancia entre los dos puntos cuyas coordenadas estn dadas por sus
parmetros.

Tabla 13.3 Mtodos de la Clase Punto2D.Double
publ i c bool ean equals( Obj ect obj )

Regresa verdadero si este punto es igual al punto de su parmetro. Dos puntos son iguales si sus
correspondientes coordenadas son iguales.
publ i c i nt hashCode( )

Regresa el cdigo hash para este punto.

462 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.3 Mtodos de la Clase Punto2D.Double. Cont.
publ i c Point2D.Double( )

Construye e inicializa un objeto del tipo Point2D con coordenadas (0.0, 0.0).
publ i c Point2D.Double( doubl e x, doubl e y)

Construye e inicializa un objeto del tipo Point2D con las coordenadas dadas por sus parmetros.
publ i c St r i ng toString( )

Regresa un objeto de tipo St r i ng que representa el valor de este punto.
Dimensiones
La clase Di mensi on2D es una clase abstracta que encapsula el ancho y el alto
de una dimensin como dobles. La clase Di mensi on encapsula el ancho y el alto
de una componente como enteros. El diagrama de clases de sas clases se
muestra en la figura 13.9.

Figura 13.9 Clases que Representan una Dimensin

La tabla 13.4 muestra los mtodos de la clase Di mensi on2D.

Tabla 13.4 Mtodos de la Clase Dimension2D
publ i c abst r act doubl e getHeight( )

Regresa la altura de esta dimensin.
publ i c abst r act doubl e getWidth( )

Regresa el ancho de esta dimensin.
publ i c voi d setSize( Di mensi on2D d)

Establece el tamao de esta dimensin al valor de su parmetro.
publ i c abst r act voi d setSize( doubl e wi dt h, doubl e hei ght )

Establece el tamao de esta dimensin al valor de sus parmetros.

Tema 13 Grficas en Java 463

ITSON Manuel Domitsu Kono
La tabla 13.5 muestra los mtodos de la clase Di mensi on.

Tabla 13.5 Mtodos de la Clase Dimension
publ i c Dimension( )

Crea una instancia de Di mensi on con altura =0 y ancho =0.
publ i c Dimension( Di mensi on d)
publ i c Dimension( i nt wi dt h, i nt hei ght )

Crean una instancia de Di mensi on con altura y ancho dados por el parmetro.
publ i c Dimension getSize( )

Obtiene el tamao de este objeto.
publ i c voi d setSize( Di mensi on d)

Establece el tamao de esta dimensin al tamao de su parmetro.
publ i c voi d setSize( i nt wi dt h, i nt hei ght )

Establece el tamao de esta dimensin al ancho y alto de sus parmetros.
publ i c bool ean equals( Obj ect obj )

Determina si esta dimensin es la misma que la dimensin de su parmetro.
publ i c i nt hashCode( )

Regresa el cdigo Hash de esta dimensin.
publ i c St r i ng toString( )

Regresa una cadena con la representacin de esta dimensin.
La Interfaz Shape

Esta interfaz Shape, figura 13.10 establece los mtodos que deben implementar
todas las clases que representen una figura geomtrica. La descripcin de esos
mtodos se encuentra en la tabla 13.6.

Figura 13.10. Interfaz Shape

464 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.6 Mtodos de la Interfaz Shape.
Rect angl e2D getBounds2D( )

Regresa un rectngulo que encierra completamente a esta figura.
bool ean contains( doubl e x, doubl e y)

Regresa verdadero si las coordenadas de sus parmetros estan dentro de esta figura.
bool ean contains( Poi nt 2D p)

Regresa verdadero si el punto del parmetro cae dentro de esta figura.
bool ean contains( doubl e x, doubl e y, doubl e w, doubl e h)

Regresa verdadero si el rea rectangular dada por las coordenadas de sus parmetros est
dentro de esta figura.
bool ean contains( Rect angl e2D r )

Regresa verdadero si el rectngulo dado por el parmetro est dentro de esta figura.
bool ean intersects( doubl e x, doubl e y, doubl e w, doubl e h)

Regresa verdadero si el interior de esta figura intersecta el interior del rea rectangular dada por
las coordenadas de sus parmetros. El rea rectangular intersecta a esta figura si hay puntos que
esten tanto en el interior de la figura y el rea especificada.
bool ean intersects( Rect angl e2D r )

Regresa verdadero si el interior de esta figura intersecta el interior del rectngulo dado por el
parmetro.
Pat hI t er at or getPathIterator( Af f i neTr ansf or mat )

Regresa un iterador que itera a lo largo de la frontera de la figura y provee acceso a la geometra
de la orilla de la figura. Si el parmetro at no es nul l , las coordenadas regresadas en la
iteracin se transforman usando la transformacin dada por el parmetro.
Pat hI t er at or getPathIterator( Af f i neTr ansf or mat , doubl e f l at ness)

Regresa un iterador que itera a lo largo de la frontera de la figura y provee acceso a una vista
plana de la geometra de la orilla de la figura. Si el parmetro at no es nul l , las coordenadas
regresadas en la iteracin se transforman usando la transformacin dada por el parmetro.
Lneas Rectas
La clase abstracta Li ne2D es la superclase de todas las clases que almacenan un
segmento de lnea 2D en el espacio coordenado (x, y). La clase Li ne2D. Doubl e
es una de sus subclases que implementa los mtodos abstractos y est definida
como una clase interna. El diagrama de clases de sas clases se muestra en la
figura 13.11. La tabla 13.7 muestra los mtodos de la clase abstracta Li ne2D.
Tema 13 Grficas en Java 465

ITSON Manuel Domitsu Kono

Figura 13.11 Clases que Representan una Lnea

Tabla 13.7 Mtodos de la Clase Line2D
publ i c abst r act voi d setLine( doubl e x1, doubl e y1, doubl e x2, doubl e y2)

Establese la posicin de los extremos de esta recta a las coordenadas de sus parmetros.
publ i c voi d setLine( Poi nt 2D p1, Poi nt 2D p2)

Establese la posicin de los extremos de esta recta a las coordenadas de los puntos de sus
parmetros.
publ i c voi d setLine( Li ne2D l )

Establese la posicin de los extremos de esta recta a las coordenadas de los extremos de la recta
de su parmetro.

La tabla 13.8 muestra los mtodos de la clase Li ne2D. Doubl e.

Tabla 13.8 Mtodos de la Clase Line2D.Double.
publ i c Line2D.Double( )

Construye e inicializa una lnea con extremos en las coordenadas (0, 0) y (0, 0).
publ i c Line2D.Double( doubl e x1, doubl e y1, doubl e x2, doubl e y2)

Construye e inicializa una lnea con extremos en las coordenadas de sus parmetros.
publ i c Line2D.Double( Poi nt 2D p1, Poi nt 2D p2)

Construye e inicializa una lnea con extremos en los puntos de sus parmetros.
Ejemplo sobre Lneas
Para ilustrar cmo se despliegan las diferentes figuras en J ava 2D, se implementa
una aplicacin con una interfaz de usuario grfica en la que ventana principal se
tienen dos paneles. El panel superior se utilizar como lienzo para desplegar las
figuras, en el inferior hay dos botones: uno para dibujar la figura y otro para
borrarla, Figura 13.12. Las opciones de la barra de men permiten seleccionar el
tipo de figura, texto u operacin con imgenes a mostrar, Figura 13.13.
466 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.12.


Figura 13.13

Tema 13 Grficas en Java 467

ITSON Manuel Domitsu Kono
El siguiente fragmento de cdigo muestra la porcin de la clase de la ventana
principal en la que se muestran las declaraciones de los paneles y los mtodos
oyentes de los eventos de hacer clic en el botn Borrar y seleccionar la opcin
Lineas.

Grafica2.View.java
/ *
* Gr af i ca2Vi ew. j ava
*/
package gr af i ca2;

i mpor t f i gur as. Oper aci ones;
i mpor t f i gur as. Tr ayect or i as;
i mpor t f i gur as. Li neas;
i mpor t f i gur as. Rect angul os;
i mpor t or g. j deskt op. appl i cat i on. Act i on;
i mpor t or g. j deskt op. appl i cat i on. Resour ceMap;
i mpor t or g. j deskt op. appl i cat i on. Si ngl eFr ameAppl i cat i on;
i mpor t or g. j deskt op. appl i cat i on. Fr ameVi ew;
i mpor t or g. j deskt op. appl i cat i on. TaskMoni t or ;
i mpor t j ava. awt . event . Act i onEvent ;
i mpor t j ava. awt . event . Act i onLi st ener ;
i mpor t j avax. swi ng. Ti mer ;
i mpor t j avax. swi ng. I con;
i mpor t j avax. swi ng. J Di al og;
i mpor t j avax. swi ng. J Fr ame;

/ **
* Vent ana de l a apl i caci n Gr af i ca2.
*/
publ i c cl ass Gr af i ca2Vi ew ext ends Fr ameVi ew {

publ i c Gr af i ca2Vi ew( Si ngl eFr ameAppl i cat i on app) {
super ( app) ;
i ni t Component s( ) ;
. . .
}

pr i vat e voi d i ni t Component s( ) {
mai nPanel = new j avax. swi ng. J Panel ( ) ;
panel Li enzo = new j avax. swi ng. J Panel ( ) ;
. . .
}

/ **
* Met odo oyent e del bot on Di buj ar . I nvoca al met odo que r eal i za l a
* t ar ea de di buj ar
* @par amevt Event o de hacer cl i c sobr e el bot on
468 Grficas en Java

ITSON Manuel Domitsu Kono
*/
pr i vat e voi d bot onDi buj ar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
Oper aci ones oper ;
swi t ch( oper aci on) {
case BORRA: Li neas. bor r a( panel Li enzo) ;
br eak;
case LI NEA: Li neas. di buj aLi neas( panel Li enzo) ;
br eak;
case CUADRATI CA: Li neas. di buj aCur vasCuadr at i cas( panel Li enzo) ;
br eak;
case CUBI CA: Li neas. di buj aCur vasCubi cas( panel Li enzo) ;
br eak;
case RECTANGULO: Rect angul os. di buj aRect angul os( panel Li enzo) ;
br eak;
case RECTANGULO_REDONDEADO:
Rect angul os. di buj aRect angul osRedondeados(
panel Li enzo) ;
br eak;
case ELI PSE: Rect angul os. di buj aEl i pses( panel Li enzo) ;
br eak;
case ARCO: Rect angul os. di buj aAr cos( panel Li enzo) ;
br eak;
case TRAYECTORI A:
Tr ayect or i as. di buj aTr ayect or i a( panel Li enzo) ;
br eak;
case COMBI NA: Composi ci on. combi naFi gur as( panel Li enzo) ;
br eak;
case RELLENA: oper = new Oper aci ones( ) ;
oper . r el l enaFi gur as( panel Li enzo) ;
br eak;
case CONTORNO: oper = new Oper aci ones( ) ;
oper . cont or noFi gur as( panel Li enzo) ;
br eak;
case TRANSLADA: Oper aci ones. Tr ansl adaFi gur as( panel Li enzo) ;
br eak;
case ROTA: Oper aci ones. Rot aFi gur as( panel Li enzo) ;
br eak;
case ESCALA: Oper aci ones. escal aFi gur as( panel Li enzo) ;
br eak;
case DEFORMA: Oper aci ones. def or maFi gur as( panel Li enzo) ;
br eak;
case RECORTA: oper = new Oper aci ones( ) ;
oper . r ecor t aFi gur as( panel Li enzo) ;
br eak;
case DI BUJ A_TEXTO: Text o. di buj aText o( panel Li enzo) ;
br eak;
case ROTA_TEXTO: Text o. r ot aText o( panel Li enzo) ;
Tema 13 Grficas en Java 469

ITSON Manuel Domitsu Kono
br eak;
}
}

/ **
* Met odo oyent e del bot on Bor r ar . Bor r a el cont eni do del panel
* panel Li enzo
* @par amevt Event o de hacer cl i c sobr e el bot on
*/
pr i vat e voi d bot onBor r ar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
Li neas. bor r a( panel Li enzo) ;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i as l i neas
* en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onLi neasAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. LI NEA;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i as cur vas
* cuadr at i cas en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onCur vaCuadr at i caAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. CUADRATI CA;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i as cur vas
* cubi cas en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onCur vaCubi caAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. CUBI CA;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i os
* r ect angul os en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
470 Grficas en Java

ITSON Manuel Domitsu Kono
*/
pr i vat e voi d opci onRect angul oAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. RECTANGULO;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i os
* r ect angul os r edondeados en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onRect angul oRedondeadoAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. RECTANGULO_REDONDEADO;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i as el i pses
* r edondeados en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onEl i pseAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. ELI PSE;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a var i os ar cos
* en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onAr coAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. ARCO;
}

/ **
* Met odo oyent e de l a opci on de menu Fi gur as. Di buj a una t r ayect or i a
* ar bi t r ar i a en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onTr ayect or i asAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. TRAYECTORI A;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci oness. Di buj a di f er ent es
Tema 13 Grficas en Java 471

ITSON Manuel Domitsu Kono
* combi naci ones de ar eas en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onCombi nar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. COMBI NA;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* f i gur as con r el l eno en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onRel l enar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. RELLENA;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* t i pos de cont or no en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onCont or noAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. CONTORNO;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* t r ansl aci ones en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onTr ansl adar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. TRANSLADA;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* r ot aci ones en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onRot ar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. ROTA;
}

472 Grficas en Java

ITSON Manuel Domitsu Kono
/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* escal ami ent os en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onEscal ar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. ESCALA;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* def or maci ones en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onDef or mar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. DEFORMA;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a di f er ent es
* f i gur as r ecor t adas en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onRecor t ar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. RECORTA;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Di buj a t ext o
* en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onDi buj aText oAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. DI BUJ A_TEXTO;
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Rot a t ext o
* en el panel panel Li enzo
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onRot aText oAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
oper aci on = oper aci ones. ROTA_TEXTO;
Tema 13 Grficas en Java 473

ITSON Manuel Domitsu Kono
}

/ **
* Met odo oyent e de l a opci on de menu Oper aci ones. Per mi t e
* sel ecci onar una f uent e de l as f uent es di sponi bl es en el si st ema
* @par amevt Event o de hacer cl i c sobr e l a opci on de menu
*/
pr i vat e voi d opci onFuent esAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
Text o t ext o = new Text o( ) ;

t ext o. f uent es( t hi s. get Fr ame( ) ) ;
}

pr i vat e j avax. swi ng. J Panel panel Cont r ol ;
pr i vat e j avax. swi ng. J Panel panel Li enzo;
pr i vat e enumoper aci ones {BORRA, LI NEA, CUADRATI CA, CUBI CA,
RECTANGULO, RECTANGULOREDONDEADO,
ELI PSE, ARCO , TRAYECTORI A, COMBI NA,
RELLENA, CONTORNO, TRANSLADA, ROTA,
ESCALA, DEFORMA, RECORTA , DI BUJ A_TEXTO,
ROTA_TEXTO };

pr i vat e oper aci ones oper aci on = oper aci ones. BORRA;
}

Note que para dibujar las lineas se invoca al mtodo di buj aLi neas( ) y se le
pasa como parmetro una referencia al panel panel Li enzo para que el mtodo
dibuje sobre l. El cdigo del mtodo di buj aLi neas( ) es el siguiente:

Lineas.java
package f i gur as;

i mpor t j ava. awt . Col or ;
i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Gr aphi cs;
i mpor t j ava. awt . Gr aphi cs2D;
i mpor t j ava. awt . Pai nt ;
i mpor t j ava. awt . geom. Li ne2D;
i mpor t j avax. swi ng. J Panel ;

/ **
* Cl ase con mt odos est t i cos par a di buj ar l i neas
* @aut hor mdomi t su
*/
publ i c cl ass Li neas {
/ **
474 Grficas en Java

ITSON Manuel Domitsu Kono
* Est e met odo bor r a el cont eni do del panel de su par amet r o.
* @par aml i enzo Panel a bor r ar
*/
publ i c st at i c voi d bor r a( J Panel l i enzo) {
/ / Obt i ene un obj et o de t i po Gr aphi cs del panel Li enzo
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;

/ / Al i nvocar al met odo pai nt se bor r a su cont eni do
l i enzo. pai nt ( g) ;
}

/ **
* Est e met odo di buj a sobr e el panel de su par amet r o
* un conj unt o de l i neas
* @par aml i enzo Panel sobr e el que se di buj an l as l i neas
*/
publ i c st at i c voi d di buj aLi neas( J Panel l i enzo) {
/ / Obt i ene un obj et o de t i po Gr aphi cs2D del panel Li enzo
Gr aphi cs2D g2 = ( Gr aphi cs2D) l i enzo. get Gr aphi cs( ) ;
i nt numer oLi neas = 25;
Col or [ ] col or es = {Col or . r ed, Col or . gr een, Col or . bl ue};

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

f or ( i nt i = 0; i < numer oLi neas; i ++) {
/ / Est abl ece el col or de l a l i nea
g2. set Pai nt ( col or es[ i %col or es. l engt h] ) ;

doubl e r adi o = ( doubl e) i / numer oLi neas;
doubl e i r adi o = 1 - r adi o;

/ / Di buj a una l i nea en l a esqui na i nf er i or i zqui er da
Li ne2D l i nea1 = new Li ne2D. Doubl e( 0, r adi o * d. hei ght ,
r adi o * d. wi dt h, d. hei ght ) ;
g2. dr aw( l i nea1) ;

/ / Di buj a una l i nea en l a esqui na super i or der echa
Li ne2D l i nea2 = new Li ne2D. Doubl e( d. wi dt h, i r adi o * d. hei ght ,
i r adi o * d. wi dt h, 0) ;
g2. dr aw( l i nea2) ;
}
}
. . .
}

La figura 13.14 muestra las lneas desplegadas por el mtodo di buj aLi neas( ) .

Tema 13 Grficas en Java 475

ITSON Manuel Domitsu Kono

Figura 13.14. Lneas
Curvas Cuadrticas

Una curva cuadrtica es una lnea curva representada por una ecuacin
cuadrtica (segundo rden). Esta curva se describe completamente por dos
puntos en los extremos de la curva y un punto de control, fuera de la curva, que
determina las tangentes de la curva en sus puntos extremos, figura 2.15.


Figura 13.15. Puntos extremos, Punto de Control y Lneas tangentes de
Curvas Cuadrticas.

La clase abstracta QuadCur ve2D es la superclase de todas las clases que
almacenan una curva cuadrtica 2D en el espacio coordenado (x, y). La clase
QuadCur ve2D. Doubl e es una de sus subclases que implementa los mtodos
abstractos y est definida como una clase interna. El diagrama de clases de sas
clases se muestra en la figura 13.16.
476 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.16 Clases que Representan una Curva Cuadrtica

La tabla 13.9 muestra los mtodos de la clase abstracta QuadCur ve2D.

Tabla 13.9 Mtodos de la Clase QuadCurve2D
publ i c abst r act voi d setCurve( doubl e x1, doubl e y1, doubl e ct r l x,
doubl e ct r l y, doubl e x2, doubl e y2)

Est abl ece l a posi ci n de l os punt os de cont r ol de est a cur va cuadr t i ca a
l as coor denadas de sus par met r os.
publ i c voi d setCurve( Poi nt 2D p1, Poi nt 2D cp, Poi nt 2D p2)

Establece la posicin de los puntos de control de esta curva cuadrtica a los puntos de sus
parmetros.
publ i c voi d setCurve( QuadCur ve2D c)

Establece la posicin de los puntos de control de esta curva cuadrtica a los mismos puntos de la
curva cuadrtica de su parmetro.

La tabla 13.10 muestra los mtodos de la clase clase QuadCur ve2D. Doubl e.

Tabla 13.10 Mtodos de la Clase QuadCurve2D.Double.
publ i c QuadCurve2D.Double( )

Construye e inicializa una curva cuadrtica a las coordenadas (0, 0, 0, 0, 0, 0).
publ i c QuadCurve2D.Double( doubl e x1, doubl e y1, doubl e ct r l x,
doubl e ct r l y, doubl e x2, doubl e y2)

Construye e inicializa una curva cuadrtica a las coordenadas de sus parmetros.



Tema 13 Grficas en Java 477

ITSON Manuel Domitsu Kono
Ejemplo sobre Curvas Cuadrticas

El cdigo del mtodo di buj aCur vasCuadr at i cas( ) dibuja varias curvas
cuadrticas:

Lineas.java
. . .
i mpor t j ava. awt . geom. Poi nt 2D;
i mpor t j ava. awt . geom. QuadCur ve2D;
. . .
publ i c cl ass Li neas {
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* un conj unt o de cur vas cuadr at i cas
* @par aml i enzo Panel sobr e el que se di buj an l as cur vas
*/
publ i c st at i c voi d di buj aCur vasCuadr at i cas( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
QuadCur ve2D q = new QuadCur ve2D. Doubl e( ) ;
Col or [ ] col or es = {Col or . r ed, Col or . gr een, Col or . bl ue};
i nt numer oCur vas = 7;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

Poi nt 2D pi = new Poi nt 2D. Doubl e( 50, d. hei ght / 2) ;
Poi nt 2D pf = new Poi nt 2D. Doubl e( d. wi dt h - 50, d. hei ght / 2) ;
Poi nt 2D pc;

f or ( i nt i = 0; i < numer oCur vas; i ++) {
doubl e r adi o = ( doubl e) i / numer oCur vas;
doubl e i r adi o = 1 - r adi o;

/ / Di buj a el punt o de cont r ol ext er no de l a cur va
pc = new Poi nt 2D. Doubl e( 50 + ( d. wi dt h - 100) * r adi o,
( d. hei ght - 100) * i r adi o) ;
di buj aPunt o( l i enzo, pc, col or es[ i %col or es. l engt h] ) ;

/ / Est abl ece el col or de l a cur va
g2. set Pai nt ( col or es[ i %col or es. l engt h] ) ;

/ / Di buj a l a cur va cuadr t i ca
q. set Cur ve( pi , pc, pf ) ;
g2. dr aw( q) ;
}
}

/ **
* Di buj a un punt o como un ci r cul o
* @par aml i enzo Panel sobr e el que se di buj a el punt o
* @par amp coor denadas del punt o a di buj ar
478 Grficas en Java

ITSON Manuel Domitsu Kono
* @par ampai nt Col or del punt o a di buj ar
*/
publ i c st at i c voi d di buj aPunt o( J Panel l i enzo, Poi nt 2D p,
Pai nt pai nt ) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Est abl ece el col or del punt o
g2. set Pai nt ( pai nt ) ;

/ / Di buj a el punt o como un ci r cul o de r adi o 5
El l i pse2D e = new El l i pse2D. Doubl e( p. get X( ) , p. get Y( ) , 5, 5) ;
g2. f i l l ( e) ;
}
}

La figura 13.17 muestra las curvas cuadrticas desplegadas por el mtodo
di buj aCur vasCuadr at i cas( ) .


Figura 13.17. Curvas Cuadrticas
Curvas Cbicas

Una curva cbica es una lnea curva cbica de Bzier representada por una
ecuacin cbica (tercer rden). Esta curva se describe completamente por dos
Tema 13 Grficas en Java 479

ITSON Manuel Domitsu Kono
puntos en los extremos de la curva y dos puntos de control, fuera de la curva, que
determinan las tangentes de la curva en sus puntos extremos, figura 2.18.


Figura 13.18. Puntos extremos, Punto de Control y Lneas tangentes de
Curvas Cbicas.

La clase abstracta Cubi cCur ve2D es la superclase de todas las clases que
almacenan una curva cuadrtica 2D en el espacio coordenado (x, y). La clase
Cubi cCur ve2D. Doubl e es una de sus subclases que implementa los mtodos
abstractos y est definida como una clase interna. El diagrama de clases de sas
clases se muestra en la figura 13.19.

Figura 13.19 Clases que Representan una Curva Cbica

La tabla 13.11 muestra los mtodos de la clase abstracta Cubi cCur ve2D y la
tabla 13.12 muestra los mtodos de la clase clase Cubi cCur ve2D. Doubl e.

Tabla 13.11 Mtodos de la Clase CubicCurve2D
publ i c abst r act voi d setCurve( doubl e x1, doubl e y1, doubl e ct r l x1,
doubl e ct r l y1, doubl e ct r l x2,
doubl e ct r l y2, doubl e x2, doubl e y2)

Establece la posicin de los puntos de control de esta curva cbica a las coordenadas de sus
parmetros.
publ i c voi d setCurve( Poi nt 2D p1, Poi nt 2D cp1, Poi nt 2D cp2, Poi nt 2D p2)

Establece la posicin de los puntos de control de esta curva cbica a los puntos de sus
parmetros.
480 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.11 Mtodos de la Clase CubicCurve2D. Cont.
publ i c voi d setCurve( Cubi cCur ve2D c)

Establece la posicin de los puntos de control de esta curva cbica a los mismos puntos de la
curva cbica de su parmetro.

Tabla 13.12 Mtodos de la Clase CubicCurve2D.Double.
publ i c QuadCubic2D.Double( )

Construye e inicializa una curva cbica a las coordenadas (0, 0, 0, 0, 0, 0, 0, 0).
publ i c QuadCubic2D.Double( doubl e x1, doubl e y1, doubl e ct r l x1,
doubl e ct r l y1, doubl e ct r l x2,
doubl e ct r l y2, doubl e x2, doubl e y2)

Const r uye e i ni ci al i za una cur va cbi ca a l as coor denadas dadas.
Ejemplo sobre Curvas Cbicas

El cdigo del mtodo di buj aCur vasCubi cas( ) dibuja varias curvas cbicas:

Lineas.java
. . .
i mpor t j ava. awt . geom. Cubi cCur ve2D;
. . .
publ i c cl ass Li neas {
. . .
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* un conj unt o de cur vas cubi cas
* @par aml i enzo Panel sobr e el que se di buj an l as cur vas
*/
publ i c st at i c voi d di buj aCur vasCubi cas( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
Cubi cCur ve2D q = new Cubi cCur ve2D. Doubl e( ) ;
Col or [ ] col or es1 = {Col or . r ed, Col or . gr een, Col or . bl ue};
i nt numer oCur vas = 5;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

Poi nt 2D pi = new Poi nt 2D. Doubl e( 50, d. hei ght / 2) ;
Poi nt 2D pf = new Poi nt 2D. Doubl e( d. wi dt h - 50, d. hei ght / 2) ;
Poi nt 2D pc1, pc2;

f or ( i nt i = 0; i < numer oCur vas; i ++) {
doubl e r adi o = ( doubl e) i / numer oCur vas;
doubl e i r adi o = 1 - r adi o;

/ / Di buj a el punt o de cont r ol 1 ext er no de l a cur va
pc1 = new Poi nt 2D. Doubl e( 50 + ( d. wi dt h - 100) * r adi o / 2,
( d. hei ght - 100) * i r adi o) ;
Tema 13 Grficas en Java 481

ITSON Manuel Domitsu Kono
di buj aPunt o( l i enzo, pc1, col or es1[ i %col or es1. l engt h] ) ;

/ / Di buj a el punt o de cont r ol 2 ext er no de l a cur va
pc2 = new Poi nt 2D. Doubl e( d. wi dt h * ( 1 + r adi o) / 2,
50 + ( d. hei ght - 100) * r adi o) ;
di buj aPunt o( l i enzo, pc2, col or es1[ i %col or es1. l engt h] ) ;

/ / Est abl ece el col or de l a cur va
g2. set Pai nt ( col or es1[ i %col or es1. l engt h] ) ;

/ / Di buj a l a cur va cubi ca
q. set Cur ve( pi , pc1, pc2, pf ) ;
g2. dr aw( q) ;
}
}
. . .
}

La figura 13.20 muestra las curvas cbicas desplegadas por el mtodo
di buj aCur vasCubi cas( ) .


Figura 13.20. Curvas Cbicas
La Interfaz RectangularShape

Esta interfaz Rect angul ar Shape, figura 13.21 es la clase base para un nmero
de objetos del tipo Shape cuya geometra est definida por un marco rectangular.
482 Grficas en Java

ITSON Manuel Domitsu Kono
Esta clase no establece una geometra especfica sino que establece los mtodos
que permiten manipularlos.

Figura 13.21. Interfaz RectangularShape

Los mtodos de la interfaz Rect angul ar Shape pueden usarse para obtener o
modificar el marco rectangular. La descripcin de esos mtodos se encuentra en
la tabla 13.13.

Tabla 13.13 Mtodos de la Interfaz RectangularShape
publ i c abst r act doubl e getX( )
publ i c abst r act doubl e getY( )

Regresa las coordenadas de la esquina superior izquierda del rectngulo que enmarca est figura.
publ i c abst r act doubl e getWidth( )
publ i c abst r act doubl e getHeight( )

Regresa el ancho y el alto del rectngulo que enmarca est figura.
publ i c doubl e getMinX( )
publ i c doubl e getMaxX( )

Regresa el mnimo y el mximo valor de la coordenada X del rectngulo que enmarca est figura.
publ i c doubl e getMinY( )
publ i c doubl e getMaxY( )

Regresa el mnimo y el mximo valor de la coordenada Y del rectngulo que enmarca est figura.
publ i c doubl e getCenterX( )
publ i c doubl e getCenterY( )

Regresa las coordenadas del centro del rectngulo que enmarca est figura
publ i c Rect angl e2D getFrame( )

Regr esa el r ect ngul o que enmar ca est f i gur a.
Tema 13 Grficas en Java 483

ITSON Manuel Domitsu Kono
Tabla 13.13 Mtodos de la Interfaz RectangularShape. Cont.
publ i c abst r act bool ean isEmpty( )

Determina si la figura rectangular est vaca. Esto es, que no encierra una rea.
publ i c voi d setFrame( doubl e x, doubl e y, doubl e w, doubl e h)

Establece la posicin del rectngulo que enmarca est figura a los valores de sus parmetros.
publ i c voi d setFrame( Poi nt 2D l oc, Di mensi on2D si ze)

Establece la posicin del rectngulo que enmarca est figura a los valores de sus parmetros.
publ i c voi d setFrame( Rect angl e2D r )

Establece la posicin del rectngulo que enmarca est figura al valor de su parmetro.
Rectngulos
La clase abstracta Rect angl e2D describe un rectngulo definido por una posicin
(x, y) y una dimensin (w x h). Es la superclase de todas las clases que
almacenan un rectngulo 2D. La clase Rect angl e2D. Doubl e es una de sus
implementaciones. El diagrama de clases se muestra en la figura 13.22.

Figura 13.22 Clases que Representan un Rectngulo

La tabla 13.14 muestra los mtodos de la clase abstracta Rect angl e2D.




484 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.14 Mtodos de la Clase Rectangle2D.
publ i c abst r act voi d setRect( doubl e x, doubl e y, doubl e w, doubl e h)

Est abl ece l a posi ci n de est e r ect ngul o a l os val or es de sus par met r os.
publ i c voi d setRect( Rect angl e2D r )

Establece la posicin de este rectngulo a los valores del rectngulo de su parmetro.
publ i c bool ean intersectsLine( doubl e x1, doubl e y1, doubl e x2, doubl e y2)

Determina si el segmento de lnea especificado por sus parmetros intersecta a este rectngulo.
publ i c bool ean intersectsLine( Li ne2D l )
publ i c i nt outcode( Poi nt 2D p)

Determina si el segmento de lnea del parmetro intersecta a este rectngulo.
publ i c abst r act i nt outcode( doubl e x, doubl e y)

Determina en que lugar de este rectngulo se encuentran las coordenadas del parmetro. El
mtodo puede regresar alguno de los valores mostrados en la figura 13.23, donde OUT_LEFT,
OUT_TOP, OUT_RI GHT, OUT_BOTTOM, son constantes simblicas definidas como atributos de
esta clase.


Figura 13.23 Valores Regresados por el Mtodo outcode() de la Clase
Rectangle2D

La tabla 13.15 muestra los mtodos de la clase Rect angl e2D. Doubl e.

Tabla 13.15 Mtodos de la Clase Rectangle2D.Double
publ i c Rectangle2D.Double( )

Construye un nuevo rectngulo y lo inicializa a la posicin (0, 0) y tamao (0, 0).
publ i c Rectangle2D.Double( doubl e x, doubl e y, doubl e w, doubl e h)

Construye un nuevo rectngulo y lo inicializa a los valores de sus parmetros.
publ i c St r i ng toString( )

Regresa una cadena con la representacin de este rectngulo.

Tema 13 Grficas en Java 485

ITSON Manuel Domitsu Kono
Ejemplo sobre Rectngulos

El cdigo del mtodo di buj aRect angul os( ) dibuja varios rectngulos y
cuadrados:

Rectangulos.java
package f i gur as;

i mpor t j ava. awt . Col or ;
i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Gr aphi cs;
i mpor t j ava. awt . Gr aphi cs2D;
i mpor t j ava. awt . geom. Rect angl e2D;
i mpor t j avax. swi ng. J Panel ;

/ **
* Cl ase con mt odos est t i cos par a di buj ar r ect angul os, r ect angul os
* r edondeados, el i pses y ar cos
* @aut hor mdomi t su
*/
publ i c cl ass Rect angul os {
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* un conj unt o de r ect angul os
* @par aml i enzo Panel sobr e el que se di buj an l os r ect angul os
*/
publ i c st at i c voi d di buj aRect angul os( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
i nt numer oRect angul os = 5;
Col or [ ] col or es = {Col or . r ed, Col or . gr een, Col or . bl ue};

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e x = 0;

f or ( i nt i = 0; i < numer oRect angul os; i ++) {
/ / Est abl ece el col or de l a r ect angul o
g2. set Pai nt ( col or es[ i %col or es. l engt h] ) ;

doubl e paso = d. wi dt h/ numer oRect angul os;
doubl e al t o = paso/ ( i +1) ;

/ / Di buj a un r ect angul o en super i or
Rect angl e2D r ect angul o1 = new Rect angl e2D. Doubl e( i *paso, 0,
paso, al t o) ;
486 Grficas en Java

ITSON Manuel Domitsu Kono
g2. dr aw( r ect angul o1) ;

/ / Di buj a un cuadr ado en l a par t e i nf er i or
Rect angl e2D r ect angul o2 = new Rect angl e2D. Doubl e( x,
d. hei ght - al t o, al t o, al t o) ;
x += al t o;
g2. dr aw( r ect angul o2) ;
}
}
. . .
}

La figura 13.24 muestra los rectngulos desplegados por el mtodo
di buj aRect angul os( ) .


Figura 13.24. Rectngulos
Rectngulos Redondeados
La clase abstracta RoundRect angl e2D describe un rectngulo redondeado (de
esquinas redondeadas) definido por una posicin (x, y) y una dimensin (w x h) y
el ancho y alto de los arcos que redondean las esquinas, figura 13.25.

Tema 13 Grficas en Java 487

ITSON Manuel Domitsu Kono

Figura 13.25. Rectngulo Redondeado

La clase RoundRect angl e2D es la superclase de todas las clases que
almacenan un rectngulo 2D de esquinas redondeadas. La clase
RoundRect angl e2D. Doubl e es una de sus subclases que implementa los
mtodos abstractos y est definida como una clase interna. El diagrama de clases
de sas clases se muestra en la figura 13.26.

Figura 13.26 Clases que Representan un Rectngulo Redondeado

La tabla 13.16 muestra los mtodos de la clase abstracta Roundect angl e2D.

Tabla 13.16 Mtodos de la Clase RoundRectangle2D
publ i c abst r act doubl e getArcHeight( )
publ i c abst r act doubl e getArcWidth( )

Obtienen la altura y el ancho del arco que redondea las esquinas del rectngulo.
publ i c abst r act voi d setRoundRect( doubl e x, doubl e y, doubl e w, doubl e h,
doubl e ar cw, doubl e ar ch)

Establece la posicin y las dimenciones de los arcos de este rectngulo redondeado a los valores
de sus parmetros.

488 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.16 Mtodos de la Clase RoundRectangle2D. Cont.
publ i c voi d setRoundRect( RoundRect angl e2D r r )

Establece la posicin de este rectngulo redondeado a los valores del rectngulo redondeado de
su parmetro.
publ i c bool ean equals( Obj ect obj )

Determina si este rectngulo edonrdeado es el mismo que el rectngulo redondeado de su
parmetro.
publ i c i nt hashCode( )

Regresa el cdigo Hash de este rectngulo de redondeada.

La tabla 13.17 muestra los mtodos de la clase Rect angl e2D. Doubl e.

Tabla 13.17 Mtodos de la Clase RoundRectangle2D.Double
publ i c RoundRectangle2D.Double( )

Construye un nuevo rectngulo redondeado y lo inicializa a la posicin (0, 0), tamao (0, 0) y
tamao de los arcos de las esquinas redondeadas de (0, 0).
publ i c RoundRectangle2D.Double( doubl e x, doubl e y, doubl e w, doubl e h,
doubl e ar cw, doubl e ar ch)

Construye un nuevo rectngulo y lo inicializa a los valores de sus parmetros.
Ejemplo sobre Rectngulos Redondeados

El cdigo del mtodo di buj aRect angul osRedondeados( ) dibuja varios
rectngulos y cuadrados redondeados:

Rectangulos.java
package f i gur as;
. . .
i mpor t j ava. awt . geom. RoundRect angl e2D;

/ **
* Cl ase con mt odos est t i cos par a di buj ar r ect angul os, r ect angul os
* r edondeados, el i pses y ar cos
* @aut hor mdomi t su
*/
publ i c cl ass Rect angul os {
. . .

/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* un conj unt o de r ect angul os r edondeados
* @par aml i enzo Panel sobr e el que se di buj an l os r ect angul os
Tema 13 Grficas en Java 489

ITSON Manuel Domitsu Kono
* r edondeados
*/
publ i c st at i c voi d di buj aRect angul osRedondeados( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
i nt numer oRect angul os = 5;
Col or [ ] col or es = {Col or . r ed, Col or . gr een, Col or . bl ue};

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e x = 0;

f or ( i nt i = 0; i < numer oRect angul os; i ++) {
/ / Est abl ece el col or de l a r ect angul o
g2. set Pai nt ( col or es[ i %col or es. l engt h] ) ;

doubl e paso = d. wi dt h/ numer oRect angul os;
doubl e al t o = paso/ ( i +1) ;
doubl e aw = paso/ 5;
doubl e ah = al t o/ 5;

/ / Di buj a una r ect angul o en par t e super i or
RoundRect angl e2D r ect angul o1 = new
RoundRect angl e2D. Doubl e( i *paso, 0, paso, al t o, aw, ah) ;
g2. dr aw( r ect angul o1) ;

/ / Di buj a una cuadr adoo en l a par t e i nf er i or
RoundRect angl e2D r ect angul o2 = new
RoundRect angl e2D. Doubl e( x, d. hei ght - al t o, al t o, al t o,
ah, ah) ;
x += al t o;
g2. dr aw( r ect angul o2) ;
}
}
}

La figura 13.27 muestra los rectngulos redondeados desplegadas por el mtodo
di buj aRect angul osRedondeados( ) .

490 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.27. Rectngulos Redondeados
Elipses

La clase abstracta El l i pse2D describe una elipse definida por el rectngulo que
la enmarca. Es la superclase de todas las clases que almacenan una elipse 2D. La
clase El l i pse2D. Doubl e es una de sus subclases que implementa los mtodos
abstractos y est definida como una clase interna. El diagrama de clases de sas
clases se muestra en la figura 13.28.
Tema 13 Grficas en Java 491

ITSON Manuel Domitsu Kono

Figura 13.28 Clases que Representan una Elipse
La tabla 13.18 muestra los mtodos de la clase El l i pse2D. Doubl e.

Tabla 13.18 Mtodos de la Clase Ellipse2D.Double
publ i c Ellipse2D.Double( )

Construye una nueva relipse y la inicializa a la posicin (0, 0) y tamao (0, 0).
publ i c El l i pse2D.Double( doubl e x, doubl e y, doubl e w, doubl e h)

Construye una nueva relipse y la inicializa a los valores de sus parmetros.
Ejemplo sobre Elipses

El cdigo del mtodo di buj aEl i pses( ) dibuja varias elipses y crculos:

Rectangulos.java
package f i gur as;
. . .
i mpor t j ava. awt . geom. RoundRect angl e2D;

/ **
* Cl ase con mt odos est t i cos par a di buj ar r ect angul os, r ect angul os
* r edondeados, el i pses y ar cos
492 Grficas en Java

ITSON Manuel Domitsu Kono
* @aut hor mdomi t su
*/
publ i c cl ass Rect angul os {
. . .

/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* un conj unt o de el i pses
* @par aml i enzo Panel sobr e el que se di buj an l as el i pses
*/
publ i c st at i c voi d di buj aEl i pses( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
i nt numer oEl i pses = 5;
Col or [ ] col or es = {Col or . r ed, Col or . gr een, Col or . bl ue};

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

f or ( i nt i = 0; i < numer oEl i pses; i ++) {
/ / Est abl ece el col or de l a el i pse
g2. set Pai nt ( col or es[ i %col or es. l engt h] ) ;

doubl e ancho = d. wi dt h/ ( i + 1) ;
doubl e al t o = d. hei ght / ( i +1) ;
doubl e x1 = ( d. wi dt h - ancho) / 2;
doubl e y = ( d. hei ght - al t o) / 2;
doubl e x2 = ( d. wi dt h - al t o) / 2;

/ / Di buj a una el i pse
El l i pse2D el i pse1 = new El l i pse2D. Doubl e( x1, y, ancho, al t o) ;
g2. dr aw( el i pse1) ;

/ / Di buj a un ci r cul o
El l i pse2D el i pse2 = new El l i pse2D. Doubl e( x2, y, al t o, al t o) ;
g2. dr aw( el i pse2) ;
}
}
. . .
}

La figura 13.29 muestra las elipses desplegadas por el mtodo
di buj aEl i pses( ) .

Tema 13 Grficas en Java 493

ITSON Manuel Domitsu Kono

Figura 13.29. Elipses
Arcos

La clase abstracta Ar c2D describe un segmento de una elipse definido por la
posicin (x, y) y dimensin (w x h) del rectnngulo que enmarca la elipse, los
ngulos iniciales y finales del arco, figura 13.30 y el tipo de arco, figura 13.31.


Figura 13.30. Parmetros de un Arco


Figura 13.31. Tipos de Arcos: OPEN, PIE, CHORD.

494 Grficas en Java

ITSON Manuel Domitsu Kono
Los tipos de arco estn definidos por constantes estticas:

OPEN: Un arco abierto, es simplemente un segmento de una elipse.

PIE: Un arco en la forma de una rebanada de pie. est formado por un
segmento de elipse y dos lneas rectas entre los extremos del arco y el
centro de la elipse.

CHORD: Un arco con una lnea recta que une los extremos del arco.

La clase Ar c2D. Doubl e es una de sus subclases que implementa los mtodos
abstractos y est definida como una clase interna. El diagrama de clases de sas
clases se muestra en la figura 13.32.

Figura 13.32 Clases que Representan Arcos
La tabla 13.19 muestra los mtodos de la clase abstracta Ar c2D.

Tabla 13.19 Mtodos de la Clase Arc2D
publ i c abst r act voi d setArc( doubl e x, doubl e y, doubl e w, doubl e h,
doubl e angSt , doubl e angExt , i nt cl osur e)

Establece la posicin y las dimenciones del arco a los valores de sus parmetros.
publ i c abst r act voi d setArc( Poi nt 2D l oc, Di mensi on si ze, doubl e angSt ,
doubl e angExt , i nt cl osur e)

Establece la posicin y las dimenciones del arco a los valores de sus parmetros.

Tema 13 Grficas en Java 495

ITSON Manuel Domitsu Kono
Tabla 13.19 Mtodos de la Clase Arc2D. Cont.
publ i c voi d setArc( Rect angl e2D r ec, doubl e angSt , doubl e angExt ,
i nt cl osur e)

Establece la posicin y las dimenciones del arco a los valores de sus parmetros.
publ i c voi d setArc( Ar c2D a)

Establece las dimensiones del arco a los valores del arco del parmetro.
publ i c voi d setArcByCenter( doubl e x, doubl e y, doubl e r adi us,
doubl e angSt , doubl e angExt , i nt cl osur e)

Establece las dimensiones de un arco circular dados su centro, radio, ngulo inicial y extencin del
ngulo y tipo de arco a los valores de sus parmetros.

La tabla 13.20 muestra los mtodos de la clase Ar c2D. Doubl e.

Tabla 13.20 Mtodos de la Clase Arc2D.Double
publ i c Arc2D.Double( )

Construye un nuevo arco abierto y lo inicializa a la posicin (0, 0), tamao (0, 0) y ngulo inicial y
extencin del ngulo (0, 0).
publ i c Ar c2D.Double( doubl e x, doubl e y, doubl e w, doubl e h,
doubl e st ar t , doubl e ext , i nt t ype)

Construye un nuevo arco y lo inicializa a los valores de sus parmetros.
publ i c Ar c2D.Double( i nt t ype)

Construye un nuevo arco del tipo especificado por el parmetro y lo inicializa a la posicin (0, 0),
tamao (0, 0), ngulo inicial y extencin del ngulo (0, 0).
publ i c Ar c2D.Double( Rect angl e2D el l i pseBounds, doubl e st ar t , doubl e ext ,
i nt t ype)

Construye un nuevo arco y lo inicializa a los valores de sus parmetros.
Ejemplo sobre Arcos

El cdigo del mtodo di buj aAr cos( ) dibuja varios arcos:

Rectangulos.java
package f i gur as;
. . .
i mpor t j ava. awt . geom. RoundRect angl e2D;

/ **
* Cl ase con mt odos est t i cos par a di buj ar r ect angul os, r ect angul os
* r edondeados, el i pses y ar cos
* @aut hor mdomi t su
*/
publ i c cl ass Rect angul os {
496 Grficas en Java

ITSON Manuel Domitsu Kono
. . .
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* un conj unt o de ar cos
* @par aml i enzo Panel sobr e el que se di buj an l as r ect angul os
*/
publ i c st at i c voi d di buj aAr cos( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
i nt numer oAr cos = 4;
Col or [ ] col or es = {Col or . r ed, Col or . gr een, Col or . bl ue};

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

f or ( i nt i = 0; i < numer oAr cos; i ++) {
/ / Est abl ece el col or del ar co
g2. set Pai nt ( col or es[ i %col or es. l engt h] ) ;
doubl e ancho = d. wi dt h/ ( i + 1) ;
doubl e al t o = d. hei ght / ( i +1) ;
doubl e x1 = ( d. wi dt h - ancho) / 2;
doubl e y = ( d. hei ght - al t o) / 2;
doubl e x2 = ( d. wi dt h - al t o) / 2;

/ / Di buj a un ar co el pt i co
Ar c2D ar co1 = new Ar c2D. Doubl e( x1, y, ancho, al t o, 90*i , 45,
i %3) ;
g2. dr aw( ar co1) ;

/ / Di buj a un ar co ci r cul ar
Ar c2D ar co2 = new Ar c2D. Doubl e( x2, y, al t o, al t o, 90*i , 45,
i %3) ;
g2. dr aw( ar co2) ;
}
}
. . .
}

La figura 13.33 muestra las elipses desplegadas por el mtodo di buj aAr cos( ) .

Tema 13 Grficas en Java 497

ITSON Manuel Domitsu Kono

Figura 13.33. Arcos

Trayectorias

Si deseamos dibujar una figura diferente a las figuras disponibles en J ava 2D y
que implementan la interfaz Shape, entonces se requiere describir la trayectoria
que define el contorno de la figura, a partir de lneas rectas y curvas. Una
trayectoria es es una serie de instrucciones para ir de un lugar a otro. Cada
instruccin describe un segmento o pieza de la trayectoria. Por ejemplo, podemos
describir el contorno de un cuadrado con las siguientes instrucciones:

1. Colcate en la posicin 0, 0.
2. Dibuja una lnea a la posicin 72, 0.
3. Dibuja una lnea a la posicin 72, 72.
4. Dibuja una lnea a la posicin 0, 72.
5. Dibuja una lnea de regreso a 0, 0.

J ava 2D, utiliza las clases Pat h2D y Pat h2D. Doubl e para describir una
trayectoria. El diagrama de clases para Pat h2D y Pat h2D. Doubl e se muestra en
la figura 13.34.
498 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.34 Clases que Representan Trayectorias
La tabla 13.21 muestra los mtodos de la clase abstracta Pat h2D.

Tabla 13.21 Mtodos de la Clase Path2D
publ i c abst r act voi d append( Pat hI t er at or pi , bool ean connect )
publ i c f i nal voi d append( Shape s, bool ean connect )

La agrega a esta trayectoria la geometra especificada por el iterador o la figura del parmetro. Si
el parmetro connect es verdadero y esta trayectoria no est vaca cualquier moveTo( ) inicial en
la geometra de la figura inicial se convierte en un segmento l i neTo( ) .
publ i c f i nal voi d closePath( )

Cierra esta trayectoria dibujando una lnea recta a las coordenadas de la ltima moveTo( ) . Si la
trayectoria ya est cerrada, el mtodo no tiene efecto.
publ i c abst r act voi d moveTo( doubl e x, doubl e y)

Agrega un punto a esta trayectoria moviendose a las coordenadas del parmetro.
publ i c abst r act voi d lineTo( doubl e x, doubl e y)

Agrega un punto a esta trayectoria dibujando una lnea recta desde la posicin actual hasta las
coordenadas del parmetro.


Tema 13 Grficas en Java 499

ITSON Manuel Domitsu Kono
Tabla 13.21 Mtodos de la Clase Path2D. Cont.
publ i c abst r act voi d quadTo( doubl e x1, doubl e y1, doubl e x2, doubl e y2)

Agrega un segmento curvo definido por dos nuevos puntos a esta trayectoria dibujando una curva
cuadrtica desde la posicin actual hasta las coordenadas (x2, y2) usando el punto (x1, y1)
como punto de control.
publ i c abst r act voi d curveTo( doubl e x1, doubl e y1, doubl e x2, doubl e y2 ,
doubl e y3)

Agrega un segmento curvo definido por tress nuevos puntos a esta trayectoria dibujando una
curva cbica desde la posicin actual hasta las coordenadas (x3, y3) usando los puntos (x1,
y1) y (x2, y2) como puntos de control.

La tabla 13.22 muestra los mtodos de la clase Pat h2D. Doubl e.

Tabla 13.22 Mtodos de la Clase Path2D.Double
publ i c Path2D.Double( )

Construye una nueva trayectoria vaca con la regla de curvado por omisin:
Pat h2D. WI ND_NON_ZERO.
publ i c Path2D.Double( i nt r ul e)

Construye una nueva trayectoria vaca con la regla de curvado de su parmetro.
publ i c Path2D.Double( i nt r ul e, i nt i ni t i al Capaci t y)

Construye una nueva trayectoria vaca con la regla de curvado y capacidad inicial de sus
parmetros. La capacidad inicial es una estimacin de segmentos que contendr la trayectoria,
pero esa capacidad crece conforme se requiere.
publ i c Path2D.Double( Shape s)

Construye una nueva trayectoria a partir de una figura arbitraria dada por su parmetro.
Reglas de Curvado

Una regla de curvado determina que parte de la figura se define como el interior y
por lo tanto que parte de la figura ser rellenada con el mtodo f i l l ( ) . Para
figuras simples como un rectngulo o una elipse, determinar el interior es sencillo,
pero no lo es para figuras ms complicadas como la mostrada en la figura 13.35.


Figura 13.35. Una Figura Compleja.
500 Grficas en Java

ITSON Manuel Domitsu Kono
Hay dos reglas que nos permiten determinar el interior de una figura: La Regla de
Curvado Par-Non y la Regla de Curvado No-Cero.
Regla de Curvado Par-Non

Esta regla representada por la constante entera WIND_EVEN_ODD trabaja de la
siguiente manera: Dibuje una lnea que cruce la figura completamente. Cada vez
que la lnea cruce la orilla de la figura, incremente en uno un contador. Cuando el
contador sea par, la lnea se encuentra fuera de la figura. Cuando el contador sea
non, la lnea est en el interior de la figura, como se muestra en la figura 13.36.
Esta regla slo nos dice el interior de la figura para los puntos sobre la lnea de
prueba. Para determinar el interior total de la figura deben de dibujarse muchas
lineas que atraviecen la figura.


Figura 13.36. Regla de Curvado Par-Non.
Regla de Curvado No-Cero

Esta regla representada por la constante entera WIND_NON_ZERO trabaja de la
siguiente manera: Dibuje una lnea que cruce la figura completamente. Cada vez
que la lnea cruce la orilla de la figura, incremente en uno un contador si la orilla se
dibuja de izquierda a derecha y decremente en uno el contador si la orilla se dibuja
de derecha a izquierda. Las porciones de la lnea donde el contador no sea cero
se consideran dentro de la figura, como se muestra en la figura 13.37.


Figura 13.37. Regla de Curvado No Cero.

Tema 13 Grficas en Java 501

ITSON Manuel Domitsu Kono
Ejemplo sobre Trayectorias

El cdigo del mtodo di buj aTr ayect or i a( ) dibuja una trayectoria arbitraria:

Trayectorias.java
package f i gur as;

i mpor t j ava. awt . Col or ;
i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Gr aphi cs;
i mpor t j ava. awt . Gr aphi cs2D;
i mpor t j ava. awt . geom. Pat h2D;
i mpor t j avax. swi ng. J Panel ;

/ **
* Est a cl ase cont i ene mt odos est t i cos par a t r abaj ar con t r ayect or i as
* @aut hor mdomi t su
*/
publ i c cl ass Tr ayect or i as {
/ **
* Est e met odo est at i co di buj a di buj a sobr e el panel de su par amet r o
* una t r ayect or i a ar bi t r ar i a
* @par aml i enzo Panel sobr e el que se di buj a l a t r ayect or i a
*/
publ i c st at i c voi d di buj aTr ayect or i a( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;
/ / Est abl ece el col or de l a t r ayect or i a
g2. set Pai nt ( Col or . bl ue) ;

/ / cr ea l a t r ayect or i a
Pat h2D t r ayect or i a = new Pat h2D. Doubl e( Pat h2D. WI ND_EVEN_ODD) ;
t r ayect or i a. moveTo( 50, 50) ;
t r ayect or i a. l i neTo( 70, 44) ;
t r ayect or i a. cur veTo( 100, 10, 140, 80, 160, 80) ;
t r ayect or i a. l i neTo( 190, 40) ;
t r ayect or i a. l i neTo( 200, 56) ;
t r ayect or i a. quadTo( 100, 150, 70, 60) ;
t r ayect or i a. cl osePat h( ) ;

/ / Di buj a l a t r ayect or i a
g2. dr aw( t r ayect or i a) ;
}
}
502 Grficas en Java

ITSON Manuel Domitsu Kono
La figura 13.38 muestra la trayectoria desplegada por el mtodo
di buj aTr ayect or i a( ) .


Figura 13.38. Trayectorias

La interfaz PathIterator

Un objeto que implemente la interfaz Pat hI t er ador , cuyo diagrama de clases se
muestra en la figura 13.34, nos permite recorrer los segmentos de una trayectoria.
Podemos obtener un objeto del tipo Pat hI t er ador que describa el contorno de
una figura invocando a su mtodo get Pat hI t er ador ( ) . Inicialmente el iterador
se encuentra posicionado al inicio de la trayectoria, podemos movernos a lo largo
de los diferentes segmentos de la trayectoria hasta alcanzar el final. El iterador es
de slo lectura. No nos permite que modifiquemos la trayectoria.

Como ya se vi en la clase Path2D, para formar una trayectoria se pueden
emplear cinco diferentes tipos de segmentos, usando los mtodos moveTo( ) ,
l i neTo( ) , quadTo, cur veTo( ) y cl osePat h( ) . La interfaz Pat hI t er ador
define cinco constantes que representan cada uno de esos tipos de segmentos:

SEG_MOVETO: Este tipo segmento se usa para actualizar la posicin de la
trayectoria sin dibujar una lnea.

Tema 13 Grficas en Java 503

ITSON Manuel Domitsu Kono
SEG_LINETO: Este tipo segmento es una lnea recta, dibujada desde el
ltimo punto de la trayectoria.

SEG_QUADTO: Este tipo segmento es una lnea curva representada por una
ecuacin cuadrtica (segundo rden). Este segmento se describe
completamente por dos puntos extremos y un punto de control que
determina las tangentes de la curva en sus puntos extremos. El ltimo
punto de la trayectoria es el primer punto extremo. se debe especificar el
otro punto extremo y el punto de control.

SEG_CUBICTO: Este tipo segmento es una lnea curva cbica de Bzier. Es
representada por una ecuacin cbica (tercer rden). Este segmento se
describe completamente por dos puntos extremos y dos puntos de control
que determinan las tangentes de la curva en sus puntos extremos. El ltimo
punto de la trayectoria es el primer punto extremo. se debe especificar el
otro punto extremo y los dos puntos de control.

SEG_CLOSE: Este tipo de segmento dibuja una lnea de regreso al final del
ltimo segmento del tipo SEG_MOVETO. Una trayectoria puede componerse
de varias subtrayectorias. El principio de cada subtrayectoria se marca con
un segmento del tipo SEG_MOVETO, de tal manera que el efecto de
SEG_CLOSE es de cerrar la ltima subtrayectoria con una lnea recta.

La descripcin de los mtodos de la interfaz Pat hI t er ador se encuentra en la
tabla 13.23.

Tabla 13.23 Mtodos de la Interfaz PathIterador
i nt currentSegment( doubl e[ ] coor ds)

Regresa las coordenadas y tipo del segmento de trayectoria actual en la iteracin. Se le debe
pasar un arreglo de dobles de tamao 6. El nmero de puntos regresado depende del tipo de
segmento.

Valor regresado Puntos regresados en el arreglo
SEG_MOVETO
1
SEG_LI NETO
1
SEG_QUADTO
2
SEG_CUBI CTO
3
SEG_CLOSE
0
i nt getWindingRule( )

Regresa la regla de curvado para la determinacin del interior de la trayectoria.
bool ean isDone( )

Prueba si la iteracin se ha completado. Regresa verdadero si se han ledo todos los segmentos.
Falso en caso contrario.
504 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.23 Mtodos de la Interfaz PathIterador. Cont.
voi d next( )

Mueve el iterador al siguiente segmento de la trayectoria.
Combinacin de Figuras

La API 2D de J ava permite combinar las reas de 2 figuras de cuatro formas
diferentes:

Adicin o Unin: La adicin o unin de dos figuras es el rea cubierta por
una o ambas figuras.

Interseccin: La interseccin de dos figuras es el rea cubierta por ambas
figuras simultneamente.

Substraccin: El resultado de substraer una figura de la otra es es el rea
cubierta por una y que no es cubierta por la otra.

Unin Exclusiva: La unin exclusiva es la inversa de la operacin de
interseccin. La unin exclusiva de dos figuras es el rea cubierta por una o
la otra figura pero no por ambas.

La figura 13.39 muestra el resultado de combinar dos figuras sobrepuestas,
usando las cuatro operaciones.


Figura 13.39 Diferentes Formas de Combinar Dos Figuras

En la API 2D de J ava, las cuatro operaciones anteriores se implementan en la
clase Ar ea. Un objeto de tipo Ar ea almacena y manipula la descripcin de un
rea cerrada. La clase Ar ea implementa la interfaz Shape pero es especfico que
una trayectoria en varias formas:

Solo se almacenan trayectorias y subtrayectorias cerradas. Objetos de tipo
Ar ea construidos de trayectorias abiertas son implicitamente cerrados
durante la construccin si esas trayectorias se han llenado usando el
mtodo f i l l ( ) .
Tema 13 Grficas en Java 505

ITSON Manuel Domitsu Kono
El interior de todas las subareas individuales almacenadas son no vacas y
no se traslapan.
La geometra de la trayectoria que describe el contorno del Ar ea se parece
a la trayectoria de la que fue construida slo en que describe a la misma
area bidimensional, pero puede usar diferentes tipos de elementos y
ordenamiento de los segmentos.

El diagrama de clases para Ar ea se muestra en la figura 13.40.

Figura 13.40 Clase que Representa una rea
La descripcin de los mtodos de la clase Ar ea se encuentra en la tabla 13.24.

Tabla 13.24 Mtodos de la Clase Area
publ i c Area( )

Construye un rea vaca.
publ i c Area( Shape s)

Construye un rea a partir de una figura. Si la figura no es cerrada, se cierra explicitamente.
publ i c voi d add( Ar ea r hs)

Le agrega a esta rea la figura del rea del parmetro. La figura resultante incluir la unin de
ambas figuras, o todas las reas que estaban contenidas en esta o en el rea del parmetro.
publ i c voi d subtract( Ar ea r hs)

Le resta a esta rea la figura del rea del parmetro. La figura resultante incluir las reas de esta
rea y no en el rea del parmetro.
publ i c voi d intersect( Ar ea r hs)

Establece la figura de esta rea a la interseccin de la figura actual y la figura especificada por el
parmetro. La figura resultante de esta rea incluir slo las reas que estaban en esta rea y el
rea del parmetro.



506 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.24 Mtodos de la Clase Area. Cont.
publ i c voi d exclusiveOr( Ar ea r hs)

Establece la figura de esta rea a la unin de la figura actual y la figura especificada por el
parmetro menos su interseccin. La figura resultante de esta rea incluir slo las reas que
estan en esta rea o en el rea del parmetro pero no en ambas.
Ejemplo sobre Combinacin de reas

El cdigo del mtodo combi naFi gur as( ) dibuja las combinaciones de varias
figuras:

Operaciones.java
package f i gur as;

i mpor t j ava. awt . Col or ;
i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Gr aphi cs;
i mpor t j ava. awt . Gr aphi cs2D;
i mpor t j ava. awt . geom. Ar ea;
i mpor t j ava. awt . geom. El l i pse2D;
i mpor t j ava. awt . geom. Rect angl e2D;
i mpor t j avax. swi ng. J Panel ;

/ **
* Est a cl ase i l ust r a l as oper aci ones de combi naci on de f i gur as,
* r el l eno de f i gur as y sel ecci on del t i po de cont or no
* @aut hor mdomi t su
*/
publ i c cl ass Oper aci ones {

/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* combi naci ones de f i gur as
* @par aml i enzo Panel sobr e el que se combi nan l as f i gur as
*/
publ i c st at i c voi d combi naFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
Ar ea ar ea1, ar ea2;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e ancho = d. wi dt h / 6;
doubl e al t o = d. hei ght / 4;
doubl e x = 50;
doubl e y = 25;

/ / Obt en el ar ea de una f i gur a r ect angul ar
ar ea1 = new Ar ea( new Rect angl e2D. Doubl e( x, y, ancho, al t o) ) ;
x += ancho/ 2;
y += al t o/ 2;
Tema 13 Grficas en Java 507

ITSON Manuel Domitsu Kono
/ / Obt en el ar ea de una f i gur a el i pt i ca
ar ea2 = new Ar ea( new El l i pse2D. Doubl e( x, y, ancho, al t o) ) ;
/ / Di buj a l as dos ar eas
g2. set Pai nt ( Col or . bl ack) ;
g2. dr aw( ar ea1) ;
g2. dr aw( ar ea2) ;
/ / Obt en l a uni on de l as ar eas
ar ea2. add( ar ea1) ;
/ / Rel l ana l a uni on de l as ar eas
g2. set Pai nt ( Col or . r ed) ;
g2. f i l l ( ar ea2) ;

x += 100+ancho;
y = 25;

/ / Obt en el ar ea de una f i gur a r ect angul ar
ar ea1 = new Ar ea( new Rect angl e2D. Doubl e( x, y, ancho, al t o) ) ;
x += ancho/ 2;
y += al t o/ 2;
/ / Obt en el ar ea de una f i gur a el i pt i ca
ar ea2 = new Ar ea( new El l i pse2D. Doubl e( x, y, ancho, al t o) ) ;
/ / Di buj a l as dos ar eas
g2. set Pai nt ( Col or . bl ack) ;
g2. dr aw( ar ea1) ;
g2. dr aw( ar ea2) ;
/ / Obt en l a r est a de l as ar eas
ar ea2. subt r act ( ar ea1) ;
/ / Rel l ana l a r est a de l as ar eas
g2. set Pai nt ( Col or . yel l ow) ;
g2. f i l l ( ar ea2) ;

x = 50;
y = 100+al t o;

/ / Obt en el ar ea de una f i gur a r ect angul ar
ar ea1 = new Ar ea( new Rect angl e2D. Doubl e( x, y, ancho, al t o) ) ;
x += ancho/ 2;
y += al t o/ 2;
/ / Obt en el ar ea de una f i gur a el i pt i ca
ar ea2 = new Ar ea( new El l i pse2D. Doubl e( x, y, ancho, al t o) ) ;
/ / Di buj a l as dos ar eas
g2. set Pai nt ( Col or . bl ack) ;
g2. dr aw( ar ea1) ;
g2. dr aw( ar ea2) ;
/ / Obt en l a i nt er secci on de l as ar eas
ar ea2. i nt er sect ( ar ea1) ;
/ / Rel l ena l a i nt er secci on de l as ar eas
g2. set Pai nt ( Col or . gr een) ;
g2. f i l l ( ar ea2) ;

x += 100+ancho;
y = 100+al t o;

/ / Obt en el ar ea de una f i gur a r ect angul ar
ar ea1 = new Ar ea( new Rect angl e2D. Doubl e( x, y, ancho, al t o) ) ;
x += ancho/ 2;
508 Grficas en Java

ITSON Manuel Domitsu Kono
y += al t o/ 2;
/ / Obt en el ar ea de una f i gur a el i pt i ca
ar ea2 = new Ar ea( new El l i pse2D. Doubl e( x, y, ancho, al t o) ) ;
/ / Di buj a l as dos ar eas
g2. set Pai nt ( Col or . bl ack) ;
g2. dr aw( ar ea1) ;
g2. dr aw( ar ea2) ;
/ / Obt en l a uni on excl usi va de l as ar eas
ar ea2. excl usi veOr ( ar ea1) ;
/ / Rel l ena l a uni on excl usi va de l as ar eas
g2. set Pai nt ( Col or . cyan) ;
g2. f i l l ( ar ea2) ;
}
}

La figura 13.41 muestra las combinaciones de figuras desplegada por el mtodo
combi naFi gur as( ) .


Figura 13.41 Combinacin de Figuras: a) Unin, b) Substraccin, c)
Interseccin, d) Unin exclusiva




Tema 13 Grficas en Java 509

ITSON Manuel Domitsu Kono
Relleno de Figuras

Una figura cerrada puede rellenarse usando un color slido, un gradiente de
colores o una textura. Los mtodos de la clase Graphics2D que nos permiten
rellenar figuras se muestran en la Tabla 13.25.

Tabla 13.25 Mtodos para Rellenar Figuras de la Clase Graphics2D
publ i c abst r act voi d fill( Shape s)

Rellena la figura del parmetro utilizando las propiedades del contexto actual de Gr aphi cs2D
publ i c abst r act Pai nt getPaint( )

Regresa el atributo Pai nt del contexto de Gr aphi cs2D. Este atributo determina el tipo de relleno
de una figura.
publ i c abst r act voi d setPaint( Pai nt pai nt )

Establece el atributo Pai nt del contexto de Gr aphi cs2D. Este atributo determina el tipo de
relleno de una figura.

Llenar una figura es un proceso de dos pasos:

1. Establecer el color, gradiente de color o textura a usar como relleno usando
el mtodo set Pai nt ( ) .
2. Rellenar la figura usando el mtodo f i l l ( ) .

El parmetro del mtodo set Pai nt ( ) es un objeto que implemente la interface
Pai nt . Graphics2D almacena ese objeto como parte de su estado y lo utiliza
para rellenar las figuras. El diagrama de clases de la figura 13.42 muestra las
clases que implementan la interfaz Pai nt .

La clase Col or nos sirve para rellenar una figura con un color slido. Esta clase
define una serie de constantes simblicas para algunos colores, tabla 13.26.
Todas esas constantes son pblicas y estticas y del tipo Col or .

Tabla 13.26 Colores Predefinidos de la clase Color
Constante Color Constante Color Constante Color
black Negro green Verde red Rojo
blue Azul lightGray Gris Claro white Blanco
cyan Cian magenta Magenta yellow Amarillo
darkGray Gris oscuro orange Naranja
gray Gris pink Rosa

Si se requieren otros colores diferentes a los predefinidos se pueden construir
otros colores a partir de los colores primarios y valores alfa. Para ello, la clase
Col or tiene los constructores de la tabla 13.27.

510 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.42 Clases que Representan un Relleno de una Figura
Tabla 13.27 Constructores de la Clase Color
publ i c Color( i nt r , i nt g, i nt b)
publ i c Color( i nt r , i nt g, i nt b, i nt a)

Crean una color sRGB con los componentes rojo, verde, azul y alfa de sus parmetros. Los
valores estn en el rango 0 a 255, inclusive.

En el primer constructor el valor de alfa es de 255.
publ i c Color( f l oat r , f l oat g, f l oat b)
publ i c Color( f l oat r , f l oat g, f l oat b, f l oat a)

Crean una color sRGB con los componentes rojo, verde, azul y alfa de sus parmetros. Los
valores estn en el rango 0.0 a 1.0, inclusive.

En el primer constructor el valor de alfa es de 1.0.

La clase Gr adi ent Pai nt provee de una forma para llenar una figura con un
patrn de gradiente de color. Si los puntos p1 y p2 del tipo Poi nt 2D con colores
c1 y c2 del tipo Color se encuentran en el espacio del usuario, los colores a lo
largo de la lnea que conecta a los puntos p1 y p2 cambia proporcionalmente de
c1 a c2.

Tema 13 Grficas en Java 511

ITSON Manuel Domitsu Kono
Cualquier punto q que no se encuentra en la lnea que conecta a los puntos p1 y
p2 tiene el color del punto p que es la proyeccin perpendicular de q en la lnea
entre p1 y p2.

Cualquier punto p que se encuentra en la lnea que conecta a los puntos p1 y p2 y
por fuera del segmento entre los puntos p1 y p2, se colorean de dos formas
diferentes:

Si el gradiente es cclico entonces los puntos en la lnea que conectan a los
puntos p1 y p2 y por fuera del segmento entre los puntos p1 y p2, se
colorean usando el mismo gradiente de c1 a c2.
Si el gradiente es acclico entonces los puntos del ado de p1 tendrn el
color c1 mientras que los puntos del lado p2 tendrn el color c2.

Para especificar el gradiente de color, la clase Gr adi ent Pai nt tiene los
constructores de la tabla 13.28.

Tabla 13.28 Constructores de la Clase GradientPaint
publ i c GradientPaint( f l oat x1, f l oat y1, Col or col or 1,
f l oat x2, f l oat y2, Col or col or 2)
publ i c GradientPaint( f l oat x1, f l oat y1, Col or col or 1,
f l oat x2, f l oat y2, Col or col or 2, bool ean cycl i c)

Construyen gradientes al valor de sus parmetros. El primer constructor construye un gradiente
acclico.
publ i c GradientPaint( Poi nt 2D p1, Col or col or 1, Poi nt 2D p2, Col or col or 2)
publ i c GradientPaint( Poi nt 2D p1, Col or col or 1, Poi nt 2D p2, Col or col or 2,
bool ean cycl i c)

Construyen gradientes al valor de sus parmetros. El primer constructor construye un gradiente
acclico.

La clase Text ur ePai nt provee de una forma para llenar una figura con una
textura especificada por un objeto del tipo Buf f er edI mage. El tamao del objeto
Buf f er edI mage debe ser pequeo ya que los datos del objeto Buf f er edI mage
sern copiados por el objeto Text ur ePai nt . En el momento de la construccin,
la textura es anclada en la esquina superior izquierda del rectngulo del tipo
Rectangle2D. La textura se crea repitiendo el rectngulo en forma infinita en todas
las dimensiones y mapeando la imagen a cada rectgulo copiado. El constructor
de la clase que nos permite hacer esto se muestra en la tabla 13.29.

Tabla 13.29 Constructor de la Clase TexturePaint
publ i c TexturePaint( Buf f er edI mage t xt r , Rect angl e2D anchor )

Construye un objeto del tipo Text ur ePai nt al valor de sus parmetros.

512 Grficas en Java

ITSON Manuel Domitsu Kono
Ejemplo sobre Rellenado de Figuras

El cdigo del mtodo r el l enanaFi gur as( ) rellena varias figuras:

Operaciones.java
/ **
* Est e met odo r el l ena f i gur as sobr e el panel de su par amet r o
* @par aml i enzo Panel sobr e el que se r el l enan l as f i gur as
*/
publ i c voi d r el l enaFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e ancho = d. wi dt h / 4;
doubl e al t o = d. hei ght / 4;
doubl e x = 50;
doubl e y = 25;

/ / Rel l ena una el i pse con un col or sol i do
El l i pse2D el i pse = new El l i pse2D. Doubl e( x, y, ancho, al t o) ;
g2. set Pai nt ( Col or . yel l ow) ;
g2. f i l l ( el i pse) ;

x += 100 + ancho;
/ / Cr ea un gr adi ent e de col or
Gr adi ent Pai nt gp = new Gr adi ent Pai nt ( ( i nt ) x, ( i nt ) y, Col or . r ed,
( i nt ) ( x + ancho) , ( i nt ) ( y + al t o) , Col or . bl ue) ;

/ / Rel l ena un r ect angul o con un gr adi ent e de col or
Rect angl e2D r ect = new Rect angl e2D. Doubl e( x, y, ancho, al t o) ;
g2. set Pai nt ( gp) ;
g2. f i l l ( r ect ) ;

x = 50 + ancho;
y = 100 + al t o;

/ / Car ga l a i magen a ser usada como t ext ur a
Buf f er edI mage bi ;
t r y {
bi = get I mage( " f ondo. j pg" ) ;
} cat ch ( I OExcept i on i oe) {
J Opt i onPane. showMessageDi al og( l i enzo,
" Er r or al car gar i magen" ) ;
r et ur n;
Tema 13 Grficas en Java 513

ITSON Manuel Domitsu Kono
}
/ / Cr ea el r ect angul o ancl a del t amao de l a i magen
Rect angl e2D t r = new Rect angl e2D. Doubl e( 0, 0, bi . get Wi dt h( ) ,
bi . get Hei ght ( ) ) ;
/ / Cr ea l a t ext ur a
Text ur ePai nt t p = new Text ur ePai nt ( bi , t r ) ;

/ / Rel l ena el r ect angul o con l a t ext ur a
RoundRect angl e2D r r ect = new RoundRect angl e2D. Doubl e( x, y, ancho,
al t o, ancho / 5, al t o / 5) ;
g2. set Pai nt ( t p) ;
g2. f i l l ( r r ect ) ;
}

/ **
* Lee l a i magen a ser usada como t ext ur a de un ar chi vo
* @par amf i l ename Nombr e del ar chi vo con l a i magen
* @r et ur n I magen
* @t hr ows I OExcept i on si hay un pr obl ema al car gar l a i magen
* @t hr ows I mageFor mat Except i on Si hay un pr obl ema al f or mat ear l a
* i magen
*/
publ i c Buf f er edI mage get I mage( St r i ng f i l ename)
t hr ows I OExcept i on, I mageFor mat Except i on {
/ / Lee l a i magen J PEG del ar chi vo.
I nput St r eami n = get Cl ass( ) . get Resour ceAsSt r eam( f i l ename) ;
J PEGI mageDecoder decoder = J PEGCodec. cr eat eJ PEGDecoder ( i n) ;

/ / Convi er t e l a i magen a una del t i po Buf f er edI mage
Buf f er edI mage bi = decoder . decodeAsBuf f er edI mage( ) ;
i n. cl ose( ) ;
r et ur n bi ;
}
}

La figura 13.43 muestra las combinaciones de figuras desplegada por el mtodo
r el l enaFi gur as( ) .

514 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.43 Rellenado de Figuras

Tipo de Contorno

Para dibujar el contorno de una figura se siguen los siguientes tres pasos:

1. Especificar el tipo de contorno a usar, llamando al mtodo set St r oke( )
de la clase Gr aphi cs2D. Este mtodo acepta cualquier objeto que
implementa la interfaz St r oke. La sintaxis de este mtodo se muestra en la
tabla 13.30.

Tabla 13.30 Mtodo para Acceder al Tipo de Contorno de las Figuras de la
Clase Graphics2D
publ i c abst r act St r oke getStroke( )

Obtiene el tipo de contorno del contexto actual de Graphics2D.
publ i c abst r act voi d setStroke( St r oke s)

Establece el tipo de contorno a usar para dibujar una figura al valor del parmetro. El tipo de
contorno se almacena como una propiedad del contexto actual de Gr aphi cs2D.

2. Establecer el color, gradiente de color o textura a usar como relleno del
contorno, usando el mtodo set Pai nt ( ) de la clase Gr aphi cs2D. El
contorno, de la misma forma que el interior de las figuras puede dibujarse
Tema 13 Grficas en Java 515

ITSON Manuel Domitsu Kono
empleando un color, gradiente de color, textura o cualquier cosa que
implemente la interfaz Pai nt .

3. Dibuja el borde de la figura usando el mtodo dr aw( ) de la clase
Gr aphi cs2D. La clase Gr aphi cs2D usa el objeto de tipo St r oke para
determinar el tipo de contorno a emplear y utiliza el objeto de tipo Pai nt
para producir el contorno.

Los objetos que encapsulan la informacin de tipo de contorno de una figura
implementan la interfaz St r oke. Una clase que implemeta esa interfaz es la clase
Basi cSt r oke. El diagrama de clases de ambas se muestra en la figura 13.44.

Figura 13.44 Clases que Representan el Tipo de Contorno de una Figura
La clase Basi cSt r oke soporta lneas slidas y punteadas de cualquier grosor.
Tambin maneja dos detalles para lneas gruesas: Estilos para los extremos y
para las uniones de lneas.

Hay tres estilos para los extremos en la clase Basi cSt r oke representados por
las constantes simblicas:

CAP_BUTT: En este estilo de extremo, los extremos aparecen como
rectngulos.
CAP_ROUND: En este estilo de extremo, los extremos son semicirculos de
radio de la mitad del ancho de la lnea.
CAP_SQUARE: En este estilo de extremo, los extremos son rectngulos cuya
longitud es la mitad del ancho de la lnea.

El efecto de cada estilo se muestra en la figura 13.45:
516 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.45 Estilos de Extremos para las lneas.

Hay tres estilos para las uniones de lneas en en la clase Basi cSt r oke
representados por las constantes simblicas:

J OI N_BEVEL: En este estilo, las lneas se unen conectando los bordes
externos de sus extremos.
J OI N_MI TER: En este estilo, los bordes externos de las lneas se extienden
hasta que se intersectan.
J OI N_ROUND: En este estilo, cada segmento termina con un semicirculo.
Esto crea un efecto redondeado en la interseccin de los segmentos de
lnea.

El efecto de cada estilo se muestra en la figura 13.46:


Figura 13.46 Estilos de Uniones para las lneas.

Basi cSt r oke controla la forma de las lineas punteadas mediante un arreglo de
flotantes llamado dash que representan las longitudes de de las secciones slidas
y borradas de la lnea. Por ejemplo un arreglo con los valores {12, 12} produce
una lnea que es visible por 12 unidades e invisible por otras 12 unidades. Los
elementos pares del arreglo empezando por el de ndice 0 determinan donde la
lnea ser visible. Los elementos nones determinan donde la lnea ser invisible.
En la figura 13.47 se muestra una trayectoria arbitraria con dos diferentes lineas
punteadas. A la izquierda con una lnea slida, en medio usando una arreglo dash
de {12, 12} y a la derecha con areglo dash de {4, 4, 12, 4}.


Figura 13.47 Diferentes Tipos de Lneas Punteadas.
Tema 13 Grficas en Java 517

ITSON Manuel Domitsu Kono
Adicionalmente al arreglo dash, Basi cSt r oke utiliza un flotante llamado
dash_phase que actua como un desfase en el el patrn de puntos. Por ejemplo,
con un arreglo dash con los valores {12, 12}, Si el valor de dash_phase es 0,
el patrn ser de una lnea que es visible por 12 unidades e invisible por otras 12
unidades. Si el valor de dash_phase es 8, el patrn ser de una lnea que es
visible por 4 unidades, invisible por otras 12 unidades, visible por otras 12
unidades, etc., como se muestra en la figura 13.48.


Figura 13.48. Diferentes valores de dash_phases.

La tabla 13.31 muestra los mtodos de la clase Basi cSt r oke.

Tabla 13.31 Mtodos de la Clase BasicStroke
publ i c BasicStroke( )

Construye un objeto del tipo basicStroke con los valores para ausencia para todos los atributos:
Una lnea slida de un grosor de 1.0, CAP_SQUARE, J OI N_MI TER y mi t er _l i mi t de 10.0. Si la
extencin de la unin es mayor que mi t er l i mi t , entonces se usa una unin del tipo
J OI N_BEVEL en lugar de J OI N_MI TER.
publ i c BasicStroke( f l oat wi dt h)

Construye un objeto del tipo basicStroke con el grosor de lnea especificado por el parmetro y
valores para ausencia para los dems atributos.
publ i c BasicStroke( f l oat wi dt h, i nt cap, i nt j oi n)

Construye un objeto del tipo basicStroke con los valores especificados para los atributos.
publ i c BasicStroke( f l oat wi dt h, i nt cap, i nt j oi n, f l oat mi t er l i mi t )

Construye un objeto del tipo basicStroke con los valores especificados para los atributos.
publ i c BasicStroke( f l oat wi dt h, i nt cap, i nt j oi n, f l oat mi t er l i mi t ,
f l oat [ ] dash, f l oat dash_phase)

Construye un objeto del tipo basicStroke con los valores especificados para los atributos.
Ejemplo sobre Tipos de Contornos de Figuras

El cdigo del mtodo cont or noFi gur as( ) dibuja diferentes contornos de
figuras:

Operaciones.java
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* t i pos de cont or nos
518 Grficas en Java

ITSON Manuel Domitsu Kono
* @par aml i enzo Panel sobr e el que se di buj an t i pos de cont or nos
*/
publ i c voi d cont or noFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
Ar ea ar ea1, ar ea2;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;
/ / Cr ea dos cont or nos
Basi cSt r oke bs1 = new Basi cSt r oke( 3) ;
Basi cSt r oke bs2 = new Basi cSt r oke( 15) ;

doubl e ancho = d. wi dt h / 6;
doubl e al t o = d. hei ght / 4;
doubl e x = 50;
doubl e y = 25;

/ / Obt en el ar ea de una f i gur a r ect angul ar
ar ea1 = new Ar ea( new Rect angl e2D. Doubl e( x, y, ancho, al t o) ) ;
x += ancho / 2;
y += al t o / 2;
/ / Obt en el ar ea de una f i gur a el i pt i ca
ar ea2 = new Ar ea( new El l i pse2D. Doubl e( x, y, ancho, al t o) ) ;
/ / Est abl ece el t i po de cont or no
f l oat [ ] dash1 = {10, 5};
Basi cSt r oke bs3 = new Basi cSt r oke( 1, Basi cSt r oke. CAP_BUTT,
Basi cSt r oke. J OI N_BEVEL, 0, dash1, 0) ;
g2. set St r oke( bs3) ;
/ / Di buj a l as dos ar eas
g2. set Pai nt ( Col or . bl ack) ;
g2. dr aw( ar ea1) ;
g2. dr aw( ar ea2) ;
/ / Obt en l a uni on de l as ar eas
ar ea2. add( ar ea1) ;
/ / Di buj a l a uni on de l as ar eas
g2. set St r oke( bs1) ;
g2. set Pai nt ( Col or . r ed) ;
g2. dr aw( ar ea2) ;

x += 100 + ancho;
y = 25;

/ / Obt en el ar ea de una f i gur a r ect angul ar
ar ea1 = new Ar ea( new Rect angl e2D. Doubl e( x, y, ancho, al t o) ) ;
x += ancho / 2;
y += al t o / 2;
/ / Obt en el ar ea de una f i gur a el i pt i ca
ar ea2 = new Ar ea( new El l i pse2D. Doubl e( x, y, ancho, al t o) ) ;
/ / Est abl ece el t i po de cont or no
f l oat [ ] dash2 = {5, 10, 10, 5};
Basi cSt r oke bs4 = new Basi cSt r oke( 1, Basi cSt r oke. CAP_BUTT,
Basi cSt r oke. J OI N_BEVEL, 0, dash2, 0) ;
g2. set St r oke( bs4) ;
/ / Di buj a l as dos ar eas
g2. set Pai nt ( Col or . bl ack) ;
Tema 13 Grficas en Java 519

ITSON Manuel Domitsu Kono
g2. dr aw( ar ea1) ;
g2. dr aw( ar ea2) ;
/ / Obt en l a r est a de l as ar eas
ar ea2. subt r act ( ar ea1) ;
/ / Di buj a l a r est a de l as ar eas
g2. set St r oke( bs1) ;
g2. set Pai nt ( Col or . yel l ow) ;
g2. dr aw( ar ea2) ;

x = 50;
y = 100 + al t o;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D r ect = new Rect angl e2D. Doubl e( x, y, 2*ancho, al t o) ;
/ / Cr ea un gr adi ent e de col or
Gr adi ent Pai nt gp = new Gr adi ent Pai nt ( ( i nt ) x, ( i nt ) y, Col or . r ed,
( i nt ) ( x + 2*ancho) , ( i nt ) ( y + al t o) , Col or . bl ue) ;
/ / Est abl ece el t i po de cont or no
g2. set St r oke( bs2) ;
/ / Di buj a el r ect angul o
g2. set Pai nt ( gp) ;
g2. dr aw( r ect ) ;

x += 50 + 2*ancho;
y = 100 + al t o;

/ / Cr ea de una f i gur a el i pt i ca
El l i pse2D el i pse = new El l i pse2D. Doubl e( x, y, 2*ancho, al t o) ;
/ / Car ga l a i magen a ser usada como t ext ur a
Buf f er edI mage bi ;
t r y {
bi = get I mage( " f ondo. j pg" ) ;
} cat ch ( I OExcept i on i oe) {
J Opt i onPane. showMessageDi al og( l i enzo,
" Er r or al car gar i magen" ) ;
r et ur n;
}
/ / Cr ea el r ect angul o ancl a del t amao de l a i magen
Rect angl e2D t r = new Rect angl e2D. Doubl e( 0, 0, bi . get Wi dt h( ) ,
bi . get Hei ght ( ) ) ;
Text ur ePai nt t p = new Text ur ePai nt ( bi , t r ) ;
/ / Est abl ece el t i po de cont or no
g2. set St r oke( bs2) ;

/ / Di buj a l a el i pse
g2. set Pai nt ( t p) ;
g2. dr aw( el i pse) ;
}

La figura 13.49 muestra las combinaciones de figuras desplegada por el mtodo
cont or noFi gur as( ) .


520 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.49 Tipos de Contorno

Transformaciones de Coordenadas

La API de java 2D nos permite transladar, rotar, escalar o deformar el sistema
coordenado. Por lo general es ms facil transformar el sistema coordenado que
calcular las coordenadas de todos los puntos. Los mtodos de la clase
Gr aphi cs2D que nos permiten hacer esas transformaciones se muestran en la
tabla 13.32.

Tabla 13.32 Mtodos de la Clase Graphics2D para Transformar
Coordenadas.
publ i c abst r act Af f i neTr ansf or mgetTransform( )

Regresa una copia de la transformacin actual en el contexto de Gr aphi cs2D.
publ i c abst r act voi d setTransform( Af f i neTr ansf or mTx)

Establece la transformacin en el contexto de Gr aphi cs2D.
publ i c abst r act voi d translate( doubl e t x, doubl e t y)

Le concatena a la transformacin actual en el contexto de Gr aphi cs2D, la transformacin de
translacin. Todas las coordenadas empleadas en las operaciones de despliegue en este contexto
grfico sern relativas a este nuevo origen (x, y).
Tema 13 Grficas en Java 521

ITSON Manuel Domitsu Kono
Tabla 13.32 Mtodos de la Clase Graphics2D para Transformar
Coordenadas. Cont.
publ i c abst r act voi d rotate( doubl e t het a)

Le concatena a la transformacin actual en el contexto de Gr aphi cs2D, la transformacin de
rotacin. Todas las coordenadas empleadas en las operaciones de despliegue en este contexto
grfico estarn giradas por el ngulo t het a en radianes relativas al origen anterior.
publ i c abst r act voi d scale( doubl e sx, doubl e sy)

Le concatena a la transformacin actual en el contexto de Gr aphi cs2D, la transformacin de
rescalamiento. Todas las coordenadas empleadas en las operaciones de despliegue en este
contexto grfico estarn escaladas de acuerdo a los factores de escala relativos a la escala
anterior.
publ i c abst r act voi d shear( doubl e shx, doubl e shy)

Le concatena a la transformacin actual en el contexto de Gr aphi cs2D, la transformacin de
deformacin. Todas las coordenadas empleadas en las operaciones de despliegue en este
contexto grfico estarn deformadas de acuerdo a los multiplicadores especificados relativos a la
posicin anterior.

shx es el multiplicador por el que las coordenadas son recorridas en la direccin positiva del eje X
como una funcin de de la coordenada Y. shy es el multiplicador por el que las coordenadas son
recorridas en la direccin positiva del eje Y como una funcin de de la coordenada X.
Ejemplos sobre Transformaciones

El cdigo del mtodo t r ansl adaFi gur as( ) dibuja diferentes translaciones de
figuras:

Operaciones.java
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* t r ansl aci ones de f i gur as
* @par aml i enzo Panel sobr e el que se di buj an t r ansl aci ones de
* f i gur a
*/
publ i c st at i c voi d t r ansl adaFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e ancho = d. wi dt h / 4;
doubl e al t o = d. hei ght / 4;
doubl e x = 50;
doubl e y = 25;

/ / Est abl ece el t i po de cont or no
Basi cSt r oke bs = new Basi cSt r oke( 2) ;
g2. set St r oke( bs) ;
522 Grficas en Java

ITSON Manuel Domitsu Kono

/ / Est abl ece el col or del cont or no
g2. set Pai nt ( Col or . bl ue) ;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D r ect = new Rect angl e2D. Doubl e( x, y, ancho, al t o) ;
/ / Cr ea de una f i gur a el i pt i ca
El l i pse2D. Doubl e el i pse = new El l i pse2D. Doubl e( x, y, ancho,
al t o) ;

/ / Est abl ece el or i gen i ni ci al
g2. t r ansl at e( 10, 10) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Tr ansl ada el or i gen
g2. t r ansl at e( 2*ancho, 0) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Tr ansl ada el or i gen
g2. t r ansl at e( 0, 2*al t o) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;
}

/ **
* Est e mt odo est t i co di buj a unos ej es coor denados en el cont ext o
* g2
* @par amg2 Cont ext o de Gr aphi cs2D en el que se di buj an l os ej es
* @par amancho Longi t ud del ej e X
* @par amal t o Longi t ud del ej e Y
*/
publ i c st at i c voi d di buj aEj es( Gr aphi cs2D g2, doubl e ancho,
doubl e al t o) {
Basi cSt r oke bs1 = new Basi cSt r oke( 2, Basi cSt r oke. CAP_BUTT,
Basi cSt r oke. J OI N_BEVEL, 0,
new f l oat [ ] { 5, 5}, 0) ;
/ / Cr ea l os ej es coor denados
Li ne2D ej eX = new Li ne2D. Doubl e( - 10, 0, ancho, 0) ;
Li ne2D ej eY = new Li ne2D. Doubl e( 0, - 10, 0, al t o) ;
Tema 13 Grficas en Java 523

ITSON Manuel Domitsu Kono

/ / Guar da l os val or es de Pai nt y St r oke act ual es
Pai nt pai nt = g2. get Pai nt ( ) ;
St r oke st r oke = g2. get St r oke( ) ;

/ / Est abl ece l os nuevos val or es de Pai nt y St r oke
g2. set St r oke( bs1) ;
g2. set Pai nt ( Col or . bl ack) ;

/ / Di buj a l os ej es coor denados
g2. dr aw( ej eX) ;
g2. dr aw( ej eY) ;

/ / Reest abl ece l os val or es de Pai nt y St r oke or i gi nal es
g2. set St r oke( st r oke) ;
g2. set Pai nt ( pai nt ) ;
}

La figura 13.50 muestra las translaciones de figuras desplegada por el mtodo
t r ansl adaFi gur as( ) .


Figura 13.50 Translaciones

El cdigo del mtodo r ot aFi gur as( ) dibuja diferentes translaciones de figuras:



524 Grficas en Java

ITSON Manuel Domitsu Kono
Operaciones.java
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* r ot aci ones de f i gur as
* @par aml i enzo Panel sobr e el que se di buj an r ot aci ones de f i gur a
*/
publ i c st at i c voi d r ot aFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e ancho = d. wi dt h / 4;
doubl e al t o = d. hei ght / 4;

/ / Est abl ece l a posi ci n i ni ci al del or i gen
g2. t r ansl at e( 2*ancho, 2*al t o) ;

/ / Est abl ece el t i po de cont or no
Basi cSt r oke bs = new Basi cSt r oke( 2) ;
g2. set St r oke( bs) ;

/ / Est abl ece el col or del cont or no
g2. set Pai nt ( Col or . bl ue) ;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D. Doubl e r ect = new Rect angl e2D. Doubl e( - ancho/ 2,
- al t o/ 2, ancho, al t o) ;
/ / Cr ea de una f i gur a el i pt i ca
El l i pse2D. Doubl e el i pse = new El l i pse2D. Doubl e( - ancho/ 2, - al t o/ 2,
ancho, al t o) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Rot a el or i gen
g2. r ot at e( Mat h. PI / 4) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Rot a el or i gen
g2. r ot at e( Mat h. PI / 4) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;
Tema 13 Grficas en Java 525

ITSON Manuel Domitsu Kono

/ / Di buj a el r ect angul o
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;
}

La figura 13.51 muestra rotaciones de figuras desplegada por el mtodo
r ot aFi gur as( ) .


Figura 13.51 Rotaciones

El cdigo del mtodo escal aFi gur as( ) dibuja diferentes escalamientos de
figuras:

Operaciones.java
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* f i gur as escal adas
* @par aml i enzo Panel sobr e el que se di buj an f i gur as escal adas
*/
publ i c st at i c voi d escal aFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

526 Grficas en Java

ITSON Manuel Domitsu Kono
doubl e ancho = d. wi dt h / 4;
doubl e al t o = d. hei ght / 4;
doubl e x = 50;
doubl e y = 25;

/ / Est abl ece el t i po de cont or no
Basi cSt r oke bs = new Basi cSt r oke( 2) ;
g2. set St r oke( bs) ;

/ / Est abl ece el col or del cont or no
g2. set Pai nt ( Col or . bl ue) ;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D. Doubl e r ect = new Rect angl e2D. Doubl e( x, y, ancho,
al t o) ;
/ / Cr ea de una f i gur a el i pt i ca
El l i pse2D. Doubl e el i pse = new El l i pse2D. Doubl e( x, y, ancho,
al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Escal a l a i magen
g2. scal e( 1. 5, 1. 5) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Escal a l a i magen
g2. scal e( 1. 5, 1. 5) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;
}

La figura 13.52 muestra escalamientos de figuras desplegada por el mtodo
escal aFi gur as( ) .

Tema 13 Grficas en Java 527

ITSON Manuel Domitsu Kono

Figura 13.52 Escalamientos

El cdigo del mtodo escal aFi gur as( ) dibuja diferentes escalamientos de
figuras:

Operaciones.java
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* def or maci ones de f i gur as
* @par aml i enzo Panel sobr e el que se di buj an t r ansl aci ones de
* f i gur a
*/
publ i c st at i c voi d def or maFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e ancho = d. wi dt h / 4;
doubl e al t o = d. hei ght / 4;
doubl e x = 50;
doubl e y = 10;

/ / Est abl ece el t i po de cont or no
Basi cSt r oke bs = new Basi cSt r oke( 2) ;
g2. set St r oke( bs) ;

/ / Est abl ece el col or del cont or no
528 Grficas en Java

ITSON Manuel Domitsu Kono
g2. set Pai nt ( Col or . bl ue) ;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D r ect = new Rect angl e2D. Doubl e( x, y, ancho, al t o) ;
/ / Cr ea de una f i gur a el i pt i ca
El l i pse2D. Doubl e el i pse = new El l i pse2D. Doubl e( x, y, ancho,
al t o) ;

/ / Est abl ece el or i gen i ni ci al
g2. t r ansl at e( 10, 10) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Tr ansl ada el or i gen
g2. t r ansl at e( 2*ancho, 0) ;

/ / Def or ma hor i zont al ment e
g2. shear ( 0. 5, 0) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Qui t a l a def or maci n hor i zont al
g2. shear ( - 0. 5, 0) ;

/ / Tr ansl ada el or i gen
g2. t r ansl at e( - 2*ancho, 2*al t o) ;

/ / Def or ma ver t i cal ment e
g2. shear ( 0, 0. 2) ;

/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;

/ / Qui t a l a def or maci n ver t i cal
g2. shear ( 0, - 0. 2) ;

/ / Tr ansl ada el or i gen
g2. t r ansl at e( 2*ancho, 0) ;

/ / Def or ma hor i zont al y ver t i cal ment e
g2. shear ( 0. 5, 0. 2) ;

Tema 13 Grficas en Java 529

ITSON Manuel Domitsu Kono
/ / Di buj a l os ej es coor denados
di buj aEj es( g2, ancho, al t o) ;

/ / Di buj a el r ect angul o y l a el i pse
g2. dr aw( r ect ) ;
g2. dr aw( el i pse) ;
}

La figura 13.52 muestra las deformaciones de figuras desplegada por el mtodo
def or maFi gur as( ) .


Figura 13.53 Deformaciones

Recorte de Figuras

El recorte de figuras es una tcnica que limita la extensin de un dibujo.
Gr aphi cs2D puede recortar los dibujos usando cualquier figura. De hecho
Gr aphi cs2D que mantiene la figura de recorte como parte de su estado.La figura
13.54 muestra un dibujo simple en tres estados: Sin recorte, recortado a un
tringulo y recortado a un crculo. Los mtodos de la clase Gr aphi cs2D que nos
permiten hacer esas transformaciones se muestran en la tabla 13.33.


530 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.54 Recortado

Tabla 13.33 Mtodos de la Clase Graphics2D para Recortar Figuras.
publ i c abst r act voi d clip( Shape s)

Intersecta la fiura de recorte actual con el interior de la figura del parmetro y establece el
resultado como la nueva figura de recorte
publ i c abst r act Shape getClip( )

Obtiene la figura de recorte actual.
publ i c abst r act voi d setClip( Shape cl i p)

Establece la figura de recorte a la figura del parmetro. No todas las figuras que implementan la
interfaz Shape pueden usarse como figuras de recorte. Las unicas figuras que se garantizan como
figuras de recorte son las obtenidas por el mtodo getClip( ) o mediante objetos del tipo
Rect angl e.

El cdigo del mtodo r ecor t aFi gur as( ) dibuja diferentes escalamientos de
figuras:

Operaciones.java
/ **
* Est e met odo di buj a sobr e el panel de su par amet r o
* f i gur as r ecor t adas
* @par aml i enzo Panel sobr e el que se di buj an f i gur as r ecor t adas
*/
publ i c voi d r ecor t aFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
Ar ea ar ea1, ar ea2;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

doubl e ancho = d. wi dt h / 3;
doubl e al t o = d. hei ght / 3;
doubl e x = 50;
doubl e y = 25;

/ / Car ga l a i magen a ser usada como t ext ur a
Buf f er edI mage bi ;
t r y {
bi = get I mage( " f ondo. j pg" ) ;
} cat ch ( I OExcept i on i oe) {
Tema 13 Grficas en Java 531

ITSON Manuel Domitsu Kono
J Opt i onPane. showMessageDi al og( l i enzo,
" Er r or al car gar i magen" ) ;
r et ur n;
}
/ / Cr ea el r ect angul o ancl a del t amao de l a i magen
Rect angl e2D t r = new Rect angl e2D. Doubl e( 0, 0, bi . get Wi dt h( ) ,
bi . get Hei ght ( ) ) ;
Text ur ePai nt t p = new Text ur ePai nt ( bi , t r ) ;

/ / est abl ece el t i po de r el l eno
g2. set Pai nt ( t p) ;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D r ect 1 = new Rect angl e2D. Doubl e( x, y, ancho, al t o) ;

/ / Di buj a el r ect angul o
g2. f i l l ( r ect 1) ;

x += 100 + ancho;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D r ect 2 = new Rect angl e2D. Doubl e( x, y, ancho, al t o) ;

/ / Cr ea l a f i gur a de r ecor t e
El l i pse2D el i pse1 = new El l i pse2D. Doubl e( x, y, ancho, al t o) ;
g2. cl i p( el i pse1) ;

/ / Di buj a el r ect angul o
g2. f i l l ( r ect 2) ;

/ / El i mi na el r ecor t e
g2. set Cl i p( nul l ) ;

x = 50;
y = 50 + al t o;

/ / Cr ea una f i gur a r ect angul ar
Rect angl e2D r ect 3 = new Rect angl e2D. Doubl e( x, y, ancho, al t o) ;

/ / Cr ea l a f i gur a de r ecor t e
El l i pse2D el i pse2 = new El l i pse2D. Doubl e( x, y, ancho, al t o) ;
g2. cl i p( el i pse2) ;

/ / Cr ea ot r a f i gur a de r ecor t e
Rect angl e2D r ect 4 = new Rect angl e2D. Doubl e( x, y, al t o, al t o) ;
g2. cl i p( r ect 4) ;

/ / Di buj a el r ect angul o
g2. f i l l ( r ect 3) ;
}

La figura 13.55 muestra las figuras recortadas desplegadas por el mtodo
r ecor t aFi gur as( ) .

532 Grficas en Java

ITSON Manuel Domitsu Kono

Figura 13.55 Deformaciones

Sugerencias de Despliegue

La API 2D de java permite el control de la calidad de su despliegue mediante el
uso de Sugerencias de Despliegue. Son sugerencias ya que no controlan la
mquina de despliegue slo son sugerencias de preferencias. La mquina de
despliegue puede seguir las sugerencias o ignorarlas. Esas sugerencias estn
encapsuladas en la clase Render i ngHi nt s.

la mquina de despliegue, Graphics2D sabe ms de una forma de hacer las
cosas. Por ejemplo, al dibujar una figura puede utilizar suavizamiento, que se ve
bien, o puede no usarlo lo que lo hace rpido. Este tipo de compromisos entre
calidad y velocidad ocurren en otras partes del proceso de despliegue. Las
sugerencias de despliegue nos permiten tener un poco de control en esas
decisiones. Las sugerencias de despliegue tambin se utilizan en el
procesamiento de imgenes.

Las sugerencias de despliegue se especifican usando un esquema llave valor.
Los diferentes valores que una llave puede tomar son constantes simblicas. Las
llaves y los posibles valores que una llave puede tomar se muestran en la tabla
13.34.

Tema 13 Grficas en Java 533

ITSON Manuel Domitsu Kono
Tabla 13.34. Sugerencias de Despliegue.
Sugerencia Llave Posibles valores
Controla si se va usar suavizamiento
para el desplegado de figuras y texto
KEY_ANTI AL
I ASI NG

VALUE_ANTI ALI AS_ON
VALUE_ANTI ALI AS_OFF
VALUE_ANTI ALI AS_DEFAULT
Le dice a Gr aphi cs2D si se prefiere
un dibujado rpido o el mejor
dibujado.
KEY_RENDER
I NG
VALUE_RENDER_QUALI TY
VALUE_RENDER_SPEED
VALUE_RENDER_DEFAULT
Le dice a Gr aphi cs2D si se va a usar
colores aproximados en dispositivos
que soportan un limitado nmero de
colores.
KEY_DI THER
I NG
VALUE_DI THER_DI SABLE
VALUE_DI THER_ENABLE
VALUE_DI THER_DEFAULT
Controla si los colores sern
corregidos para un determinado
dispositivo usando un perfil de
dispositivo.
KEY_COLOR_
RENDERI NG
VALUE_COLOR_RENDER_QUALI TY
VALUE_COLOR_RENDER_SPEED
VALUE_COLOR_RENDER_DEFAULT
Controla si en las fuentes se usaran
mediciones con enteros o fotantes.
Las medidas flotantes permiten mayor
precisin en el posicionamiento del
texto.
KEY_FRACTI
ONALMETRI C
S
VALUE_FRACTI ONALMETRI CS_ON
VALUE_FRACTI ONALMETRI CS_OFF
VALUE_FRACTI ONALMETRI CS_DEFAULT
Controla el suavizamiento del texto en
forma separada del de las otras
figuras.
KEY_TEXT_
ANTI ALI ASI
NG
VALUE_TEXT_ANTI ALI AS_ON
VALUE_TEXT_ANTI ALI AS_OFF
VALUE_TEXT_ANTI ALI AS_DEFAULT
Utiliza el algoritmo empleado para
transformar las imgenes.
KEY_I NTER
POLATI ON
VALUE_I NTERPOLATI ON_BI CUBI C
VALUE_I NTERPOLATI ON_BI LI NEAR
VALUE_I NTERPOLATI ON_NEAREST_NEI GHBOR
Determina como se calcularn los
valores alfa.
KEY_ALPHA
_I NTERPOLA
TI ON
VALUE_ALPHA_I NTERPOLATI ON_QUALI TY
VALUE_ALPHA_I NTERPOLATI ON_SPEED
VALUE_ALPHA_I NTERPOLATI ON_DEFAULT

Los mtodos de Gr aphi cs2D que nos permiten establecer o cuestionar el valor o
valores para esas sugerencias de despliegue se muestran en la tabla 13.35.

Tabla 13.35. Mtodos de la Clase Graphics2D para Manejar las Sugerencias
de Despliegue.
publ i c abst r act voi d setRenderingHint( Render i ngHi nt s. Key hi nt Key,
Obj ect hi nt Val ue)

Establece el valor de una sola sugerencia de despliegue para los algoritmos de despliegue.
Establece el valor de la sugerencia hi nt Key al valor de hi nt Val ue.
publ i c abst r act Obj ect getRenderingHint( Render i ngHi nt s. Key hi nt Key)

Regresa el valor de una sola sugerencia de despliegue para los algoritmos de despliegue.
Regresa el valor de la sugerencia par a l a l l ave hi nt Key.
publ i c abst r act voi d setRenderingHints( Map<?, ?> hi nt s)

Reemplaza los valores de todas las sugerencias para los algoritmos de despliegue con las
sugerencias del parmetro hi nt s. Los valores existentes de todas las sugerencias de despliegue
se descartan y son reemplazados por las sugerencias especificadas en el mapa.


534 Grficas en Java

ITSON Manuel Domitsu Kono
Tabla 13.35. Mtodos de la Clase Graphics2D para Manejar las Sugerencias
de Despliegue. Cont.
publ i c abst r act Render i ngHi nt s getRenderingHints( )

Regresa los valores de las sugerencias para los algoritmos de despliegue.
publ i c abst r act voi d addRenderingHints( Map<?, ?> hi nt s)

Establece los valores de un nmero arbitrario de sugerencias para los algoritmos de despliegue.
Solo los valores de las sugerencias que se encuentran presente en el mapa del parmetro son
modificados. Las otras sugerencias que no estn en el mapa del parmetro no se ven
modificados.

Para establecer que se use suavizamiento al desplegar las figuras podemos hacer
lo siguiente:

publ i c voi d r ecor t aFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

g2. set Render i ngHi nt ( Render i ngHi nt s. KEY_ANTI ALI ASI NG,
Render i ngHi nt s. VALUE_ANTI ALI AS_ON) ;
. . .
}

Si deseamos establecer varias sugerencias de despliegue al mismo tiempo,
podemos podemos podemos guardarlos en una instancia de Render i ngHi nt s o
cualquier otra clase que implemente la interfaz Map, como se muestra en la
siguiente pieza de cdigo.

publ i c voi d r ecor t aFi gur as( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;

Render i ngHi nt s hi nt s = new Render i ngHi nt s(
Render i ngHi nt s. KEY_ANTI ALI ASI NG,
Render i ngHi nt s. VALUE_ANTI ALI AS_ON) ;

hi nt s. add( Render i ngHi nt s. KEY_RENDERI NG,
Render i ngHi nt s. VALUE_RENDER_ON) ;

g2. set Render i ngHi nt s( hi nt s) ;
. . .
}

Texto

La forma ms simple de dibujar texto y controlar su apariencia es mediante los
mtodos de la clase Gr aphi cs2D que se muestran en la tabla 13.36.

Tema 13 Grficas en Java 535

ITSON Manuel Domitsu Kono
Tabla 13.36 Mtodos para Controlar y Dibujar Texto de la Clase Graphics2D.
publ i c abst r act voi d drawString( St r i ng st r , i nt x, i nt y)
publ i c abst r act voi d drawString( St r i ng st r , f l oat x, f l oat y)

Dibujan el texto especificado por el parmetro st r , usando los atributos de texto del contexto
grfico. La lnea base del primer carcter se dibuja en las coordenadas (x, y).
publ i c abst r act voi d drawString( At t r i but edChar act er I t er at or i t er at or ,
i nt x, i nt y)
publ i c abst r act voi d drawString( At t r i but edChar act er I t er at or i t er at or ,
f l oat x, f l oat y)

Dibujan el texto especificado por el iterador i t er at or , usando sus atributos de acuerdo a la
especificacin de la clase Text At t r i but e. La lnea base del primer carcter se dibuja en las
coordenadas (x, y).
publ i c abst r act Font getFont( )

Regresa la fuente actual en el contexto grfico.
publ i c abst r act voi d setFont( Font f ont )

Establece la fuente actual en el contexto grfico. Todas las operaciones subsecuentes
operaciones con texto usan esa fuente.
publ i c Font Met r i cs getFontMetrics( )
publ i c abst r act Font Met r i cs getFontMetrics( Font f )

La primera versin obtiene las mtricas para la fuente actual.
La segunda versin obtiene las mtricas para la fuente del parmetro.
publ i c abst r act Font Render Cont ext getFontRenderContext( )

Obtiene el contexto de despliegue de la fuente dentro del contexto de Graphics2D. El objeto de
tipo Font Render Cont ext encapsula las sugerencias de despliegue as como la informacin
especial del dispositivo destino como los puntos por pixel. Esta informacin es util cuando se
requiere posicionar texto.
Lnea Base

La lnea base de una cadena es una lnea sobre la que se dibujan los caracteres
de la cadena, figura 13.56.


Figura 13.56. Lnea Base de una Cadena.
Mtricas de Fuente

Las mtricas de fuente es un conjunto de mediciones que describen la fuente. la
figura 13.57 muestra algunas de esas mtricas. La altura total de una fuente es la
suma de la separacin entre lneas (leading), el ascenso (ascent) y el descenso
536 Grficas en Java

ITSON Manuel Domitsu Kono
(descent) de la fuente. El ascenso mide la altura del carcter por encima de la
lnea base. El descenso mide la distancia de algunos caracteres por debajo de la
lnea base.


Figura 13.57. Mtricas de una Fuente.

El siguiente cdigo ilustra el uso del mtodo dr awSt r i ng( ) para dibujar texto.

Texto.java
package f i gur as;

i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Font ;
i mpor t j ava. awt . Gr aphi cs;
i mpor t j ava. awt . Gr aphi cs2D;
i mpor t j ava. awt . Render i ngHi nt s;
i mpor t j avax. swi ng. J Panel ;

/ **
* Est a cl ase muest r a di f er ent es oper aci ones par a di buj ar t ext o
* @aut hor mdomi t su
*/
publ i c cl ass Text o {
/ **
* Est e met odo est at i co di buj a t ext o sobr e el panel de su par amet r o
* @par aml i enzo Panel sobr e el que se di buj a t ext o
*/
publ i c st at i c voi d di buj aText o( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
f l oat x, y;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

/ / Cr ea un t i po de f uent e
Font f ont = new Font ( " Ser i f " , Font . PLAI N, 96) ;
/ / Est abl ece el t i po de f uent e
g2. set Font ( f ont ) ;

/ / Di buj a una cadena de t ext o
g2. dr awSt r i ng( " Hol a mundo" , 20, 100) ;

/ / Est abl ece l a suger enci a de usar suavi zami ent o de or i l l as
g2. set Render i ngHi nt ( Render i ngHi nt s. KEY_ANTI ALI ASI NG,
Render i ngHi nt s. VALUE_ANTI ALI AS_ON) ;

Tema 13 Grficas en Java 537

ITSON Manuel Domitsu Kono
/ / Di buj a una cadena de t ext o
g2. dr awSt r i ng( " Hol a mundo" , 20, 200) ;
}
}

La figura 13.58 muestra el texto desplegado por el mtodo di buj aText o( ) .


Figura 13.58 Dibujado de Texto

El siguiente cdigo ilustra la forma de rotar texto.

Texto.java
/ **
* Est e met odo est at i co di buj a sobr e el panel de su par amet r o
* t ext o r ot ado
* @par aml i enzo Panel sobr e el di buj a t ext o r ot ado
*/
publ i c st at i c voi d r ot aText o( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
f l oat x, y;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

/ / Cr ea un t i po de f uent e
Font f ont = new Font ( " Ser i f " , Font . PLAI N, 48) ;
/ / Est abl ece el t i po de f uent e
538 Grficas en Java

ITSON Manuel Domitsu Kono
g2. set Font ( f ont ) ;

/ / Est abl ece l a suger enci a de usar suavi zami ent o de or i l l as
g2. set Render i ngHi nt ( Render i ngHi nt s. KEY_ANTI ALI ASI NG,
Render i ngHi nt s. VALUE_ANTI ALI AS_ON) ;

/ / Est abl ece el or i gen de coor denadas
g2. t r ansl at e( 80, 250) ;

/ / Di buj a una cadena de t ext o
g2. dr awSt r i ng( " Hol a mundo" , 0, 0) ;

/ / Gi r a el si st ema coor denado 45 gr ados
g2. r ot at e( - Mat h. PI / 4) ;

/ / Di buj a una cadena de t ext o
g2. dr awSt r i ng( " Hol a mundo" , 0, 0) ;

/ / Gi r a el si st ema coor denado ot r os 45 gr ados
g2. r ot at e( - Mat h. PI / 4) ;

/ / Di buj a una cadena de t ext o
g2. dr awSt r i ng( " Hol a mundo" , 0, 0) ;
}

La figura 13.59 muestra el texto desplegado por el mtodo r ot aText o( ) .


Figura 13.59 Rotado de Texto
Tema 13 Grficas en Java 539

ITSON Manuel Domitsu Kono
Caracteres, Glifos y Fuentes

Un carcter es un smbolo empleado para representar una letra, un dgito o un
smbolo de puntuacin.
Un glifo es una figura que se usa para desplegar un carcter o secuencia de
caracteres. A veces un glifo representa un carcter pero por lo general no hay una
relacin uno a uno entre los glifos y los caracteres. Por ejemplo la slaba fi
formadas por dos caracteres puede representarse por un solo glifo.

Una fuente encapsula la coleccin de glifos necesarios para desplegar un
conjunto selecto de caracteres asi como las tablas necesarias para mapear
secuencias de carateres a sus correspondientes secuencias de glifos.
Fuentes Fsicas y Fuentes Lgicas
La plataforma de java distingue entre dos tipos de fuentes: fuentes fsicas y
fuentes lgicas.

las fuentes fsicas son las bibliotecas actuales de las fuentes con los datos de los
glifos y las tablas para mapear de las secuencias de caracteres a las secuencias
de glifos, usando tecnologas como True Type o PostScript Type 1. Todas las
implementaciones de J ava deben soportar las fuentes True Type, aunque cada
implementacin puede soportar otras tecnologas de fonts. Las fuentes fsicas
usan nombres como Helvetica, Palatino, HonMincho, etc.

Las fuentes lgicas son las cinco familias definidas por la plataforma de J ava y
que deben ser soportadas por cualquier ambiente de ejecucin de J ava: Serif,
SansSerif, Monospaced, Dialog, and DialogInput. Estas fuentes no son
bibliotecas reales, en lugar de ello los nombre lgicos son mapeados a los
nombres fsicos por el ambiente de ejecucin de J ava. Este mapeado es
dependiente de la implementacin y localizacin. Por lo general cada nombre
lgico se mapea se mapea a varias fuentes fsicas para cubrir un rango amplio de
caracteres.
Caras de fuentes y Nombres

Una fuente puede tener varias caras como heavy, medium, oblique, gothic and
regular. Todas esas caras tienen un diseo tipogrfico similar.

Hay tres nombres que se pueden obtener de un objeto de tipo Font . El nombre
lgico de la fuente es el nombre usado para construir la fuente. El nombre de la
540 Grficas en Java

ITSON Manuel Domitsu Kono
cara de la fuente o simplemente, el nombre de la fuente, es el nombre de una cara
de una fuente, por ejemplo Hevetic bold. El nombre de de familia es el nombre de
la familia de la fuente que determina el diseo tipogrfico a lo largo de varias caras
como Helvetica.
La clase Font representa una instancia de de una cara de fuente de una coleccin
de caras de fuente que estn presentes en en los recursos del sistema del sistema
huesped, por ejemplo Arial Bold y Courier bold. Puede haber varios objetos del
tipo Font asociados a una cara de fuente, cada uno diferiendo en tamao, estilo,
transformacin y caractersticas de fuente.

La tabla 13.36 muestra algunos de los mtodos de la clase Font .

Tabla 13.36 mtodos de la clase Font.
publ i c Font( St r i ng name, i nt st yl e, i nt si ze)

Crea una fuente para el nombre, estilo y tamao dados por sus parmetros. El nombre de la
fuente puede ser el nombre de la cara o nombre lgico. Los estilos de la fuente pueden ser
cualquiera de kas siguientes constantes definidas en esta clase: PLAI N, I TALI C, BOLD o I TALI C
| BOLD. El tamao de la fuente debe darse en puntos tipogrficos. Un punto es 1/72 pulgadas. Si
la fuente especificada no existe, se regresar la fuente por omisin.
publ i c Font deriveFont( f l oat si ze)
publ i c Font deriveFont( i nt st yl e)
publ i c Font deriveFont( i nt st yl e, f l oat si ze)

Crea una nueva fuente, replicando esta fuente y aplicando un nuevo tamao, estilo o ambos.
publ i c St r i ng getFamily( )

Regresa el nombre de la familia de esta fuente.
publ i c St r i ng getFontName( )

Regresa el nombre de la cara de esta fuente.
publ i c St r i ng getName( )

Regresa el nombre lgico de esta fuente.
Familia de Fuentes Instaladas en el Sistema

La clase Gr aphi csEnvi r ement tiene el mtodo
get Avai l abl eFont Fami l yNames( ) que nos regresa un arreglo una lista de las
familias de fuentes instaladas en el sistema. Su sintaxis me muestra en la tala
13.37.

Tabla 13.36 mtodo getAvailableFontFamilyNames()de la Clase
GraphicsEnvirement.
publ i c abst r act St r i ng[ ] getAvailableFontFamilyNames( )

Regresa un arreglo con los nombres de todas las familias de fuentes en el sistema.
Tema 13 Grficas en Java 541

ITSON Manuel Domitsu Kono
Ejemplo sobre Familia de Fuentes Instaladas en el Sistema
El siguiente cdigo ilustra el mtodo que invoca al cuadro de dilogo usado para
seleccionar una fuente de las instaladas en el sistema.

Texto.java
/ **
* Est e met odo despl i ega un cuadr o de di al ogo par a sel ecci oanar
* una f uent e de l as i nst al adas en el si st ema.
*
* @par amf r ame f r ame sobr e el que se despl egar el cuadr o de di al ogo
*/
publ i c voi d f uent es( J Fr ame f r ame) {
Font f ont = new Font ( " Ser i f " , Font . PLAI N, 12) ;

Dl gSel ect or Fuent es dl g = new Dl gSel ect or Fuent es( f r ame,
" Sel ect or de f uent es" , t r ue, f ont ) ;
}

DlgSelectorFuentes.java
/ *
* Dl gSel ect or Fuent es. j ava
*
* Cr eat ed on 25/ 10/ 2011, 12: 55: 32 PM
*/
package gr af i ca2;

i mpor t f i gur as. Li neas;
i mpor t j ava. awt . Col or ;
i mpor t j ava. awt . Di mensi on;
i mpor t j ava. awt . Font ;
i mpor t j ava. awt . Gr aphi cs;
i mpor t j ava. awt . Gr aphi cs2D;
i mpor t j ava. awt . Gr aphi csEnvi r onment ;
i mpor t j ava. awt . Poi nt ;
i mpor t j avax. swi ng. Def aul t ComboBoxModel ;
i mpor t j avax. swi ng. J Panel ;

/ **
* Est e cuadr o de di al ogo per mi t e sel ecci onar una f uent e
* @aut hor mdomi t su
*/
publ i c cl ass Dl gSel ect or Fuent es ext ends j avax. swi ng. J Di al og {

/ **
* Const r uct or del cuadr o de di al ogo
* @par ampar ent Fr ame sobr e el que se di buj a el cuadr o de di al ogo
* @par amt i t l e Ti t ul o del cuadr o de di al ogo
* @par ammodal t r ue si per mi t e acceder f uer a de l os l i mi t es del
* cuadr o de di al ogo, f al se en caso cont r ar i o
* @par amf ont Fuent e sel ecci onada en el cuadr o de di al ogo
*/
publ i c Dl gSel ect or Fuent es( j ava. awt . Fr ame par ent , St r i ng t i t l e,
bool ean modal , Font f ont ) {
542 Grficas en Java

ITSON Manuel Domitsu Kono
super ( par ent , t i t l e, modal ) ;
t hi s. f ont = f ont ;
i ni t Component s( ) ;
/ / est abl ece l a f uent e i ni ci al
f ont = new Font ( f uent eSel , est i l oSel , t amanosel ) ;

/ / Cent r a el cuadr o de di al ogo sobr e el f r ame
cent r aCuadr oDi al ogo( par ent ) ;
/ / Muest r a el cuadr o de di l ogo
set Vi si bl e( t r ue) ;
}

/ **
* Est e mt odo r egr esa una i nst anci a de l a cl ase Def aul t ComboMoxModel
* f or mada a par t i r de l os nombr es de l as f ami l i as de f uent es
* i nst al adas en el si st ema.
*/
pr i vat e Def aul t ComboBoxModel
get Nombr esFami l i aFuent esComboBoxModel ( ) {
Gr aphi csEnvi r onment gEnv =
Gr aphi csEnvi r onment . get Local Gr aphi csEnvi r onment ( ) ;

/ / Obt i ene l os nombr es de l as f ami l i as de f uent es i nst al adas
/ / en el si st ema
St r i ng[ ] nombr esFami l i aFuent es =
gEnv. get Avai l abl eFont Fami l yNames( ) ;
/ / Cr ea l a i nst anci a de l a cl ase Def aul t ComboMoxModel
/ / f or mada a par t i r de l os nombr es de l as f ami l i as de f uent es
/ / i nst al adas en el si st ema
Def aul t ComboBoxModel dcbmNombr esFami l i aFuent es =
new Def aul t ComboBoxModel ( nombr esFami l i aFuent es) ;

r et ur n dcbmNombr esFami l i aFuent es;
}

/ **
* Est e mt odo cent r a el cuadr o de di al ogo sobr e l a vent ana de l a
* apl i caci n.
* @par ampar ent Vent ana sobr e l a que apar ecer el cuadr o de di l ogo
*/
pr i vat e voi d cent r aCuadr oDi al ogo( j ava. awt . Fr ame par ent ) {
/ / Obt i ene el t amao y posi ci n de l a vent ana de l a apl i caci n
Di mensi on f r ameSi ze = par ent . get Si ze( ) ;
Poi nt l oc = par ent . get Locat i on( ) ;

/ / Obt i ene el t amao del cuadr o de di l ogo
Di mensi on dl gSi ze = get Pr ef er r edSi ze( ) ;

/ / Cent r a el cuadr o de di l ogo sobr e l a vent ana padr e
set Locat i on( ( f r ameSi ze. wi dt h - dl gSi ze. wi dt h) / 2 + l oc. x,
( f r ameSi ze. hei ght - dl gSi ze. hei ght ) / 2 + l oc. y) ;
}

. . .

/ **
Tema 13 Grficas en Java 543

ITSON Manuel Domitsu Kono
* Mt odo oyent e del bot n bot onAcept ar
* @par amevt Event o al que escucha
*/
pr i vat e voi d bt nAcept ar Act i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
/ / Dest r uye el cuadr o de d al ogo
di spose( ) ;
}

/ **
* Met odo oyent e de l a caj a combi nada par a sel ecci onar l a f ami l i a de
* f uent e a usar en l a f uent e
* @par amevt Event o al que escucha
*/
pr i vat e voi d cbFuent esAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
/ / Obt i ene l a f uent e sel ecci onada en l a caj a combi nada
f uent eSel = ( St r i ng) cbFuent es. get Sel ect edI t em( ) ;

/ / Cr ea una f uent e con l a f ami l i a sel ecci onada
f ont = new Font ( f uent eSel , est i l oSel , t amanosel ) ;

/ / Di buj a una cadena con l a f uent e sel ecci onada
di buj aText oDemoFuent es( panel Li enzoFuent es) ;
}

/ **
* Met odo oyent e de l a caj a combi nada par a sel ecci onar el est i l o de
* f uent e a usar en l a f uent e
* @par amevt Event o al que escucha
*/
pr i vat e voi d cbEst i l osAct i onPer f or med(
j ava. awt . event . Act i onEvent evt ) {
/ / Obt i ene el est i l o de l a f uent e de l a caj a combi nada
est i l oSel = cbEst i l os. get Sel ect edI ndex( ) ;

/ / Cr ea una f uent e con l a f ami l i a sel ecci onada
f ont = new Font ( f uent eSel , est i l oSel , t amanosel ) ;

/ / Di buj a una cadena con l a f uent e sel ecci onada
di buj aText oDemoFuent es( panel Li enzoFuent es) ;
}

/ **
* Met odo oyent e del spi nner par a sel ecci onar el t amano de
* f uent e a usar en l a f uent e
* @par amevt Event o al que escucha
*/
pr i vat e voi d spTamanosSt at eChanged(
j avax. swi ng. event . ChangeEvent evt ) {
/ / Obt i ene el t amano de l a f uent e del spi nner
St r i ng t amano = spTamanos. get Model ( ) . get Val ue( ) . t oSt r i ng( ) ;
t amanosel = I nt eger . par seI nt ( t amano) ;

/ / Cr ea una f uent e con l a f ami l i a sel ecci onada
f ont = new Font ( f uent eSel , est i l oSel , t amanosel ) ;
544 Grficas en Java

ITSON Manuel Domitsu Kono

/ / Di buj a una cadena con l a f uent e sel ecci onada
di buj aText oDemoFuent es( panel Li enzoFuent es) ;
}

/ **
* Met odo oyent e que se i nvoca al despl egar se el cuadr o de di al ogo
* @par amevt Event o al que escucha
*/
pr i vat e voi d f or mWi ndowOpened( j ava. awt . event . Wi ndowEvent evt ) {
/ / Di buj a una cadena con l a f uent e sel ecci onada
di buj aText oDemoFuent es( panel Li enzoFuent es) ;
}

/ **
* Di buj a una cadena con l a f uent e sel ecci onada
* cent r ada hor i zont al ment e sobr e el panel del par amet r o
* @par aml i enzo Panel sobr e el que se di buj a l a cadena
*/
publ i c voi d di buj aText oDemoFuent es( J Panel l i enzo) {
Gr aphi cs g = l i enzo. get Gr aphi cs( ) ;
Gr aphi cs2D g2 = ( Gr aphi cs2D) g;
St r i ng s = " Hol a mundo" ;

/ / Est abl ece l a f uent e a usar
g2. set Font ( f ont ) ;
g2. set Pai nt ( Col or . bl ack) ;

/ / Bor r a el panel
Li neas. bor r a( l i enzo) ;

/ / Obt i ene una i nst anci a de Font Render Cont ext que cont i ene
/ / i nf or maci n par a obt ener el t amao de una cadena
Font Render Cont ext f r c = g2. get Font Render Cont ext ( ) ;
/ / Obt i ene el r ect angul o que l i mi t a l a cadena
Rect angl e2D bounds = g2. get Font ( ) . get St r i ngBounds( s, f r c) ;
/ / Obt i ene el ancho del r ect angul o que l i mi t a l a cadena
f l oat wi dt h = ( f l oat ) bounds. get Wi dt h( ) ;

/ / Obt i ene el t amao del panel
Di mensi on d = l i enzo. get Si ze( ) ;

/ / Cal cul a l a posi ci n hor i zont al par a cent r ar el t ext o
i nt x = ( i nt ) ( ( f l oat ) d. wi dt h - wi dt h) / 2;
i nt y = ( i nt ) ( ( f l oat ) d. hei ght - 50) ;

/ / Di buj a l a cadena de t ext o
g2. dr awSt r i ng( s, x, y) ;
}

/ / Var i abl es decl ar at i on - do not modi f y
pr i vat e j avax. swi ng. J But t on bt nAcept ar ;
pr i vat e j avax. swi ng. J ComboBox cbEst i l os;
pr i vat e j avax. swi ng. J ComboBox cbFuent es;
pr i vat e j avax. swi ng. J Label j Label 1;
pr i vat e j avax. swi ng. J Label j Label 2;
Tema 13 Grficas en Java 545

ITSON Manuel Domitsu Kono
pr i vat e j avax. swi ng. J Label j Label 3;
pr i vat e j avax. swi ng. J Panel panel Li enzoFuent es;
pr i vat e j avax. swi ng. J Spi nner spTamanos;
/ / End of var i abl es decl ar at i on
pr i vat e St r i ng f uent eSel = " Di al og" ;
pr i vat e i nt est i l oSel = 0;
pr i vat e i nt t amanosel = 12;
pr i vat e Font f ont ;
}

La figura 13.60 muestra el cuadro de dilogo empleado para seleccionar una
fuente de las instaladas en el sistema.


Figura 13.60 Cuadro de Dilogo para seleccionar una Fuente de las
Instaladas en el Sistema

Você também pode gostar