Está en la página 1de 1027

Índice Tutor Básico

Nota:
Es t e t u t o r e s t á b a s a d o e n u n a t ra d u cció n - a d a p t a ció n d e l
t u t o ria l d e S u n q u e p u e d e s e n co n t ra r: a q u í

Tu Primera 'Taza' de Java


● La Prim e ra 'Ta za ' d e Ja va
❍ En Win d o ws
❍ En UNIX
❍ En Ma c OS

¿Por donde Empezar?


● ¿ Po r d ó n d e Em p e za r?
● El co m p ila d o r Ja va c
● El vis u a liza d o r d e Ap p le t s
● El in t é rp re t e Ja va
● El d e co m p ila d o r Ja va p

Conceptos Básicos
● Co n ce p t o s Bá s ico s d e Pro g ra m a ció n Orie n t a d a a Ob je t o s

Características del Lenguaje


● Va ria b le s y Tip o s d e Da t o s
● Op e ra d o re s
● Exp re s io n e s
● Co n t ro l d e Flu jo
● Arra ys y Ca d e n a s
Objetos, Clases e Interfaces
● Cre a r Ob je t o s
● Ut iliza r Ob je t o s
● Elim in a r Ob je t o s n o u t iliza d o s
● De cla ra r Cla s e s
● El cu e rp o d e la Cla s e
● De cla ra r Va ria b le s Mie m b ro
● De cla ra r Mé t o d o s
● Pa s a r Arg u m e n t o s a u n Mé t o d o
● El cu e rp o d e u n Mé t o d o
● Mie m b ro s d e la Cla s e s y d e l Eje m p la r
● Co n t ro l d e Acce s o a Mie m b ro s
● Co n s t ru ct o re s
● Co n s t ru ir u n Me t o d o Fin a lize
● S u b cla s e s y S u p e rCla s e s
● Cre a r u n a S u b cla s e
● S o b re e s crib ir Mé t o d o s
● Cla s e s y Mé t o d o s Fin a le s
● Cla s e s y Mé t o d o s Ab s t ra ct o s
● La cla s e Ob je ct
● ¿ Qu é e s u n In t e rfa ce ?
● Cre a r u n In t e rfa ce
● Ut iliza r u n In t e rfa ce
● Us a r u n In t e rfa ce co m o u n Tip o
● Cre a r Pa q u e t e s d e Cla s e s
● Ut iliza r Pa q u e t e s
● Lo s Pa q u e t e s In t e rn o s d e l JDK
● Ca m b io s e n e l JDK 1 . 1 . x

La clase String
● S t rin g y S t rin g Bu ffe r
● ¿ Po r q u é d o s cla s e s S t rin g ?
● Cre a r S t rin g y S t rin g Bu ffe r
● Mé t o d o s Acce s o re s
● Mo d ifica r u n S t rin g Bu ffe r
● Co n ve rt ir Ob je t o s a S t in g s
● Lo s S t rin g s y e l Co m p ia ld o r Ja va c
● No t a s s o b re e l JDK 1 . 1

Atributos del Programa


● At rib u t o s d e l Pro g ra m a
● S e le ccio n a r y Ut iliza r Pro p ie d a d e s
● Arg u m e n t o s d e la Lín e a d e Co m a n d o s
❍ Co n ve n cio n e s
❍ An a liza r Arg u m e n t o s
● No t a s s o b re e l JDK 1 . 1

Recursos del Sistema


● Re cu rs o s d e l S is t e m a
● Ut iliza r la Cla s e S ys t e m
● Lo s S t re a m s d e I/ O Es t á n d a rd
● Pro p ie d a d e s d e l S is t e m a
● Re co le cció n d e Ba s u ra
● Ot ro s Mé t o d o s d e la Cla s e S ys t e m
● No t a s s o b re e l JDK 1 . 1

Manejo de Errores
● Ma n e jo d e Erro re s u t iliza n d o Exce p cio n e s
● ¿ Qu é e s u n a Exce p ció n ?
● Prim e r e n cu e n t ro co n la s Exce p cio n e s
● De cla ra r o Exp e cifica r
● Tra t a r co n Exce p cio n e s
❍ El e je m p lo Lis t OfNu m b e rs
❍ Ca p t u ra r y Ma n e ja r Exce p cio n e s
■ El b lo q u e t ry
■ Lo s b lo q u e s ca t ch
■ El b lo q u e fin a lly
■ Ju n t á n d o lo t o d o
❍ Exp e cifica r Exce p cio n e s
● La s e n t e n cia t h ro w
● La cla s e Th ro wa b le
● Cre a r Cla s e s d e Exce p cio n e s
● Exce p cio n e s e n Tie m p o d e Eje cu ció n
● No t a s s o b re e l JDK 1 . 1

Threads de Control
● Th re a d s d e Co n t ro l
● ¿ Qu é e s u n Th re a d ?
● S e n cillo Th re a d d e Eje m p lo
● At rib u t o s d e u n Th re a d
❍ El cu e rp o d e u n Th re a d
■ El a p p le t d e l Re lo j
❍ Es t a d o s d e u n Th re a d
❍ Prio rid a d d e u n Th re a d
❍ Th re a d s S e rvid o re s
❍ Gru p o s d e Th re a d s
■ La cla s e Th re a d Gro u p
● Pro g ra m a s Mu lt i- Th re a d
● S in cro n iza ció n d e Th re a d s
❍ Mo n it o re s Ja va
■ Lo s m o n it o re s Ja va s o n re e n t ra n t e s
❍ Lo s m é t o d o s wa it ( ) y n o t ify( )
● No t a s s o b re e l JDK 1 . 1

Canales de I/O
● S t re a m s d e I/ O
● Prim e r e n cu e n t ro co n la I/ O e n Ja va
● In t ro d u cció n a lo s S t re a m s
● Ut iliza r S t re a m s d e I/ O
❍ Im p le m e n t a r Tu b e ría s
❍ I/ O d e Fich e ro s
❍ I/ O s o b re Me m o ria
❍ Co n ca t e n e r Fich e ro s
● S t re a m s Filt ra d o s
❍ Da t a In p u t S t re a m y Da t a Ou t p u t S t re a m
❍ Es crib ir S t re a m s Filt ra d o s
● Fich e ro s d e Acce s o Ale a t o rio
❍ Ut iliza r Fich e ro s d e Acce s o Ale a t o rio
❍ Filt ro s p a ra Fich e ro s d e Acce s o Ale a t o rio
● No t a s s o b re e l JDK 1 . 1

Los Applets
● In t ro d u cció n a lo s Ap p le t s
❍ An a t o m ía d e u n Ap p le t
■ Im p o rt a r Cla s e s y Pa q u e t e s
■ De fin ir u n a s u b cla s e d e Ap p le t
■ Im p le m e n t a r m é t o d o s e n u n Ap p le t
■ Eje cu t a r u n Ap p le t
● De s crip ció n d e u n Ap p le t
❍ El ciclo d e vid a d e u n Ap p le t
❍ Mé t o d o s p a ra Mille s t o n e s
❍ Mé t o d o s p a ra Dib u ja r y m a n e ja r Eve n t o s
❍ Us a r Co m p o n e n t e s UI
❍ Th re a d s e n u n Ap p le t
■ Eje m p lo s
❍ Qu é p u e d e y q u é n o p u e d e h a ce r u n Ap p le t
❍ Añ a d ir u n Ap p le t a u n a p á g in a HTML
❍ S u m a rio
● Cre a r u n In t e rfa ce d e Us u a rio
❍ Cre a r u n GUI

❍ Eje cu t a r S o n id o s
❍ Us a r Pa rá m e t ro s e n e n u n Ap p le t
■ Pa rá m e t ro s a S o p o rt a r
■ Es crib ir có d ig o p a ra s o p o rt a r Pa rá m e t ro s
■ Ob t e n e r in fo rm a ció n s o b re Pa rá m e t ro s
❍ Le e r la s Pro p ie d a d e s d e l S is t e m a
❍ Mo s t ra r ca d e n a s d e Es t a d o
❍ Dia g n ó s t ico e n la S a lid a Es t á n d a rd
● Co m u n ica rs e co n o t ro s p ro g ra m a s
❍ En via r Me n s a je s a o t ro s Ap p le t s
❍ Co m u n ica ció n co n e l Na ve g a d o r
❍ Ap lica cio n e s e n e l la d o d e l S e rvid o r
● Ca p a cid a d e s y Re s t riccio n e s e n u n Ap p le t
❍ Re s t riccio n e s d e S e g u rid a d

❍ Ca p a cid a d e s d e u n Ap p le t
● Fin a liza r u n Ap p le t
❍ An t e s d e Lib e ra r u n Ap p le t

❍ Fin a liza ció n p e rfe ct a d e u n Ap p le t


● Pro b le m a s Co m u n e s co n lo s Ap p le t s ( y s u s s o lu cio n e s )
● No t a s s o b re e l JDK 1 . 1

Interface Gráfico de Usuario


● In t ro d u cció n a l UI d e Ja va
❍ Co m p o n e n t e s d e la cla s e AWT
❍ Ot ra s Cla s e s AWT
❍ La An a t o m ía d e u n p ro g ra m a b a s a d o e n GUI
■ La s cla s e s d e l Pro g ra m a Eje m p lo
■ La He re n cia d e Co m p o n e n t e s
■ Dib u jo
■ Ma n e jo d e Eve n t o s
● Ut iliza r Co m p o n e n t e s AWT
❍ Re g la s Ge n e ra le s
❍ Ut iliza r Bu t t o n
❍ Ut iliza r Ca n va s
❍ Ut iliza r Ch e ckb o x
❍ Ut iliza r Ch o ice
❍ Ut iliza r Dia lo g
❍ Ut iliza r Fra m e
❍ Ut iliza r La b e l
❍ Ut iliza r Lis t
❍ Ut iliza r Me n u
❍ Ut iliza r Pa n e l
❍ Ut iliza r S cro llb a r
❍ Ut iliza r Ca m p o s y Are a s d e Te xt o
❍ De t a lle s d e la Arq u it e ct u ra d e Co m p o n e n t e s
❍ Pro b le m a s co n lo s Co m p o n e n t e s
● Dis t rib u ir Co m p o n e n t e s
❍ Ut iliza r Ma n e ja d o re s d e Dis t rib u ció n
■ Re g la s Ge n e ra le s
■ Bo rd e rLa yo u t
■ Ca rd La yo u t
■ Flo wLa yo u t
■ Grid La yo u t
■ Grid Ba g La yo u t
■ Es p e cifica r Re s t riccio n e s
■ El Ap p le t d e Eje m p lo
■ Cre a r u n Co n t ro la d o r Pe rs o n a liza d o
■ Po s icio n a m ie n t o Ab s o lu t o
■ Pro b le m a s co n lo s co n t ro la d o re s
● In t ro d u cció n a lo s Grá fico s d e l AWT
❍ Dib u ja r Fo rm a s S e n cilla s
❍ Dib u ja r Te xt o
❍ Ut iliza r Im a g e n e s
■ Ca rg a r Im a g e n e s
■ Mo s t ra r Im a g e n e s
■ Ma n ip u la r Im a g e n e s
■ Ut iliza r u n Filt ro
■ Es crib ir u n Filt ro
❍ Re a liza r An im a cio n e s
■ Cre a r u n Bu cle
■ An im a r Grá fico s
■ Elim in a r e l Pa rp a d e o
■ S o b re e s crib ir e l m é t o d o u p d a t e ( )
■ Do b le Bu ffe r
■ Mo ve r u n a Im a g e n
■ Mo s t ra r S e cu e n cia s d e Im a g e n e s
■ Au m e n t a r e l re n d im ie n t o d e u n a An im a ció n
❍ Pro b le m a s co m u n e s co n lo s Grá fico s

Gráficos 2D
● In t ro d u cció n a l API 2 D d e Ja va
❍ Dib u ja d o Ja va 2 D
❍ S is t e m a d e Co o rd e n a d a s
❍ Fo rm a s
❍ Te xt o
❍ Im á g e n e s
❍ Im p rim ir
● Mo s t ra r Grá fico s co n Gra p h ics 2 D
❍ Re lle n a r y p a t ro n a r g rá fico s p rim it ivo s
❍ Tra n s fo rm a r fo rm a s t e xt o e im á g e n e s
❍ Re co rt a r la re g ió n d e d ib u jo
❍ Co m p o n e r Grá fico s
❍ Co n t ro la r la Ca lid a d d e l d ib u ja d o
❍ Co n s t ru ir fo rm a s co m p le ja s co n g e o m é t rico s p rim it ivo s
❍ S o p o rt a r In t e ra cció n d e l Us u a rio
● Tra b a ja r co n Te xt o y Fu e n t e s
❍ Cre a r y De riva r Fu e n t e s
❍ Dib u ja r m ú lt ip le s lín e a s d e t e xt o
● Ma n ip u la r y Mo s t ra r Im á g e n e s
❍ Mo d o In m e d ia t o co n Bu ffe re d Im a g e
❍ Filt ra r u n Bu ffe re d Im a g e
❍ Us a r u n Bu ffe re d Im a g e p a ra d o b le b u ffe r
● Im p rim ir
❍ Im p rim ir e n Ja va
❍ Im p rim ir e l co n t e n id o d e u n co m p o n e n t e
❍ Mo s t ra r e l d iá lo g o Pa g e S e t u p
❍ Im p rim ir u n a co le cció n d e p á g in a s
● Re s o lve r p ro b le m a s co m u n e s co n lo s g rá fico s e n 2 D

Trabajo en Red
● Tra b a jo e n la Re d
● In t ro d u cció n a l Tra b a jo e n Re d
❍ Tra b a jo e n Re d Bá s ico

❍ Lo q u e ya p o d ría s co n o ce r s o b re e l t ra b a jo e n Re d
● Tra b a ja r co n URLs
❍ ¿ Qu é e s u n a URL?

❍ Cre a r u n a URL
❍ An a liza r u n a URL
❍ Le e r d e s d e u n a URL
❍ Co n e ct a r co n u n a URL
❍ Le e r y Es crib ir u t iliza n d o u n a URL
● To d o s o b re lo s S o cke t s
❍ ¿ Qu é e s u n S o cke t ?
❍ Le e r y Es crib ir u t iliza n d o u n S o cke t
❍ Es crib ir e l la d o d e l s e rvid o r d e u n S o cke t
● To d o s o b re lo s Da t a g ra m a s
❍ ¿ Qu é e s u n Da t a g ra m a ?

❍ Es crib ir Da t a g ra m a s Clie n t e y S e rvid o r


● Co n t ro la d o r d e S e g u rid a d
❍ In t ro d u cció n a lo s Co n t ro la d o re s d e S e g u rid a d
❍ Es crib ir u n Co n t ro la d o r
❍ In s t a la r u n Co n t ro la d o r
❍ De cid ir lo s Mé t o d o s a s o b re e s crib ir d e l S e cu rit yMa n a g e r
● No t a s s o b re e l JDK 1 . 1
Los Beans
● Ja va Be a n s
● In t ro d u cció n a lo s Be a n s
❍ Co n ce p t o s b á s ico s

❍ El Kit d e De s a rro llo d e b e a n s


● Ut iliza r Be a n Bo x
❍ Arra n ca r y u t iliza r Be a n Bo x
❍ Me n ú s d e Be a n Bo x
❍ Ut iliza r Be a n Bo x p a ra g e n e ra r Ap p le t s
● Es crib ir u n Be a n s e n cillo
● Pro p ie d a d e s
❍ Pro p ie d a d e s s e n cilla s
❍ Pro p ie d a d e s Co m p a rt id a s
❍ Pro p ie d a d e s Re s t rin g id a s
❍ Pro p ie d a d e s In d e xa d a s
● Ma n ip u la r Eve n t o s e n Be a n Bo x
● El In t e rfa ce Be a n In fo
● Pe rs o n a liza r Be a n s
● Pe rs is t e n cia d e u n Be a n
● Nu e va s Ca ra ct e rís it ca s

Servlets
● In t ro d u cció n a lo s S e rvle t s
❍ Arq u it e ct u ra d e l p a q u e t e S e rvle t
❍ Un S e rve lt S e n cillo
❍ Eje m p lo s
● In t e ra cció n co n lo s Clie n t e s
❍ Pe t icio n e s y Re s p u e s t a s
❍ Ma n e ja r Pe t icio n e s GET y POS T
❍ Pro b le m a s co n lo s Th re a d s
❍ Pro p o rcio n a r In fo rm a ció n d e u n S e rvle t
● El Ciclo d e Vid a d e u n S e rvle t
❍ In icia liza r u n S e rvle t
❍ De s t ru ir u n S e rvle t
● Gu a rd a r e l e s t a d o d e l Clie n t e
❍ Tra ye ct o ria d e S e s ió n
❍ Ut iliza r Co o kie s
● La u t ilid a d S e rvle t Ru n n e r
❍ Pro p ie d a d e s d e u n S e rvle t
❍ Arra n ca r S e rvle t ru n n e r
● Eje cu t a r S e rvle t s
❍ De s d e u n Na ve g a d o r
❍ De s d e u n a Pá g in a HTML
❍ De s d e o t ro S e rvle t

Internacionalización
● Me rca d o s Glo b a le s
❍ In t e rn a cio n a liza ció n
❍ Lo ca liza ció n
❍ Da t o s De p e n d ie n t e s d e la Cu lt u ra
● Un Eje m p lo Rá p id o
❍ An t e s d e la In t e rn a cio n a liza ció n
❍ De s p u é s d e la In t e rn a cio n a liza ció n
❍ Eje cu t a r e l p ro g ra m a
❍ In t e rn a cio n a liza r e l e je m p lo
■ Cre a r e l fich e ro d e p ro p ie d a d e s
■ De fin ir la Lo ca lid a d
■ Cre a r e l Re s o u rce Bu n d le
■ Bu s ca r e l t e xt o e n e l Re s o u rce Bu n d le
● S e le ccio n a r la Lo ca lid a d
❍ Cre a r u n a Lo ca lid a d
❍ Id e n t ifica r la s Lo ca lid a d e s d is p o n ib le s
❍ La Lo ca lid a d p o r d e fe ct o
❍ El á m b it o d e la Lo ca lid a d
● Ais la r Ob je t o s Es p e cífico s e n u n Re s o u rce Bu n d le
❍ La cla s e Re s o u rce Bu n d le
❍ Pre p a ra r u n Re s o u rce Bu n d le
❍ Fich e ro s d e Pro p ie d a d e s
❍ Ut iliza r u n Lis t Re s o u rce Bu n d le
● Fo rm a t e a r Nú m e ro s y Mo n e d a
❍ Us a r Fo rm a t o s Pre d e fin id o s
❍ Fo rm a t e a r co n Pa t ro n e s
● Fo rm a t e a r Fe ch a s y Ho ra s
❍ Us a r Fo rm a t o s Pre d e fin id o s
❍ Fo rm a t e a r co n Pa t ro n e s
❍ Ca m b ia r s im b o lo s e n e l fo rm a t o d e Fe ch a s
● Fo rm a t e a r Me n s a je s
❍ Tra t a r co n m e n s a je s co n ca t e n a d o s
❍ Ma n e ja r Plu ra le s
● Tra b a ja r co n Exce p cio n e s
❍ Ma n e ja r m e n s a je s d e la s Exce p cio n e s
❍ Cre a r s u b cla s e s d e Exce p t io n in d e p e n d ie n t e s d e la Lo ca lid a d
● Co m p a ra r S t rin g s
❍ Re a liza r co m p a ra cio n e s in d e p e n d ie n t e s d e la Lo ca lid a d
❍ Re g la s p e rs o n a le s d e co m p a ra ció n
❍ Au m e n t a r e l re n d im ie n t o d e la co m p a ra ció n
● De t e ct a r Lím it e s d e Te xt o
❍ La cla s e Bre a kIt e ra t o r
❍ Lím it e d e Ca ra ct e r
❍ Lím it e d e Pa la b ra
❍ Lím it e d e S e n t e n cia
❍ Lím it e d e Lín e a
● Co n ve rt ir t e xt o n o Un ico d e
❍ Byt e s Co d ifica d o s y S t rin g s
❍ S t re a m s d e Byt e s y d e Ca ra ct e r
● Un lis t a d e ch e q u e o p a ra In t e rn a cio n a liza r u n a p ro g ra m a e xis t e n t e
Ficheros JAR
● Fo rm a t o d e Fich e ro JAR
● Us a r fich e ro s JAR: b á s ico
❍ Cre a r u n fich e ro JAR
❍ Ve r e l co n t e n id o d e u n fich e ro JAR
❍ Ext ra e r e l co n t e n id o d e u n fich e ro JAR
❍ Mo d ifica r u n fich e ro d e Ma n ifie s t o
❍ Eje cu t a r s o ft wa re co n t e n id o e n u n fich e ro JAR
❍ En t e n d e r e l Ma n ifie s t o
● Firm a r y Ve rifica r fich e ro s JAR
❍ Firm a r u n Fich e ro JAR
❍ Ve rifica r u n Fich e ro JAR Firm a d o
❍ En t e n d e r la Firm a y la Ve rifica ció n

Métodos Nativos
● El JNI d e Ja va
● Pa s o a Pa s o
❍ Pa s o 1 : Es crib ir e l có d ig o Ja va
❍ Pa s o 2 : Co m p ila r e l có d ig o Ja va
❍ Pa s o 3 : Cre a r e l fich e ro . H
❍ Pa s o 4 : Es crib ir e l Mé t o d o Na t ivo
❍ Pa s o 5 : Cre a r u n a Lib re ría Co m p a rt id a
❍ Pa s o 6 : Eje cu t a r e l Pro g ra m a
● Im p le m e n t a r Mé t o d o s Na t ivo s
❍ De cla ra r Mé t o d o s Na t ivo s
❍ Lo s t ip o s Ja va e n Mé t o d o s Na t ivo s
❍ Acce d e r a S t rin g s Ja va e n Mé t o d o s Na t ivo s
❍ Tra b a ja r co n Arra ys Ja va e n Mé t o d o s Na t ivo s
❍ Lla m a r a Mé t o d o s Ja va
❍ Acce d e r a ca m p o s Ja va
❍ Ma n e ja r e rro re s Ja va d e s d e Mé t o d o s Na t ivo s
❍ Re fe re n cia s Lo ca le s y Glo b a le s
❍ Th re a d s y Mé t o d o s Na t ivo s
❍ In vo ca r a la Má q u in a Virt u a l Ja va
❍ Pro g ra m a ció n JNI e n C+ +

Acceso a Bases de Datos: JDBC


● Acce s o a Ba s e s d e Da t o s
● JDBC Bá s ico
❍ Em p e za r

❍ S e le ccio n a r u n a b a s e d e d a t o s
❍ Es t a b le ce r u n a Co n e xió n
❍ S e le ccio n a r u n a Ta b la
❍ Re cu p e ra r Va lo re s d e s d e u n a Ho ja d e Re s u lt a d o s
❍ Act u a liza r Ta b la s
❍ Ut iliza r S e n t e n cia s Pre p a ra d a s
❍ Ut iliza r Un io n e s
❍ Ut iliza r Tra n s a cio n e s
❍ Pro ce d im ie n t o s Alm a ce n a d o s
❍ Ut iliza r S e n t e n cia s S QL
❍ Cre a r Ap lica cio n e s JDBC Co m p le t a s
❍ Eje cu t a r la Ap lica ció n d e Eje m p lo
❍ Cre a r u n Ap p le t d e s d e u n a Ap lica ció n
● El API d e l JDBC 2 . 0
❍ In icia liza ció n p a ra u t iliza r JDBC 2 . 0
❍ Mo ve r e l Cu rs o r s o b re u n a h o ja d e Re s u lt a d o s
❍ Ha ce r Act u a liza cio n e s e n u n a h o ja d e Re s u lt a d o s
❍ Act u a liza r u n a Ho ja d e Re s u lt a d o s Pro g ra m á t ica m e n t e
❍ In s e rt a r y b o rra r fila s Pro g ra m á t ica m e n t e
❍ In s e rt a r u n a fila
❍ Bo rra r u n a fila
❍ Ha ce r Act u a liza cio n e s p o r Lo t e s
❍ Us a r t ip o s d e d a t o s S QL3
❍ Ca ra ce rís t ica s d e Ext e n s ió n Es t á n d a rd
Invocación Remota de Métodos: RMI
● RMI
❍ In t ro d u cció n a l RMI
❍ Es crib ir u n S e rvid o r d e RMI
■ Dis e ñ a r u n In t e rfa ce Re m o t o
■ Im p le m e n t a r u n In t e rfa ce Re m o t o
❍ Cre a r u n Pro g ra m a Clie n t e
❍ Co m p ila r y Eje cu t a r e l Eje m p lo
■ Co m p ila r e l Pro g ra m a d e Eje m p lo
■ Eje cu t a r e l Pro g ra m a d e Eje m p lo

Cambios en el JDK 1.1.x


● Ca m b io s e n e l JDK 1 . 1 . x
● ¿ Qu é h a y d e n u e vo ?
❍ In t e rn a cio n a liza ció n
❍ S e g u rid a d y lo s Ap p le t s firm a d o s
❍ Am p lia ció n d e l AWT
❍ Ja va Be a n s
❍ Fich e ro s JAR
❍ Am p lia ció n d e la Re d
❍ Am p lia ció n d e la I/ O
❍ El p a q u e t e Ma t h
❍ RMI
❍ S e ria liza r Ob je t o s
❍ Re fle xió n
❍ Ba s e s d e Da t o s
❍ Cla s e s In t e rn a s
❍ In t e rfa ce Na t ivo
❍ Au m e n t o d e Re n d im ie n t o
❍ Mis ce lá n e a
❍ No t a s s o b re JDK 1 . 1
● Ca m b io s e n e l GUI
❍ Nu e vo m o d e lo d e Eve n t o s
■ In t ro d u cció n
■ Ad a p t a d o re s y cla s e s In t e rn a s
■ Eve n t o s Es t a n d a rd
■ Eve n t o s g e n e ra d o s p o r co m p o n e n t e s d e l AWT
■ Es crib ir u n o ye n t e d e Act io n
■ Es crib ir u n o ye n t e d e Ad ju s t m e n t
■ Es crib ir u n o ye n t e d e Co m p o n e n t
■ Es crib ir u n o ye n t e d e Co n t a in e r
■ Es crib ir u n o ye n t e d e Fo cu s
■ Es crib ir u n o ye n t e d e It e m
■ Es crib ir u n o ye n t e d e Ke y
■ Es crib ir u n o ye n t e d e Ra t ó n
■ Es crib ir u n o ye n t e d e m o vim ie n t o d e Ra t ó n
■ Es crib ir u n o ye n t e d e Te xt o
■ Es crib ir u n o ye n t e d e Ve n t a n a s
● Ut iliza r la ve rs ió n "S win g " d e l JFC
❍ In t ro d u ció n a l S win g
❍ Em p e za r co n S win g
■ Eje cu t a r u n Ap p le t d e S win g
■ De t a lle s d e Co m p o n e n t e s
■ Re g la s Ge n e ra le s
■ La cla s e Bu t t o n
■ La cla s e Ch e ckb o x
■ La cla s e La b e l
■ La cla s e Ra d io Bu t t o n
■ La cla s e Ta b b e d Pa n e
■ La cla s e Ta b le
■ La cla s e To o lTip
■ La cla s e Tre e

Oz it o
Tu Primera 'Taza' de Java
La s d o s p á g in a s s ig u ie n t e s p ro p o rcio n a n in s t ru ccio n e s d e t a lla d a s p a ra co m p ila r y
e je cu t a r t u p rim e r p ro g ra m a Ja va . Elig e la s e cció n a la q u e p e rt e n e zca t u s is t e m a
o p e ra t ivo

Tu primera 'Taza' en Win32

Es t a s in s t ru ccio n e s s o n p a ra u s u a rio s d e p la t a fo rm a s Win 3 2 , q u e in clu ye


a Win d o ws 9 5 , Win d o ws 9 8 y Win d o ws NT.

Tu primera 'Taza' en UNIX

Es t a s in s t ru ccio n e s s o n p a ra u s u a rio s d e p la t a fo rm a s b a s a d a s e n UNIX,


in clu ye n d o Lin u x y S o la ris .

Tu primera 'Taza' en MAC

Es t a s in s t ru ccio n e s s o n p a ra u s u a rio s d e p la t a fo rm a s b a s a d a s e n MAC.

Oz it o
Tu Primera Taza de Java en Win32
I n s t ru c c io n e s D e t a lla d a s
p a ra Tu P rim e r P ro g ra m a
La s s ig u ie n t e s in s t ru ccio n e s t e a yu d a rá n a e s crib ir t u p rim e r
p ro g ra m a Ja va . Es t a s in s t ru ccio n e s s o n p a ra u s u a rio s d e
p la t a fo rm a s Win 3 2 , q u e in clu ye Win d o ws 9 5 , Win d o ws 9 8 y
Win d o ws NT.
1 . Ch e cklis t 2 . Cre a r t u Prim e ra Ap lica ció n
a . Cre a r u n Fich e ro Fu e n t e Ja va
b . Co m p ila r e l Fich e ro Fu e n t e
c. Eje cu t a r e l Pro g ra m a

3 . Cre a r Tu Prim e r Ap p le t 4 . Dó n d e ir d e s d e Aq u í

1. Checklist
Pa ra e s crib ir t u p rim e r p ro g ra m a , n e ce s it a rá s :
1 . La Ed ic ió n Es t á n d a rd d e la P la t a fo rm a Ja v a 2 TM. Pu e d e s d e s c a rg a rla
a h o ra y co n s u lt a r la s in s t ru c c io n e s d e in s t a la c ió n .
2 . Un Ed it o r d e t e x t o . En e s t e e je m p lo , u s a re m o s e l No t e Pa d d e Win d o ws . Pa ra
e n co n t ra r No t e Pa d d e s d e le m e n ú In icio s e le ccio n a Pro g ra m a s > Acce s o rio s >
No t e Pa d . S i u s a s u n e d it o r d ife re n t e n o t e s e rá d ificil a d a p t a r e s t a s
in s t ru ccio n e s .
Es t a s d o s co s a s s o n t o d o lo q u e n e ce s it a s p a ra p ro g ra m a r e n Ja va .

2. Crear Tu Primera Aplicación


Tu p rim e r p ro g ra m a , He llo W o rld Ap p , s im p le m e n t e
m o s t ra rá e l s a lu d o "He llo wo rld !". Pa ra cre a r e s t e ¿ P o r q u é e s t á n d e m o d a lo s
p ro g ra m a , d e b e rá s : By t e c o d e s
● Cre a r u n fic h e ro fu e n t e Ja v a . Un fich e ro
fu e n t e co n t ie n e t e xt o , e s crit o e n e l le n g u a je d e Ha b rá s o id o q u e co n e l le n g u a je d e
p ro g ra m a ció n Ja va , q u e t u y o t ro s p ro g ra m a ció n Ja va , p u e d e s "e s crib ir
p ro g ra m a d o re s p u e d e n e n t e n d e r. S e p u e d e u s a r u n a ve z, e je cu t a r e n cu a lq u ie r p a rt e ".
cu a lq u ie r e d it o r d e t e xt o p a ra cre a r y e d it a r Es t o s ig n ifica q u e cu a n d o s e co m p ila
fich e ro s fu e n t e . u n p ro g ra m a , n o s e g e n e ra n
in s t ru ccio n e s p a ra u n a p la t a fo rm a
e s p e cífica . En s u lu g a r, s e g e n e ra n
● Co m p ila r e l fic h e ro fu e n t e e n u n fic h e ro d e b yt e co d e s Ja va , q u e s o n in s t ru ccio n e s
b y t e c o d e s . El co m p ila d o r d e Ja va , ja v a c , t o m a p a ra la Má q u in a Virt u a l Ja va ( Ja va
n u e s t ro fich e ro fu e n t e y lo t ra d u ce e n VM) . S i t u p la t a fo rm a - s e a Win d o ws ,
in s t ru ccio n e s q u e la Má q u in a Virt u a l Ja v a ( Ja va UNIX, Ma cOS o u n n a ve g a d o r d e
VM) p u e d e e n t e n d e r. El co m p ila r p o n e e s t a s in t e rn e t - - t ie n e la Ja va VM, p o d rá
in s t ru ccio n e s e n u n fich e ro d e b yt e co d e s . e n t e n d e r lo s b yt e co d e s .

● Eje c u t a r le p ro g ra m a c o n t e n id o e n e l
fic h e ro d e b y t e c o d e s . La m á q u in a virt u a l Ja va
e s t á im p le m e n t a d a p o r u n in t é rp re t e Ja va ,
ja v a . Es t e in t é rp re t e t o m a n u e s t ro fich e ro d e
b yt e co d e s y lle va a ca b o la s in s t ru ccio n e s
t ra d u cié n d o la s a in s t ru ccio n e s q u e n u e s t ro
o rd e n a d o r p u d e e n t e n d e r.

S u b ir

a.Crear un Fichero Fuente Java.


Tie n e s d o s o p cio n e s :
● Pu e d e s g ra b a r e l fich e ro He llo W o rld Ap p . ja v a e n t u o rd e n a d o r y
a s í e vit a rt e t o d o e l t e cle o . Lu e g o p u e d e s ir d ire ct o a l p a s o b .
● O, p u e d e s s e g u ir e s t á s ( la rg a s ) in s t ru ccio n e s :
1 . Arra n ca No t e Pa d . En u n n u e vo d o cu m e n t o , t e cle a e l s ig u ie n t e có d ig o :
/**
* The HelloWorldApp class implements an application that
* simply displays "Hello World!" to the standard output.
*/
class HelloWorldApp {
public static void main(String[] args) {
// Display "Hello World!"
System.out.println("Hello World!");
}
}

S e c u id a d o s o c u a n d o lo t e c le e s

Te cle a t o d o e l có d ig o , co m a n d o s y n o m b re s d e fich e ro s e xa ct a m e n t e
co m o lo s ve s . El co m p ila d o r y e l in t é rp re t e Ja va s o n s e n s ib le s a la s
m a y ú s c u la s .

He llo W o rld Ap p h e llo w o rld a p p

2 . Gra b a e s t e có d ig o e n u n fich e ro . De s d e la b a rrá d e m e n ú , s e le ccio n a


File > S a ve As . En le ca ja d e d iá lo fo S a ve As :
● Us a e l m e n ú d e s p le g a b le S a ve in , p a ra e s p e cifica r e l d ire ct o rio ( o
ca rp e t a ) d o n d e g ra b a rá s e l fich e ro . En e s t e e je m p lo , e l e s e l
d ire ct o rio ja v a e n la u n id a d C.
● En la ca ja d e t e xt o File n a m e , t e cle a , "He llo W o rld Ap p . ja v a ",
in clu ye n d o la s co m illa s .
● En e l m e n ú d e s p le g a b le S a ve a s t yp e , e lig e Te xt Do cu m e n t .

Cu a n d o h a ya s t e rm in a d o la ca ja d e d iá lo g o s e d e b e ría p a re ce r
a e sto:
Ah o ra p u ls a s o b re S a ve , y s a l d e No t e Pa d .
S u b ir

b. Compilar el Fichero Fuente


De s d e e l m e n ú S t a rt , s e le ccio n a la a p lica ció n MS - DOS Pro m p t ( Win d o ws
9 5 / 9 8 ) o Co m m a n d Pro m p t ( Win d o ws NT) . Cu a n d o s e la n ze , s e d e b e ría
p a re ce r a e s t o :

El p ro m p t m u e s t ra t u d ire ct o rio a ct u a l. Cu a n d o s a lim o s a u n a ve n t a n a


d e l DOS e n Win d o ws 9 5 / 9 8 , e l d ire ct o rio a ct u a l n o rm a lm e n t e e s
W I N D OW S e n n u e s t ra u n id a d C ( co m o s e ve a rrib a ) o W I N N T p a ra
Win d o ws NT. Pa ra co m p ila r e l fich e ro fu e n t e , ca m b ia m o s a l d ire ct o rio e n
e l q u e s e e n cu e n t ra e l fich e ro . Po r e je m p lo , s i n u e s t ro d ire ct o rio d e
có d ig o fu e n t e e s ja v a e n la u n id a d C, d e b e ría m o s t e cle a r e l s ig u ie n t e
co m a n d o y p u ls a r En t e r:
c d c :\ ja v a

Ah o ra e l p ro m p t d e b e ría ca m b ia r a C:\ ja v a > .

N o t a : Pa ra ca m b ia r a u n d ire ct o rio e n u n a u n id a d d ife re n t e ,


d e b e re m o s t e cle a r u n co m a n d o e xt ra .

Co m o s e ve a q u í, p a ra ca m b ia r a l
d ire ct o rio ja v a e n la u n id a d D ,
d e b e m o s re e n t ra r e n la u n id a d d :

S i t e cle a s d ir e n la lín e a d e co m a n d o s , d e b e ría s ve r t u fich e ro .


Ah o ra p u e d e s co m p ila r. En la lín e a d e co m a n d o s , t e cle a e l s ig u ie n t e
co m a n d o y p u ls a En t e r:
ja v a c He llo W o rld Ap p . ja v a

S i e l p ro m p t re a p a re ce s in m e n s a je s d e e rro r, fe licid a d e s . Tu p ro g ra m a
s e h a co m p ila d o co n é xit o .

Ex p lic a c ió n d e Erro r
Ba d c o m m a n d o r file n a m e ( W in d o w s 9 5 / 9 8 )

El n o m b re e s p e c ific a d o n o e s re c o n o c id o c o m o u n c o m a n d o in t e rn o o
e x t e rn o , o p e ra b le p ro g ra m o r b a t c h file ( W in d o w s NT)

S i re cib e s e s t e e rro r, Win d o ws n o p u e d e e n co n t ra r e l co m p ila d o r Ja va , ja v a c .

Aq u í h a y u n a fo rm a d e d e cirle a Win d o ws d ó n o d e e n co n t ra r ja v a c .
S u p o n g a m o s q u e h a s in t a la d o e l S DK d e Ja va 2 e n C:\ jd k 1 . 2 . 2 . En e l p ro m p t
d e b e ría s t e ce la r e l s ig u ie n t e co m a n d o y p u ls a r En t e r:
C:\jdk1.2.2\bin\javac HelloWorldApp.java
N o t a : S i e lig e s e s t a o p ció n , ca d a ve z q u e co m p ile s o e je cu t e s u n p ro g ra m a m
t e n d rá s q u e p re ce d e r a t u s co m a n d o s ja v a c y ja v a co n C:\ jd k 1 . 2 . 2 \ b in \ .
Pa ra e vit a r e s t o co n s u lt a la s e cció n Up d a t e t h e P A TH v a r ia b le e n la s
in s t ru ccio n e s d e in s t a la ció n .

El co m p ila d o r h a g e n e ra d o u n fich e ro d e b yt e co d e s Ja va ,
He llo W o rld Ap p . c la s s . En e l p ro m p t , t e cle a d ir p a ra ve r e l n u e vo
fich e ro q u e s e h a g e n e ra d o :
Ah o ra q u e t ie n e n u n fich e ro . c la s s , p u e d e s e je cu t a r t u p ro g ra m a .
s u b ir

c.Ejecutar el Programa
En e l m is m o d ire ct o rio t e cle a e n e l p ro m p t :
ja v a He llo W o rld Ap p
Ah o ra d e b e ría s ve r:

Fe licid a d e s !, t u p ro g ra m a fu n cio n a .
Ex p lic a c ió n d e Erro r
Ex c e p t io n in t h re a d "m a in " ja v a . la n g . N o Cla s s D e fFo u n d Erro r:
He llo W o rld Ap p

S i re cib e s e s t e e rro r, ja v a n o p u e d e e n co n t ra r t u fich e ro d e b yt e co d e s ,


He llo W o rld Ap p . c la s s .

Un o d e lo s lu g a re s d o n d e ja v a in t e n t a b u s ca r e l fich e ro d e b yt e co d e s e s e l
d ire ct o rio a ct u a l. Po r e s o , s i t u fich e ro d e b yt e co d e s e s t á e n C:\ ja v a , d e b e ría s
ca m b ia r a e s e d ire ct o rio co m o d ire ct o rio a ct u a l.

S i t o d a vía t ie n e s p ro b le m a s , p o d ría s t e n e r q u e ca m b ia r t u va ria b le s


CLAS S PATH. Pa ra ve r s i e s n e ce s a rio , in t e n t a s e le ccio n a r e l ca s s p a t h co n e l
s ig u ie n t e co m a n d o :
set CLASSPATH=
Ah o ra in t ro d u ce d e n u e vo ja v a He llo W o rld Ap p . S i e l p ro g ra m a fu n cio n a ,
t e n d rá s q u e ca m b ia r t u va ria b le CLAS S PATH. Pa ra m á s in fo rm a ció n , co n s u lt a
la s e cció n Ch e c k t h e CLA S S P A TH Va r ia b le e n la s in s t ru ccio n e s d e
in s t a la ció n .

s u b ir

3.Crear tu Primer Applet


He llo W o rld Ap p e s u n e je m p lo d e u n a a p lica ció n Ja va , u n p ro g ra m a s o lit a rio .
Ah o ra cre a rá s u n a p p le t Ja va , lla m a d o He llo W o rld , q u e t a m b ié n m u e s t ra e l
s a lid o "He llo wo rld !". S in e m b a rg o , a l co n t ra rio q u e He llo W o rld Ap p , e l a p p le t s e
e je cu t a s o b re u n n a ve g a d o r co m p a t ib le co n Ja va , co m o Ho t Ja va , Ne t s ca p e
Na vig a t o r, o Micro s o ft In t e rn e t Exp lo re r.
Pa ra cre a r e s t e a p p le t , d e b e s re a liza r lo s m is m o s p a s o s b á s ico s q u e a n t e s : cre a r
u n fich e ro fu e n t e Ja va ; co m p ila rlo y e je cu t a r e l p ro g ra m a .

a. Crear un Fichero Fuente Java.


De n u e vo , t ie n e s d o s o p cio n e s :
● Pu e d e s g ra b a r lo s fich e ro s He llo W o rld . ja v a y He llo . h t m l e n t u
o rd e n a d o r y a s í e vit a rt e t o d o e l t e cle o . Lu e g o p u e d e s ir d ire ct o a l
paso b.
● O, p u e d e s s e g u ir e s t a s in s t ru ccio n e s :
1 . Arra n ca No t e Pa d y t e cle a e l s ig u ie n t e có d ig o e n u n n u e vo d o cu m e n t o :
import java.applet.*;
import java.awt.*;

/**
* The HelloWorld class implements an applet that
* simply displays "Hello World!".
*/
public class HelloWorld extends Applet {
public void paint(Graphics g) {
// Display "Hello World!"
g.drawString("Hello world!", 50, 25);
}
}

Gra b a e s t e có d ig o e n u n fich e ro lla m a d o He llo W o rld . ja v a .


2 . Ta m b ié n n e ce s it a s u n fich e ro HTML q u e a co m p a ñ e a t u a p p le t . Te cle a
e l s ig u ie n t e có d ig o e n n u e vo d o cu m e n t o d e l No t e Pa d :
<HTML>
<HEAD>
<TITLE>A Simple Program</TITLE>
</HEAD>
<BODY>
Here is the output of my program:
<APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>

Gra b a e s t e có d ig o e n u n fich e ro lla m a d o He llo . h t m l.

b. Compilar el Código Fuente.


En e l p ro m p t , t e cle a e l s ig u ie n t e co m a n d o y p u ls a Re t u rn :
ja v a c He llo W o rld . ja v a

El co m p ila r d e b e ría g e n e ra r e l fich e ro d e b yt e co d e s Ja va ,


He llo W o rld . c la s s .
c. Ejecutar el Programa.
Au n q u e p u e d e s ve r t u a p p le t u s a n d o u n n a ve g a d o , p o d ría s e n co n t ra r
m á s s e n cillo p ro b a rlo s u s a n d o la a p lica ció n a p p le t v ie w e r q u e vie n e co n
la p la t a fo rm a Ja va TM . Pa ra ve r e l a p p le t He llo W o rld u s a n d o e l
a p p le t v ie w e r, t e cle a e s t o e n la lín e a d e co m a n d o s :
a p p le t v ie w e r He llo . h t m l

Ah o ra d e b e ría s ve r:
Fe licid a d e s ! t u a p p le t fu n cio n a .
s u b ir

4. ¿A dónde ir desde aquí?


Pa ra co n t in u a r co n la in t ro d u cció n a l le n g u a je Ja va , p u e d e s vis it a r e s t a s s e ccio n e s :
Po r d ó n d e Em p e za r
Co n ce p t o s Bá s ico s

S u b ir

Oz it o
Primera Taza de Java en UNIX
I n s t ru c c io n e s D e t a lla d a s
p a ra Tu P rim e r P ro g ra m a
La s s ig u ie n t e s in s t ru ccio n e s t e a yu d a rá n a e s crib ir t u p rim e r
p ro g ra m a Ja va . Es t a s in s t ru ccio n e s s o n p a ra u s u a rio s d e
p la t a fo rm a s b a s a d a s e n UNIX, in clu ye n d o Lin u x y S o la ris

1 . Ch e cklis t 2 . Cre a r t u Prim e ra Ap lica ció n


a . Cre a r u n Fich e ro Fu e n t e Ja va
b . Co m p ila r e l Fich e ro Fu e n t e
c. Eje cu t a r e l Pro g ra m a

3 . Cre a r Tu Prim e r Ap p le t 4 . Dó n d e ir d e s d e Aq u í

1. Checklist
Pa ra e s crib ir t u p rim e r p ro g ra m a , n e ce s it a rá s :
1 . La Ed ic ió n Es t á n d a rd d e la P la t a fo rm a Ja v a 2 TM. Pu e d e s d e s c a rg a rla a h o ra
y co n s u lt a r la s in s t ru c c io n e s d e in s t a la c ió n .
2 . Un Ed it o r d e t e x t o . En e s t e e je m p lo , u s a re m o s e l Pico , u n e d it o r d is p o n ib le e n
m u ch a s p la t a fo rm a s b a s a d a s e n UNIX. S i u s a s u n e d it o r d ife re n t e , co m o VI o
Em a cs , n o t e s e rá d ificil a d a p t a r e s t a s in s t ru ccio n e s .
Es t a s d o s co s a s s o n t o d o lo q u e n e ce s it a s p a ra p ro g ra m a r e n Ja va .

2. Crear Tu Primera Aplicación


Tu p rim e r p ro g ra m a , He llo W o rld Ap p , s im p le m e n t e
m o s t ra rá e l s a lu d o "He llo wo rld !". Pa ra cre a r e s t e ¿ P o r q u é e s t á n d e m o d a lo s
p ro g ra m a , d e b e rá s : By t e c o d e s
● Cre a r u n fic h e ro fu e n t e Ja v a . Un fich e ro
fu e n t e co n t ie n e t e xt o , e s crit o e n e l le n g u a je d e Ha b rá s o id o q u e co n e l le n g u a je d e
p ro g ra m a ció n Ja va , q u e t u y o t ro s p ro g ra m a ció n Ja va , p u e d e s "e s crib ir
p ro g ra m a d o re s p u e d e n e n t e n d e r. S e p u e d e u s a r u n a ve z, e je cu t a r e n cu a lq u ie r p a rt e ".
cu a lq u ie r e d it o r d e t e xt o p a ra cre a r y e d it a r Es t o s ig n ifica q u e cu a n d o s e co m p ila
fich e ro s fu e n t e . u n p ro g ra m a , n o s e g e n e ra n
in s t ru ccio n e s p a ra u n a p la t a fo rm a
e s p e cífica . En s u lu g a r, s e g e n e ra n
● Co m p ila r e l fic h e ro fu e n t e e n u n fic h e ro d e b yt e co d e s Ja va , q u e s o n in s t ru ccio n e s
b y t e c o d e s . El co m p ila d o r d e Ja va , ja v a c , t o m a p a ra la Má q u in a Virt u a l Ja va ( Ja va
n u e s t ro fich e ro fu e n t e y lo t ra d u ce e n VM) . S i t u p la t a fo rm a - s e a Win d o ws ,
in s t ru ccio n e s q u e la Má q u in a Virt u a l Ja v a ( Ja va UNIX, Ma cOS o u n n a ve g a d o r d e
VM) p u e d e e n t e n d e r. El co m p ila r p o n e e s t a s in t e rn e t - - t ie n e la Ja va VM, p o d rá
in s t ru ccio n e s e n u n fich e ro d e b yt e co d e s . e n t e n d e r lo s b yt e co d e s .
● Eje c u t a r le p ro g ra m a c o n t e n id o e n e l
fic h e ro d e b y t e c o d e s . La m á q u in a virt u a l Ja va
e s t á im p le m e n t a d a p o r u n in t é rp re t e Ja va ,
ja v a . Es t e in t é rp re t e t o m a n u e s t ro fich e ro d e
b yt e co d e s y lle va a ca b o la s in s t ru ccio n e s
t ra d u cié n d o la s a in s t ru ccio n e s q u e n u e s t ro
o rd e n a d o r p u d e e n t e n d e r.

S u b ir

a.Crear un Fichero Fuente Java.


Tie n e s d o s o p cio n e s :
● Pu e d e s g ra b a r e l fich e ro He llo W o rld Ap p . ja v a e n t u o rd e n a d o r y a s í
e vit a rt e t o d o e l t e cle o . Lu e g o p u e d e s ir d ire ct o a l p a s o b .
● O, p u e d e s s e g u ir e s t á s ( la rg a s ) in s t ru ccio n e s :
1 . Tra e u n a ve n t a n a s h e ll ( a lg u n a s ve ce s lla m a d a u n a ve n t a n a d e t e rm in a l) .
Cu a n d o ve a s la ve n t a n a s e p a re ce rá a e s t o
Cu a n d o s e m u e s t ra p o r p rim e ra ve z e l p ro m p t , t u d ire ct o rio a ct u a la r s e rá
n o rm a lm e n t e t u d ire ct o rio 'h o m e '. Pu e d e s ca m b ia r t u d ire ct o rio a ct u a l a t u
d ire ct o rio h o m e e n cu a lq u ie r m o m e n t o t e cle a n d o c d y p u ls a n d o Re t u rn .
Lo s fich e ro s Ja va q u e cre e s d e b e ría n e s t a r e n u n d ire ct o rio s e p a ra d o . Pu e d e s
cre a r u n d ire ct o rio u s a n d o e l co m a n d o m k d ir. Po r e je m p lo , p a ra cre a r e l
d ire ct o rio ja v a e n t u d ie ct o rio h o m e , p rim e ro d e b e s ca m b ia r t u d ire ct o rio
a ct u a l a t u d ire ct o rio h o m e e n t ra n d o e l s ig u ie n t e co m a n d o :
cd

Lu e g o in t ro d u cirá s e l s ig u ie n t e co m a n d o :
m k d ir ja v a

Pa ra ca m b ia r t u d ire ct o rio a ct u a l a e s t e n u e vo d is re ct o rio , d e b e ría s t e cle a r:


c d ja v a

Ah o ra ya p u e d e s e m p e za r a cre a r t u fich e ro fu e n t e .
2 . Arra n ca e l e d it o r Pico t e cle a n d o
p ic o e n e lp ro m p t y p u ls a n d o P ic o ? VI ? Em a c s ?
Re t u rn . S i e l s is t e m a re s p o n d e co n
e l m e n s a je p ic o : c o m m a n d n o t Pico e s p ro b a b le m e n t e e l m á s
fo u n d , e s q u e Pico n o e s t á s e n cillo d e lo s t re s e d it o re s . S i
d is p o n ib le . Co n s u lt a a t u t ie n e s cu rio s id a d s o b re e l u s o
a d m in is t ra d o r d e s is t e m a s p a ra d e lo s o t ro s e d it o re s p u e d e s
m á s in fo rm a ció n o u s a o t ro e d it o r. vis it a r la s s ig u ie n t e s p á g in a s VI
y Em a c s < .
Cu a n d o s e a rra ca Pico , s e m u e s t ra
u n n u e vo b u ffe r e n b la n co . Es t e e s
e l á re e n q u e e l t e cle a rá s t u
có d ig o

3 . Te cle a e l s ig u ie n t e có d ig o d e n t ro d e l n u e vo b u ffe r:
/**
* The HelloWorldApp class implements an application that
* simply displays "Hello World!" to the standard output.
*/
class HelloWorldApp {
public static void main(String[] args) {
// Display "Hello World!"
System.out.println("Hello World!");
}
}

S e c u id a d o s o c u a n d o lo t e c le e s

Te cle a t o d o e l có d ig o , co m a n d o s y n o m b re s d e fich e ro s e xa ct a m e n t e
co m o lo s ve s . El co m p ila d o r y e l in t é rp re t e Ja va s o n s e n s ib le s a la s
m a y ú s c u la s .

He llo W o rld Ap p h e llo w o rld a p p

4 . Gra b a e l có d ig o p u ls a n d o Ct rl- O. En la p a rt e in fe rio r ve rá s e l p ro m p t File N a m e t o


w rit e :. In t ro d u ce He llo W o rld Ap p . ja v a , p re ce d id o p o r e l d ire ct o rio e n e l q u e d e s e a s
g ra b a r e l fich e rp . Po r e je m p lo , s i lo d e s e a s g ra b a r e n e l d ire ct o rio r
/ h o m e / ro rt ig a s / ja v a , d e b e ría s t e cle a r
/ h o m e / ro rt ig a s / ja v a / He llo W o rld Ap p . ja v a y p u ls a r Re t u rn .

Pu e d e s t e cle a r Ct rl- X p a ra s a lir d e Pico . s u b ir

b. Compilar el fichero Fuente.


Tra e o t ra ve n t a n a d e l s h e ll. Pa ra co m p ila r e l fich e ro fu e n t e , ca m b ia r t u
d ire ct o rio a ct u a l a l d ire ct o rio e n e l q u e e s t a b a e l fich e ro fu e n t e . Po r e je m p lo ,
s i t u d ire ct o rio fu e n t e e s / h o m e / ro rt ig a s / ja v a , d e b e ría s t e cle a r e l
s ig u ie n t e co m a n d o e n e l p ro m p t y p u ls a r Re t u rn :
c d / h o m e / ro rt ig a s / ja v a
S i in t ro d u ce s p w d e n e l p ro m p t d e b e ría s ve rl d ire ct o rio a ct u a l, q u e e n e s t e
e je m p lo h a s id o ca m b ia d o a / h o m e / ro rt ig a s / ja v a .
S i in t ro d u ce s ls e n e l p ro m p t d e b e ría s ve r t u fich e ro .

Ah o ra p u e d e s co m p ila rlo . En e l p ro m p t , t e cle a e l s ig u ie n t e co m a n d o y p u ls a


Re t u rn :
ja v a c He llo W o rld Ap p . ja v a
S i t u p ro m p t re a p a re ce s in m e n s a je s d e e rro r, Fe licid a d e s ! t u p ro g ra m a s e
h a co m p ila d o co n é xit o .
Ex p lic a c ió n d e Erro r
ja v a c : Co m m a n d n o t fo u n d

S i re cib e s e s t e e rro r, UNIX n o p u e d e e n co n t ra r e l co m p ila d o r Ja va , ja v a c .

Aq u í h a y u n a fo rm a d e d e cirle a UNIX d ó n o d e e n co n t ra r ja v a c . S u p o n g a m o s
q u e h a s in t a la d o e l S DK d e Ja va 2 e n / u s r/ lo c a l/ jd k 1 . 2 . 2 . En e l p ro m p t
d e b e ría s t e ce la r e l s ig u ie n t e co m a n d o y p u ls a r En t e r:
/usr/local/jdk1.2.2\bin\javac HelloWorldApp.java
N o t a : S i e lig e s e s t a o p ció n , ca d a ve z q u e co m p ile s o e je cu t e s u n p ro g ra m a m
t e n d rá s q u e p re ce d e r a t u s co m a n d o s ja v a c y ja v a co n
/ u s r/ lo a c l/ jd k 1 . 2 . 2 \ b in \ . Pa ra e vit a r e s t o co n s u lt a la s e cció n Up d a t e t h e
P A TH v a r ia b le e n la s in s t ru ccio n e s d e in s t a la ció n .

El co m p ila d o r h a g e n e ra d o u n fich e ro d e b yt e co d e s d e Ja va ,
He llo W o rld Ap p . c la s s . En e l p ro m p t , t e cle a ls p a ra ve r e l n u e vo fich e ro
g e n e ra d o

Ah o ra q u e t e n e m o s u n fich e ro . c la s s , p o d e m o s e je cu t a r e l p ro g ra m a .
S u b ir
c.Ejecutar el Programa.
En e l m is m o d ire ct o rio in t ro d u cir e n e l p ro m p t :
ja v a He llo W o rld Ap p

Ah o ra d e b e ría s ve r:

Fe licid a d e s ! t u p ro g ra m a fu n cio n a !.

Ex p lic a c ió n d e Erro r
Ex c e p t io n in t h re a d "m a in " ja v a . la n g . N o Cla s s D e fFo u n d Erro r:
He llo W o rld Ap p

S i re cib e s e s t e e rro r, ja v a n o p u e d e e n co n t ra r t u fich e ro d e b yt e co d e s ,


He llo W o rld Ap p . c la s s .

Un o d e lo s lu g a re s d o n d e ja v a in t e n t a b u s ca r e l fich e ro d e b yt e co d e s e s e l
d ire ct o rio a ct u a l. Po r e s o , s i t u fich e ro d e b yt e co d e s e s t á e n
/ h o m e / ro rt ig a s / ja v a , d e b e ría s ca m b ia r a e s e d ire ct o rio co m o d ire ct o rio
a ct u a l.
cd /home/rortigas/java
S i t o d a vía t ie n e s p ro b le m a s , p o d ría s t e n e r q u e ca m b ia r t u va ria b le
CLAS S PATH. Pa ra ve r s i e s n e ce s a rio , in t e n t a s e le ccio n a r e l ca s s p a t h co n e l
s ig u ie n t e co m a n d o :
unset CLASSPATH=
Ah o ra in t ro d u ce d e n u e vo ja v a He llo W o rld Ap p . S i e l p ro g ra m a fu n cio n a ,
t e n d rá s q u e ca m b ia r t u va ria b le CLAS S PATH. Pa ra m á s in fo rm a ció n , co n s u lt a
la s e cció n Ch e c k t h e CLA S S P A TH Va r ia b le e n la s in s t ru ccio n e s d e
in s t a la ció n .

S u b ir

3.Crear tu primer Applet


He llo W o rld Ap p e s u n e je m p lo d e u n a a p lica ció n Ja va , u n p ro g ra m a s o lit a rio . Ah o ra
cre a rá s t u p rim e r Ap p le t Aja va lla m a d o He llo W o rld , q u e t a m b ié n m u e s t ra e l s a lu d o
"He llo wo rld !". S in e m b a rg o , a l co n t ra rio q u e He llo W o rld Ap p , e l a p p le t s e e je cu t a
s o b re u n n a ve g a d o r co m p a t ib le co n Ja va , co m o Ho t Ja va , Ne t s ca p e Na vig a t o r, o
Micro s o ft In t e rn e t Exp lo re r.
Pa ra cre a r e s t e a p p le t , d e b e s re a liza r lo s m is m o s p a s o s b á s ico s q u e a n t e s : cre a r u n
fich e ro fu e n t e Ja va ; co m p ila rlo y e je cu t a r e l p ro g ra m a .

a. Crear un Fichero Fuente Java.


De n u e vo , t ie n e s d o s o p cio n e s :
● Pu e d e s g ra b a r lo s fich e ro s He llo W o rld . ja v a y He llo . h t m l e n t u
o rd e n a d o r y a s í e vit a rt e t o d o e l t e cle o . Lu e g o p u e d e s ir d ire ct o a l p a s o
b.
● O, p u e d e s s e g u ir e s t a s in s t ru ccio n e s :
1 . Arra n ca r Pico , y t e cle a r e l s ig u ie n t e có d ig o d e n t ro d e l b u ffe r:
import java.applet.*;
import java.awt.*;

/**
* The HelloWorld class implements an applet that
* simply displays "Hello World!".
*/
public class HelloWorld extends Applet {
public void paint(Graphics g) {
// Display "Hello World!"
g.drawString("Hello world!", 50, 25);
}
}

Gra b a e s t e có d ig o e n u n fich e ro lla m a d o He llo W o rld . ja v a . Te cle a Ct rl- X


p a ra s a lir d e Pico .
2 . Ta m b ié n n e ce s it a s u n fich e ro HTML q u e a co m p a ñ e a l a p p le t . Arra n ca Pico
d e n u e vo y t e ce la e l s ig u ie n t e có d ig o e n u n n u e vo b u ffe r:
<HTML>
<HEAD>
<TITLE>A Simple Program</TITLE>
</HEAD>
<BODY>
Here is the output of my program:
<APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>

Gra b a e s t e có d ig o e n u n fich e ro lla m a d o He llo W o rld . h t m l. Te cle a Ct rl- X


p a ra s a lir d e Pico .

b. Compilar el Ficheor Fuente.


En e l p ro m p t , t e cle a e l s ig u ie n t e co m a n d o y p u ls a Re t u rn :
ja v a c He llo W o rld . ja v a
El co m p ila r d e b e ría g e n e ra r u n fich e ro d e b yt e co d e s Ja va ,
He llo W o rld . c la s s .

c. Ejecutar el Programa.
Au n q u e p u e d e s ve r t u a p p le t u s a n d o u n n a ve g a d o , p o d ría s
e n co n t ra r m á s s e n cillo p ro b a rlo s u s a n d o la a p lica ció n
a p p le t v ie w e r q u e vie n e co n la p la t a fo rm a Ja va TM . Pa ra ve r e l
a p p le t He llo W o rld u s a n d o e l a p p le t v ie w e r, t e cle a e s t o e n la
lín e a d e co m a n d o s :
a p p le t v ie w e r He llo . h t m l
Ah o ra d e b e ría s ve r:
Fe licid a d e s ! t u a p p le t Fu n cio n a !

s u b ir

4. ¿A dónde ir desde aquí?


Pa ra co n t in u a r co n la in t ro d u cció n a l le n g u a je Ja va , p u e d e s vis it a r e s t a s s e ccio n e s :
Po r d ó n d e Em p e za r
Co n ce p t o s Bá s ico s

S u b ir

Oz it o
Tu Primera Taza de Java en MacOS
I n s t ru c c io n e s D e t a lla d a s
p a ra Tu P rim e r P ro g ra m a
La s s ig u ie n t e s in s t ru ccio n e s t e a yu d a rá n a e s crib ir t u p rim e r
p ro g ra m a Ja va . Es t a s in s t ru ccio n e s s o n p a ra u s u a rio s d e la
p la t a fo rm a Ma cOS .

1 . Ch e cklis t 2 . Cre a r t u Prim e ra Ap lica ció n


a . Cre a r u n Fich e ro Fu e n t e Ja va
b . Co m p ila r e l Fich e ro Fu e n t e
c. Eje cu t a r e l Pro g ra m a

3 . Cre a r Tu Prim e r Ap p le t 4 . Dó n d e ir d e s d e Aq u í

1. Checklist
1 . Un En t o rn o d e D e s a rro llo p a ra la P la t a fo rm a Ja v a . Pu e d e s d e s ca rg a r e l MRJ S DK
( Ma cin t o s h Ru n t im e En viro n m e n t fo r Ja va S o ft wa re De ve lo p m e n t Kit ) d e s d e la
we b s it e d e Ap p le .
2 . Un e n t o rn o d e e je c u c ió n p a ra la m is m a v e rs ió n d e la p la t a fo rm a Ja v a . Pu e d e s
d e s ca rg a r e l MRJ ( Ma cin t o s h Ru n t im e En viro m e n t fo r Ja va ) d e s d e la we b s it e d e
Ap p le .
3 . Un Ed it o r d e t e x t o . En e s t e e je m p lo , u s a re m o s S im p le Te xt , e l s e n cillo e d it o r
in clu id o co n la s p la t a fo rm a s Ma c OS . S i u s a s u n e d it o r d ife re n t e n o t e s e rá d ificil
a d a p t a r e s t a s in s t ru ccio n e s .
Es t a s t re s co s a s s o n t o d o lo q u e n e ce s it a s p a ra p ro g ra m a r e n Ja va .

2. Crear Tu Primera Aplicación


Tu p rim e r p ro g ra m a , He llo W o rld Ap p , s im p le m e n t e
m o s t ra rá e l s a lu d o "He llo wo rld !". Pa ra cre a r e s t e ¿ P o r q u é e s t á n d e m o d a lo s
p ro g ra m a , d e b e rá s : By t e c o d e s
● Cre a r u n fic h e ro fu e n t e Ja v a . Un fich e ro
fu e n t e co n t ie n e t e xt o , e s crit o e n e l le n g u a je d e Ha b rá s o id o q u e co n e l le n g u a je d e
p ro g ra m a ció n Ja va , q u e t u y o t ro s p ro g ra m a ció n Ja va , p u e d e s "e s crib ir
p ro g ra m a d o re s p u e d e n e n t e n d e r. S e p u e d e u s a r u n a ve z, e je cu t a r e n cu a lq u ie r p a rt e ".
cu a lq u ie r e d it o r d e t e xt o p a ra cre a r y e d it a r Es t o s ig n ifica q u e cu a n d o s e co m p ila
fich e ro s fu e n t e . u n p ro g ra m a , n o s e g e n e ra n
in s t ru ccio n e s p a ra u n a p la t a fo rm a
e s p e cífica . En s u lu g a r, s e g e n e ra n
● Co m p ila r e l fic h e ro fu e n t e e n u n fic h e ro d e b yt e co d e s Ja va , q u e s o n in s t ru ccio n e s
b y t e c o d e s . El co m p ila d o r d e Ja va , ja v a c , t o m a p a ra la Má q u in a Virt u a l Ja va ( Ja va
n u e s t ro fich e ro fu e n t e y lo t ra d u ce e n VM) . S i t u p la t a fo rm a - s e a Win d o ws ,
in s t ru ccio n e s q u e la Má q u in a Virt u a l Ja v a ( Ja va UNIX, Ma cOS o u n n a ve g a d o r d e
VM) p u e d e e n t e n d e r. El co m p ila r p o n e e s t a s in t e rn e t - - t ie n e la Ja va VM, p o d rá
in s t ru ccio n e s e n u n fich e ro d e b yt e co d e s . e n t e n d e r lo s b yt e co d e s .

● Eje c u t a r le p ro g ra m a c o n t e n id o e n e l
fic h e ro d e b y t e c o d e s . La m á q u in a virt u a l Ja va
e s t á im p le m e n t a d a p o r u n in t é rp re t e Ja va ,
ja v a . Es t e in t é rp re t e t o m a n u e s t ro fich e ro d e
b yt e co d e s y lle va a ca b o la s in s t ru ccio n e s
t ra d u cié n d o la s a in s t ru ccio n e s q u e n u e s t ro
o rd e n a d o r p u d e e n t e n d e r.

S u b ir

a.Crear un Fichero Fuente Java.


Tie n e s d o s o p cio n e s :
● Pu e d e s g ra b a r e l fich e ro He llo W o rld Ap p . ja v a e n t u o rd e n a d o r y a s í
e vit a rt e t o d o e l t e cle o . Lu e g o p u e d e s ir d ire ct o a l p a s o b .
● O, p u e d e s s e g u ir e s t á s ( la rg a s ) in s t ru ccio n e s :
1 . Arra n ca S im p le Te xt . En u n n u e vo d o cu m e n t o , t e cle a e l s ig u ie n t e có d ig o :
/**
* The HelloWorldApp class implements an application that
* simply displays "Hello World!" to the standard output.
*/
class HelloWorldApp {
public static void main(String[] args) {
// Display "Hello World!"
System.out.println("Hello World!");
}
}
S e c u id a d o s o c u a n d o lo t e c le e s

Te cle a t o d o e l có d ig o , co m a n d o s y n o m b re s d e fich e ro s e xa ct a m e n t e
co m o lo s ve s . El co m p ila d o r y e l in t é rp re t e Ja va s o n s e n s ib le s a la s
m a y ú s c u la s .

He llo W o rld Ap p h e llo w o rld a p p

2 . Gra b a e s t e có d ig o e n u n fich e ro . De s d e la b a rrá d e m e n ú , s e le ccio n a File >


S a ve As . En la ca ja d e d iá lo g o S a ve As :
● Es p e cifica r la ca rp e t a d o n d e g ra b a rá s e l fich e ro . En e s t e e je m p lo , e l e s la
ca rp e t a MRJ S D K 2 . 1 .
● En la ca ja d e t e xt o S a ve Th is Do cu m e n t a s : , t e cle a ,
"He llo W o rld Ap p . ja v a "
Cu a n d o h a ya s t e rm in a d o la ca ja d e d iá lo g o s e d e b e ría p a re ce r a e s t o :

Ah o ra p u ls a s o b re S a ve , y s a l d e S im p le Te xt .
S u b ir

b. Compilar el Fichero Fuente


Ve a la ca rp e t a MRJ S DK 2 . 1 y a llí d e b e ría s ve r a lg o co m o e s t o :
Ha b rá u n a ca rp e t a lla m a d a To o ls . En e s t a ca rp e t a h a y u n a ca rp e t a lla m a d a
MRJTo o ls .
Ab re la . Ve rá s u n p ro g ra m a lla m a d o ja va c.

Ah o ra a rra s t ra n u e s t ro He llo Wo rld Ap p . ja va s o b re e s t a a p lica ció n Ja va c. S e


a b rira ja va c y d e b e ría s ve r:

En la ca ja S o u rce File s n o s o fre ce e l p a t h a b s o lu t o q u e a ca b a m o s d e cre a r. Po r


a h o ra n o t e n e m o s q u e h a ce r n a d a m á s e xce xt o p u ls r e l b o t ó n Do Ja va c.
S i n o a p a re ce n m e n s a je s d e e rro r, fe licid a d e s . Tu p ro g ra m a s e h a co m p ila d o co n
é xit o .
Ex p lic a c ió n d e Erro r
S i a rra s t ra s n u e s t ro fic h e ro . ja v a s o b re e l p ro g ra m a ja v a c y e l fic h e ro
s e m u d a s o b re la a p I ic a c ió n ja v a c

Cu a n d o s e in t e n t a e s t o y lo ú n ico q u e s u ce d e e s q u e n u e s t ro fich e ro . ja va s e
co p ia o s e m u e ve e n cim a d e n u e s t ra a p lica ció n ja va c, t e n e m o s re co n s t ru ir
n u e s t ro e s crit o rio .
Pa ra h a ce r e s t o t e n e m o s q u e vo lve r a a rra n ca r e l o rd e n a d o r y p u ls a r y
m a n t e n e r la s t e cla s "Ap p le " - y "Alt " h a s t a q u e o b t e n g a m o s u n a ve n t a n a
p re g u n t á n d o n o s s i q u e re m o s re co n s t ru ir n u e s t ro e s crit o rio .

Re s p o n d e m o s q u e s í. Cu a n d o e l o rd e n a d o r h a ya fin a liza d o d e b e m o s p o d e r
a rra s t ra r n u e s t ro fich e ro . ja va s o b re la a p lica ció n ja va c.

El co m p ila d o r h a g e n e ra d o u n fich e ro d e b yt e co d e s Ja va ,
He llo W o rld Ap p . c la s s . Mira e n la m is m a ca rp e t a e n la q u e g ra b a s t e e l fich e ro
. ja va y ve rá s e l fich e ro . cla s s :

Ah o ra q u e t e n e m o s u n fich e ro . c la s s , p u e d e s e je cu t a r t u p ro g ra m a .
s u b ir

c.Ejecutar el Programa
En la ca rp e t a MRJ S DK 2 . 1 h a y o t ra ca rp e t a lla m a d a JBin d e ry. Ab re la y d e b e ría
h a ce r u n a a p lica ció n lla m a d a JBin d e ry

Arra s t ra e l fich e ro He llo Wo rld Ap p . cla s s s o b re e l ico n o JBin d e ry.


S i o b t ie n e s e s t o :
Fe licid a d e s !, t u p ro g ra m a fu n cio n a .
s u b ir

3.Crear tu Primer Applet


He llo W o rld Ap p e s u n e je m p lo d e u n a a p lica ció n Ja va , u n p ro g ra m a s o lit a rio . Ah o ra
cre a rá s u n a p p le t Ja va , lla m a d o He llo W o rld , q u e t a m b ié n m u e s t ra e l s a lid o "He llo
wo rld !". S in e m b a rg o , a l co n t ra rio q u e He llo W o rld Ap p , e l a p p le t s e e je cu t a s o b re u n
n a ve g a d o r co m p a t ib le co n Ja va , co m o Ho t Ja va , Ne t s ca p e Na vig a t o r, o Micro s o ft In t e rn e t
Exp lo re r.
Pa ra cre a r e s t e a p p le t , d e b e s re a liza r lo s m is m o s p a s o s b á s ico s q u e a n t e s : cre a r u n
fich e ro fu e n t e Ja va ; co m p ila rlo y e je cu t a r e l p ro g ra m a .

a. Crear un Fichero Fuente Java.


De n u e vo , t ie n e s d o s o p cio n e s :
● Pu e d e s g ra b a r lo s fich e ro s He llo W o rld . ja v a y He llo . h t m l e n t u o rd e n a d o r
y a s í e vit a rt e t o d o e l t e cle o . Lu e g o p u e d e s ir d ire ct o a l p a s o b .
● O, p u e d e s s e g u ir e s t a s in s t ru ccio n e s :
1 . Arra n ca S im p le Te xt y t e cle a e l s ig u ie n t e có d ig o e n u n n u e vo d o cu m e n t o :
import java.applet.*;
import java.awt.*;

/**
* The HelloWorld class implements an applet that
* simply displays "Hello World!".
*/
public class HelloWorld extends Applet {
public void paint(Graphics g) {
// Display "Hello World!"
g.drawString("Hello world!", 50, 25);
}
}
Gra b a e s t e có d ig o e n u n fich e ro lla m a d o He llo W o rld . ja v a .
2 . Ta m b ié n n e ce s it a s u n fich e ro HTML q u e a co m p a ñ e a t u a p p le t . Te cle a e l
s ig u ie n t e có d ig o e n n u e vo d o cu m e n t o d e l S im p le Te xt :
<HTML>
<HEAD>
<TITLE>A Simple Program</TITLE>
</HEAD>
<BODY>
Here is the output of my program:
<APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>

Gra b a e s t e có d ig o e n u n fich e ro lla m a d o He llo . h t m l.

b. Compilar el Código Fuente.


Co m p ila e l fich e ro fu e n t e He llo W o rld . ja v a u s a n d o ja va c.
El co m p ila d o r d e b e ría g e n e ra r e l fich e ro d e b yt e co d e s Ja va , He llo W o rld . c la s s .

c. Ejecutar el Programa.
Au n q u e p u e d e s ve r t u a p p le t u s a n d o u n n a ve g a d o , p o d ría s e n co n t ra r m á s
s e n cillo p ro b a rlo s u s a n d o la a p lica ció n a p p le t ru n n e r q u e vie n e co n la
p la t a fo rm a Ja va TM . Pa ra ve r e l a p p le t He llo W o rld u s a n d o e l a p p le t ru n n e r,
a b re la ca rp e t a Ap p le a p p le t vie we r e n la ca rp e t e MRJ S DK 2 . 1 . De b e ría h a b e r
u n a a p lica ció n lla m a d a Ap p le Ap p le t Ru n n e r.

Arra s t ra n u e s t ro fich e ro He llo . h t m l s o b re e s t a a p lica ció n .


Ah o ra d e b e ría s ve r:
Fe licid a d e s ! Tu Ap p le t fu n cio n a .
s u b ir

4. ¿A dónde ir desde aquí?


Pa ra co n t in u a r co n la in t ro d u cció n a l le n g u a je Ja va , p u e d e s vis it a r e s t a s s e ccio n e s :
Po r d ó n d e Em p e za r
Co n ce p t o s Bá s ico s

S u b ir

Oz it o
¿Por Dónde Empezar?
Bie n , s i e s t á s in t e re s a d o e n e s t e p o t e n t e le n g u a je y n o s a b e s n a d a d e é l t e
re co m ie n d o q u e t e d e s u n a vu e lt a p o r la s it e d e s u s cre a d o re s :
h t t p :/ / ja v a . s u n . c o m

En e s t a o t ra d ire cció n p o d rá s b a ja rt e la ú lt im a ve rs ió n d e l JDK:


h t t p :/ / ja v a . s u n . c o m / p ro d u c t s / in d e x . h t m l

De n t ro d e l JD K e n co n t ra rá s va ria s a p lica cio n e s q u e t e a yu d a rá n e n e l t ra b a jo co n


Ja va , p o r e je m p lo :
● ja v a c El co m p ila d o r Ja va p o r e xce le n cia , u n co m p ila d o r d e lín e a d e
co m a n d o s , q u e t e p e rm it irá cre a r t u s p ro g ra m a s y a p p le t s e n Ja va .
● a p p le t v ie w e r Un vis u a liza d o r d e Ap p le t s p a ra n o t e n e r q u e ca rg a rlo s e n u n
n a ve g a d o r.
● ja v a El in t é rp re t e q u e t e p e rm it irá e je cu t a r t u s a p lica cio n e s cre a d a s e n Ja va .

● ja v a p Un d e s co m p ila d o r q u e t e p e rm it e ve r e l co n t e n id o d e la s cla s e s
co m p ila d a s .
Pe ro s i n o t e in t e re s a e l t ra b a jo p u ro y d u ro co n Ja va , p u e d e s b a ja rt e cu a lq u ie ra d e
lo s e n t o rn o s in t e g ra d o s d e d e s a rro llo d e Ja va , co m o e l Vis u a l J+ + d e Micro s o ft e n
h t t p : / / www. m icro s o ft . co m / vis u a lj/ o e l Wro ks h o p d e S u n e n
h t t p : / / www. s u n . co m / d e ve lo p e r- p ro d u ct s / ja va / .

Oz it o
javac - El compilador de Java
Síntaxis de utilización
javac [opciones] fichero.java ...

javac_g [ opciones] fichero.java ...

Descripción
El co m a n d o ja v a c co m p ila e l có d ig o fu e n t e Ja va y lo co n vie rt e e n
Byt e co d e s . De s p u é s s e p u e d e u t iliza r e l in t é rp re t e Ja va - ja v a - o e l
n a ve g a d o r e n ca s o d e lo s a p p le t s p a ra in t e rp re t a r e s o s Byt e co d e s Ja va .
El có d ig o fu e n t e d e Ja va d e b e e s t a r co n t e n id o e n fich e ro s co n e xt e n s ió n
'. ja v a '. Pa ra ca d a cla s e d e fin id a e n e l fich e ro fu e n t e p a s a d o a ja v a c , e l
co m p ila d o r a lm a ce n a lo s b yt e co d e s re s u lt a n t e s e n u n fich e ro lla m a d o
n o m b r e d e c la s e . c la s s . El co m p ila d o r s it ú a e s t o s fich e ro s e n e l m is m o
d ire ct o rio e n e l q u e e s t a b a e l fich e ro fu e n t e ( a m e n o s q u e s e e s p e cifiq u e
la o p ció n - d ) .
Cu a n d o d e fin a s t u s p ro p ia s cla s e s n e ce s it a rá s e s p e cifica r s u lo ca liza ció n .
Ut iliza CLAS S PATH p a ra h a ce r e s t o . CLAS S PATH co n s is t e e n u n a lis t a d e
d ire ct o rio s s e p a ra d o s p o r p u n t o s y co m a s q u e e s p e cifica n e l p a t h . S i e l
fich e ro fu e n t e p a s a d o a ja v a c h a ce re fe re n cia a o t ra cla s e q u e n o e s t á
d e fin id a e n o t ro s fich e ro s p a s a d o s a ja v a c , e l co m p ila d o r b u s ca la s
cla s e s re fe re n cia d a s u t iliza n d o CLAS S PATH. Po r e je m p lo :
.;C:/users/java/clases
Ob s e rva q u e e l s is t e m a s ie m p re a ñ a d e la lo ca liza ció n d e la s cla s e s d e l
s is t e m a a l fin a l d e l CLAS S PATH a m e n o s q u e s e u t ilice la o p ció n
- c la s s p a t h p a ra e s p e cifica r u n p a t h .
ja v a c _ g e s u n a ve rs ió n n o o p t im iza d a d e ja v a c e s p e cia lm e n t e
p re p a ra d a p a ra u t iliza r co n d e p u ra d o re s co m o jd b .

Opciones
- c la s s p a t h p a t h
Es p e cifica e l p a t h q u e ja v a c u t iliza rá p a ra b u s ca r la s cla s e s .
S o b re e s crib e e l p a t h p o r d e fe ct o g e n e ra d o p o r la va ria b le d e
e n t o rn o CLAS S PATH. Lo s d ire ct o rio s e s t á n s e p a ra d o s p o r p u n t o s y
co m a s . Po r e je m p lo :
.;C:/users/java/clases;C:\tools\java\clases
- d d ire c t o rio
Es p e cifica e l d ire ct o rio ra iz p a ra e l á rb o l d e cla s e s . Ha ce r e s t o :
javac -d <mi_dir> miprograma.java
h a ce q u e lo s fich e ro s '. cla s s ' d e l fich e ro fu e n t e 'm ip ro g ra m a . ja va '
s e a n g u a rd a d o s e n e l d ire ct o rio 'm i_ d ir'.
-g
Ha b ilit a la g e n e ra ció n d e t a b la s d e d e p u ra d o . Es t a t a b la s co n t ie n e n
in fo rm a ció n s o b re lo s n ú m e ro s d e lín e a s y la s va ria b le s lo ca le s -
in fo rm a ció n u t iliza d a p o r la s h e rra m ie n t a s d e d e p u ra d o d e Ja va . Po r
d e fe ct o , s ó lo g e n e ra n ú m e ro s d e lín e a s a m e n o s q u e s e a ct ive la
o p t im iza ció n ( - O) .
- n o w a rn
De s a ct iva lo s a vis o s . S i s e u t iliza e l co m p ila d o r n o im p rim e n in g ú n
a vis o .
-O
Op t im iza e l có d ig o co m p illa d o in t ro d u cie n d o e n lín e a lo s m é t o d o s
fin a le s y p riva d o s . Ob s e rva q u e e s t o p u e d e h a ce r q u e e l t a m a ñ o d e
t u s cla s e s cre zca d e m a s ia d o .
- v e rb o s e
Ha ce q u e e l co m p ila d o r y e l e n la za d o r im p rim a n lo s m e n s a je s s o b re
lo s fich e ro s fu e n t e s q u e e s t á n s ie n d o co m p ila d o s y q u e fich e ro s
. cla s s e s t á n s ie n d o ca rg a d o s .

Oz it o
appletviewer - El visualizador de Applets
Es t e co m a n d o t e p e rm it e e je cu t a r a p p le t s fu e ra d e l co n t e xt o d e lo s n a ve g a d o re s d e
la WWW.

Síntaxis

appletviewer [ opciones ] urls ...

Descripción
El co m a n d o a p p le t v ie w e r co n e ct a lo s d o cu m e n t o s o re cu rs o s
d e s ig n a d o s p o r u rls y m u e s t ra ca d a a p p le t re fe re n cia d o e n s u p ro p ia
ve n t a n a .
N o t a : s i lo s d o cu m e n t o s re fe re n cia d o s co n la s u rls n o co n t ie n e n n in g ú n
a p p le t co n la e t iq u e t a APPLET, a p p le t v ie w e r n o h a ce n a d a .

Opciones
-de bug
Arra n ca e l vis u a liza d o r d e n t ro d e l d e p u ra d o r d e Ja va , e l jd b ,
p e rm it ié n d o t e d e p u ra r lo s a p p le t s e n e l d o cu m e n t o

Oz it o
java - El intérprete Java
Síntasis de Utilización

java [ opciones ] nombredeclase <argumentos>


java_g [ opciones ] nombredeclase <argumentos>

Descripción
El co m a n d o ja v a e je cu t a lo s b yt e co d e s Ja va cre a d o s p o r e l co m p ila d o r
ja v a c .

El a rg u m e n t o n o m b re d e cla s e e s e l n o m b re d e la cla s e q u e s e va a
e je cu t a r. De b e e s t a r t o t a lm e n t e cu a lifica d o e in clu ir s u n o m b re d e
p a q u e t e e n e l n o m b re , p o r e je m p lo :
java java.lang.String
Ob s e rva q u e t o d o s lo s a rg u m e n t o s q u e a p a re ce n d e s p u é s d e
n o m b re d e cla s e e n la lín e a d e co m a n d o s s o n p a s a d o s a l m é t o d o m a in ( )
d e la cla s e .
ja v a e s p e ra q u e lo s b yt e co d e s d e la cla s e s e e n cu e n t re n e n u n fich e ro
lla m a d o n o m b re d e cla s e . cla s s q u e h a s id o g e n e ra d o a l co m p ila r e l fich e ro
fu e n t e co rre s p o n d ie n t e co n ja v a c . To d o s lo s fich e ro s d e b yt e co d e s ja va
t ie n e n la e xt e n s ió n . cla s s q u e a ñ a d a a u t o m á t ica m e n t e e l co m p ila d o r
cu a n d o la cla s e e s co m p ila d a . La cla s e d e b e co n t e n e r u n m é t o d o m a in ( )
d e fin id o d e la s ig u ie n t e fo rm a :
class Unaclase {
public static void main( String argv []) {
...
}
}
ja v a e je cu t a e l m é t o d o m a in y lu e g o s a le a m e n o s q u e é s t e cre e u n o o
m á s t h re a d s . S i e l m é t o d o m a in ( ) cre a a lg ú n t h re a d , ja v a n o s a le h a s t a
q u e h a ya t e rm in a d o e l ú lt im o t h re a d .
No rm a lm e n t e , co m p ila r t u s fich e ro s fu e n t e co n ja v a c y lu e g o e je cu t a s
lo s p ro g ra m a s co n ja v a . S in e m b a rg o , s e p u e d e u t iliza r ja v a p a ra
co m p ila r y e je cu t a r lo s p ro g ra m a s cu a n d o s e u t iliza la o p ció n - c s .
Cu a n d o s e ca rg a u n a cla s e s e co m p a ra s u fe ch a d e ú lt im a m o d ifica ció n
co n la fe ch a d e l fich e ro fu e n t e . S i e l fu e n t e h a s id o m o d ifica d o , s e
re co m p ila y s e ca rg a e l n u e vo fich e ro d e b yt e co d e s . ja v a re p it e e s t e
p ro ce d im ie n t o h a s t a q u e t o d a s la s cla s e s s e h a n co m p ila d o y ca rg a d o
co rre ct a m e n t e .
El in t é rp re t e p u e d e d e t e rm in a r s u u n a e s le g ít im a a t ra vé s d e u n
m e ca n is m o d e ve rififa ció n . Es t a ve rifica ció n a s e g u ra q u e lo s b yt e co d e s
q u e e s t á n s ie n d o in t e rp re t a d o s n o vio la n la s re s t riccio n e s d e l le n g u a je .
ja v a _ g e s u n a ve rs ió n n o o p t im iza d a d e ja v a p e n s a d a p a ra s e r u t iliza d a
co n d e p u ra d o re s co m o e l jd b .

Opciones
-de bug
Pe rm it e q u e e l d e p u ra d o r d e Ja va jd b s e a ñ a d a a e s t a s e s ó n ja v a .
Cu a n d o s e e s p e cifica e s t a o p ció n e n la lín e a d e co m a n d o s , ja v a
m u e s t ra u n a p a s s wo rd q u e s e d e b e u t iliza r cu a n d o e m p ie ce la
s e s ió n d e d e p u ra d o .
- c s , - c h e c k s o u rc e
Cu a n d o s e ca rg a u n a cla s e co m p ila d a , e s t a o p ció n h a ce q u e la fe ch a
d e m o d ifica ció n d e lo s b yt e co d e s s e a co m p a ra d a co n la d e l fich e ro
fu e n t e . S i e l fich e ro fu e n t e h a s id o m o d ifica d o re cie n t e m e n t e , e s
re co m p ila d o y s e ca rg a n lo s n u e vo s b yt e co d e s .
- c la s s p a t h p a t h
Es p e cifica e l p a t h q u e u t iliza rá ja v a p a ra b u s ca r la s cla s e s .
S o b re e s crib e e l va lo r p o r d e fe ct o d e la va ria b le d e e t o rn o
CLAS S PATH. Lo s d ire ct o rio s e s t á s s e p a ra d o s p o r co m a s .
-m x x
S e le ccio n a e l m á xim o t a m a ñ o d e m e m o ria re s e rva d a p a ra la p ila
d e l re co le ct o r d e b a s u ra a x . El va lo r p o r d e fe ct o e s 1 6 m e g a b yt e s
d e m e m o ria . x d e b e s e r m a yo r d e 1 0 0 0 b yt e s
Po r d e fe ct o , x s e m id e e n b yt e s . Pe ro p u e d e s e s p e cifa rlo e n kb o Mb
a ñ a d ié n d o le la le t ra 'k' p a ra kilo b yt e s o 'm ' p a ra m e g a b yt e s .
-m s x
S e le ccio n a e l t a m a ñ o in icia l d e la m e m o ria re s e rva d a p a ra la p ila
d e l re co le ct o r d e b a s u ra a x . El va lo r p o r d e fe ct o e s 1 6 m e g a b yt e s
d e m e m o ria . x d e b e s e r m a yo r d e 1 0 0 0 b yt e s
Po r d e fe ct o , x s e m id e e n b yt e s . Pe ro p u e d e s e s p e cifa rlo e n kb o Mb
a ñ a d ié n d o le la le t ra 'k' p a ra kilo b yt e s o 'm ' p a ra m e g a b yt e s .
-noas yncg c
De s a ct iva la re co le cció n d e b a s u ra a s ín cro n a . Cu a n d o s e a ct iva la
re co le cció n d e b a s u ra n o t ie n e lu g a r a m e n o s q u e la lla m e
e xp lícit a m e n t e o e l p ro g ra m a s a le d e la m e m o ria . No rm a lm e n t e , la
re co le cció n d e b a s u ra s e e je cu t a e n u n t h re a d a s ín cro n o e n p a ra le lo
co n o t ro s t h re a d s .
-s s x
Ca d a t h re a d Ja va t ie n e d o s p ila s : u n a p a ra e l có d ig o Ja va y o t ra
p a ra e l có d ig o C. La o p ció n - s s s e le ccio n a e l t a m a ñ o m á xim o d e la
p ila q u e p u e d e s e r u t iliza d a p o r e l có d ig o C e n u n t h re a d a x . Ca d a
u n o d e lo s t h e a d s e je cu t a d o s d e n t ro d e l p ro g ra m a q u e s e p a s o a
j a v a t ie n e x co m o s u t a m a ñ o d e p ila C. El va lo r p o r d e fe ct o e s 1 2 8
kilo b yt e s d e m e m o ria . x d e b e s e r m a yo r d e 1 0 0 0 b yt e s
Po r d e fe ct o , x s e m id e e n b yt e s . Pe ro p u e d e s e s p e cifa rlo e n kb o Mb
a ñ a d ié n d o le la le t ra 'k' p a ra kilo b yt e s o 'm ' p a ra m e g a b yt e s .
-os s x
Ca d a t h re a d Ja va t ie n e d o s p ila s : u n a p a ra e l có d ig o Ja va y o t ra
p a ra e l có d ig o C. La o p ció n - o s s s e le ccio n a e l t a m a ñ o m á xim o d e la
p ila q u e p u e d e s e r u t iliza d a p o r e l có d ig o Ja va e n u n t h re a d a x .
Ca d a u n o d e lo s t h e a d s e je cu t a d o s d e n t ro d e l p ro g ra m a q u e s e
p a s o a j a v a t ie n e x co m o s u t a m a ñ o d e p ila Ja va . El va lo r p o r
d e fe ct o e s 4 0 0 kilo b yt e s d e m e m o ria . x d e b e s e r m a yo r d e 1 0 0 0
b yt e s
Po r d e fe ct o , x s e m id e e n b yt e s . Pe ro p u e d e s e s p e cifa rlo e n kb o Mb
a ñ a d ié n d o le la le t ra 'k' p a ra kilo b yt e s o 'm ' p a ra m e g a b yt e s .
-t
Im p rim e u n ra s t ro d e la s in s t ru ccio n e s e je cu t a d a s ( s ó lo e n
ja v a _ g ) .
- v , - v e rb o s e
Ha ce q u e ja v a e n e l ca n a l s t d o u t ca d a ve z q u e s e ca ra u n fich e ro
cla s s .
v e rify
Eje cu t a e l ve rifica d o r e n t o d o e l có d ig o .
- v e rify re m o t e
Eje cu t a e l ve rifica d o r p a ra t o d o e l có d ig o q u e e s ca rg a d e n t ro d e l
s is t e m a a t ra vé s d e cla s s lo a d e r. v e rify re m o t e e s e l va lo r p o r d e fe ct o
p a ra e l in t é rp re t e .
- n o v e rify
De s a ct iva a l ve rifica ció n .
- v e rb o s e g c
Ha ce q u e e l re co le ct o r d e b a s u ra im p im a m e n s a je s ca d a ve z q u e
lib e re m e m o ria .
- D n o m b re P ro p ie d a d = n u e v o Va lo r
Re d e fin e u n va lo r d e u n a p ro p ie d a d . n o m b re Pro p ie d a d e s e l n o m b re
d e la p ro p ie d a d cu yo va lo r s e q u ie re ca m b ia r y n u e v o Va lo r e s e l
va lo r a ca m b ia r. Po r e je m p lo , e s t a lín e a d e co m a n d o :
java -Dawt.button.color=green ...
s e le ccio n a e l co lo r d e la p ro p ie d a d a w t . b u t t o n . co lo r a v e rd e . ja v a
a ce p t a cu a lq u ie r n ú m e ro d e o p cio n e s - D e n la lín e a d e co m a n d o s .

Oz it o
javap - El descompilador de Ficheros de Clases
Java
De s e n s a m b la lo s fich e ro s cla s s .

Síntaxis de Utilización
javap [ opciones ] clase ...

Descripción
El co m a n d o ja v a p d e s e n s a m b la u n fich e ro cla s s . S u s a lid a d e p e n d e d e
la s o p cio n e s u t iliza d a s . S i n o s e u t iliza n o p cio n e s , ja v a p im p rim e lo s
ca m p o s y lo s m é t o d o s p ú b lico s d e la cla s e p a s a d a . ja v a p m u e s t ra la
s a lid a e n s t d o u t . Po r e je m p lo , la s ig u ie n t e d e cla ra ció n d e cla s e :
class C {
static int a= 1;
static int b= 2;
static {
System.out.println(a);
}
static {
a++;
b = 7;
System.out.println(a);
System.out.println(b);
}
static {
system.out println(b);
}
public static void main(String args[]) {
C c = new C();
}
}
Cu a n d o e l re s u lt a d o d e la cla s e C, s e a p a s a d o a ja v a p s in u t iliza r
o p cio n e s , re s u lt a rá la s ig u ie n t e s a lid a :
Compiled from C:\users\clases\C.java
private class C extends java\lang\Object {
static int a;
static int b;
public static void main(java\lang\String[]);
public C();
static void();
}

Opciones
-l
Im p rim e u n a t a b la d e lín e a y va ria b le s lo ca le s .
-p
Im p rim e t a m b ié n lo s m ie m b ro s y m é t o d o p riva d o s y p ro t e g id o s d e
la cla s e , a d e m á s d e lo s m ie m b ro s p ú b lico s .
-c
Im p rim e e l có d ig o d e s e n s a m b la d o , e s d e cir, la s in t ru ccio n e s q u e
co m p re n d e n lo s b yt e co d e s Ja va , p a ra ca d a u n o d e lo s m é t o d o s d e
la cla s e . Po r e je m p lo , s i s e p a s a la cla s e C a ja v a p u t iliza n d o - c e l
re s u lt a d o s e ría la s ig u ie n t e s a lid a :
Compiled from C:\users\clases\C.java
private class C extends java\lang\Object {
static int a;
static int b;
public static void main(java\lang\String[]);
public C();
static void();

Method void main(java\lang\String [])


0 new #4
3 invokenonvirtual # 9 () V>
6 return

Method C()
0 aload_0 0
1 invokenonvirtual #10 ()V>
4 return

Method void()
0 iconst_1
1 putstatic #7
4 getstatic #6
7 getstatic #7
10 invokevirtual #8
13 getstatic #7
16 iconst_1
17 iadd
18 putstatic #7
21 bipush 7
23 putstatic #5
26 getstatic #6
29 getstatic #7
32 invokevirtual #8
35 getstatic #6
38 getstatic #5
41 invokevirtual #8
44 iconst_2
45 putstatic #5
48 getstatic #6
51 getstatic #5
54 invokevirtual #8
57 return
}
- c la s s p a t h p a t h
Es p e cifica e l p a t h q u e ja v a p u t iliza rá p a ra b u s ca r la s cla s e s .
S o b re e s crib e e l va lo r d e la va ria b le d e e n t o rn o CLAS S PATH. Lo s
d ire ct o rio s d e b e n e s t á s s e p a ra d o s p o r p u n t o s y co m a s .

Oz it o
Conceptos Básicos de Programación Orientada a
Objetos
¿Qué son los objetos?
En in fo rm á t ica , u n OBJETO e s u n co n ju n t o d e va ria b le s y d e lo s m é t o d o s
re la cio n a d o s co n e s a s va ria b le s .
Un p o co m á s s e n cillo : u n o b je t o co n t ie n e e n s í m is m o la in fo rm a ció n y lo s m é t o d o s
o fu n cio n e s n e ce s a rio s p a ra m a n ip u la r e s a in fo rm a ció n .
Lo m á s im p o rt a n t e d e lo s o b je t o s e s q u e p e rm it e n t e n e r u n co n t ro l t o t a l s o b re
'q u ié n ' o 'q u é ' p u e d e a cce d e r a s u s m ie m b ro s , e s d e cir, lo s o b je t o s p u e d e n t e n e r
m ie m b ro s p ú b lico s a lo s q u e p o d rá n a cce d e r o t ro s o b je t o s o m ie m b ro s p riva d o s a
lo s q u e s ó lo p u e d e a cce d e r é l. Es t o s m ie m b ro s p u e d e n s e r t a n t o va ria b le s co m o
fu n cio n e s .
El g ra n b e n e ficio d e t o d o e s t o e s la e n ca p s u la ció n , e l có d ig o fu e n t e d e u n o b je t o
p u e d e e s crib irs e y m a n t e n e rs e d e fo rm a in d e p e n d ie n t e a lo s o t ro s o b je t o s
co n t e n id o s e n la a p lica ció n .

¿Qué son las clases?


Un a CLAS E e s u n p ro ye ct o , o p ro t o t ip o , q u e d e fin e la s va ria b le s y lo s m é t o d o s
co m u n e s a u n cie rt o t ip o d e o b je t o s .
Un p o co m á s s e n cillo : la s cla s e s s o n la s m a t rice s d e la s q u e lu e g o s e p u e d e n cre a r
m ú lt ip le s o b je t o s d e l m is m o t ip o . La cla s e d e fin e la s va ria b le s y lo s m é t o d o s
co m u n e s a lo s o b je t o s d e e s e t ip o , p e ro lu e g o , ca d a o b je t o t e n d rá s u s p ro p io s
va lo re s y co m p a rt irá n la s m is m a s fu n cio n e s .
Prim e ro d e b e re m o s cre a r u n a cla s e a n t e s d e p o d e r cre a r o b je t o s o e je m p la re s d e
e s a cla s e .

¿Qué son los mensajes?


Pa ra p o d e r cre a r u n a a p lica ció n n e ce s it a rá s m á s d e u n o b je t o , y e s t o s o b je t o s n o
p u e d e n e s t a r a is la d o s u n o s d e o t ro s , p u e s b ie n , p a ra co m u n ica rs e e s o s o b je t o s s e
e n vía n m e n s a je s .
Lo s m e n s a je s s o n s im p le s lla m a d a s a la s fu n cio n e s o m é t o d o s d e l o b je t o co n e l s e
q u ie re co m u n ica r p a ra d e cirle q u e h a g a cu a lq u ie r co s a .
¿Qué es la herencia?
Qu é s ig n ifica e s t o la h e re n cia , q u íe n h e re d a q u é ; b u e n o t ra n q u ilo , e s t o s ó lo
s ig n ifica q u e p u e d e s cre a r u n a cla s e p a rt ie n d o d e o t ra q u e ya e xis t a .
Es d e cir, p u e d e s cre a r u n a cla s e a t ra vé s d e u n a cla s e e xis t e n t e , y e s t a cla s e
t e n d rá t o d a s la s va ria b le s y lo s m é t o d o s d e s u 's u p e rcla s e ', y a d e m á s s e le p o d rá n
a ñ a d ir o t ra s va ria b le s y m é t o d o s p ro p io s .
S e lla m a 'S u p e rcla s e ' a la cla s e d e la q u e d e s cie n d e u n a cla s e , p u e d e s ve r m á s
s o b re la d e cla ra ció n d e cla s e s e n la p á g in a De cla ra r Cla s e s .

Oz it o
Variables y Tipos de Datos
La s va ria b le s s o n la s p a rt e s im p o rt a n t e s d e u n le n g u a je d e p ro g ra m a ció n : e lla s s o n
la s e n t id a d e s ( va lo re s , d a t o s ) q u e a ct ú a n y s o b re la s q u e s e a ct ú a .
Un a d e cla ra ció n d e va ria b le s ie m p re co n t ie n e d o s co m p o n e n t e s , e l t ip o d e la
va ria b le y s u n o m b re :
t ip o Va ria b le n o m b re ;

Tipos de Variables
To d a s la s va ria b le s e n e l le n g u a je Ja va d e b e n t e n e r u n t ip o d e d a t o . El
t ip o d e la va ria b le d e t e rm in a lo s va lo re s q u e la va ria b le p u e d e co n t e n e r y
la s o p e ra cio n e s q u e s e p u e d e n re a liza r co n e lla .
Exis t e n d o s ca t e g o ria s d e d a t o s p rin cip a le s e n e l le n g u a je Ja va : lo s t ip o s
p rim it ivo s y lo s t ip o s re fe re n cia d o s .
Lo s t ip o s p rim it ivo s co n t ie n e n u n s ó lo va lo r e in clu ye n lo s t ip o s co m o lo s
e n t e ro s , co m a flo t a n t e , lo s ca ra ct e re s , e t c. . . La t a b la s ig u ie n t e m u e s t ra
t o d o s lo s t ip o s p rim it ivo s s o p o rt a d o s p o r e l le n g u a je Ja va , s u fo rm a t o , s u
t a m a ñ o y u n a b re ve d e s crip ció n d e ca d a u n o :
Tip o Ta m a ñ o / Fo rm a t o D e s c rip c ió n
(Números enteros)
b yt e 8 - b it co m p le m e n t o a 2 En t e ro d e u n Byt e
s h o rt 1 6 - b it co m p le m e n t o a 2 En t e ro co rt o
in t 3 2 - b it co m p le m e n t o a 2 En t e ro
lo n g 6 4 - b it co m p le m e n t o a 2 En t e ro la rg o
(Números reales)
flo a t 3 2 - b it IEEE 7 5 4 Co m a flo t a n t e d e p re cis ió n s im p le
d o u b le 6 4 - b it IEEE 7 5 4 Co m a flo t a n t e d e p re cis ió n d o b le
(otros tipos)
ch a r 1 6 - b it Ca ra ct e r Un s ó lo ca rá ct e r
b o o le a n t ru e o fa ls e Un va lo r b o o le a n o ( ve rd a d e ro o fa ls o )

Lo s t ip o s re fe re n cia d o s s e lla m a n a s í p o rq u e e l va lo r d e u n a va ria b le d e


re fe re n cia e s u n a re fe re n cia ( u n p u n t e ro ) h a cia e l va lo r re a l. En Ja va
t e n e m o s lo s a rra ys , la s cla s e s y lo s in t e rfa ce s co m o t ip o s d e d a t o s
re fe re n cia d o s .

Nombres de Variables
Un p ro g ra m a s e re fie re a l va lo r d e u n a va ria b le p o r s u n o m b re . Po r
co n ve n ció n , e n Ja va , lo s n o m b re s d e la s va ria b le s e m p ie za n co n u n a
le t ra m in ú s cu la ( lo s n o m b re s d e la s cla s e s e m p ie za n co n u n a le t ra
m a yú s cu la ) .
Un n o m b re d e va ria b le Ja va :
1 . d e b e s e r u n id e n t ifica d o r le g a l d e Ja va co m p re n d id o e n u n a s e rie d e
ca ra ct e re s Un ico d e . Un ico d e e s u n s is t e m a d e co d ifica ció n q u e
s o p o rt a t e xt o e s crit o e n d is t in t o s le n g u a je s h u m a n o s . Un ico d e
p e rm in t e la co d ifica ció n d e 3 4 . 1 6 8 ca ra ct e re s . Es t o le p e rm it e
u t iliza r e n s u s p ro g ra m a s Ja va va rio s a lfa b e t o s co m o e l Ja p o n é s , e l
Grie g o , e l Ru s o o e l He b re o . Es t o e s im p o rt a n t e p a ra q u e lo s
p ro g ra m a d o re s p u e d e n e s crib ir có d ig o e n s u le n g u a je n a t ivo .
2 . n o p u e d e s e r e l m is m o q u e u n a p a la b ra cla ve o e l n o m b re d e u n
va lo r b o o le a n o ( t ru e o r fa ls e )
3 . n o d e b e n t e n e r e l m is m o n o m b re q u e o t ra s va ria b le s cu ya s
d e cla ra cio n e s a p a re zca n e n e l m is m o á m b it o .
La re g la n ú m e ro 3 im p lica q u e p o d ría e xis t ir e l m is m o n o m b re e n o t ra
va ria b le q u e a p a re zca e n u n á m b it o d ife re n t e .
Po r co n ve n ció n , lo s n o m b re s d e va ria b le s e m p ie za n p o r u n le t ra
m in ú s cu la . S i u n a va ria b le e s t á co m p u e s t a d e m á s d e u n a p a la b ra , co m o
'n o m b re Da t o ' la s p a la b ra s s e p o n e n ju n t a s y ca d a p a la b ra d e s p u é s d e la
p rim e ra e m p ie za co n u n a le t ra m a yú s cu la .

Oz it o
Operadores
Lo s o p e ra d o re s re a liza n a lg u n a s fu n cio n e s e n u n o o d o s o p e ra n d o s . Lo s o p e ra d o re s
q u e re q u ie re n u n o p e ra d o r s e lla m a n o p e ra d o re s u n a rio s . Po r e je m p lo , + + e s u n
o p e ra d o r u n a rio q u e in cre m e n t a e l va lo r s u o p e ra n d o e n u n o .
Lo s o p e ra d o re s q u e re q u ie re n d o s o p e ra n d o s s e lla m a n o p e ra d o re s b in a rio s . El
o p e ra d o r = e s u n o p e ra d o r b in a rio q u e a s ig n a u n va lo r d e l o p e ra n d o d e re ch o a l
o p e ra n d o izq u ie rd o .
Lo s o p e ra d o re s u n a rio s e n Ja va p u e d e n u t iliza r la n o t a ció n d e p re fijo o d e s u fijo . La
n o t a ció n d e p re fijo s ig n ifica q u e e l o p e ra d o r a p a re ce a n t e s d e s u o p e ra n d o :
o p e ra d o r o p e ra n d o
La n o t a ció n d e s u fijo s ig n ifica q u e e l o p e ra d o r a p a re ce d e s p u é s d e s u o p e ra n d o :
o p e ra n d o o p e ra d o r
To d o s lo s o p e ra d o re s b in a rio s d e Ja va t ie n e n la m is m a n o t a ció n , e s d e cir
a p a re n ce n e n t re lo s d o s o p e ra n d o s :
o p 1 o p e ra t o r o p 2
Ad e m á s d e re a liza r u n a o p e ra ció n t a m b ié n d e vu e lve u n va lo r. El va lo r y s u t ip o
d e p e n d e n d e l t ip o d e l o p e ra d o r y d e l t ip o d e s u s o p e ra n d o s . Po r e je m p lo , lo s
o p e ra d o re s a rit m é t ico s ( re a liza n la s o p e ra cio n e s d e a rit m é t ica b á s ica co m o la s u m a
o la re s t a ) d e vu e lve n n ú m e ro s , e l re s u lt a d o t íp ico d e la s o p e ra cio n e s a rit m é t cia s .
El t ip o d e d a t o s d e vu e lt o p o r lo s o p e ra d o re s a rit m é t ico s d e p e n d e d e l t ip o d e s u s
o p e ra n d o s : s i s u m a s d o s e n t e ro s , o b t e n d rá s u n e n t e ro . S e d ice q u e u n a o p e ra ció n
e va lú a s u re s u lt a d o .
Es m u y ú t il d ivid ir lo s o p e ra d o re s Ja va e n la s s ig u ie n t e s ca t e g o ría s : a rit m é t ico s ,
re la cio n a le s y co n d icio n a le s . ló g ico s y d e d e s p la za m ie n t o y d e a s ig n a ció n .

Operadores Aritméticos
El le n g u a je Ja va s o p o rt a va rio s o p e ra d o re s a rit é t ico s - in clu ye n d o +
( s u m a ) , - ( re s t a ) , * ( m u lt ip lica ció n ) , / ( d ivis ió n ) , y % ( m ó d u lo ) - - e n
t o d o s lo s n ú m e ro s e n t e ro s y d e co m a flo t a n t e . Po r e je m p lo , p u e d e s
u t iliza r e s t e có d ig o Ja va p a ra s u m a r d o s n ú m e ro s :
s u m a Es t o + a Es t o
O e s t e có d ig o p a ra ca lcu la r e l re s t o d e u n a d ivis ió n :
d ivid e Es t o % p o rEs t o
Es t a t a b la s u m a riza t o d a s la s o p e ra cio n e s a rit m é t ica s b in a ria s e n Ja va :
Op e ra d o r Us o D e s c rip c ió n
+ op1 + op2
Sum a op1 y op2
- op1 - op2
Re s t a o p 2 d e o p 1
* op1 * op2
Mu lt ip lica o p 1 y o p 2
/ op1 / op2
Divid e o p 1 p o r o p 2
Ob t ie n e e l re s t o d e d ivid ir o p 1 p o r
% op1 % op2
op2

N o t a : El le n g u a je Ja va e xt ie n d e la d e fin ició n d e l o p e ra d o r + p a ra in clu ir


la co n ca t e n a ció n d e ca d e n a s .
Lo s o p e ra d o re s + y - t ie n e n ve rs io n e s u n a ria s q u e s e le ccio n a n e l s ig n o
d e l o p e ra n d o :
Op e ra d o r Us o D e s c rip c ió n
+ + o p In d ica u n va lo r p o s it ivo
- - o p Nie g a e l o p e ra n d o

Ad e m á s , e xis t e n d o s o p e ra d o re s d e a t a jo s a rit m é t ico s , + + q u e


in cre m e n t a e n u n o s u o p e ra n d o , y - - q u e d e cre m e n t a e n u n o e l va lo r d e
s u o p e ra n d o .
Op e ra d o r Us o D e s c rip c ió n
++ o p + + In cre m e n t a o p e n 1 ; e va lú a e l va lo r a n t e s d e in cre m e n t a r
In cre m e n t a o p e n 1 ; e va lú a e l va lo r d e s p u é s d e
++ + + op
in cre m e n t a r
-- o p - - De cre m e n t a o p e n 1 ; e va lú a e l va lo r a n t e s d e d e cre m e n t a r
De cre m e n t a o p e n 1 ; e va lú a e l va lo r d e s p u é s d e
-- -- op
d e cre m e n t a r

Operadores Relacionales y Condicionales


Lo s va lo re s re la cio n a le s co m p a ra n d o s va lo re s y d e t e rm in a n la re la ció n
e n t re e llo s . Po r e je m p lo , != d e vu e lve t ru e s i lo s d o s o p e ra n d o s s o n
d is t in t o s .
Es t a t a b la s u m a riza lo s o p e ra d o re s re la cio n a le s d e Ja va :
Op e ra d o r Us o D e v u e lv e t ru e s i
> op1 > op2 o p 1 e s m a yo r q u e o p 2
>= op1 > = o p 2 o p 1 e s m a yo r o ig u a l q u e o p 2
< op1 < op2 op1 e s m e nor que op2
<= op1 < = o p 2 o p 1 e s m e n o r o ig u a l q u e o p 2
== op1 = = o p 2 o p 1 y o p 2 s o n ig u a le s
!= op1 != o p 2 o p 1 y o p 2 s o n d is t in t o s

Fre cu e n t e m e n t e lo s o p e ra d o re s re la cio n a le s s e u t iliza n co n o t ro ju e g o d e


o p e ra d o re s , lo s o p e ra d o re s co n d icio n a le s , p a ra co n s t ru ir e xp re s io n e s d e
d e cis ió n m á s co m p le ja s . Un o d e e s t o s o p e ra d o re s e s && q u e re a liza la
o p e ra ció n Y b o o le a n a . Po r e je m p lo p u e d e s u t iliza r d o s o p e ra d o re s
re la cio n a le s d ife re n t e s ju n t o co n && p a ra d e t e rm in a r s i a m b a s re la cio n e s
s o n cie rt a s . La s ig u ie n t e lín e a d e có d ig o u t iliza e s t a t é cn ica p a ra
d e t e rm in a r s i u n in d ice d e u n a rra y e s t á e n t re d o s lím it e s - e s t o e s , p a ra
d e t e rm in a r s i e l in d ice e s m a yo r q u e 0 o m e n o r q u e NUM_ ENTRIES ( q u e
s e h a d e fin id o p ré via m e n t e co m o u n va lo r co n s t a n t e ) :
0 < in d e x && in d e x < NUM_ ENTRIES
Ob s e rva q u e e n a lg u n a s s it u a cio n e s , e l s e g u n d o o p e ra n d o d e u n
o p e ra d o r re la cio n a l n o s e rá e va lu a d o . Co n s id e re m o s e s t a s e n t e n cia :
( ( co u n t > NUM_ ENTRIES ) && ( S ys t e m . in . re a d ( ) != - 1 ) )
S i co u n t e s m e n o r q u e NUM_ ENTRIES , la p a rt e izq u ie rd a d e l o p e ra n d o d e
&& e va lú a a fa ls e . El o p e ra d o r && s ó lo d e vu e lve t ru e s i lo s d o s
o p e ra n d o s s o n ve rd a d e ro s . Po r e s o , e n e s t a s it u a ció n s e p u e d e
d e t e m in a r e l va lo r d e && s in e va lu a r e l o p e ra d o r d e la d e re ch a . En u n
ca s o co m o e s t e , Ja va n o e va lú a e l o p e ra n d o d e la d e re ch a . As í n o s e
lla m a rá a S ys t e m . in . re a d ( ) y n o s e le e rá u n ca rá ct e r d e la e n t ra d a
e s t a n d a rd .
Aq u í t ie n e s t re s o p e ra d o re s co n d icio n a le s :
Op e ra d o r Us o D e v u e lv e t ru e s i
&& o p 1 && o p 2 o p 1 y o p 2 s o n ve rd a d e ro s
|| op1 | | op2 u n o d e lo s d o s e s ve rd a d e ro
! ! op o p e s fa ls o
El o p e ra d o r & s e p u e d e u t iliza r co m o u n s in ó n im o d e && s i a m b o s
o p e ra d o re s s o n b o o le a n o s . S im ila rm e n t e , | e s u n s in o n im o d e | | s i
a m b o s o p e ra n d o s s o n b o o le a n o s .

Operadores de Desplazamiento
Lo s o p e ra d o re s d e d e s p la za m ie n t o p e rm it e n re a liza r u n a m a n ip u a lció n
d e lo s b it s d e lo s d a t o s . Es t a t a b la s u m a riza lo s o p e ra d o re s ló g ico s y d e
d e s p la za m ie n t o d is p o n ib le s e n e l le n g u a je Ja va :
Op e ra d o r Us o D e s c rip c ió n
>> op1 > > op2 d e s p la za a la d e re ch a o p 2 b it s d e o p 1
<< op1 < < op2 d e s p la za a la izq u ie rd a o p 2 b it s d e o p 1
d e s p la za a la d e re ch a o p 2 b it s d e o p 1 ( s in
>>> op1 > > > op2
s ig n o )
& op1 & op2 b it wis e a n d
| op1 | op2 b it wis e o r
^ op1 ^ op2 b it wis e xo r
~ ~ op b it wis e co m p le m e n t o

Lo s t re s o p e ra d o re s d e d e s p la za m ie n t o s im p le m e n t e d e s p la za n lo s b it s
d e l o p e ra n d o d e la izq u ie rd a e l n ú m e ro d e p o s icio n e s in d ica d a s p o r e l
o p e ra d o r d e la d e re ch a . Lo s d e s p la za m ie n t o s o cu rre n e n la d ire cció n
in d ica d a p o r e l p ro p io o p e ra d o r. Po r e je m p lo :
13 > > 1;
d e s p la za lo s b it s d e l e n t e ro 1 3 u n a p o s ició n a la d e re ch a . La
re p re s e n t a ció n b in a ria d e l n ú m e ro 1 3 e s 1 1 0 1 . El re s u lt a d o d e la
o p e ra ció n d e d e s p la za m ie n t o e s 1 1 0 o e l 6 d e cim a l. Ob s e rve q u e e l b it
s it u a d o m á s a la d e re ch a d e s a p a re ce . Un d e s p la za m ie n t o a la d e re ch a d e
u n b it e s e q u iva le n t e , p e ro m á s e ficie n t e q u e , d ivid ir e l o p e ra n d o d e la
izq u ie rd a p o r d o s . Un d e s p la za m ie n t o a la izq u ie rd a e s e q u iva le n t e a
m u lt ip lica r p o r d o s .
Lo s o t ro s o p e ra d o re s re a liza n la s fu n cio n e s ló g ica s p a ra ca d a u n o d e lo s
p a re s d e b it s d e ca d a o p e ra n d o . La fu n ció n "y" a ct iva e l b it re s u lt a n t e s i
lo s d o s o p e ra n d o s s o n 1 .
o p1 o p2 re s u lt a d o
0 0 0
0 1 0
1 0 0
1 1 1
S u p o n q u e q u ie re s e va lu a r lo s va lo re s 1 2 "a n d " 1 3 :
12 & 13
El re s u lt a d o d e e s t a o p e ra ció n e s 1 2 . ¿ Po r q u é ? Bie n , la re p re s e n t a ció n
b in a ria d e 1 2 e s 1 1 0 0 y la d e 1 3 e s 1 1 0 1 . La fu n ció n "a n d " a ct iva lo s b it s
re s u lt a n t e s cu a n d o lo s b it s d e lo s d o s o p e ra n d o s s o n 1 , d e o t ra fo rm a e l
re s u lt a d o e s 0 . En t o n ce s s i co lo ca s e n lín e a lo s d o s o p e ra n d o s y re a liza s
la fu n ció n "a n d ", p u e d e s ve r q u e lo s d o s b it s d e m a yo r p e s o ( lo s d o s b it s
s it u a d o s m á s a la izq u ie rd a d e ca d a n ú m e ro ) s o n 1 a s í e l b it re s u lt a n t e
d e ca d a u n o e s 1 . Lo s d o s b it s d e m e n o r p e s o s e e va lú a n a 0 p o q u e a l
m e n o s u n o d e lo s d o s o p e ra n d o s e s 0 :

1101
& 1100
------
1100
El o p e ra d o r | re a liza la o p e ra ció n O in clu s iva y e l o p e ra d o r ^ re a liza la
o p e ra ció n O e xclu s iva . O in clu s iva s ig n ifica q u e s i u n o d e lo s d o s
o p e ra n d o s e s 1 e l re s u lt a d o e s 1 .
o p1 o p2 re s u lt a d o
0 0 0
0 1 1
1 0 1
1 1 1

O e xclu s iva s ig n ifica q u e s i lo s d o s o p e ra n d o s s o n d ife re n t e s e l re s u lt a d o


e s 1 , d e o t ra fo rm a e l re s u lt a d o e s 0 :
o p1 o p2 re s u lt a d o
0 0 0
0 1 1
1 0 1
1 1 0
Y fin a lm e n t e e l o p e ra d o r co m p le m e n t o in vie rt e e l va lo r d e ca d a u n o d e
lo s b it e s d e l o p e ra n d o : s i e l b it d e l o p e ra n d o e s 1 e l re s u lt a d o e s 0 y s i e l
b it d e l o p e ra n d o e s 0 e l re s u lt a d o e s 1 .

Operadores de Asignación
Pu e d e s u t iliza r e l o p e ra d o r d e a s ig n a ció n = , p a ra a s ig n a r u n va lo r a o t ro .
Ad e m á s d e l o p e ra d o r d e a s ig n a ció n b á s ico , Ja va p ro p o rcio n a va rio s
o p e ra d o re s d e a s ig n a ció n q u e p e rm it e n re a liza r o p e ra cio n e s a rit m é t cia s ,
ló g ica s o d e b it s y u n a o p e ra ció n d e a s ig n a ció n a l m is m o t ie m p o .
Es p e cifica m e n t e , s u p o n q u e q u ie re s a ñ a d ir u n n ú m e ro a u n a va ria b le y
a s ig n a r e l re s u lt a d o d e n t ro d e la m is m a va ria b le , co m o e s t o :
i = i + 2;
Pu e d e s o rd e n a r e s t a s e n t e n cia u t iliza n d o e l o p e ra d o r + = .
i + = 2;
La s d o s lín e a s d e có d ig o a n t e rio re s s o n e q u iva le n t e s .
Es t a t a b la lis t a lo s o p e ra d o re s d e a s ig n a ció n y s u s e q u iva le n t e s :
Op e ra d o r Us o Eq u iv a le a
+= op1 + = op2 op1 = op1 + op2
-= op1 -= op2 op1 = op1 - op2
*= op1 *= op2 op1 = op1 * op2
/= op1 / = op2 op1 = op1 / op2
%= op1 % = op2 op1 = op1 % op2
&= op1 &= o p 2 op1 = op1 & op2
|= op1 | = op2 op1 = op1 | op2
^= op1 ^ = op2 op1 = op1 ^ op2
<<= op1 < < = op2 op1 = op1 < < op2
>>= op1 > > = op2 op1 = op1 > > op2
>>>= op1 > > > = op2 op1 = op1 > > > op2

Oz it o
Expresiones
La s e xp re s io n e s re a liza n e l t ra b a jo d e u n p ro g ra m a Ja va . En t re o t ra s co s a s , la s
e xp re s io n e s s e u t iliza n p a ra ca lcu la r y a s ig n a r va lo re s a la s va ria b le s y p a ra
co n t ro la r e l flu jo d e u n p ro g ra m a Ja va . El t ra b a jo d e u n a e xp re s ió n s e d ivid e e n
d o s p a rt e s : re a liza r lo s cá lcu lo s in d ica d o s p o r lo s e le m e n t o s d e la e xp re s ió n y
d e vo lve r a lg ú n va lo r.

D e fin ic ió n : Un a e xp re s ió n e s u n a s e rie d e va ria b le s , o p e ra d o re s y lla m a d a s a


m é t o d o s ( co n s t ru id a d e a cu e rd o a la s in t a xis d e l le n g u a je ) q u e e va lú a a u n va lo r
s e n cillo .

El t ip o d e l d a t o d e vu e lt o p o r u n a e xp re s ió n d e p e n d e d e lo s e le m e n t o s u t iliza d o s e n
la e xp re s ió n . La e xp re s ió n c o u n t + + d e vu e lve u n e n t e ro p o rq u e + + d e vu e lve u n
va lo r d e l m is m o t ip o q u e s u o p e ra n d o y c o u n t e s u n e n t e ro . Ot ra s e xp re s io n e s
d e vu e lve n va lo re s b o o le a n o s , ca d e n a s , e t c. . .
Un a e xp re s ió n d e lla m a d a a u n m é t o d o d e vu e lve e l va lo r d e l m é t o d o ; a s í e l t ip o d e
d a t o d e u n a e xp re s ió n d e lla m a d a a u n m é t o d o e s e l m is m o t ip o d e d a t o q u e e l
va lo r d e re t o rn o d e l m é t o d o . El m é t o d o S y s t e m . in . re a d ( ) s e h a d e cla ra d o co m o
u n e n t e ro , p o r lo t a n t o , la e xp re s ió n S y s t e m . in . re a d ( ) d e vu e lve u n e n t e ro .
La s e g u n d a e xp re s ió n co n t e n id a e n la s e n t e n cia S y s t e m . in . re a d ( ) != - 1 u t iliza e l
o p e ra d o r != . Re cu e rd a q u e e s t e o p e ra d o r co m p ru e b a s i lo s d o s o p e ra n d o s s o n
d is t in t o s . En e s t a s e n t e n cia lo s o p e ra n d o s s o n S y s t e m . in . re a d ( ) y - 1 .
S y s t e m . in . re a d ( ) e s u n o p e ra n d o vá lid o p a ra != p o rq u e d e vu e lve u n e n t e ro . As í
S y s t e m . in . re a d ( ) != - 1 co m p a ra d o s e n t e ro s , e l va lo r d e vu e lt o p o r
S y s t e m . in . re a d ( ) y - 1 . El va lo r d e vu e lt o p o r != e s t ru e o fa ls e d e p e n d ie n d o d e
la s a lid a d e la co m p a ra ció n .
Co m o h a s p o d id o ve r, Ja va t e p e rm it e co n s t ru ir e xp re s io n e s co m p u e s t a s y
s e n t e n cia s a p a rt ir d e va ria s e xp re s io n e s p e q u e ñ a s s ie m p re q u e lo s t ip o s d e d a t o s
re q u e rid o s p o r u n a p a rt e d e la e xp re s ió n co rre s p o n d a n co n lo s t ip o s d e d a t o s d e la
o t ra . Ta m b íe n h a b rá s p o d id o co n clu ir d e l e je m p lo a n t e rio r, e l o rd e n e n q u e s e
e va lú a n lo s co m p o n e n t e s d e u n a e xp re s ió n co m p u e s t a .
Po r e je m p lo , t o m a la s ig u ie n t e e xp re s ió n co m p u e s t a :
x * y * z
En e s t e e je m p lo p a rt icu la r, n o im p o rt a e l o rd e n e n q u e s e e va lú e la e xp re s ió n
p o rq u e e l re s u lt a d o d e la m u lt ip lica ció n e s in d e p e n d ie n t e d e l o rd e n . La s a lid a e s
s ie m p re la m is m a s in im p o rt a r e l o rd e n e n q u e s e a p liq u e n la s m u lt ip lica cio n e s . S in
e m b a rg o , e s t o n o e s cie rt o p a ra t o d a s la s e xp re s io n e s . Po r e je m p lo , e s t a e xp re s ió n
o b t ie n e u n re s u lt a d o d ife re n t e d e p e n d ie n d o d e s i s e re a liza p rim e ro la s u m a o la
d ivis ió n :
x + y / 100
Pu e d e s d e cirle d ire ct a m e n t e a l co m p ila d o r d e Ja va có m o q u ie re s q u e s e e va lú e u n a
e xp re s ió n u t iliza n d o lo s p a ré n t e s is ( y ) . Po r e je m p lo , p a ra a cla ra r la s e n t e n cia
a n t e rio r, s e p o d ría e s crib ir: ( x + y ) / 1 0 0 .
S i n o le d ice s e xp lícit a m e n t e a l co m p ila d o r e l o rd e n e n e l q u e q u ie re s q u e s e
re a lice n la s o p e ra cio n e s , é l d e cid e b a s á n d o s e e n la p re c e d e n c ia a s ig n a d a a lo s
o p e ra d o re s y o t ro s e le m e n t o s q u e s e u t iliza n d e n t ro d e u n a e xp re s ió n .
Lo s o p e ra d o re s co n u n a p re ce d e n cia m á s a lt a s e e va lú a n p rim e ro . Po r e je m p lo . e l
o p e ra d o r d ivis ió n t ie n e u n a p re ce d e n cia m a yo r q u e e l o p e ra d o r s u m a , p o r e s o , e n
la e xp re s ió n a n t e rio r x + y / 1 0 0 , e l co m p ila d o r e va lu a rá p rim e ro y / 1 0 0 . As í
x + y / 100
e s e q u iva le n t e a :
x + (y / 100)
Pa ra h a ce r q u e t u có d ig o s e a m á s fá cil d e le e r y d e m a n t e n e r d e b e ría s e xp lica r e
in d ica r co n p a ré t e s is lo s o p e ra d o re s q u e s e d e b e n e va lu a r p rim e ro .
La t a b la s ig u ie n t e m u e s t ra la p re ce d e n cia a s ig n a d a a lo s o p e ra d o re s d e Ja va . Lo s
o p e ra d o re s s e h a n lis t a d o p o r o rd e n d e p re ce d e n cia d e m a yo r a m e n o r. Lo s
o p e ra d o re s co n m a yo r p re ce d e n cia s e e va lú a n a n t e s q u e lo s o p e ra d o re s co n u n
p re ce d e n cia re la t iva m e n t e m e n o r. Lo o p e ra d o re s co n la m is m a p re ce d e n cia s e
e va lú a n d e izq u ie rd a a d e re ch a .
P re c e d e n c ia d e Op e ra d o re s e n Ja v a
o p e ra d o re s s u fijo [ ] . ( p a ra m s ) e x p r+ + e x p r- -
o p e ra d o re s u n a rio s + + e x p r - - e x p r + e x p r - e x p r ~ !
cre a ció n o t ip o ne w (type )e xpr
m u lt ip lica d o re s * / %
s u m a / re s t a + -
d e s p la za m ie n t o << >> >>>
re la cio n a le s < > < = > = in s t a n ce o f
ig u a ld a d = = !=
b it wis e AND &
b it wis e e xclu s ive OR ^
b it wis e in clu s ive OR |
AND ló g ico &&
OR ló g ico ||
co n d icio n a l ? :
= + = - = * = / = % = ^ = &= | = < < =
a s ig n a ció n
>>= >>>=

Oz it o
Sentencias de Control de Flujo
La s s e n t e n cia s d e co n t ro l d e flu jo d e t e rm in a n e l o rd e n e n q u e s e e je cu t a rá n la s o t ra s s e n t e n cia s
d e n t ro d e l p ro g ra m a . El le n g u a je Ja va s o p o rt a va ria s s e n t e n cia s d e co n t ro l d e flu jo , in clu ye n d o :
S e n t e n c ia s p a la b ra s c la v e
t o m a d e d e cis io n e s if- e ls e , s wit ch - ca s e
b u cle s fo r, wh ile , d o - wh ile
e xce p cio n e s t ry- ca t ch - fin a lly, t h ro w
m is ce la n e a s b re a k, co n t in u e , la b e l: , re t u rn

N o t a : Au n q u e g o t o e s u n a p a la b ra re s e rva d a , a ct u a lm e n t e e l le n g u a je Ja va n o la s o p o rt a .
Po d e m o s u t iliza r la s ru p t u ra s e t iq u e t a d a s e n s u lu g a r.

La sentencia if-else

La s e n t e n cia if- e ls e d e ja va p ro p o rcio n a a lo s p ro g ra m a s la p o s ib ilid a d d e e je cu t a r


s e le ct iva m e n t e o t ra s s e n t e n cia s b a s á n d o s e e n a lg ú n crit e rio . Po r e je m p lo , s u p o n q u e
t u p ro g ra m a im p rim e in fo rm a ció n d e d e p u ra d o b a s á n d o s e e n e l va lo r d e u n a va ria b le
b o o le a n a lla m a d a DEBUG. S i DEBUG fu e ra ve rd a d e ra t ru e , e l p ro g ra m a im p rim iría la
in fo rm a ció n d e d e p u ra d o , co m o p o r e je m p lo , e l va lo r d e u n a va ria b le co m o x . S i
DEBUG e s fa ls e e l p ro g ra m a p ro ce d e rá n o rm a lm e n t e . Un s e g m e n t o d e có d ig o q u e
im p le m e n t e e s t o s e p o d ría p a re ce r a e s t e :
. . .
if (DEBUG)
System.out.println("DEBUG: x = " + x);
. . .
Es t a e s la ve rs ió n m á s s e n cilla d e la s e n t e n cia if: la s e n t e n cia g o b e rn a d a p o r if s e
e je cu t a s i a lg u n a co d ició n e s ve rd a d e ra . Ge n e ra lm e n t e , la fo rm a s e n cilla d e if s e p u e d e
e s crib ir a s í:
if (expresión)
sentencia
Pe ro , ¿ y s i q u ie re s e je cu t a r u n ju e g o d ife re n t e d e s e n t e n cia s s i la e x p re s ió n e s fa ls a ?
Bie n , p u e d e s u t iliza r la s e n t e n cia e ls e . Ech e m o s u n vis t a zo a o t ro e je m p lo . S u p o n q u e
t u p ro g ra m a n e ce s it a re a liza r d ife re n t e s a ccio n e s d e p e n d ie n d o d e q u e e l u s u a rio p u ls e
e l b o t ó n OK o e l b o t ó n Ca n ce l e n u n ve n t a n a d e a la rm a . S e p o d ría h a ce r e s t o
u t iliza n d o u n a s e n t e n cia if:
. . .
// Respuesta dependiente del botoón que haya pulsado el usuario
// OK o Cancel
. . .
if (respuesta == OK) {
. . .
// Código para la acción OK
. . .
} else {
. . .
// código para la acción Cancel
. . .
}
Es t e u s o p a rt icu la r d e la s e n t e n cia e ls e e s la fo rm a d e ca p t u ra rlo t o d o . Exis t e o t ra
fo rm a d e la s e n t e cia e ls e , e ls e if q u e e je cu t a u n a s e n t e n cia b a s a d a e n o t ra e xp re s ió n .
Po r e je m p lo , s u p o n q u e h a s e s crit o u n p ro g ra m a q u e a s ig n a n o t a s b a s a d a s e n la
p u n t u a ció n d e u n e xa m e n , u n S o b re s a lie n t e p a ra u n a p u n t u a ció n d e l 9 0 % o s u p e rio r,
u n No t a b le p a ra e l 8 0 % o s u p e rio r y d e m á s . o d ría s u t iliza r u n a s e n t e n cia if co n u n a
s e rie d e co m p a ra cio n e s e ls e if y u n a s e t e n cia e ls e p a ra e s crib ir e s t e có d ig o :
int puntuacion;
String nota;

if (puntuacion >= 90) {


nota = "Sobresaliente";
} else if (puntuacion >= 80) {
nota = "Notable";
} else if (puntuacion >= 70) {
nota = "Bien";
} else if (puntuacion >= 60) {
nota = "Suficiente";
} else {
nota = "Insuficiente";
}
Un a s e n t e n cia if p u e d e t e n e r cu a lq u ie r n ú m e ro d e s e n t e n cia s d e a co m p a ñ a m ie n t o e ls e
if. Po d ría s h a b e r o b s e rva d o q u e a lg u n o s va lo re s d e p u n t u a c io n p u e d e n s a t is fa ce r m á s
u n a d e la s e xp re s io n e s q u e co m p o n e n la s e n t e n cia if. Po r e je m p lo , u n a p u n t u a ció n d e
7 6 p o d ría e va lu a rs e co m o t ru e p a ra d o s e xp re s io n e s d e e s t a s e n t e n cia : p u n t u a c io n
> = 7 0 y p u n t u a c io n > = 6 0 . S in e m b a rg o , e n e l m o m e n t o d e e je cu ció n , e l s is t e m a
p ro ce s a u n a s e n t e n cia if co m p u e s t a co m o u n a s ó la ; u n a ve z q u e s e h a s a t is fe ch o u n a
co n d ició n ( 7 6 > = 7 0 ) , s e e je cu t a la s e n t e n cia a p ro p ia d a ( n o t a = "Bie n ";) , y e l co n t ro l
s a le fu e ra d e la s e n t e n cia if s in e va lu a r la s co n d icio n e s re s t a n t e s .

La sentencia switch

La s e n t e n cia s w it c h s e u t iliza p a ra re a liza r s e n t e n cia s co n d icio n a lm e n t e b a s a d a s e n


a lg u n a e xp re s ió n . Po r e je m p lo , s u p o n q u e t u p ro g ra m a co n t ie n e u n e n t e ro lla m a d o
m e s cu yo va lo r in d ica e l m e s e n a lg u n a fe ch a . S u p o n q u e t a m b ié n q u ie re s m o s t ra r e l
n o m b re d e l m e s b a s á n d o s e e n s u n ú m e ro e n t e ro e q u iva le n t e . Po d ría s u t iliza r la
s e n t e n cia s w it c h d e Ja va p a ra re a liza r e s t a t a re a :
int mes;
. . .
switch (mes) {
case 1: System.out.println("Enero"); break;
case 2: System.out.println("Febrero"); break;
case 3: System.out.println("Marzo"); break;
case 4: System.out.println("Abril"); break;
case 5: System.out.println("May0"); break;
case 6: System.out.println("Junio"); break;
case 7: System.out.println("Julio"); break;
case 8: System.out.println("Agosto"); break;
case 9: System.out.println("Septiembre"); break;
case 10: System.out.println("Octubre"); break;
case 11: System.out.println("Noviembre"); break;
case 12: System.out.println("Diciembre"); break;
}
La s e n t e n cia s w it c h e va lú a s u e xp re s ió n , e n e s t e ca s o e l va lo r d e m e s , y e je cu t a la
s e n t e n cia c a s e a p ro p ia d a . De cid ir cu a n d o u t iliza r la s s e n t e n cia s if o s w it c h d e p e n d e n
d e l ju icio p e rs o n a l. Pu e d e s d e cid ir cu a l u t iliza r b a s á n d o s e e n la b u e n a le ct u ra d e l
có d ig o o e n o t ro s fa ct o re s .
Ca d a s e n t e n cia c a s e d e b e s e r ú n ica y e l va lo r p ro p o rcio n a d o a ca d a s e n t e n cia c a s e
d e b e s e r d e l m is m o t ip o q u e e l t ip o d e d a t o d e vu e lt o p o r la e xp re s ió n p ro p o rcio n a d a a
la s e n t e n cia s w it c h .
Ot ro p u n t o d e in t e re s e n la s e n t e n cia s w it c h s o n la s s e n t e n cia s b re a k d e s p u é s d e
ca d a c a s e . La s e n t e n cia b re a k h a ce q u e e l co n t ro l s a lg a d e la s e n t e n cia s w it c h y
co n t in ú e co n la s ig u ie n t e lín e a . La s e n t e n cia b re a k e s n e ce s a ria p o rq u e la s s e n t e n cia s
c a s e s e s ig u e n e je cu t a n d o h a cia a b a jo . Es t o e s , s in u n b re a k e xp lícit o , e l flu jo d e
co n t ro l s e g u iría s e cu e n cia lm e n t e a t ra vé s d e la s s e n t e n cia s c a s e s ig u ie n t e s . En e l
e je m p lo a n t e rio r, n o s e q u ie re q u e e l flu jo va ya d e u n a s e n t e n cia c a s e a o t ra , p o r e s o
s e h a n t e n id o q u e p o n e r la s s e n t e n cia s b re a k . S in e m b a rg o , h a y cie rt o s e s ce n a rio e n
lo s q u e q u e rrá s q u e e l co n t ro l p ro ce d a s e cu e n cia lm e n t e a t ra vé s d e la s s e n t e n cia s
c a s e . Co m o e s t e có d ig o q u e ca lcu la e l n ú m e ro d e d ía s d e u n m e s d e a cu e rd o co n e l
rit m ico re frá n q u e d ice "Tre in t a t ie n e S e p t ie m b re . . . ".
int mes;
int numeroDias;
. . .
switch (mes) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numeroDias = 31;
break;
case 4:
case 6:
case 9:
case 11:
numeroDias = 30;
break;
case 2:
if ( ((ano % 4 == 0) && !(ano % 100 == 0)) || ano % 400 == 0) )
numeroDias = 29;
else
numeroDias = 28;
break;
}
Fin a lm e n t e , p u e d e u t iliza r la s e n t e n cia d e fa u lt a l fin a l d e la s e n t e n cia s w it c h p a ra
m a n e ja r lo s va lo re s q u e n o s e h a n m a n e ja d o e xp lícit a m e n t e p o r u n a d e la s s e n t e n cia s
cas e .
int mes;
. . .
switch (mes) {
case 1: System.out.println("Enero"); break;
case 2: System.out.println("Febrero"); break;
case 3: System.out.println("Marzo"); break;
case 4: System.out.println("Abril"); break;
case 5: System.out.println("Mayo"); break;
case 6: System.out.println("Junio"); break;
case 7: System.out.println("Julio"); break;
case 8: System.out.println("Agosto"); break;
case 9: System.out.println("Septiembre"); break;
case 10: System.out.println("Octubre"); break;
case 11: System.out.println("Noviembre"); break;
case 12: System.out.println("Diciembre"); break;
default: System.out.println("Ee, no es un mes válido!");
break;
}

Sentencias de Bucle

Ge n e ra lm e n t e h a b la n d o , u n a s e n t e n cia w h ile re a liza u n a a cció n m ie n t ra s s e cu m p la


u n a cie rt a co n d ició n . La s in t a xis g e n e ra l d e la s e n t e n cia w h ile e s :
while (expresión)
sentencia
Es t o e s , m ie n t ra s la e x p re s ió n s e a ve rd a d e ra , e je cu t a rá la s e n t e n cia .
s e n t e n cia p u e d e s e r u n a s ó la s e n t e n cia o p u e d e s e r u n b lo q u e d e s e n t e n cia s . Un
b lo q u e d e s e n t e n cia s e s u n ju e g o d e s e n t e n cia s le g a le s d e ja va co n t e n id a s d e n t ro d e
co rch e t e s ( '{ 'y '} ') . Po r e je m p lo , s u p o n q u e a d e m á s d e in cre m e n t a r c o n t a d o r d e n t ro
d e u n b u cle w h ile t a m b ié n q u ie re s im p rim ir e l co n t a d o r ca d a ve z q u e s e le a u n
ca rá ct e r. Po d ría s e s crib ir e s t o e n s u lu g a r:
. . .
while (System.in.read() != -1) {
contador++;
System.out.println("Se ha leido un el carácter = " + contador);
}
. . .
Po r co n ve n ció n e l co rch e t e a b ie rt o '{ ' s e co lo ca a l fin a l d e la m is m a lín e a d o n d e s e
e n cu e n t ra la s e n t e n cia w h ile y e l co rch e t e ce rra d o '} ' e m p ie za u n a n u e va lín e a
in d e n t a d a a la lín e a e n la q u e s e e n cu e n t ra e l w h ile .
Ad e m á s d e wh ile Ja va t ie n e o t ro s d o s co n s t ru ct o re s d e b u cle s q u e p u e d e s u t iliza r e n
t u s p ro g ra m a s : e l b u cle fo r y e l b u cle d o - w h ile .
Prim e ro e l b u cle fo r. Pu e d e s u t iliza r e s t e b u cle cu a n d o co n o zca s lo s lím it e s d e l b u cle
( s u in s t ru cció n d e in icia liza ció n , s u crit e rio d e t e rm in a ció n y s u in s t ru cció n d e
in cre m e n t o ) . Po r e je m p lo , e l b u cle fo r s e u t iliza fre cu e n t e m e n t e p a ra it e ra r s o b re lo s
e le m e n t o s d e u n a rra y, o lo s ca ra ct e re s d e u n a ca d e n a .
// a es un array de cualquier tipo
. . .
int i;
int length = a.length;
for (i = 0; i < length; i++) {
. . .
// hace algo en el elemento i del array a
. . .
}
S i s a b e s cu a n d o e s t a s e s crib ie n d o e l p ro g ra m a q u e q u ie re s e m p e za r e n e l in icio d e l
a rra y, p a ra r a l fin a l y u t iliza r ca d a u n o d e lo s e le m e n t o s . En t o n ce s la s e n t e n cia fo r e s
u n a b u e n a e le cció n . La fo rm a g e n e ra l d e l b u cle fo r p u e d e e xp re s a rs e a s i:
for (inicialización; terminación; incremento)
sentencias
in icia liz a ció n e s la s e n t e n cia q u e in icia liza e l b u cle - - s e e je cu t a u n a ve z a l in icia r e l
b u cle .
t e rm in a ció n e s u n a s e n t e cia q u e d e t e rm in a cu a n d o s e t e rm in a e l b u cle . Es t a e xp re s ió n
s e e va lú a a l p rin cip io d e ca d a it e ra cció n e n e l b u cle . Cu a n d o la e xp re ió n s e e va lú a a
fa ls e e l b u cle s e t e rm in a .
Fin a lm e n t e , in cre m e n t o e s u n a e xp re s ió n q u e s e in vo ca e n ca d a in t e ra cció n d e l b u cle .
Cu a lq u ie ra ( o t o d o s ) d e e s t o s co m p o n e n t e s p u d e n s e r u n a s e n t e n cia va cía ( u n p u n t o y
co m a ) .
Ja va p ro p o rcio n a o t ro b u cle , e l b u cle d o - w h ile , q u e e s s im ila r a l b u cle w h ile q u e s e
vió a l p rin cip io , e xce p t o e n q u e la e xp re s ió n s e a va lú a l fin a l d e l b u cle :
do {
sentencias
} while (Expresión Booleana);
La s e n t e n cia d o - w h ile s e u s a m u y p o co e n la co n s t ru cció n d e b u cle s p e ro t ie n e s u s
u s o s . Po r e je m p lo , e s co n ve n ie n t e u t iliza r la s e n t e n cia d o - w h ile cu a n d o e l b u cle d e b e
e je cu t a rs e a l m e n o s u n a ve z. Po r e je m p lo , p a ra le e r in fo rm a ció n d e u n fich e ro ,
s a b e m o s q u e a l m e n o s d e b e le e r u n ca rá ct e r:
int c;
InputStream in;
. . .
do {
c = in.read();
. . .
} while (c != -1);

Sentencias de Manejo de Excepciones

Cu a n d o o cu rre u n e rro r d e n t ro d e u n m é t o d o Ja va , e l m é t o d o p u e d e la n za r u n a
e xce p ció n p a ra in d ica r a s u lla m a d o r q u e h a o cu rrid o u n e rro r y q u e e l e rro r e s t á
u t iliza n d o la s e n t e n cia t h ro w . El m é t o d o lla m a d o r p u e d e u t iliza r la s s e n t e n cia s t ry ,
c a t c h , y fin a lly p a ra ca p t u ra r y m a n e ja r la e xce p ció n . Pu e d e s ve r Ma n e ja r Erro re s
Ut iliza n d o Exce p cio n e s p a ra o b t e n e r m á s in fo rm a ció n s o b re e l la n za m ie n t o y m a n e jo
d e e xce p cio n e s .

Sentencias de Ruptura

Ya h a s vis t o la s e n t e n cia b re a k e n a cció n d e n t ro d e la s e n t e n cia s w it c h


a n t e rio rm e n t e . Co m o s e o b s e rvó a n t e rio rm e n t e , la s e n t e n cia b re a k h a ce q u e e l
co n t ro l d e l flu jo s a lt e a la s e n t e n cia s ig u ie n t e a la a ct u a l.
Ha y o t ra fo rm a d e b re a k q u e h a ce q u e e l flu jo d e co n t ro l s a lt e a u n a s e n t e n cia
e t iq u e t a d a . S e p u e d e e t iq u e t a r u n a s e n t e n cia u t iliza n d o u n id e n t ifica d o r le g a l d e Ja va
( la e t iq u e t a ) s e g u id o p o r d o s p u n t o s ( : ) a n t e s d e la s e n t e n cia :
SaltaAqui: algunaSentenciaJava
Pa ra s a lt a r a la s e n t e n cia e t iq u e t a d a u t ilice e s t a fo rm a d e la s e n t e n cia b re a k .
break SaltaAqui;
La s ru p t u ra s e t iq u e t a d a s s o n u n a a lt e rn a t iva a la s e n t e n cia g o t o q u e n o e s t á
s o p o rt a d a p o r e l le n g u a je Ja va .
S e p u e d e u t iliza la s e n t e n cia c o n t in u e d e n t ro d e u n b u cle p a ra s a lt a r d e la s e n t e n cia
a ct u a l h a cia e l p rin cip io d e l b u cle o a u n a s e n t e n cia e t iq u e t a d a . Co n s id e ra e s t a
im p le m e n t a ció n d e l m é t o d o in d e x Of( ) d e la cla s e S t rin g q u e u t iliza la fo rm a d e
c o n t in u e q u e co n t in ú a e n u n a s e n t e n cia e t iq u e t a d a :
public int indexOf(String str, int fromIndex) {
char[] v1 = value;
char[] v2 = str.value;
int max = offset + (count - str.count);
test:
for (int i = offset + ((fromIndex < 0) ? 0 : fromIndex); i <= max ; i++) {
int n = str.count;
int j = i;
int k = str.offset;
while (n-- != 0) {
if (v1[j++] != v2[k++]) {
continue test;
}
}
return i - offset;
}
return -1;
}

N o t a : S ó lo s e p u e d e lla m a r a la s e n t e n cia c o n t in u e d e s d e d e n t ro d e u n b u cle .

Y fin a lm e n t e la s e n t e n cia re t u rn . Es t a s e n t e n cia s e u t iliza p a ra s a lir d e l m é t o d o a ct u a l


y vo lve r a la s e n t e n cia s ig u ie n t e a la q u e o rig in ó la lla m a d a e n e l m é t o d o o rig in a l.
Exis t e n d o s fo rm a s d e re t u rn : u n a q u e d e vu e lve u n va lo r y o t ra q u e n o lo h a ce . Pa ra
d e vo lve r u n va lo r, s im p le m e n t e s e p o n e e l va lo r ( o u n a e xp re s ió n q u e ca lcu le e l va lo r)
d e t rá s d e la p a la b ra re t u rn :
return ++count;
El va lo r d e vu e lt o p o r re t u rn d e b e co rre s p o n d e r co n e l t ip o d e l va lo r d e re t o rn o d e la
d e cla ra ció n d e l m é t o d o .
Cu a n d o u n m é t o d o s e d e cla ra co m o v o id u t iliza la fo rm a d e re t u rn q u e n o d e vu e lve
n in g ú n va lo r:
return;

Oz it o
Arrays y Cadenas
Al ig u a l q u e o t ro s le n g u a je s d e p ro g ra m a ció n , Ja va p e rm it e ju n t a r y m a n e ja r m ú lt ip le s
va lo re s a t ra vé s d e u n o b je t o a rra y ( m a t riz) . Ta m b ié n s e p u e d e n m a n e ja r d a t o s
co m p u e s t o s d e m ú lt ip le s ca ra ct e re s u t iliza n d o e l o b je t o S t rin g ( ca d e n a ) .

Arrays
Es t a s e cció n t e e n s e ñ a rá t o d o lo q u e n e ce s it a s p a ra cre a r y u t iliza r a rra ys e n
t u s p ro g ra m a s Ja va .
Co m o o t ra s va ria b le s , a n t e s d e p o d e r u t iliza r u n a rra y p rim e ro s e d e b e
d e cla ra r. De n u e vo , a l ig u a l q u e o t ra s va ria b le s , la d e cla ra ció n d e u n a rra y
t ie n e d o s co m p o n e n t e s p rim a rio s : e l t ip o d e l a rra y y s u n o m b re . Un t ip o d e
a rra y in clu ye e l t ip o d e d a t o d e lo s e le m e n t o s q u e va co n t e n e r e l a rra y. Po r
e je m p lo , e l t ip o d e d a t o p a ra u n a rra y q u e s ó lo va a co n t e n e r e le m e n t o s
e n t e ro s e s u n a rra y d e e n t e ro s . No p u e d e e xis t ir u n a rra y d e t ip o d e d a t o s
g e n é rico e n e l q u e e l t ip o d e s u s e le m e n t o s e s t é in d e fin id o cu a n d o s e d e cla ra
e l a rra y. Aq u í t ie n e s la d e cla ra ció n d e u n a rra y d e e n t e ro s :
int[] arrayDeEnteros;
La p a rt e in t [ ] d e la d e cla ra ció n in d ica q u e a rra y D e En t e ro s e s u n a rra y d e
e n t e ro s . La d e cla ra ció n n o a s ig n a n in g u n a m e m o ria p a ra co n t e n e r lo s
e le m e n t o s d e l a rra y.
S i s e in t e n t a a s ig n a r u n va lo r o a cce d e r a cu a lq u ie r e le m e n t o d e
a rra y D e En t e ro s a n t e s d e h a b e r a s ig n a d o la m e m o ria p a ra é l, e l co m p ila d o r
d a rá u n e rro r co m o e s t e y n o co m p ila rá e l p ro g ra m a :
testing.java:64: Variable arraydeenteros may not have been initialized.
Pa ra a s ig n a r m e m o ria a lo s e le m e n t o s d e u n a rra y, p rim e ro s e d e b e
e je m p la riza r e l a rra y. S e p u e d e h a ce r e s t o u t iliza n d o e l o p e ra d o r n e w d e Ja va .
( Re a lm e n t e , lo s p a s o s q u e s e d e b e n s e g u ir p a ra cre a r u n a rra y s o n s im ila re s a
lo s s e d e b e n s e g u ir p a ra cre a r u n o b je t o d e u n a cla s e : d e cla ra ció n ,
e je m p la riza ció n e in icia liza ció n .
La s ig u ie n t e s e n t e n cia a s ig n a la s u ficie n t e m e m o ria p a ra q u e a rra y D e En t e ro s
p u e d a co n t e n e r d ie z e n t e ro s .
int[] arraydeenteros = new int[10]
En g e n e ra l, cu a n d o s e cre a u n a rra y, s e u t iliza e l o p e ra d o r n e w , m á s e l t ip o
d e d a t o d e lo s e le m e n t o s d e l a rra y, m á s e l n ú m e ro d e e le m e n t o s d e s e a d o s
e n ce rra d o e n t re co ch e t e s cu a d ra d o s ( '[ ' y '] ') .
TipodeElemento[] NombredeArray = new TipodeElementos[tamanoArray]
Ah o ra q u e s e h a a s ig n a d o m e m o ria p a ra u n a rra y ya s e p u e d e n a s ig n a r
va lo re s a lo s e le m e t o s y re cu p e ra r e s o s va lo re s :

for (int j = 0; j < arrayDeEnteros.length; j ++) {


arrayDeEnteros[j] = j;
System.out.println("[j] = " + arrayDeEnteros[j]);
}
Co m o s e p u e d e ve r e n e l e je m p lo a n t e rio r, p a ra re fe rirs e a u n e le m e n t o d e l
a rra y, s e a ñ a d e co rch e t e s cu a d ra d o s a l n o m b re d e l a rra y. En t re lo s co rch e t e s
ca u d ra d o s s e in d ica ( b ie n co n u n a va ria b le o co n u n a e xp re s ió n ) e l ín d ice d e l
e le m e n t o a l q u e s e q u ie re a cce d e r. Ob s e rva q u e e n Ja va , e l ín d ice d e l a rra y
e m p ie za e n 0 y t e rm in a e n la lo n g it u d d e l a rra y m e n o s u n o .
Ha y o t ro e le m e n t o in t e re s a n t e e n e l p e q u e ñ o e je m p lo a n t e rio r. El b u cle fo r
it e ra s o b re ca d a e le m e n t o d e a rra y D e En t e ro s a s ig n á n d o le va lo re s e
im p rim ie n d o e s o s va lo re s . Ob s e rva e l u s o d e a rra y D e En t e ro s . le n g t h p a ra
o b t e n e r e l t a m a ñ o re a l d e l a rra y. le n g t h e s u n a p ro p ie d a d p ro p o rcio n a d a p a ra
t o d o s lo s a rra ys d e Ja va .
Lo s a rra ys p u e d e n co n t e n e r cu a lq u ie r t ip o d e d a t o le g a l e n Ja va in clu ye n d o lo s
t ip o s d e re fe re n cia co m o s o n lo s o b je t o s u o t ro s a rra y. Po r e je m p lo , e l
s ig u ie n t e e je m p lo d e cla ra u n a rra y q u e p u e d e co n t e n e r d ie z o b je t o s S t rin g .
String[] arrayDeStrings = new String[10];
Lo s e le m e n t o s e n e s t e a rra y s o n d e l t ip o re fe re n cia , e s t o e s , ca d a e le m e n t o
co n t ie n e u n a re fe re n cia a u n o b je t o S t rin g . En e s t e p u n t o , s e h a a s ig n a d o
s u ficie n t e m e m o ria p a ra co n t e n e r la s re fe re n cia s a lo s S t rin g s , p e ro n o s e h a
a s ig n a d o m e m o ria p a ra lo s p ro p io s s t rin g s . S i s e in t e n t a a cce d e r a u n o d e lo s
e le m e n t o s d e a rra y d e S t rin g s o b t e n d rá u n a e xce p ció n 'Nu llPo in t e rExce p t io n '
p o rq u e e l a rra y e s t á va cio y n o co n t ie n e n i ca d e n a s n i o b je t o s S t rin g . S e d e b e
a s ig n a r m e m o ria d e fo rm a s e p a ra d a p a ra lo s o b je t o s S t rin g :
for (int i = 0; i < arraydeStrings.length; i ++) {
arraydeStrings[i] = new String("Hello " + i);
}

Strings
Un a s e cu e n cia d e d a t o s d e l t ip o ca rá ct e r s e lla m a u n s t rin g ( ca d e n a ) y e n e l
e n t o rn o Ja va e s t á im p le m e n t a d a p o r la cla s e S t rin g ( u n m ie m b ro d e l p a q u e t e
ja va . la n g ) .
String[] args;
Es t e có d ig o d e cla ra e xp lícit a m e n t e u n a rra y, lla m a d o a rg s , q u e co n t ie n e
o b je t o s d e l t ip o S t rin g . Lo s co rch e t e s va cio s in d ica n q u e la lo n g it u d d e l a rra y
n o s e co n o ce e n e l m o m e n t o d e la co m p ila ció n , p o rq u e e l a rra y s e p a s a e n e l
m o m e n t o d e la e je cu ció n .
El s e g u n d o u s o d e S t rin g e s e l u s o d e ca d e n a s lit e ra le s ( u n a ca d e n a d e
ca ra ct e re s e n t re co m illa s " y ") :
"Hola mundo!"
El co m p ila d o r a s ig n a im p licit a m e n t e e s p a cio p a ra u n o b je t o S t rin g cu a n d o
e n cu e n t ra u n a ca d e n a lit e ra l.
Lo s o b je t o s S t rin g s o n in m u t a b le s - e s d e cir, n o s e p u e d e n m o d ifica r u n a ve z
q u e h a n s id o cre a d o s . El p a q u e t e ja va . la n g p ro p o rcio n a u n a cla s e d ife re n t e ,
S t rin g Bu ffe r, q u e s e p o d rá u t iliza r p a ra cre a r y m a n ip u la r ca ra ct e re s a l vu e lo .

Concatenación de Cadenas
Ja va p e rm it e co n ca t e n a r ca d e n a s fa cilm e n t e u t iliza n d o e l o p e ra d o r
+ . El s ig u ie n t e fra g m e n t o d e có d ig o co n ca t e n a t re s ca d e n a s p a ra
p ro d u cir s u s a lid a :
"La entrada tiene " + contador + " caracteres."
Do s d e la s ca d e n a s co n ca t e n a d a s s o n ca d e n a s lit e ra le s : "La
e n t ra d a t ie n e " y " c a ra c t e re s . ". La t e rce ra ca d e n a - la d e l m e d io -
e s re a lm e n t e u n e n t e ro q u e p rim e ro s e co n vie rt e a ca d e n a y lu e g o
s e co n ca t e n a co n la s o t ra s .

Oz it o
Crear Objetos
En Ja va , s e cre a u n o b je t o m e d ia n t e la cre a cció n d e u n o b je t o d e u n a cla s e o , e n
o t ra s p a la b ra s , e je m p la riz a n d o u n a cla s e . Ap re n d e rá s có m o cre a r u n a cla s e m á s
a d e la n t e e n Cre a r Cla s e s . Ha s t a e n t o n ce s , lo s e je m p lo s co n t e n id o s a q u í cre a n
o b je t o s a a p a rt ir d e cla s e s q u e ya e xis t e n e n e l e n t o rn o Ja va .
Fre cu e n t e m e n t e , s e ve rá la cre a cció n d e u n o b je t o Ja va co n u n s e n t e n cia co m o
e sta :
Date hoy = new Date();
Es t a s e n t e n cia cre a u n o b je t o Da t e ( Da t e e s u n a cla s e d e l p a q u e t e ja va , u t il) . Es t a
s e n t e n cia re a lm e n t e re a liza t re s a ccio n e s : d e cla ra ció n , e je m p la riza ció n e
in icia liza ció n . D a t e h o y e s u n a d e cla ra ció n d e va ria b le q u e s ó lo le d ice a l
co m p ila d o r q u e e l n o m b re h o y s e va a u t iliza r p a ra re fe rirs e a u n o b je t o cu yo t ip o
e s Da t e , e l o p e ra d o r n e w e je m p la riza la cla s e Da t e ( cre a n d o u n n u e vo o b je t o
Da t e ) , y D a t e ( ) in icia liza e l o b je t o .

Declarar un Objeto
Ya q u e la d e cla ra ció n d e u n o b je t o e s u n a p a rt e in n e ce s a ria d e la
cre a cció n d e u n o b je t o , la s d e cla ra cio n e s a p a re ce n fre cu e n t e m e n t e e n la
m is m a lín e a q u e la cre a cció n d e l o b je t o . Co m o cu a lq u ie r o t ra d e cla ra ció n
d e va ria b le , la s d e cla ra cio n e s d e o b je t o s p u e d e n a p a re ce r s o lit a ria s co m o
e sta :
Date hoy;
De la m is m a fo rm a , d e cla ra r u n a va ria b le p a ra co n t e n e r u n o b je t o e s
e xa ct a m e n t e ig u a l q u e d e cla ra r u n a va ria b le q u e va a co n t e n e r u n t ip o
p rim it ivo :
tipo nombre
d o n d e t ip o e s e l t ip o d e d a t o d e l o b je t o y n o m b re e s e l n o m b re q u e va a
u t iliza r e l o b je t o . En Ja va , la s cla s e s e in t e rfa ce s s o n co m o t ip o s d e
d a t o s . En t o n ce s t ip o p u e d e s e r e l n o m b re d e u n a cla s e o d e u n in t e rfa ce .
La s d e cla ra cio n e s n o t ifica n a l co m p ila d o r q u e s e va a u t iliza r n o m b re
p a ra re fe rirs e a u n a va ria b le cu yo t ip o e s t ip o . La s d e c la ra c io n e s n o
c re a n n u e v o s o b je t o s . D a t e h o y n o cre a u n o b je t o Da t e , s ó lo cre a u n
n o m b re d e va ria b le p a ra co n t e n e r u n o b je t o Da t e . Pa ra e je m p la riza r la
cla s e Da t e , o cu a lq u ie r o t ra cla s e , s e u t iliza e l o p e ra d o r n e w .

Ejemplarizar una Clase


El o p e ra d o r n e w e je m p la riza u n a cla s e m e d ia n t e la a s ig n a ció n d e
m e m o ria p a ra e l o b je t o n u e vo d e e s e t ip o . n e w n e ce s it a u n s ó lo
a rg u m e n t o : u n a lla m a d a a l m é t o d o co n s t ru ct o r. Lo s m é t o d o s
co n s t ru ct o re s s o n m é t o d o s e s p e cia le s p ro p o rcio n a d o s p o r ca d a cla s e
Ja va q u e s o n re p o n s a b le s d e la in icia liza ció n d e lo s n u e vo s o b je t o s d e
e s e t ip o . El o p e ra d o r n e w cre a e l o b je t o , e l co n s t ru ct o r lo in icia liza .
Aq u í t ie n e s u n e je m p lo d e l u s o d e l o p e ra d o r n e w p a ra cre a r u n o b je t o
Re ct a n g le ( Re ct a n g le e s u n a cla s e d e l p a q u e t e ja va . a wt ) :
new Rectangle(0, 0, 100, 200);
En e l e je m p lo , Re c t a n g le ( 0 , 0 , 1 0 0 , 2 0 0 ) e s u n a lla m a d a a l
co n s t ru ct o r d e la cla s e Re ct a n g le .
El o p e ra d o r n e w d e vu e lve u n a re fe re n cia a l o b je t o re cie n cre a d o . Es t a
re fe re n cia p u e d e s e r a s ig n a d a a u n a va ria b le d e l t ip o a p ro p ia d o .
Rectangle rect = new Rectangle(0, 0, 100, 200);
( Re cu e rd a q u e u n a cla s e e s ce n cia lm e n t e d e fin e u n t ip o d e d a t o d e
re fe re n cia . Po r e s o , Re ct a n g le p u e d e u t iliza rs e co m o u n t ip o d e d a t o e n
lo s p ro g ra m a s Ja va . El va lo r d e cu a lq u ie r va ria b le cu yo t ip o s e a u n t ip o
d e re fe re n cia , e s u n a re fe re n cia ( u n p u n t e ro ) a l va lo r re a l o co n ju n t o d e
va lo re s re p re s e n t a d o p o r la va ria b le .

Inicializar un Objeto
Co m o m e n cio n é a n t e rio rm e n t e , la s cla s e s p o rp o rcio n a n m é t o d o s
co n s t ru ct o re s p a ra in cia liza r lo s n u e vo s o b je t o s d e e s e t ip o . Un a cla s e
p o d ría p ro p o rcio n a r m ú lt ip le s co n s t ru ct o re s p a ra re a liza r d ife re n t e s t ip o s
d e in icia liza ció n e n lo s n u e vo s o b je t o s . Cu a n d o ve a s la im p le m e n t a ció n
d e u n a cla s e , re co n o ce rá s lo s co n s t ru ct o re s p o rq u e t ie n e n e l m is m o
n o m b re q u e la cla s e y n o t ie n e n t ip o d e re t o rn o . Re cu e rd a la cre a cció n
d e l o b je t o Da t e e n e l s e cció n in icia l. El co n s t ru ct o r u t iliza d o n o t e n ía
n in g ú n a rg u m e n t o :
Date()
Un co n s t ru ct o r q u e n o t ie n e n in g ú n a rg u m e n t o , co m o e l m o s t ra d o a rrib a ,
e s co n o cid o co m o co n s t ru ct o r p o r d e fe ct o . Al ig u a l q u e Da t e , la m a yo ría
d e la s cla s e s t ie n e n a l m e n o s u n co n s t ru ct o r, e l co n s t ru ct o r p o r d e fe ct o .
S i u n a cla s e t ie n e va rio s co n s t ru ct o re s , t o d o s e llo s t ie n e n e l m is m o
n o m b re p e ro s e d e b e n d ife re n cia r e n e l n ú m e ro o e l t ip o d e s u s
a rg m e n t o s . Ca d a co n s t ru ct o r in icia liza e l n u e vo o b je t o d e u n a fo rm a
d ife re n t e . Ju n t o a l co n s t ru ct o r p o r d e fe ct o , la cla s e Da t e p ro p o rcio n a o t ro
co n s t ru ct o r q u e in icia liza e l n u e vo o b je t o co n u n n u e vo a ñ o , m e s y d ia :
Date cumpleaños = new Date(1963, 8, 30);
El co m p ila d o r p u e d e d ife re n cia r lo s co n s t ru ct o re s a t ra vé s d e l t ip o y d e l
n ú m e ro d e s u s a rg u m e n t o s .

Oz it o
Utilizar Objetos
Un a ve z q u e s e h a cre a d o u n o b je t o , p ro b a b le m e n t e q u e rrá s h a ce r a lg o co n é l.
S u p ó n , p o r e je m p lo , q u e d e s p u é s d e cre a r u n n u e vo re ct á n g u lo , q u ie re s m o ve rlo a
u n a p o s ició n d ife re n t e ( e s d e cir, e l re ct á n g u lo e s u n o b je t o e n u n p ro g ra m a d e
d ib u jo y e l u s u a rio q u ie re m o ve rlo a o t ra p o s ició n d e la p á g in a ) .
La cla s e Re ct a n g le p ro p o rcio n a d o s fo rm a s e q u iva le n t e s d e m o ve r e l re ct á n g u lo :
1 . Ma n ip u la r d ire ct a m e n t e la s va ria b le s x e y d e l o b je t o .
2 . Lla m a r e l m é t o d o m o v e ( ) .
La o p ció n 2 s e co n s id e ra "m á s o rie n t a d a a o b je t o s " y m á s s e g u ra p o rq u e s e
m a n ip u la n la s va ria b le s d e l o b je t o in d ire ct a m e n t e a t ra vé s d e u n a ca p a p ro t e ct o ra
d e m é t o d o s , e n ve z d e m a n e ja rla s d ire ct a m e n t e . Ma n ip u la r d ire ct a m e n t e la s
va ria b le s d e u n o b je t o s e co n s id e ra p ro p e n s o a e rro re s ; s e p o d ría co lo ca r e l o b je t o
e n u n e s t a d o d e in co n s is t e n cia . S in e m b a rg o , u n a cla s e n o p o d ría ( y n o d e b e ría )
h a ce r q u e s u s va ria b le s e s t u vie ra n d is p o n ib le s p a ra la m a n ip u la ció n d ire ct a p o r
o t ro s o b je t o s , s i fu e ra p o s ib le q u e e s a s m a n ip u la cio n e s s it u a ra n e l o b je t o e n u n
e s t a d o d e in co n s is t e n cia . Ja va p ro p o rcio n a u n m e ca n is m o m e d ia n t e e l q u e la s
cla s e s p u e d e re s t rin g ir o p e rm it ir e l a cce s o a s u s va ria b le s y m é t o d o s a o t ro s
o b je t o s d e o t ro s t ip o s .
Es t a s e cció n e xp lica la lla m a d a a m é t o d o s y la m a n ip u la ció n d e va ria b le s q u e s e
h a n h e ch o a cce s ib le s a o t ra s cla s e s . Pa ra a p re n d e r m á s s o b re e l co n t ro l d e a cce s o
a m ie m b ro s p u e d e s ir Co n t ro la r e l Acce s o a Mie m b ro s d e u n a Cla s e .

La s va ria b le s x e y d e Re ct a n g le s o n a cce s ib le s d e s d e o t ra s cla s e s . Po r e s o


p o d e m o s a s u m ir q u e la m a n ip u la ció n d ire ct a d e e s t a s va ria b le s e s s e g u ra .

Referenciar Variables de un Objeto


Prim e ro , e n fo q u e m o s có m o in s p e ccio n a r y m o d ifica r la p o s ició n d e l
re ct á n g u lo m e d ia n t e la m a n ip u la ció n d ire ct a d e la s va ria b le s x e y . La
s ig u ie n t e s e cció n m o s t ra rá co m o m o ve r e l re ct á n g u lo lla m a n d o a l
m é todo m o v e ( ) .
Pa ra a cce d e r a la s va ria b le s d e u n o b je t o , s ó lo s e t ie n e q u e a ñ a d ir e l
n o m b re d e la va ria b le a l d e l o b je t o re fe re n cia d o in t ro d u cie n d o u n p u n t o
e n e l m e d io ( '. ') .
objetoReferenciado.variable
S u p ó n q u e t ie n e s u n re ct á n g u lo lla m a d o re c t e n t u p ro g ra m a . p u e d e s
a cce d e r a la s va ria b le s x e y co n re c t . x y re c t . y , re s p e ct iva m e n t e .
Ah o ra q u e ya t ie n e s u n n o m b re p a ra la s va ria b le s d e re c t , p u e d e s
u t iliza r e s e n o m b re e n s e n t e n cia s y e xp re s io n e s Ja va co m o s i fu e ra n
n o m b re s d e va ria b le s "n o rm a le s ". As í, p a ra m o ve r e l re ct á n g u lo a u n a
n u e va p o s ició n p o d ría s e s crib ir:
rect.x = 15; // cambia la posición x
rect.y = 37; // cambia la posición y
La cla s e Re ct a n g le t ie n e o t ra s d o s va ria b le s - - w id t h y h e ig h t - - q u e s o n
a cce s ib le s p a ra o b je t o s fu e ra d e Re ct a n g le . S e p u e d e u t iliza r la m is m a
n o t a ció n co n e lla s : re c t . w id t h y re c t . h e ig h t . En t o n ce s s e p u e d e
ca lcu la r e l á re a d e l re ct á n g u lo u t iliza n d o e s t a s e n t e n cia :
area = rect.height * rect.width;
Cu a n d o s e a cce d e a u n a va ria b le a t ra vé s d e u n o b je t o , s e e s t á
re firie n d o a la s va ria b le s d e u n o b je t o p a rt icu la r. S i c u b o fu e ra t a m b ié n
u n re ct á n g u lo co n u n a a lt u ra y a n ch u ra d ife re n t e s d e re c t , e s t a
in s t ru cció n :
area = cubo.height * cubo.width;
ca lcu la e l á re a d e u n re ct á n g u lo lla m a d o c u b o y d a rá u n re s u lt a d o
d ife re n t e q u e la in s t ru cció n a n t e rio r ( q u e ca lcu la b a e l á re a d e u n
re ct á n g u lo lla m a d o re c t ) .
Ob s e rva q u e la p rim e ra p a rt e d e l n o m b re d e u n a va ria b le d e u n o b je t o
( e l o b j e t o R e fe r e n c ia d o e n o b j e t o R e fe r e n c ia d o . v a r ia b le ) d e b e s e r
u n a re fe re n cia a u n o b je t o . Co m o s e p u e d e u t iliza r u n n o m b re d e
va ria b le a q u í, t a m b ié n s e p u e d e u t iliza r e n cu a lq u ie r e xp re s ió n q u e
d e vu e lva u n a re fe re n cia a u n o b je t o . Re cu e rd a q u e e l o p e ra d o r n e w
d e vu e lve u n a re fe re n cia a u n o b je t o . Po r e s o , s e p u e d e u t iliza r e l va lo r
d e vu e lt o p o r n e w p a ra a cce d e r a la s va ria b le s d e l n u e vo o b je t o :
height = new Rectangle().height;

Llamar a Métodos de un Objeto


Lla m a r a u n m é t o d o d e u n o b je t o e s s im ila r a o b t e n e r u n a va ria b le d e l
o b je t o . Pa ra lla m a r a u n m é t o d o d e l o b je t o , s im p le m e n t e s e a ñ a d e a l
n o m b re d e l o b je t o re fe re n cia d o e l n o m b re d e l m é t o d o , s e p a ra d o s p o r u n
p u n t o ( '. ') , y s e p ro p o rcio n a n lo s a rg u m e n t o s d e l m é t o d o e n t re
p a ré n t e s is . S i e l m é t o d o n o n e ce s it a a rg u m e n t o s , s e u t iliza n lo s
p a ré n t e s is va cio s .
objetoReferenciado.nombreMétodo(listaArgumentos);
o
objetoReferenciado.nombreMétodo();
Ve a m o s q u e s ig n ifica e s t o e n t é rm in o s d e m o vim ie n t o d e l re ct á n g u lo .
Pa ra m o ve r re c t a u n a n u e va p o s ició n u t iliza n d o e l m é t o d o m o v e ( )
e s crib e e s t o :
rect.move(15, 37);
Es t a s e n t e n cia Ja va lla m a a l m é t o d o m o v e ( ) d e re c t co n d o s
p a rá m e t ro s e n t e ro s , 1 5 y 3 7 . Es t a s e n t e n cia t ie n e e l e fe ct o d e m o ve r e l
o b je t o re c t ig u a l q u e s e h izo e n la s s e n t e n cia s a n t e rio re s e n la s q u e s e
m o fica b a n d ire ct a m e n t e lo s va lo re s x e y d e l o b je t o :
rect.x = 15;
rect.y = 37;
S i s e q u ie re m o ve r u n re ct á n g u lo d ife re n t e , u n o lla m a d o c u b o , la n u e va
p o s ició n s e p o d ría e s crib ir:
cubo.move(244, 47);
Co m o s e h a vis t o e n e s t o s e je m p lo s , la s lla m a d a s a m é t o d o s s e h a ce n
d ire ct a m e n t e a u n o b je t o e s p e cífico ; e l o b je t o e s p e cifica d o e n la lla m a d a
a l m é t o d o e s e l q u e re s p o n d e a la in s t ru cció n .
La s lla m a d a s a m é t o d o s t a m b ié n s e co n o ce n co m o m e n s a je s . Co m o e n la
vid a re a l, lo s m e n s a je s s e d e b e n d irig ir a u n re ce p t o r p a rt icu la r. S e
p u e d e n o b t e n e r d is t in t o s re s u lt a d o s d e p e n d ie n d o d e l re ce p t o r d e s u
m e n s a je . En e l e je m p lo a n t e rio r, s e h a e n via d o e l m e n s a je m o v e ( ) a l
o b je t o lla m a d o re c t p a ra q u e é s t e m u e va s u p o s ició n . Cu a n d o s e e n vía
e l m e n s a je m o v e ( ) a l o b je t o lla m a d o c u b o , e l q u e s e m u e ve e s c u b o .
S o n re s u lt a d o s m u y d is t in t o s .
Un a lla m a d a a u n m é t o d o e s u n a e xp re s ió n ( p u e d e s ve r Exp re s io n e s
p a ra m á s in fo rm a ció n ) y e va lú a a a lg ú n va lo r. El va lo r d e u n a lla m a d a a
u n m é t o d o e s s u va lo r d e re t o rn o , s i t ie n e a lg u n o . No rm a lm e n t e s e
a s ig n a rá e l va lo r d e re t o rn o d e u n m é t o d o a u n a va ria b le o s e u t iliza rá la
lla m a d a a l m é t o d o d e n t ro d e l á m b it o d e o t ra e xp re s ió n o s e n t e n cia .
El m é t o d o m o v e ( ) n o d e vu e lve n in g ú n va lo r ( e s t á d e cla ra d o co m o
v o id ) . S in e m b a rg o , e l m é t o d o in s id e ( ) d e Re ct a n g le s i lo h a ce . Es t e
m é t o d o t o m a d o s co o rd e n d a s x e y, y d e vu e lt e t ru e s i e s t e p u n t o e s t á
d e n t ro d e l re ct á n g u lo . S e p u e d e u t iliza r e l m é t o d o in s id e ( ) p a ra h a ce r
a lg o e s p e cia l e n a lg ú n p u n t o , co m o d e cir la p o s ició n d e l ra t ó n cu a n d o
e s t á d e n t ro d e l re ct a n g u lo :
if (rect.inside(mouse.x, mouse.y)) {
. . .
// ratón dentro del rectángulo
. . .
} else {
. . .
// ratón fuera del rectángulo
. . .
}
Re cu e rd a q u e u n a lla m a d a a u n m é t o d o e s u n m e n s a je a l o b je t o
n o m b ra d o . En e s t e ca s o , e l o b je t o n o m b ra d o e s re c t . En t o n ce s :
rect.inside(mouse.x, mouse.y)
le p re g u n t a a re c t s i la p o s ició n d e l cu rs o r d e l ra t ó n s e e n cu e n t ra e n t re
la s co o rd e n a d a s m o u s e . x y m o u s e . y . S e p o d ría o b t e n e r u n a re s p u e s t a
d ife re n t e s i e n vía e l m is m o m e n s a je a c u b o .
Co m o s e e xp licó a n t e rio rm e n t e , e l o b je t o Re fe re n c ia d o e n la lla m a d a a l
m é t o d o o b je t o Re fe re n c ia d o . m é t o d o ( ) d e b e s e r u n a re fe re n cia a u n
o b je t o . Co m o s e p u e d e u t iliza r u n n o m b re d e va ria b le a q u í, t a m b ié n s e
p u e d e u t iliza r e n cu a lq u ie r e xp re s ió n q u e d e vu e lva u n a re fe re n cia a u n
o b je t o . Re cu e rd a q u e e l o p e ra d o r n e w d e vu e lve u n a re fe re n cia a u n
o b je t o . Po r e s o , s e p u e d e u t iliza r e l va lo r d e vu e lt o p o r n e w p a ra a cce d e r
a la s va ria b le s d e l n u e vo o b je t o :
new Rectangle(0, 0, 100, 50).equals(anotherRect)
La e xp re s ió n n e w Re c t a n g le ( 0 , 0 , 1 0 0 , 5 0 ) e va lú a a u n a re fe re n cia a
u n o b je t o q u e s e re fie re a u n o b je t o Re ct a n g le . En t o n ce s , co m o ve rá s , s e
p u e d e u t iliza r la n o t a ció d e p u n t o ( '. ') p a ra lla m a r a l m é t o d o e q u a ls ( )
d e l n u e vo o b je t o Re ct a n g le p a ra d e t e rm in a r s i e l re ct a n g ú lo n u e vo e s
ig u a l a l e s p e cifica d o e n la lis t a d e a rg u m e n t o s d e e q u a ls ( ) .

Oz it o
Eliminar Objetos no Utilizados
Mu ch o s o t ro s le n g u a je s o rie n t a d o s a o b je t o s n e ce s it a n q u e s e s ig a la p is t a d e lo s
o b je t o s q u e s e h a n ce a d o y lu e g o s e d e s t ru ya n cu a n d o n o s e n e ce s it e n . Es crib ir
có d ig o p a ra m a n e ja r la m e m o ria d e e s t a e s fo rm a e s a b u rrid o y p ro p e n s o a
e rro re s . Ja va p e rm it e a h o rra rs e e s t o , p e rm it ié n d o cre a r t a n t o s o b je t o s co m o s e
q u ie ra ( s ó lo lim it a d o s p o r lo s q u e e l s is t e m a p u e d a m a n e ja r) p e ro n u n ca t ie n e n
q u e s e r d e s t ru id o s . El e n t o rn o d e e je cu ció n Ja va b o rra lo s o b je t o s cu a n d o
d e t e rm in a q u e n o s e va n a u t iliza r m á s . Es t e p ro ce s o e s co n o cid o co m o re co le cció n
d e b a s u ra .
Un o b je t o e s e le g ib le p a ra la re co le cció n d e b a s u ra cu a n d o n o e xis t e n m á s
re fe re n cia s a e s e o b je t o . La s re fe re n cia s q u e s e m a n t ie n e n e n u n a va ria b le
d e s a p a re ce n d e fo rm a n a t u ra l cu a n d o la va ria b le s a le d e s u á m b it o . O cu a n d o s e
b o rra e xp licit a m e n t e u n o b je t o re fe re n cia m e d ia n t e la s e le cció n d e u n va lo r cu yo
t ip o d e d a t o e s u n a re fe re n cia a n u ll.

Recolector de Basura
El e n t o rn o d e e je cu ció n d e Ja va t ie n e u n re co le ct o r d e b a s u ra q u e
p e rió d ica m e n t e lib e ra la m e m o ria o cu p a d a p o r lo s o b je t o s q u e n o s e va n
a n e ce s it a r m á s . El re co le ct o r d e b a s u ra d e Ja va e s u n b a rre d o r d e
m a rca s q u e e s ca n e a d in a m ica m e n t e la m e m o ria d e Ja va b u s ca n d o
o b je t o s , m a rca n d o a q u e llo s q u e h a n s id o re fe re n cia d o s . De s p u é s d e
in ve s t ig a r t o d o s lo s p o s ib le s p a t h s d e lo s o b je t o s , lo s q u e n o e s t á n
m a rca d o s ( e s t o e s , n o h a n s id o re fe re n cia d o s ) s e le s co n o ce co m o
b a s u ra y s o n e lim in a d o s .
El co le ct o r d e b a s u ra fu n cio n a e n u n t h re a d ( h ilo ) d e b a ja p rio rid a d y
fu n cio n a t a n t o s ín cro n a co m o a s ín cro n a m e n t e d e p e n d ie n d o d e la
s it u a ció n y d e l s is t e m a e n e l q u e s e e s t é e je cu t a n d o e l e n t o rn o Ja va .
El re co le ct o r d e b a s u ra s e e je cu t a s ín cro n a m e n t e cu a n d o e l s is t e m a
fu n cio n a fu e ra d e m e m o ria o e n re s p u e s t a a u n a p e t ició n d e u n
p ro g ra m a Ja va . Un p ro g ra m a Ja va le p u e d e p e d ir a l re co le ct o r d e b a s u ra
q u e s e e je cu t e e n cu a lq u ie r m o m e n t o m e d ia n e u n a lla m a d a a
S y s te m .g c( ) .
N o t a : Pe d ir q u e s e e je cu t e e l re co le ct o r d e b a s u ra n o g a ra n t iza q u e lo s
o b je t o s s e a n re co le ct a d o s .
En s is t e m a s q u e p e rm it e n q u e e l e n t o rn o d e e je cu ció n Ja va n o t e cu a n d o
u n t h re a d a e m p e za d o a in t e rru m p ir a o t ro t h re a d ( co m o Win d o ws
9 5 / NT) , e l re co le ct o r d e b a s u ra d e Ja va fu n cio n a a s ín cro m a m e n t e
cu a n d o e l s is t e m a e s t á o cu p a d o . Ta n p ro n t o co m o o t ro t h re a d s e vu e lva
a ct ivo , s e p e d ira a l re co le ct o r d e b a s u ra q u e o b t e n g a u n e s t a d o
co n s is t e n t e y t e rm in e .
Finalización
An t e s d e q u e u n o b je t o s e a re co le ct a d o , e l re co le ct o r d e b a s u ra le d a
u n a o p o rt u n id a d p a ra lim p ia rs e é l m is m o m e d ia n t e la lla m a d a a l m é t o d o
fin a liz e ( ) d e l p ro p io o b je t o . Es t e p ro ce s o e s co n o cid o co m o fin a liza ció n .
Du ra n t e la fin a liza ció n u n o b je t o s e p o d ría n lib e ra r lo s re cu rs o s d e l
s is t e m a co m o s o n lo s fich e ro s , e t c y lib e ra r re fe re n cia s e n o t ro s o b je t o s
p a ra h a ce rs e e le g ib le p o r la re co le cció n d e b a s u ra .
El m é t o d o fin a liz e ( ) e s u n m ie m b ro d e la cla s e ja va . la n g . Ob je ct . Un a
cla s e d e b e s o b re e s crib ir e l m é t o d o fin a liz e ( ) p a ra re a liza r cu a lq u ie r
fin a liza ció n n e ce s a ria p a ra lo s o b je t o s d e e s e t ip o .

Oz it o
Declarar Clases
Ah o ra q u e ya s a b e m o s co m o cre a r, u t iliza r y d e s t ru ir o b je t o s , e s h o ra d e a p re n d e r có m o e s crib ir cla s e s
d e la s q u e cre a r e s o s o b je t o s .
Un a cla s e e s u n p ro ye ct o o p ro t o t ip o q u e s e p u e d e u t iliza r p a ra cre a r m u ch o s o b je t o s . La im p le m e n t a ció n
d e u n a cla s e co m p re n d e d o s co m p o n e n t e s : la d e cla ra ció n y e l cu e rp o d e la cla s e :
DeclaraciónDeLaClase {
CuerpoDeLaClase
}

La Declaración de la Clase
Co m o m ín im o , la d e cla ra ció n d e u n a cla s e d e b e co n t e n e r la p a la b ra cla ve c la s s y e l n o m b re d e
la cla s e q u e e s t á d e fin ie n d o . As í la d e cla ra ció n m á s s e n cilla d e u n a cla s e s e p a re ce ría a e s t o :
class NombredeClase {
. . .
}
Po r e je m p lo , e s t a cla s e d e cla ra u n a n u e va cla s e lla m a d a Nu m e ro Im a g in a rio :
class NumeroImaginario {
. . .
}
Lo s n o m b re s d e la s cla s e s d e b e n s e r u n id e n t ifica d o r le g a l d e Ja va y, p o r co n ve n ció n , d e b e n
e m p e za r p o r u n a le t ra m a yú s cu la . Mu ch a s ve ce s , t o d o lo q u e s e n e ce s it a rá s e rá u n a
d e cla ra ció n m ín im a . S in e m b a rg o , la d e cla ra ció n d e u n a cla s e p u e d e d e cir m á s co s a s s o b re la
cla s e . Má s e s p e cifica m e n t e , d e n t ro d e la d e cla ra ció n d e la cla s e s e p u e d e :
● d e cla ra r cu a l e s la s u p e rcla s e d e la cla s e .

● lis t a r lo s in t e rfa ce s im p le m e n t a d o s p o r la cla s e

● d e cla ra r s i la cla s e e s p ú b lica , a b s t ra ct a o fin a l

Declarar la Superclase de la Clase


En Ja va , t o d a s la s cla s e s t ie n e n u n a s u p e rcla s e . S i n o s e e s p e cifica u n a s u p e rcla s e p a ra u n a
cla s e , s e a s u m e q u e e s la cla s e Ob je ct ( d e cla ra d a e n ja va . la n g ) . En t o n ce s la s u p e rcla s e d e
Nu m e ro Im a g in a rio e s Ob je ct p o rq u e la d e cla ra ció n n o e xp licit ó n in g u n a o t ra cla s e . Pa ra
o b t e n e r m á s in fo rm a ció n s o b re la cla s e Ob je ct , p u e d e ve r La cla s e Ob je ct .
Pa ra e s p e cifica r e xp lícit a m e n t e la s u p e rcla s e d e u n a cla s e , s e d e b e p o n e r la p a la b ra cla ve
e x t e n d s m á s e l n o m b re d e la s u p e rcla s e e n t re e l n o m b re d e la cla s e q u e s e h a cre a d o y e l
co rch e t e a b ie rt o q u e a b re e l cu e rp o d e la cla s e , a s í:
class NombredeClase extends NombredeSuperClase {
. . .
}
Po r e je m p lo , s u p o n q u e q u ie re s q u e la s u p e rcla s e d e Nu m e ro Im a g in a rio s e a la cla s e Nu m b e r
e n ve z d e la cla s e Ob je ct . S e p o d ró a e s crib ir e s t o :
class NumeroImaginario extends Number {
. . .
}
Es t o d e cla ra e xp lícit a m e n t e q u e la cla s e Nu m b e r e s la s u p e rcla s e d e Nu m e ro Im a g in a rio . ( La
cla s e Nu m b e r e s p a rt e d e l p a q u e t e ja va . la n g y e s la b a s e p a ra lo s e n t e ro s , lo s n ú m e ro s e n
co m a flo t a n t e y o t ro s n ú m e ro s ) .
De cla ra r q u e Nu m b e r e s la s u p e rcla s e d e Nu m e ro Im a g in a rio d e cla ra im p lícit a m e n t e q u e
Nu m e ro Im a g in a rio e s u n a s u b cla s e d e Nu m b e r. Un a s u b cla s e h e re d a la s va ria b le s y lo s
m é t o d o s d e s u s u p e rcla s e .
Cre a r u n a s u b cla s e p u e d e s e r t a n s e n cillo co m o in clu ir la cla u s u la e x t e n d s e n s u d e cla ra ció n
d e cla s e . S in e m b a rg o , s e t e n d rá n q u e h a ce r o t ra s p ro vis io n e s e n s u có d ig o cu a n d o s e cre a u n a
s u b cla s e , co m o s o b re e s crib ir m é t o d o s . Pa ra o b t e n e r m á s in fo rm a ció n s o b re la cre a cció n d e
s u b cla s e s , p u e d e ve r S u b cla s e s , S u p e rcla s e s , y He re n cia .

Listar los Interfaces Implementados por la Clase


Cu a n d o s e d e cla ra u n a cla s e , s e p u e d e e s p e cifica r q u e in t e rfa ce , s i lo h a y, e s t á im p le m e n t a d o
p o r la cla s e . Pe ro , ¿ Qu é e s u n in t e rfa ce ? Un in t e rfa ce d e cla ra u n co n ju n t o d e m é t o d o s y
co n s t a n t e s s in e s p e cifica r s u im p le m e n t a ció n p a ra n in g ú n m é t o d o . Cu a n d o u n a cla s e e xig e la
im p le m e n t a ció n d e u n in t e rfa ce , d e b e p ro p o rcio n a r la im p le m e n t a ció n p a ra t o d o s lo s m é t o d o s
d e cla ra d o s e n e l in t e rfa ce .
Pa ra d e cla ra r q u e u n a cla s e im p le m e n t a u n o o m á s in t e rfa ce s , s e d e b e u t iliza r la p a la b ra cla ve
im p le m e n t s s e g u id a p o r u n a lis t a d e lo s in t e rfa ce s im p le m e n t a d o s p o r la cla s e d e lim it a d a p o r
co m a s . Po r e je m p lo , im a g in a u n in t e rfa ce lla m a d o Arit m e t ico q u e d e fin e lo s m é t o d o s lla m a d o s
s u m a ( ) , re s t a ( ) , e t c. . . La cla s e Nu m e ro Im a g in a rio p u e d e d e cla ra r q u e im p le m e n t a e l
in t e rfa ce Arit m e t ico d e e s t a fo rm a :
class NumeroImaginario extends Number implements Aritmetico {
. . .
}
s e d e b e g a ra n t iza r q u e p ro p o cio n a la im p le m e n t a ció n p a ra lo s m é t o d o s s u m a ( ) , re s t a ( ) y
d e m á s m é t o d o s d e cla ra d o s e n e l in t e rfa ce Arit m e t ico . S i e n Nu m e ro Im a g in a rio fa lt a a lg u n a
im p le m e n t a ció n d e lo s m é t o d o s d e fin id o s e n Arit m e t ico , e l co m p ila d o r m o s t ra rá u n m e n s a je d e
e rro r y n o co m p ila rá e l p ro g ra m a :
nothing.java:5: class NumeroImaginario must be declared abstract. It does not define
java.lang.Number add(java.lang.Number, java.lang.Number) from interface Aritmetico.
class NumeroImaginario extends Number implements Aritmetico {
^
Po r co n ve n ció n , la cla u s u la im p le m e n t s s ig u e a la cla u s u la e x t e n d s s i é s t a e xis t e .
Ob s e rva q u e la s firm a s d e lo s m é t o d o s d e cla ra d o s e n e l in t e rfa ce Arit m e t ico d e b e n
co rre s p o n d e r co n la s firm a s d e lo s m é t o d o s im p le m e n t a d o s e n la cla s e Nu m e ro Im a g in a rio .
Tie n e s m á s in fo rm a ció n s o b re có m o cre a r y u t iliza r in t e rfa ce s e n Cre a r y Ut iliza r In t e rfa ce s .

Clases Public, Abstract, y Final


S e p u e d e u t iliza r u n o d e e s t o s t re s m o d ifica d o re s e n u n a d e cla ra ció n d e cla s e p a ra d e cla ra r q u e
e s a cla s e e s p ú b lica , a b s t ra ct a o fin a l. Lo s m o d ifica d o re s va n d e la n t e d e la p a la b ra cla ve c la s s
y s o n o p cio n a le s .
El m o d ifica d o r p u b lic d e cla ra q u e la cla s e p u e d e s e r u t iliza d a p o r o b je t o s q u e e s t é n fu e ra d e l
p a q u e t e a ct u a l. Po r d e fe ct o , u n a cla s e s ó lo p u e d e s e r u t iliza p o r o t ra s cla s e s d e l m is m o
p a q u e t e e n e l q u e e s t á n d e cla ra d a s .
public class NumeroImaginario extends Number implements Aritmetico {
. . .
}
Po r co n ve n ció n , cu a n d o s e u t iliza la p a la b ra p u b lic e n u n a d e cla ra ció n d e cla s e d e b e m o s
a s e g u ra rn o s d e q u e e s e l p rim e r it e m d e la d e cla ra ció n .
El m o d ifica d o r a b s t ra c t d e cla ra q u e la cla s e e s u n a cla s e a b s t ra ct a . Un a cla s e a b s t ra ct a p o d ría
co n t e n e r m é t o d o s a b s t ra ct o s ( m é t o d o s s in im p le m e n t a ció n ) . Un a cla s e a b s t ra ct a e s t á d is e ñ a d a
p a ra s e r u n a s u p e rcla s e y n o p u e d e e je m p la riza rs e . Pa ra u n a d is cu s ió n s o b re la s cla s e s
a b s t ra ct a s y có m o e s crib irla s p u e d e s ve r Es crib ir Cla s e s y Mé t o d o s Ab s t ra ct o s .
Ut iliza n d o e l m o d ifica d o r fin a l s e p u e d e d e cla ra r q u e u n a cla s e e s fin a l, q u e n o p u e d e t e n e r
s u b cla s e s . Exis t e n ( a l m e n o s ) d o s ra zo n e s p o r la s q u e s e p o d ría q u e re r h a ce r e s t o : ra zo n e s d e
s e g u rid a d y ra zo n e s d e d is e ñ o . Pa ra u n m e jo r e xp lica ió n s o b re la s cla s e s fin a le s p u e d e s ve r
Es crib ir Cla s e s y Mé t o d o s Fin a le s .
Ob s e rva q u e n o t ie n e s e n t id o p a ra u n a cla s e s e r a b s t ra ct a y fin a l. En o t ra s p a la b ra s , u n a cla s e
q u e co n t e n g a m é t o d o s n o im p le m e n t a d o s n o p u e d e s e r fin a l. In t e n t a r d e cla ra r u n a cla s e co m o
fin a l y a b s t ra ct a re s u lt a rá e n u n e rro r e n t ie m p o d e co m p ila ció n .

Sumario de la Daclaración de una Clase


En s u m a , u n a d e cla ra ció n d e cla s e s e p a re ce ría a e s t o :
[ modificadores ] class NombredeClase [ extends NombredeSuperclase ]
[ implements NombredeInterface ] {
. . .
}
Lo s p u n t o s e n t re [ y ] s o n o p cio n a le s . Un a d e cla ra ció n d e cla s e d e fin e lo s s ig u ie n t e s a s p e ct o s
d e u n a cla s e :
● m o d ific a d o re s d e cla ra n s i la cla s e e s a b s t ra ct a , p ú b lica o fin a l.

● N o m b re d e Cla s e s e le ccio n a e l n o m b re d e la cla s e q u e e s t á d e cla ra n d o

● N o m b re d e S u p e rCla s e e s e l n o m b re d e la s u p e rcla s e d e No m b re d e Cla s e

● N o m b re d e I n t e rfa c e e s u n a lis t a d e lim it a d a p o r co m a s d e lo s in t e rfa ce s im p le m e n t a d o s


p o r No m b re d e Cla s e
De t o d o s e s t o s it e m s , s ó lo la p a la b ra cla ve c la s s y e l n o m b re d e la cla s e s o n n e ce s a rio s . Lo s
o t ro s s o n o p cio n a le s . S i n o s e re a liza n in g u n a d e cla ra ció n e xp lícit a p a ra lo s it e m s o p cio n a le s , e l
co m p ila d o r Ja va a s u m e cie rt o s va lo re s p o r d e fe ct o ( u n a s u b cla s e d e Ob je ct n o fin a l, n o p ú b lica ,
n o o b s t ra ct a y q u e n o im p le m e n t a in t e rfa ce s ) .

Oz it o
El Cuerpo de la Clase
An t e rio rm e n t e s e vió u n a d e s crip ció n g e n e ra l d e la im p le m e n t a ció n d e u n a cla s e :
DeclaraciondeClase {
CuerpodeClase
}
La p á g in a a n t e rio r d e s crib e t o d o s lo s co m p o n e n t e s d e la d e cla ra ció n d e u n a cla s e .
Es t a p á g in a d e s crib e la e s t ru ct u ra g e n e ra l y la o rg a n iza ció n d e l cu e rp o d e la cla s e .
El cu e rp o d e la cla s e co m p o n e la im p le m e n t a ció n d e la p ro p ia cla s e y co n t ie n e d o s
s e ccio n e s d ife re n t e s : la d e cla ra ció n d e va rib le s y la d e m é t o d o s . Un a va ria b le
m ie m b ro d e la cla s e re p re s e n t a u n e s t a d o d e la cla s e y s u s m é t o d o s im p le m e t a n e l
co m p o rt a m ie n d o d e la cla s e . De n t ro d e l cu e rp o d e la cla s e s e d e fin e n t o d a s la s
va ria b le s m ie m b ro y lo s m é t o d o s s o p o rt a d o s p o r la cla s e .
Típ ica m e n t e , p rim e ro s e d e cla ra n la s va ria b le s m ie m b ro d e la cla s e y lu e g o s e
p o rp o rcio n a la s d e cla ra cio n e s e im p le m e n t a n cio n e s d e lo s m é t o d o s , a u n q u e e s t e
o rd e n n o e s n e ce s a rio .
DeclaracióndeClase {
DeclaracionesdeVariablesMiembros
DeclaracionesdeMétodos
}
Aq u í t ie n e s u n a p e q u e ñ a cla s e q u e d e cla ra t re s va ria b le s m ie m b ro y u n m é t o d o :
class Ticket {
Float precio;
String destino;
Date fechaSalida;
void firma(Float forPrecio, String forDestino, Date forFecha) {
precio = forPrecio;
destino = forDestino;
fechaSalida = forFecha;
}
}
Pa ra m á s in fo rm a ció n s o b re có m o d e cla ra r va ria b le s m ie m b ro , p u e d e s ve r De cla ra r
Va ria b le s Mie m b ro . Y p a ra o b t e n e r m á s in fo rm a ció n s o b re có m o im p le m e n t a r
m é t o d o s , p u e d e s ve r Im p le m e n t a r Mé t o d o s .

Ad e m á s d e la s va ria b le s m ie m b ro y lo s m é t o d o s q u e s e d e cla ra n e xp lícit a m e n t e


d e n t ro d e l cu e rp o d e la cla s e , u n a cla s e p u e d e h e re d a r a lg o d e s u s u p e rcla s e . Po r
e je m p lo , t o d a s la s cla s e s d e l e n t o rn o Ja va s o n u n a d e s ce n d e n cia ( d ire ct a o
in d ire ct a ) d e la cla s e Ob je ct . La cla s e Ob je ct d e fin e e l e s t a d o b á s ico y e l
co m p o rt a m ie t o q u e t o d o s lo s o b je t o s d e b e n t e n e r co m o h a b ilid a d p a ra co m p a ra r
u n o s o b je t o s co n o t ro s , p a ra co n ve rt ir u n a ca d e n a , p a ra e s p e ra r u n a co n d ició n
va ria b le , p a ra n o t ifica r a o t ro s o b je t o s q u e u n a co n d ició n va ria b le h a ca m b ia d o ,
e t c. . . As í, co m o d e s ce n d e n t e s d e e s t a cla s e , t o d o s lo s o b je t o s d e l e n t o rn o Ja va
h e re d a n s u s co m p o rt a m ie n t o s d e la cla s e Ob je ct .

Oz it o
Declarar Variables Miembro
Co m o m ín im o , u n a d e cla ra ció n d e va ria b le m ie m b ro t ie n e d o s co m p o n e n t e s : e l t ip o d e d a t o y e l
n o m b re d e la va ria b le .
tipo nombreVariable; // Declaración mínima de una variable miembro
Un a d e cla ra ció n m ín im a d e va ria b le m ie m b ro e s co m o la d e cla ra ció n d e va ria b le s q u e s e e s crib e e n
cu a lq u ie r o t ro lu g a r d e u n p ro g ra m a Ja va , co m o la s va ria b le s lo ca le s o p a rá m e t ro s d e m é t o d o s . El
s ig u ie n t e có d ig o d e cla ra u n a va ria b le m ie m b ro e n t e ra lla m a d a u n En t e ro d e n t ro d e la cla s e
Cla s e En t e ro s .
class ClaseEnteros {
int unEntero;
. . .
// define los métodos aquí
. . .
}
Ob s e rva q u e la d e cla ra ció n d e va ria b le s m ie m b ro a p a re ce d e n t ro d e la im p le m e n t a ció n d e l cu e rp o
d e la cla s e p e ro n o d e n t ro d e u n m é t o d o . Es t e p o s icio n a m ie n t o d e n t ro d e l cu e rp o d e la cla s e
d e t e rm in a q u e u n a va ria b le e s u n a va ria b le m ie m b ro .
Al ig u a l q u e o t ra s va ria b le s e n Ja va , la s va ria b le s m ie m b ro d e b e n t e n e r u n t ip o . Un t ip o d e va ria b le
d e t e rm in a lo s va lo re s q u e p u e d e n s e r a s ig n a d o s a la s va ria b le s y la s o p e ra cio n e s q u e s e p u e d e n
re a liza r co n e lla s . Ya d e b e ría s e s t a r fa m ilia riza d o co n lo s t ip o s d e d a t o s e n Ja va m e d ia n t e la le ct u ra
d e la le cció n a n t e rio r: Va ria b le s y Tip o s d e Da t o s .

Un n o m b re d e u n a va ria b le m ie m b ro p u e d e s e r cu a lq u ie r id e n t ifica d o r le g a l d e Ja va y p o r
co n ve n ció n e m p ie za co n u n a le t ra m in ú s cu la ( lo s n o m b re s d e cla s e t íp ica m e n t e e m p ie za n co n u n a
le t ra m a yú s cu la ) . No s e p u e d e d e cla ra r m á s d e u n a va ria b le co n e l m is m o n o m b re e n la m is m a
cla s e . Po r e je m p lo , e l s ig u ie n t e có d ig o e s le g a l:
class ClaseEnteros {
int unEntero;
int unEntero() { // un método con el mismo nombre que una variable
. . .
}
}
Ju n t o co n e l n o m b re y e l t ip o , s e p u e d e n e s p e cifica r va rio s a t rib u t o s p a ra la s va ria b le s m ie m b ro
cu a n d o s e la s d e cla ra : in clu ye n d o s i lo s o b je t o s p u e d e n a cce d e r a la va ria b le , s i la va ria b le e s u n a
va ria b le d e cla s e o u n a va ria b le d e e je m p la r, y s i la va ria b le e s u n a co n s t a n t e .
Un a d e cla ra ció n d e va ria b le s e p o d ría p a re ce r a e s t o :
[especificadordeAcceso] [static] [final] [transient] [volatile] tipo nombredeVaraible
Lo s p u n t o s e n t re [ y ] s o n o p cio n a le s . Lo it e m s e n n e g rit a s e d e b e n re e m p la za r p o r p a la b ra s cla ve o
p o r n o m b re s .
Un a d e cla ra ció n d e va ria b le m ie m b ro d e fin e lo s s ig u ie n t e s a s p e ct o s d e la va ria b le :
● e s p e c ific a d o rd e Ac c e s o d e fin e s i o t ra s cla s e s t ie n e n a cce s o a la va ria b le . S e p u e d e co n t ro la r
e l a cce s o a lo s m é t o d o s u t iliza n d o lo s m is m o s e s p e cifica d o re s , p o r e s o Co n t ro la r e l Acce s o a
Va ria b le s Mie m b ro d e u n a Cla s e cu b re có m o s e p u e d e co n t ro la r e l a cce s o a la s va ria b le s
m ie m b ro o lo s m é t o d o s .
● s t a t ic in d ica q u e la va ria b le e s u n a va ria b le m ie m b ro d e la cla s e e n o p o s ició n a u n a va ria b le
m ie m b ro d e l e je m p la r. S e p u e d e u t iliza r s t a t ic p a ra d e cla ra r m é t o d o s d e cla s e . Mie m b ro s d e
Cla s e y d e Eje m p la r e xp lica la d e cla ra ció n d e va ria b le s d e cla s e y d e e je m p la r y e s crib ir
m é t o d o s d e e je m p la r o d e cla s e .
● fin a l in d ica q u e la va ria b le e s u n a co n s t a n t e
● t ra n s ie n t la va ria b le n o e s u n a p a rt e p e rs is t e n t e d e l e s t a d o d e l o b je t o
● v o la t ile s ig n ifica q u e la va ria b le e s m o d ifica d a d e fo rm a a s ín cro n a .

La e xp lica ció n d e la s va ria b le s fin a l, t ra n s ie n t , y vo la t ile vie n e a h o ra :

Declarar Constantes
Pa ra cre a r u n a va ria b le m ie m b ro co n s t a n t e e n Ja va s e d e b e u t iliza r la p a la b ra cla ve fin a l
e n s u d e cla ra ció n d e va ria b le . La s ig u ie n t e d e cla ra ció n d e fin e u n a co n s t a n t e lla m a d a
AVOGADRO cu yo va lo r e s e l n ú m e ro d e Avo g a d ro ( 6 . 0 2 3 x 1 0 ^ 2 3 ) y n o p u e d e s e r
ca m b ia d o :
class Avo {
final double AVOGADRO = 6.023e23;
}
Po r co n ve n ció n , lo s n o m b re s d e lo s va lo re s co n s t a n t e s s e e s crib e n co m p le t a m e n e e n
m a yú s cu la s . S i u n p ro g ra m a in t e n t a ca m b ia r u n a va ria b le , e l co m p ila d o r m u e s t ra u n
m e n s a je d e e rro r s im ila r a l s ig u ie n t e , y re h u s a a co m p ila r s u p ro g ra m a .
AvogadroTest.java:5: Can't assign a value to a final variable: AVOGADRO

Declarar Variables Transitorias


Po r d e fe ct o , la s va ria b le s m ie m b ro s o n u n a p a rt e p e rs is t e n t e d e l e s t a d o d e u n o b je t o , La s
va ria b le s q u e fo rm a n p a rt e p e rs is t e n t e d e l e s t a d o d e l o b je t o d e b e g u a rd a rs e cu a n d o e l
o b je t o s e a rch iva . S e p u e d e u t iliza r la p a la b ra cla ve t ra n s ie n t p a ra in d ica r a la m á q u in a
virt u a l Ja va q u e la va ria b le in d ica d a n o n o e s u n a p a rt e p e rs is t e n t e d e l o b je t o .
Al ig u a l q u e o t ro s m o d ifica d o rs d e va ria b le s e n e l s is t e m a Ja va , s e p u e d e u t iliza r
t ra n s ie n t e n u n a cla s e o d e cla ra ció n d e va ria b le d e e je m p la r co m o e s t a :
class TransientExample {
transient int hobo;
. . .
}
Es t e e je m p lo d e cla ra u n a va ria b le e n t e ra lla m d a h o b o q u e n o e s u n a p a rt e p e rs is t e n t e d e l
e s t a d o d e la cla s e Tra n s ie n t Exa m p le .

Declarar Variables Volatiles


S i u n a cla s e co n t ie n e u n a va ria b le m ie m b ro q u e e s m o d ifica d a d e fo rm a a s ín cro n a ,
m e d ia n t e la e je cu ció n d e t h re a d s co n cu rre n t e s , s e p u e d e u t iliza r la p a la b ra cla ve v o la t ile
d e Ja va p a ra n o t ifica r e s t o a l s is t e m a Ja va .
La s ig u ie n t e d e cla ra ció n d e va ria b le e s u n e je m p lo d e co m o d e cla ra r q u e u n a va ria b le va a
s e r m o d ifica d a d e fo rm a a s ín cro n a p o r t h re a d s co n cu rre n t e s :
class VolatileExample {
volatile int contador;
. . .
}

Oz it o
Implementación de Métodos
S im ila rm e n t e a la im p le m e n t a ció n d e u n a cla s e , la im p le m e n t a ció n d e u n m é t o d o co n s is t e e n d o s
p a rt e s , la d e cla ra ció n y e l cu e rp o d e l m é t o d o .
declaracióndeMétodo {
cuerpodeMétodo
}

La Declaración de Método
Un a d e cla ra ció n d e m é t o d o p ro p o rcio n a m u ch a in fo rm a ció n s o b re e l m é t o d o a l
co m p ila d o r, a l s is t e m a e n t ie m p o d e e je cu ció n y a o t ra s cla s e s y o b je t o s . Ju n t o co n e l
n o m b re d e l m é t o d o , la d e cla ra ció n lle va in fo rm a ció n co m o e l t ip o d e re t o rn o d e l
m é t o d o , e l n ú m e ro y e l t ip o d e lo s a rg u m e n t o s n e ce s a rio s , y q u é o t ra s cla s e s y o b je t o s
p u e d e n lla m a r a l m é t o d o .
Lo s ú n ico s e le m e n t o s n e ce s a rio s u n a d e cla ra ció n d e m é t o d o s o n e l n o m b re y e l t ip o d e
re t o rn o d e l m é t o d o . Po r e je m p lo , e l có d ig o s ig u ie n t e d e cla ra u n m é t o d o lla m a d o
e s t a Va c io ( ) e n la cla s e Pila q u e d e vu e lve u n va lo r b o o le a n o ( t ru e o fa ls e ) :
class Pila {
. . .
boolean estaVacio() {
. . .
}
}

Devolver un Valor desde un Método


Ja va n e ce s it a q u e u n m é t o d o d e cla re e l t ip o d e d a t o d e l va lo r q u e d e vu e lve . S i u n
m é t o d o n o d e vu e lve n in g ú n va lo r, d e b e s e r d e cla ra d o p a ra d e vo lve r v o id ( n u lo ) .
Lo s m é t o d o s p u e d e n d e vo lve r t ip o s d e d a t o s p rim it ivo s o t ip o s d e d a t o s d e re fe re n cia . El
m é t o d o e s t a Va c io ( ) d e la cla s e Pila d e vu e lve u n t ip o d e d a t o p rim it ivo , u n va lo r
b o o le a n o :
class Pila {
static final int PILA_VACIA = -1;
Object[] stackelements;
int topelement = PILA_VACIA;
. . .
boolean estaVacio() {
if (topelement == PILA_VACIA)
return true;
else
return false;
}
}
S in e m b a rg o , e l m é t o d o p o p d e la cla s e PILA d e vu e lve u n t ip o d e d a t o d e re fe re n cia : u n
o b je t o .
class Pila {
static final int PILA_VACIA = -1;
Object[] stackelements;
int topelement = PILA_VACIA;
. . .
Object pop() {
if (topelement == PILA_VACIA)
return null;
else {
return stackelements[topelement--];
}
}
}
Lo s m é t o d o s u t iliza n e l o p e ra d o r re t u rn p a ra d e vo lve r u n va lo r. To d o m é t o d o q u e n o
s e a d e cla ra d o co m o v o id d e b e co n t e n e r u n a s e n t e n cia re t u rn .
El t ip o d e d a t o d e l va lo r d e vu e lt o p o r la s e n t e n cia re t u rn d e b e co rre s p o n d e r co n e l t ip o
d e d a t o q u e e l m é t o d o t ie n e q u e d e vo lve r; n o s e p u e d e d e vo lve r u n o b je t o d e s d e u n
m é t o d o q u e fu e d e cla ra d o p a ra d e vo lve r u n e n t e ro .
Cu a n d o s e d e vu e lva u n o b je t o , e l t ip o d e d a t o d e l o b je t o d e vu e lt o d e b e s e r u n a
s u b cla s e o la cla s e e xa ct a in d ica d a . Cu a n d o s e d e vu e lva u n t ip o in t e rfa ce , e l o b je t o
re t o rn a d o d e b e im p le m e n t a r e l in t e rfa ce e s p e cifica d o .

Un Nombre de Método
Un n o m b re d e m é t o d o p u e d e s e r cu a lq u ie r in d e n t ifica d o r le g a l e n Ja va . Exis t e n t re s
ca s o s e s p e cia le s a t e n e r e n cu e n t a co n lo s n o m b re s d e m é t o d o s :
1 . Ja va s o p o rt a la s o b re ca rg a d e m é t o d o s , p o r e s o va rio s m é t o d o s p u e d e n co m p a rt ir
e l m is m o n o m b re . Po r e je m p lo , s u p o n q u e s e h a e s crit o u n a cla s e q u e p u e d e
p ro p o rcio n a r va rio s t ip o s d e d a t o s ( ca d e n a s , e n t e ro s , e t c. . . ) e n u n á re a d e d ib u jo .
S e p o d ría e s crib ir u n m é t o d o q u e s u p ie ra co m o t ra t a r a ca d a t ip o d e d a t o . En o t ro s
le n g u a je s , s e t e n d ría q u e p e n s a r u n n o m b re d is t in t o p a ra ca d a u n o d e lo s
m é t o d o s . d ib u ja Ca d e n a ( ) , d ib u ja En t e ro , e t c. . . En Ja va , s e p u e d e u t iliza r e l
m is m o n o m b re p a ra t o d o s lo s m é t o d o s p a s á n d o le u n t ip o d e p a rá m e t ro d ife re n t e a
ca d a u n o d e lo s m é t o d o s . En t o n ce s e n la cla s e d e d ib u jo , s e p o d rá n d e cla ra r t re s
m é t o d o s lla m a d o s d ra w < ( ) y q u e ca d a u n o a ce p t a ra u n t ip o d e p a rá m e t ro
d ife re n t e :
class DibujodeDatos {
void draw(String s) {
. . .
}
void draw(int i) {
. . .
}
void draw(float f) {
. . .
}
}
N o t a : La in fo rm a ció n q u e h a y d e n t ro d e lo s p a ré n t e s is d e la d e cla ra ció n s o n lo s
a rg u m e n t o s d e l m é t o d o . Lo s a rg u m e n t o s s e cu b re n e n la s ig u ie n t e p á g in a : Pa s a r
In fo rm a ció n a u n Mé t o d o .
Lo s m é t o d o s s o n d ife re n cia d o s p o r e l co m p ila d o r b a s á n d o s e e n e l n ú m e ro y t ip o d e
s u s a rg u m e n t o s . As í d ra w ( S t rin g s ) y d ra w ( in t i) s o n m é t o d o s d is t in t o s y ú n ico s .
No s e p u e d e d e cla ra r u n m é t o d o co n la m is m a firm a : d ra w ( S t rin g s ) y
d ra w ( S t rin g t ) s o n id é n t ico s y d a rá n u n e rro r d e l co m p ila d o r.
Ha b rá s o b s e rva d o q u e lo s m é t o d o s s o b re ca rg a d o s d e b e n d e vo lve r e l m is m o t ip o d e
d a t o , p o r e s o v o id d ra w ( S t rin g s ) y in t d ra w ( S t rin g t ) d e cla ra d o s e n la m is m a
cla s e p ro d u cirá n u n e rro r e n t ie m p o d e co m p ila ció n .
2 . To d o m é t o d o cu yo n o m b re s e a ig u a l q u e e l d e s u cla s e e s u n c o n s t ru c t o r y t ie n e
u n a t a re a e s p e cia l q u e re a liza r. Lo s co n s t ru ct o re s s e u t iliza n p a ra in icia liza r u n
o b je t o n u e vo d e l t ip o d e la cla s e . Lo s co n s t ru ct o re s s ó lo p u e d e n s e r lla m a d o s co n
e l o p e ra d o r n e w . Pa ra a p re n d e r có m o e s crib ir u n co n s t ru ct o r, p u e d e s ve r Es crib ir
u n Mé t o d o Co n s t ru ct o r.
3 . Un a cla s e p u e d e s o b re e s crib ir u n m é t o d o d e s u s s u p e rcla s e s . El m é t o d o q u e
s o b re e s crib e d e b e t e n e r e l m is m o , n o m b re , t ip o d e re t o rn o y lis t a d e p a rá m e t ro s
q u e e l m é t o d o a l q u e h a s o b re e s crit o . S o b re e s crib ir Mé t o d o s t e e n s e ñ a rá co m o
s o b re e s crib ir lo s m é t o d o s d e u n a s u p e rcla s e .

Caractersiticas Avanzadas de la Declaración de Métodos


Ju n t o co n lo s d o s e le m e n t o s n e ce s a rio s , u n a d e cla ra ció n d e m é t o d o p u e d e co n t e n e r
o t ro s e le m e n t o s . Es t o s e le m e n t o s d e cla ra n lo s a rg u m e n t o s a ce p t a d o s p o r e l m é t o d o , s i
e l m é t o d o e s u n m é t o d o d e cla s e , e t c. . .
Ju n t á n d o lo t o d o , u n a d e cla ra ció n d e m é t o d o s e p a re ce ría a e s t o :
[especificadordeAcceso] [static] [abstract] [final] [native] [synchronized]
tipodeRetorno nombredelMétodo ([listadeparámetros]) [throws listadeExcepciones]
Ca d a u n o d e e s t o s e le m e n t o s d e u n a d e cla ra ció n s e cu b re e n a lg u n a p a rt e d e e s t e
t u t o ria l.

Oz it o
Pasar Información a un Método.
Cu a n d o s e e s crib e u n m é t o d o , s e d e cla ra e l n ú m e ro y t ip o d e lo s a rg u m e n t o s re q u e rid o s p o r e s e
m é t o d o . Es t o s e h a ce e n la firm a d e l m é t o d o . Po r e je m p lo , e l s ig u ie n t e m é t o d o ca lcu la e l p a g o
m e n s u a l d e u n a h ip o t e ca b a s á n d o s e e n la ca n t id a d p re s t a d a , e l in t e ré s , la d u ra ció n d e la h ip o t e ca
( n ú m e ro d e m e s e s ) y e l va lo r fu t u ro d e la h ip o t e ca ( p re s u m ib le m e n t e e l va lo r fu t u ro s e a ce ro ,
p o rq u e a l fin a l d e la h ip o t e ca , ya la h a b rá s p a g a d o ) :
double hipoteca(double cantidad, double interes, double valorFinal, int numPeriodos)
{
double I, parcial1, denominador, respuesta;

I = interes / 100.0;
parcial1 = Math.pow((1 + I), (0.0 - numPeriodos));
denominador = (1 - parcial1) / I;
respuestar = ((-1 * cantidad) / denominador) - ((valorFinal * parcial1) /
denominador);
return respuesta;
}
Es t e m é t o d o t o m a cu a t ro a rg u m e n t o s : la ca n t id a d p re s t a d a , e l in t e ré s , e l va lo r fu t u ro y e l n ú m e ro
d e m e s e s . Lo s t re s p rim e ro s s o n n ú m e ro s d e co m a flo t a n t e d e d o b le p re cis ió n y e l cu a rt o e s u n
e n t e ro .
Al ig u a l q u e e s t e m é t o d o , e l co n ju n t o d e a rg u m e n t o s d e cu a lq u ie r m é t o d o e s u n a lis t a d e
d e cla ra cio n e s d e va rib a le s d e lim it a d a s p o r co m a s d o n d e ca d a d e cla ra ció n d e va rib a le e s u n p a r
t ip o / n o m b re :
tipo nombre
Co m o h a s p o d id o ve r e n e l e je m p lo a n t e rio r, s ó lo t ie n e s q u e u t iliza r e l n o m b re d e l a rg u m e n t o p a ra
re fe rirt e a l va lo r d e l a rg u m e n t o .

Tipos de Argumentos
En Ja va , s e p u e d e p a s a r co m o a rg u m e n t o a u n m é t o d o cu a lq u ie r t ip o d e d a t o vá lid o e n
Ja va . Es t o in clu ye t ip o s p rim it ivo s , co m o e n t e ro s , d o b le s , e t c. . y t ip o s d e re fe re n cia co m o
a rra ys , o b je t o s , e t c. . .
Aq u í t ie n e s u n e je m p lo d e u n co n s t ru ct o r q u e a ce p t a u n a a rra y co m o a rg u m e n t o . En e s t e
e je m p lo e l co n s t ru ct o r in icia liza u n o b je t o Po lyg o n a p a rt ir d e u n a lis t a d e p u n t o s ( Po in t e s
u n a cla s e d e l p a q u e t e ja va . a wt q u e re p re s e n t a u n a co o rd e n a d a xy) :
Polygon polygonFrom(Point[] listadePuntos) {
. . .
}
Al co n t ra rio q u e e n o t ro s le n g u a je s , n o s e p u e d e p a s a r u n m é t o d o a u n m é t o d o Ja va . Pe ro
s i s e p o d ría p a s a r u n o b je t o a u n m é t o d o y lu e g o lla m a r a lo s m é t o d o s d e l o b je t o .

Nombres de Argumentos
Cu a n d o s e d e cla ra u n a rg u m e n t o p a ra u n m é t o d o Ja va , s e p ro p o rcio n a e l n o m b re p a ra e s e
a rg u m e n t o . Es t e n o m b re e s u t iliza d o d e n t o d e l cu e rp o d e l m é t o d o p a ra re fe ris e a l va lo r
d e l a rg u m e n t o .
Un a rg u m e n t o d e u n m é t o d o p u e d e t e n e r e l m is m o n o m b re q u e u n a va ria b le d e la cla s e .
En e s t e ca s o , s e d ice q u e e l a rg u m e n t o o cu lt a a la va ria b le m ie m b ro . No rm a lm e n t e lo s
a rg u m e n t o s q u e o cu lt a n u n a va ria b le m ie m b ro s e u t iliza n e n lo s co n s t ru ct o re s p a ra
in icia liza r u n a cla s e . Po r e je m p lo , o b s e rva la cla s e Circle y s u co n s t ru ct o r:
class Circle {
int x, y, radius;
public Circle(int x, int y, int radius) {
. . .
}
}
La cla s e Circle t ie n e t re s va ria b le s m ie m b ro x , y y ra d iu s . Ad e m ñ a s , e l co n s t ru ct o r d e la
cla s e Circle a ce p t a t re s a rg u m e n t o s ca d a u n o d e lo s cu a le s co m p a rt e e l n o m b re co n la
va ria b le m ie m b ro p a ra la q u e e l a rg u m e n t o p ro p o rcio n a u n va lo r in icia l.
Lo s n o m b re s d e a rg u m e n t o s o cu lt a n lo s n o m b re s d e la s va ria b le s m ie m b ro . Po r e s o
u t iliza r x , y o ra d iu s d e n t ro d e l cu e rp o d e la fu n ció n , s e re fie re a lo s a rg u m e n t o s , n o a la s
va ria b le s m ie m b ro . Pa ra a cce d e r a la s va rib a le s m ie m b ro , s e d e b e re fe re n cia rla s a t ra vé s
d e t h is - - e l o b je t o a ct u a l.
class Circle {
int x, y, radius;
public Circle(int x, int y, int radius) {
this.x = x;
this.y = y;
this.radius = radius;
}
}
Lo s n o m b re s d e lo s a rg u m e n t o s d e u n m é t o d o n o p u e d e n s e r e l m is m o q u e e l d e o t ro s
a rg u m e n t o s d e l m is m o m é t o d o , e l n o m b re d e cu a lq u ie r va ria b le lo ca l d e l m é t o d o o e l
n o m b re d e cu a lq u ie r p a rá m e t ro a u n a cla u s u la c a t c h ( ) d e n t ro d e l m is m o m é t o d o .

Paso por Valor


En lo s m é t o d o s Ja va , lo s a rg u m e n t o s s o n p a s a d o s p o r v a lo r. Cu a n d o s e le lla m a , e l
m é t o d o re cib e e l va lo r d e la va ria b le p a s a d a . Cu a n d o e l a rg u m e n t o e s d e u n t ip o p rim it ivo ,
p a s a r p o r va lo r s ig n ifica q u e e l m é t o d o n o p u e d e ca m b ia r e l va lo r. Cu a n d o e l a rg u m e n t o
e s d e l t ip o d e re fe re n cia , p a s a r p o r va lo r s ig n ifica q u e e l m é t o d o n o p u e d e ca m b ia r e l
o b je t o re fe re n cia d o , p e ro s i p u e d e in vo ca r a lo s m é t o d o s d e l o b je t o y p u e d e m o d ifica r la s
va ria b le s a cce s ib le s d e n t ro d e l o b je t o .
Co n s id e re m o s e s t a s e rie d e s e n t e n cia s Ja va q u e in t e n t a n re cu p e ra r e l co lo r a ct u a l d e u n
o b je t o Pe n e n u n a a p lica ció n g rá fica :
. . .
int r = -1, g = -1, b = -1;
pen.getRGBColor(r, g, b);
System.out.println("red = " + r + ", green = " + g + ", blue = " + b);
. . .
En e l m o m e n t o q u e s e lla m a a l m é t o d o g e t RGBCo lo r( ) , la s va ria b le s r, g , y b t ie n e n u n
va lo r d e - 1 . El lla m a d o r e s p e ra q u e e l m é t o d o g e t RGBCo lo r( ) le d e vu e lva lo s va lo re s d e
ro jo , ve rd e y a zu l p a ra e l co lo r a ct u a l e n la s va ria b le s r, g , y b .
S in e m b a rg o , e l s is t e m a Ja va p a s a lo s va lo re s d e la s va ria b le s ( - 1 ) a l m é t o d o
g e t RGBCo lo r( ) ; n o u n a re fe re n cia a la s va ria b le s r, g , y b . Co n e s t o s e p o d ría vis u a liza r
la lla m a d a a g e t RGBCo lo r( ) d e e s t a fo rm a : g e t RGBCo lo r( - 1 , - 1 , - 1 ) .
Cu a n d o e l co n t ro l p a s a d e n t ro d e l m é t o d o g e t RGBCo lo r( ) , lo s a rg u m e n t o s e n t ra n d e n t ro
d e l á m b it o ( s e le s a s ig n a e s p a cio ) y s o n in icia liza d o s a lo s va lo re s p a s a d o s a l m é t o d o :
class Pen {
int valorRojo, valorVerde, valorAzul;
void getRGBColor(int rojo, int verde, int azul) {
// rojo, verde y azul han sido creados y sus valores son -1
. . .
}
}
Co n e s t o g e t RGBCo lo r( ) o b t ie n e a cce s o a lo s va lo re s d e r, g , y b d e l lla m a d o r a t a vé s d e
s u s a rg u m e n t o s ro jo , v e rd e , y a z u l, re s p e ct iva m e n t e . El m é t o d o o b t ie n e s u p ro p ia co p ia
d e lo s va lo re s p a ra u t iliza rlo s d e n t ro d e l á m b it o d e l m é t o d o . Cu a lq u ie r ca m b io re a liza d o e n
e s t a s co p ia s lo ca le s n o s e ra n re fle ja d o s e n la s va ria b le s o rig in a le s d e l lla m a d o r.
Ah o ra ve re m o s la im p le m e n t a ció n d e g e t RGBCo lo r( ) d e n t ro d e la cla s e Pe n q u e
im p lica b a la firm a d e m é t o d o a n t e rio r:
class Pen {
int valorRojo, valorVerde, valorAzul;
. . .
// Este método no trabaja como se espera
void getRGBColor(int rojo, int verde, int azul) {
rojo = valorRojo;
verde=valorVerde;
azul=valorAzul;
}
}
Es t e m é t o d o n o t ra b a ja rá co m o s e e s p e ra . Cu a n d o e l co n t ro l lle g a a la s e n t e n cia p rin t ln ( )
e n e l s ig u ie n t e fra g m e n t o d e có d ig o , lo s a rg u m e n t o s ro jo , v e rd e y a z u l d e
g e t RGBCo lo r( ) ya n o e xis t e n . Po r lo t a n t o la s a s ig n a cio n e s re a liza d a s d e n t ro d e l m é t o d o
n o t e n d rá n e fe ct o ; r, g , y b s e g u ira n s ie n d o ig u a l a - 1 .
. . .
int r = -1, g = -1, b = -1;
pen.getRGBColor(r, g, b);
System.out.println("rojo = " + r + ", verde = " + g + ", azul = " + b);
. . .
El p a s o d e la s va rib a le s p o r va lo r le o fre ce a lg u n a s e g u rid a d a lo s p ro g ra m a d o re s : lo s
m é t o d o s n o p u e d e m o d ifica r d e fo rm a n o in t e n cio n a d a u n a va ria b le q u e e s t á fu e ra d e s u
á m b it o . S in e m b a rg o , a lg u n a ve z s e q u e rrá q u e u n m é t o d o m o d ifiq u e a lg u n o d e s u s
a rg u m e n t o s . El m e t o d o g e t RGBCo lo r( ) e s u n ca s o a p ro p ia d o . El lla m a d o r q u ie re q u e e l
m é t o d o d e vu e lva t re s va lo re s a t ra vé s d e s u s a rg u m e n t o s . S in e m b a rg o , e l m é t o d o n o
p u e d e m o d ifica r s u s a rg u m e n t o s , y, a d e m á s , u n m é t o d o s ó lo p u e d e d e vo lve r u n va lo r a
t ra vé s d e s u va lo r d e re t o rn o . En t o n ce s , ¿ có m o p u e d e u n m é t o d o d e vo lve r m á s d e u n
va lo r, o t e n e r a lg ú n e fe ct o ( m o d ifica r a lg ú n va lo r) fu e ra d e s u á m b it o ?
Pa ra q u e u n m é t o d o m o d ifiq u e u n a rg u m e n t o , d e b e s e r u n t ip o d e re fe re n cia co m o u n
o b je t o o u n a rra y. Lo s o b je t o s y a rra ys t a m b ié n s o n p a s a d o s p o r va lo r, p e ro e l va lo r d e u n
o b je t o e s u n a re fe re n cia . En t o n ce s e l e fe ct o e s q u e lo s a rg u m e n t o s d e t ip o s d e re fe re n cia
s o n p a s a d o s p o r re fe re n cia . De a q u í e l n o m b re . Un a re fe re n cia a u n o b je t o e s la d ire cció n
d e l o b je t o e n la m e m o ria . Ah o ra , e l a rg u m e n t o e n e l m é t o d o s e re fie re a la m is m a
p o s ició n d e m e m o ria q u e e l lla m a d o r.
Re e s crib a m o s e l m é t o d o g e t RGBCo lo r( ) p a ra q u e h a g a lo q u e q u e re m o s . Prim e ro
in t ro d u zca m o s u n n u e vo o b je t o RGBCo lo r, q u e p u e d e co n t e n e r lo s va lo re s d e ro jo , ve rd e y
a zu l d e u n co lo r e n fo rm a t o RGB:
class RGBColor {
public int rojo, verde, azul;;
}
Ah o ra p o d e m o s re e s crib ir g e t RGBCo lo r( ) p a ra q u e a ce p t e u n o b je t o RGBCo lo r co m o
a rg u m e n t o . El m é t o d o g e t RGBCo lo r( ) d e vu e lve e l co lo r a ct u a l d e lá p iz, e n lo s va lo re s d e
la s va ria b le s m ie m b ro ro jo , v e rd e y a z u l d e s u a rg u m e n t o RGBCo lo r:
class Pen {
int valorRojo, valorVerde, valorAzul;
void getRGBColor(RGBColor unColor) {
unColor.rojo = valorRojo;
unColor.verde = valorVerde;
unColor.azul = valorAzul;
}
}
Y fin a lm e n t e , re e s crib im o s la s e cu e n cia d e lla m a d a :
. . .
RGBColor penColor = new RGBColor();
pen.getRGBColor(penColor);
System.out.println("ojo = " + penColor.rojo + ", verde = " + penColor.verde + ",
azul = " + penColor.azul);
. . .
La s m o d ifica cio n e s re a liza d a s a l o b je t o RGBCo lo r d e n t ro d e l m é t o d o g e t RGBCo lo r( )
a fe ct a n a l o b je t o cre a d o e n la s e cu e n cia d e lla m a d a p o rq u e lo s n o m b re s p e n Co lo r ( e n la
s e cu e n cia d e lla m a d a ) y u n Co lo r ( e n e l m é t o d o g e t RGBCo lo r( ) ) s e re fie re n a l m is m o
o b je t o .

Oz it o
El Cuerpo del Método
En e l s ig u ie n t e e je m p lo , e l cu e rp o d e m é t o d o p a ra lo s m é t o d o s e s t a Va c io ( ) y
p o n e r( ) e s t á n e n n e g rit a :
class Stack {
static final int PILA_VACIA = -1;
Object[] elementosPila;
int elementoSuperior = PILA_VACIA;
. . .
boolean estaVacio() {
if (elementoSuperior == PILA_VACIA)
return true;
else
return false;
}
Object poner() {
if (elementoSuperior == PILA_VACIA)
return null;
else {
return elementosPila[elementoSuperior--];
}
}
}
Ju n t o a lo s e le m e n t o s n o rm a le s d e l le n g u a je Ja va , s e p u e d e u t iliza r t h is e n e l
cu e rp o d e l m é t o d o p a ra re fe rirs e a lo s m ie m b ro s d e l o b je t o a ct u a l. El o b je t o a ct u a l
e s e l o b je t o d e l q u e u n o d e cu yo s m ie m b ro s e s t á s ie n d o lla m a d o . Ta m b ié n s e
p u e d e u t iliza r s u p e r p a ra re fe rirs e a lo s m ie m b ro s d e la s u p e rcla s e q u e e l o b je t o
a ct u a l h a ya o cu lt a d o m e d ia n t e la s o b re e s crit u ra . Un cu e rp o d e m é t o d o t a m b ié n
p u e d e co n t e n e r d e cla ra cio n e s d e va ria b le s q u e s o n lo ca le s d e e s e m é t o d o .

this
No rm a lm e n t e , d e n t ro d e l cu e rp o d e u n m é t o d o d e u n o b je t o s e p u e d e
re fe rir d ire ct a m e n t e a la s va ria b le s m ie m b ro s d e l o b je t o . S in e m b a rg o ,
a lg u n a s ve ce s n o s e q u e rrá t e n e r a m b ig u e d a d s o b re e l n o m b re d e la
va ria b le m ie m b ro y u n o d e lo s a rg u m e n t o s d e l m é t o d o q u e t e n g a n e l
m is m o n o m b re .
Po r e je m p lo , e l s ig u ie n t e co n s t ru ct o r d e la cla s e HS BCo lo r in icia liza
a lg u n a va ria b le m ie m b ro d e u n o b je t o d e a cu e rd o a lo s a rg u m e n t o s
p a s a d o s a l co n s t ru ct o r. Ca d a a rg u m e n t o d e l co n s t ru ct o r t ie n e e l m is m o
n o m b re q u e la va ria b le d e l o b je t o cu yo va lo r co n t ie n e e l a rg u m e n t o .
class HSBColor {
int hue, saturacion, brillo;
HSBColor (int luminosidad, int saturacion, int brillo) {
this.luminosidad = luminosidad;
this.saturacion = saturacion;
this.brillo = brillo;
}
}
S e d e b e u t iliza r t h is e n e s t e co n s t ru ct o r p a ra e vit a r la e m b ig u e d a d e n t re
e l a rg u m e n t o lu m in o s id a d y la va ria b le m ie m b ro lu m in o s id a d ( y a s í
co n e l re s t o d e lo s a rg u m e n t o s ) . Es crib ir lu m in o s id a d = lu m in o s id a d ;
n o t e n d ría s e n t id o . Lo s n o m b re s d e a rg u m e n t o s t ie n e n m a yo r
p re ce d e n cia y o cu lt a n a lo s n o m b re s d e la s va ria b le s m ie m b ro co n e l
m is m o n o m b re . Pa ra re fe riris e a la va ria b le m ie m b ro s e d e b e h a ce r
e xp licit a m e n t e a t ra vé s d e l o b je t o a ct u a l- - t h is .
Ta m b ié n s e p u e d e u t iliza r t h is p a ra lla m a r a u n o d e lo s m é t o d o s d e l
o b je t o a ct u a l. Es t o s ó lo e s n e ce s a rio s i e xis t e a lg u n a a m b ig ü e d a d co n e l
n o m b re d e l m é t o d o y s e u t iliza p a ra in t e n t a r h a ce r e l có d ig o m á s cla ro .

super
S i e l m é t o d o o cu lt a u n a d e la s va ria b le s m ie m b ro d e la s u p e rcla s e , s e
p u e d e re fe rir a la va ria b le o cu lt a u t iliza n d o s u p e r. De ig u a l fo rm a , s i e l
m é t o d o s o b re e s crib e u n o d e lo s m é t o d o s d e la s u p e rcla s e , s e p u e d e
lla m a r a l m é t o d o s o b re e s crit o a t ra vé s d e s u p e r.
Co n s id e re m o s e s t a cla s e :
class MiClase {
boolean unaVariable;
void unMetodo() {
unaVariable = true;
}
}
y u n a s u b cla s e q u e o cu lt a u n a Va ria b le y s o b re e s crib e u n Me t o d o ( ) :
class OtraClase extends MiClase {
boolean unaVariable;
void unMetodo() {
unaVariable = false;
super.unMetodo();
System.out.println(unaVariable);
System.out.println(super.unaVariable);
}
}
Prim e ro u n Me t o d o ( ) s e le ccio n a u n a Va ria b le ( u n a d e cla ra d a e n
Ot ra Cla s e q u e o cu lt a a la d e cla ra d a e n MiCla s e ) a fa ls e . Lu e g o
u n Me t o d o ( ) lla m a a s u m é t o d o s o b re e s crit o co n e s t a s e n t e n cia :
super.unMetodo();
Es t o s e le ccio n a la ve rs ió n o cu lt a d e u n a Va ria b le ( la d e cla ra d a e n
MiCla s e ) a t ru e . Lu e g o u n Me t o d o m u e s t ra la s d o s ve rs io n e s d e
u n a Va ria b le co n d ife re n t e s va lo re s :
false
true

Variables Locales
De n t ro d e l cu e rp o d e u n m é t o d o s e p u e d e d e cla ra r m á s va ria b le s p a ra
u s a rla s d e n t ro d e l m é t o d o . Es t a s va ria b le s s o n v a ria b le s lo ca le s y vive n
s ó lo m ie n t ra s e l co n t ro l p e rm a n e zca d e n t ro d e l m é t o d o . Es t e m é t o d o
d e cla ra u n va ria b le lo ca l i y la u t iliza p a ra o p e ra r s o b re lo s e le m e n t o s d e l
a rra y.
Object encontrarObjetoEnArray(Object o, Object[] arrayDeObjetos) {
int i; // variable local
for (i = 0; i < arrayDeObjetos.length; i++) {
if (arrayDeObjetos[i] == o)
return o;
}
return null;
}
De s p u é s d e q u e e s t e m é t o d o re t o rn e , i ya n o e xis t irá m á s .

Oz it o
Miembros de la Clase y del Ejemplar
Cu a n d o s e d e cla ra u n a va ria b le m ie m b ro co m o u n Flo a t e n MiCla s e :
class MiClase {
float unFloat;
}
d e cla ra u n a v a ria b le d e e je m p la r. Ca d a ve z q u e s e cre a u n e je m p la r d e la cla s e , e l s is t e m a cre a
u n a co p ia d e t o d a s la s va ria b le s d e e je m p la r d e la cla s e . S e p u e d e a cce d e r a u n a va ria b le d e l
e je m p la r d e l o b je t o d e s d e u n o b je t o co m o s e d e s crib e e n Ut iliza r Ob je t o s .
La s va ria b le s d e e je m p la r e s t á n e n co n s t ra s t e co n la s v a ria b le s d e cla s e ( q u e s e d e cla ra n
u t iliza n d o e l m o d ifica d o r s t a t ic ) . El s is t e m a a s ig n a e s p a cio p a ra la s va ria b le s d e cla s e u n a ve z
p o r cla s e , s in im p o rt a r e l n ú m e ro d e e je m p la re s cre a d o s d e la cla s e . To d o s lo s o b je t o s cre a d o s
d e e s t a cla s e co m p a rt e n la m is m a co p ia d e la s va ria b le s d e cla s e d e la cla s e , s e p u e d e a cce d e r
a la s va ria b le s d e cla s e a t ra vé s d e u n e je m p la r o t ra vé s d e la p ro p ia cla s e .
Lo s m é t o d o s s o n s im ila re s : u n a cla s e p u e d e t e n e r m é t o d o s d e e je m p la r y m é t o d o s d e cla s e .
Lo s m é t o d o s d e e je m p la r o p e ra n s o b re la s va ria b le s d e e je m p la r d e l o b je t o a ct u a l p e ro t a m b ié n
p u e d e n a cce d e r a la s va ria b le s d e cla s e . Po r o t ro la d o , lo s m é t o d o s d e cla s e n o p u e d e n a cce d e r
a la s va ria b le s d e l e je m p la r d e cla ra d o s d e n t ro d e la cla s e ( a m e n o s q u e s e cre e u n o b je t o
n u e vo y a cce d a a e llo s a t ra vé s d e l o b je t o ) . Lo s m é t o d o s d e cla s e t a m b ié n p u e d e n s e r in vo ca d o s
d e s d e la cla s e , n o s e n e ce s it a u n e je m p la r p a ra lla m a r a lo s m é t o d o s d e la cla s e .
Po r d e fe ct o , a m e n o s q u e s e e s p e cifiq u e d e o t ra fo rm a , u n m ie m b ro d e cla ra d o d e n t ro d e u n a
cla s e e s u n m ie m b ro d e l e je m p la r. La cla s e d e fin id a a b a jo t ie n e u n a va ria b le d e e je m p la r - - u n
e n t e ro lla m a d o x - - y d o s m é t o d o s d e e je m p la r - - x ( ) y s e t X( ) - - q u e p e rm it e q u e o t ro s
o b je t o s p re g u n t e n p o r e l va lo r d e x :
class UnEnteroLlamadoX {
int x;
public int x() {
return x;
}
public void setX(int newX) {
x = newX;
}
}
Ca d a ve z q u e s e e je m p la riza u n o b je t o n u e vo d e s d e u n a cla s e , s e o b t ie n e u n a co p ia d e ca d a
u n a d e la s va ria b le s d e e je m p la r d e la cla s e . Es t a s co p ia s e s t á n a s o cia d a s co n e l o b je t o n u e vo .
Po r e s o , ca d a ve z q u e s e e je m p la riza u n n u e vo o b je t o Un En t e ro Lla m a d o X d e la cla s e , s e
o b t ie n e u n a co p ia d e x q u e e s t á a s o cia d a co n e l n u e vo o b je t o Un En t e ro Lla m a d o X.
To d o s lo s e je m p la re s d e u n a cla s e co m p a rt e n la m is m a im p le m e n t a ció n d e u n m é t o d o d e
e je m p la r; t o d o s lo s e je m p la re s d e Un En t e ro Lla m a d o X co m p a rt e n la m is m a im p le m e n t a ció n d e
x ( ) y s e t X( ) . Ob s e rva q u e e s t o s m é t o d o s s e re fie re n a la va ria b le d e e je m p la r d e l o b je t o x p o r
s u n o m b re . "Pe ro , ¿ s i t o d o s lo s e je m p la re s d e Un En t e ro Lla m a d o X co m p a rt e n la m is m a
im p le m e n t a ció n d e x ( ) y s e t X( ) e s t o n o e s a m b ig ü o ? " La re s p u e s t a e s n o . De n t ro d e u n
m é t o d o d e e je m p la r, e l n o m b re d e u n a va ria b le d e e je m p la r s e re fie re a la va ria b le d e e je m p la r
d e l o b je t o a ct u a l ( a s u m ie n d o q u e la va ria b le d e e je m p la r n o e s t á o cu lt a d a p o r u n p a rá m e t ro d e l
m é t o d o ) . Ya q u e , d e n t ro d e x ( ) y s e t X( ) , x e s e q u iva le n t e a t h is . x .
Lo s o b je t o s e xt e rn o s a Un En t e ro Lla m a d o X q u e d e s e e n a cce d e r a x d e b e n h a ce rlo a t ra vé s d e
u n e je m p la r p a rt icu la r d e Un En t e ro Lla m a d o X. S u p o n g a m o s q u e e s t e có d ig o e s t u vie ra e n o t ro
m é t o d o d e l o b je t o . Cre a d o s o b je t o s d ife re n t e s d e l t ip o Un En t e ro Lla m a d o X, y s e le ccio n a s u s
va lo re s d e x a d ife re n t e va lo re s Y lu e g o lo m u e s t ra :
. . .
UnEnteroLlamadoX miX = new UnEnteroLlamadoX();
UnEnteroLlamadoX otroX = new UnEnteroLlamadoX();
miX.setX(1);
otroX.x = 2;
System.out.println("miX.x = " + miX.x());
System.out.println("otroX.x = " + otroX.x());
. . .
Ob s e rva q u e e l có d ig o u t iliza d o e n s e t X( ) p a ra s e le ccio n a r e l va lo r d e x p a ra m iX p e ro s o lo
a s ig n a n d o e l va lo r o t ro X. x d ire ct a m e n t e . De o t ra fo rm a , e l có d ig o m a n ip u la d o s co p ia s
d ife re n t e s d e x : u n a co n t e n id a e n e l o b je t o m iX y la o t ra e n e l o b je t o o t ro X. La s a lid a
p ro d u cid a p o r e s t e có d ig o e s :
miX.x = 1
otroX.x = 2
m o s t ra n d o q u e ca d a e je m p la r d e la cla s e Un En t e ro Lla m a d o X t ie n e s u p ro p ia co p ia d e la
va ria b le d e e je m p la r x y q u e ca d a x t ie n e u n va lo r d ife re n t e .
Cu a n d o s e d e cla ra u n a va ria b le m ie m b ro s e p u e d e e s p e cifica r q u e la va ria b le e s u n a va ria b le d e
cla s e e n ve z d e u n a va ria b le d e e je m p la r. S im ila rm e n t e , s e p u e d e e s p e cifica r q u e u n m é t o d o e s
u n m é t o d o d e cla s e e n ve z d e u n m é t o d o d e e je m p la r. El s is t e m a cre a u n a s o la co p ia d e u n a
va ria b le d e cla s e la p rim e ra ve z q u e e n cu e n t ra la cla s e e n la q u e e s t á d e fin id a la va ria b le .
To d o s lo s e je m p la re s d e e s t a cla s e co m p a rt e n la m is m a co p ia d e la s va ria b le s d e cla s e . Lo s
m é t o d o s d e cla s e s o lo p u e d e n o p e ra r co n va ria b le s d e cla s e - - n o p u e d e n a cce d e r a va ria b le s
d e e je m p la r d e fin d a s e n la cla s e .
Pa ra e s p e cifica r q u e u n a va ria b le m ie m b ro e s u n a va ria b le d e cla s e , s e u t iliza la p a la b ra cla ve
s t a t ic . Po r e je m p lo , ca m b ie m o s la cla s e Un En t e ro Lla m a d o X p a ra q u e s u va ria b le x s e a a h o ra
u n a va ria b le d e cla s e :
class UnEnteroLlamadoX {
static int x;
public int x() {
return x;
}
public void setX(int newX) {
x = newX;
}
}
Ah o ra ve a m o s e l m is m o có d ig o m o s t ra d o a n t e rio rm e n t e q u e cre a d o s e je m p la re s d e
Un En t e ro Lla m a d o X, s e le ccio n a s u s va lo re s d e x , y m u e s t ra e s t a s a lid a d ife re n t e :
miX.x = 2
otroX.x = 2
La s a lid a e s d ife re n t e p o rq u e x a h o ra e s u n a va ria b le d e cla s e p o r lo q u e s ó lo h a y u n a co p ia d e
la va ria b le y e s co m p a rt id a p o r t o d o s lo s e je m p la re s d e Un En t e ro Lla m a d o X in clu ye n d o m iX y
o t ro X.
Cu a n d o s e lla m a a s e t X( ) e n cu a lq u ie r e je m p la r, ca m b ia e l va lo r d e x p a ra t o d o s lo s
e je m p la re s d e Un En t e ro Lla m a d o X.
La s va ria b le s d e cla s e s e u t iliza n p a ra a q u e llo s p u n t o s e n lo q u e s e n e ce s it e u n a s o la co p ia q u e
d e b e e s t a r a cce s ib le p a ra t o d o s lo s o b je t o s h e re d a d o s p o r la cla s e e n la q u e la va ria b le fu e
d e cla ra d a . Po r e je m p lo , la s va ria b le s d e cla s e s e u t iliza n fre cu e n t e m e n t e co n fin a l p a ra d e fin ir
co n s t a n t e s ( e s t o e s m á s e ficie n t e e n e l co n s u m o d e m e m o ria , ya q u e la s co n s t a n t e s n o p u e d e n
ca m b ia r y s ó lo s e n e ce s it a u n a co p ia ) .
S im ila rm e n t e , cu a n d o s e d e cla re u n m é t o d o , s e p u e d e e s p e cifica r q u e e l m é t o d o e s u n m é t o d o
d e cla s e e n ve z d e u n m é t o d o d e e je m p la r. Lo s m é t o d o s d e cla s e s ó lo p u e d e n o p e ra r co n
va ria b le s d e cla s e y n o p u e d e n a cce d e r a la s va ria b le s d e e je m p la r d e fin id a s e n la cla s e .
Pa ra e s p e cifica r q u e u n m é t o d o e s u n m é t o d o d e cla s e , s e u t iliza la p a la b ra cla ve s t a t ic e n la
d e cla ra ció n d e m é t o d o . Ca m b ie m o s la cla s e Un En t e ro Lla m a d o X p a ra q u e s u va ria b le m ie m b ro x
s e a d e n u e vo u n a va ria b le d e e je m p la r, y s u s d o s m é t o d o s s e a n a h o ra m é t o d o s d e cla s e :
class UnEnteroLlamadoX {
private int x;
static public int x() {
return x;
}
static public void setX(int newX) {
x = newX;
}
}
Cu a n d o s e in t e n t e co m p ila r e s t a ve rs ió n d e Un En t e ro Lla m a d o X, s e o b t e n d rá n e rro re s d e
co m p ila ció n :
UnEnteroLlamadoX.java:4: Can't make a static reference to nonstatic variable x in
class UnEnteroLlamadoX.
return x;
^
UnEnteroLlamadoX.java:7: Can't make a static reference to nonstatic variable x in
class UnEnteroLlamadoX.
x = newX;
^
2 errors
Es t o e s p o rq u e lo s m é t o d o s d e la cla s e n o p u e d e n a cce d e r a va ria b le s d e e je m p la r a m e n o s q u e
e l m é t o d o h a ya cre a d o u n e je m p la r d e Un En t e ro Lla m a d o X p rim e ro y lu e g o a cce d a a la va ria b le
a t ra vé s d e é l.
Co n s t ru ya m o s d e n u e vo Un En t e ro Lla m a d o X p a ra h a ce r q u e s u va ria b le x s e a u n a va ria b le d e
cla s e :
class UnEnteroLlamadoX {
static private int x;
static public int x() {
return x;
}
static public void setX(int newX) {
x = newX;
}
}
Ah o ra la cla s e s e co m p ila rá y e l có d ig o a n t e rio r q u e cre a d o s e je m p la re s d e Un En t e ro Lla m a d o X,
s e le ccio n a s u s va lo re s x , y m u e s t ra e n s u s a lid a lo s va lo re s d e x :
miX.x = 2
otroX.x = 2
De n u e vo , ca m b ia r x a t ra vé s d e m iX t a m b ié n lo ca m b ia p a ra lo s o t ro s e je m p la re s d e
Un En t e ro Lla m a d o X.
Ot ra d ife re n cia e n t re m ie m b ro s d e l e je m p la r y d e la cla s e e s q u e lo s m ie m b ro s d e la cla s e s o n
a cce s ib le s d e s d e la p ro p ia cla s e . No s e n e ce s it a e je m p la riza r la cla s e p a ra a cce d e r a lo s
m ie m b ro s d e cla s e . Re e s crib a m o s e l có d ig o a n t e rio r p a ra a cce d e r a x ( ) y s e t X( ) d ire ct a m e n t e
d e s d e la cla s e Un En t e ro Lla m a d o X:
. . .
UnEnteroLlamadoX.setX(1);
System.out.println("UnEnteroLlamadoX.x = " + UnEnteroLlamadoX.x());
. . .
Ob s e rva q u e ya n o s e t e n d rá q u e cre a r m iX u o t ro X. S e p u e d e s e le ccio n a r x y re cu p e ra rlo
d ire ct a m e n t e d e s d e la cla s e Un En t e ro Lla m a d o X. No s e p u e d e h a ce r e s t o co n m ie m b ro s d e l
e je m p la r. S o lo s e p u e d e in vo ca r m é t o d o s d e e je m p la r a t ra vé s d e u n o b je t o y s ó lo p u e d e
a cce d e r a la s va ria b le s d e e je m p la r d e s d e u n o b je t o . S e p u e d e a cce d e r a la s va ria b le s y
m é t o d o s d e cla s e d e s d e u n e je m p la r d e la cla s e o d e s d e la cla s e m is m a .

Oz it o
Controlar el Acceso a los Miembros de la Clase
Un o d e lo s b e n e fico s d e la s cla s e s e s q u e p u e d e n p ro t e g e r s u s va ria b le s y m é t o d o s m ie m b ro s
fre n t e a l a cce s o d e o t ro s o b je t o s . ¿ Po r q u é e s e s t o im p o rt a n t e ? Bie n , co n s id e re m o s e s t o . S e h a
e s crit o u n a cla s e q u e re p re s e n t a u n a p e t ició n a u n a b a s e d e d a t o s q u e co n t ie n e t o d a cla s e d e
in fo rm a ció n s e cre t a , e s d e cir, re g is t ro s d e e m p le a d o s o p ro ye ct o s s e cre t o s d e la co m p a ñ ia .
Cie rt a s in fo rm a cio n e s y p e t icio n e s co n t e n id a s e n la cla s e , la s s o p o rt a d a s p o r lo s m é t o d o s y
va ria b le s a cce s ib le s p ú b lica m e n t e e n s u o b je t o s o n co rre ct a s p a ra e l co n s u m o d e cu a lq u ie r o t ro
o b je t o d e l s is t e m a . Ot ra s p e t icio n e s co n t e n id a s e n la cla s e s o n s ó lo p a ra e l u s o p e rs o n a l d e la
cla s e . Es t a s o t ra s s o p o rt a d a s p o r la o p e ra ció n d e la cla s e n o d e b e ría n s e r u t iliza d a s p o r o b je t o s d e
o t ro s t ip o s . S e q u e rría p ro t e g e r e s a s va ria b le s y m é t o d o s p e rs o n a le s a n ive l d e l le n g u a je y
p ro h ib ir e l a cce s o d e s d e o b je t o s d e o t ro s t ip o s .
En Ja va s e p u e d e u t iliza r lo s e s p e cifica d o re s d e a cce s o p a ra p ro t e g e r t a n t o la s va ria b le s co m o lo s
m é t o d o s d e la cla s e cu a n d o s e d e cla ra n . El le n g u a je Ja va s o p o rt a cu a t ro n ive le s d e a cce s o p a ra
la s va ria b le s y m é t o d o s m ie m b ro s : p riva t e , p ro t e ct e d , p u b lic, y, t o d a vía n o e s p e cifica d o , a cce s o
de pa que te .
La s ig u ie n t e t a b la le m u e s t ra lo s n ive le s d e a cce s o p e m it id o s p o r ca d a e s p e cifica d o r:
Es p e c ific a d o r c la s e s u b c la s e pa que te m undo
p riva t e X
p ro t e ct e d X X* X
p u b lic X X X X
p a cka g e X X

La p rim e ra co lu m n a in d ica s i la p ro p ia cla s e t ie n e a cce s o a l m ie m b ro d e fin id o p o r e l e s p e cifica d o r


d e a cce s o . La s e g u n d a co lu m n a in d ica s i la s s u b cla s e s d e la cla s e ( s in im p o rt a r d e n t ro d e q u e
p a q u e t e s e e n cu e n t re n e s t a s ) t ie n e n a cce s o a lo s m ie m b ro s . La t e rce ra co lu m n a in d ica s i la s
cla s e s d e l m is m o p a q u e t e q u e la cla s e ( s in im p o rt a r s u p a re n t e s co ) t ie n e n a cce s o a lo s m ie m b ro s .
La cu a rt a co lu m n a in d ica s i t o d a s la s cla s e s t ie n e n a cce s o a lo s m ie m b ro s .
Ob s e rva q u e la in t e rs e cció n e n t re p ro t e ct e d y s u b cla s e t ie n e u n '* ' - e s t e ca s o d e a cce s o p a rt icu la r
t ie n e u n a e xp lica ció n e n m á s d e t a lle m á s a d e la n t e .

Ech e m o s u n vis t a zo a ca d a u n o d e lo s n ive le s d e a cce s o m á s d e t a lla d a m e n t e :

Private
El n ive l d e a cce s o m á s re s t rin g id o e s p riva t e . Un m ie m b ro p riva d o e s a cce s ib le s ó lo p a ra
la cla s e e n la q u e e s t á d e fin id o . S e u t iliza e s t e a cce s o p a ra d e cla ra r m ie m b ro s q u e s ó lo
d e b e n s e r u t iliza d o s p o r la cla s e . Es t o in clu ye la s va ria b le s q u e co n t ie n e n in fo rm a ió n
q u e s i s e a cce d e a e lla d e s d e e l e xt e rio r p o d ría co lo ca r a l o b je t o e n u n e s t a d o d e
in co n s is t e n cia , o lo s m é t o d o s q u e lla m a d o s d e s d e e l e xt e rio r p u e d e n p o n e n e n p e lig ro e l
e s t a d o d e l o b je t o o d e l p ro g ra m a d o n d e s e e s t á e je cu t a n d o . Lo s m ie m b ro s p riva d o s s o n
co m o s e cre t o s , n u n ca d e b e n co n t a rs e le a n a d ie .
Pa ra d e cla ra r u n m ie m b ro p riva d o s e u t iliza la p a la b ra cla ve p riv a t e e n s u d e cla ra ció n .
La cla s e s ig u ie n t e co n t ie n e u n a va ria b le m ie m b ro y u n m é t o d o p riva d o s :
class Alpha {
private int soyPrivado;
private void metodoPrivado() {
System.out.println("metodoPrivado");
}
}
Lo s o b je t o s d e l t ip o Alp h a p u e d e n in s p e ccio n a r y m o d ifica r la va ria b le s o y P riv a d o y
p u e d e n in vo ca r e l m é t o d o m e t o d o P riv a d o ( ) , p e ro lo s o b je t o s d e o t ro s t ip o s n o p u e d e n
a cce d e r. Po r e je m p lo , la cla s e Be t a d e fin id a a q u í:
class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.soyPrivado = 10; // ilegal
a.metodoPrivado(); // ilegal
}
}
n o p u e d e a cce d e r a la va ria b le s o y P riv a d o n i a l m é t o d o m e t o d o P riv a d o ( ) d e u n
o b je t o d e l t ip o Alp h a p o rq u e Be t a n o e s d e l t ip o Alp h a .
S i u n a cla s e e s t á in t e n t a n d o a cce d e r a u n a va ria b le m ie m b ro a la q u e n o t ie n e
a cce s o - - e l co m p ila d o r m o s t ra rá u n m e n s a je d e e rro r s im ila r a e s t e y n o co m p ila rá s u
p ro g ra m a :
Beta.java:9: Variable iamprivate in class Alpha not accessible from class Beta.
a.iamprivate = 10; // ilegal
^
1 error
Y s i u n p ro g ra m a in t e n t a a cce d e r a u n m é t o d o a l q u e n o t ie n e a cce s o , g e n e ra rá u n e rro r
d e co m p ila ció n p a re cid o a e s t e :
Beta.java:12: No method matching privateMethod() found in class Alpha.
a.privateMethod(); // ilegal
1 error

Protected
El s ig u ie n t e e s p e cifica d o r d e n ive l d e a cce s o e s 'p ro t e ct e d ' q u e p e rm it e a la p ro p ia cla s e ,
la s s u b cla s e s ( co n la e xce p ció n a la q u e n o s re fe rim o s a n t e rio rm e n t e ) , y t o d a s la s cla s e s
d e n t ro d e l m is m o p a q u e t e q u e a cce d a n a lo s m ie m b ro s . Es t e n ive l d e a cce s o s e u t iliza
cu a n d o e s a p ro p ia d o p a ra u n a s u b cla s e d a la cla s e t e n e r a cce s o a lo s m ie m b ro s , p e ro
n o la s cla s e s n o re la cio n a d a s . Lo s m ie m b ro s p ro t e g id o s s o n co m o s e cre t o s fa m ilia re s -
n o im p o rt a q u e t o d a la fa m ilia lo s e p a , in clu s o a lg u n o s a m ig o s a lle g a d o s p e ro n o s e
q u ie re q u e lo s e xt ra ñ o s lo s e p a n .
Pa ra d e cla ra r u n m ie m b ro p ro t e g id o , s e u t iliza la p a la b ra cla ve p ro t e c t e d . Prim e ro
e ch e m o s u n vis t a zo a có m o a fe ct a e s t e e s p e cifica d o r d e a cce s o a la s cla s e s d e l m is m o
pa que te .
Co n s id e re m o s e s t a ve rs ió n d e la cla s e Alp h a q u e a h o ra s e d e cla ra p a ra e s t a r in clu id a e n
e l p a q u e t e Grie g o y q u e t ie n e u n a va ria b le y u n m é t o d o q u e s o n m ie m b ro s p ro t e g id o s :
package Griego;

class Alpha {
protected int estoyProtegido;
protected void metodoProtegido() {
System.out.println("metodoProtegido");
}
}
Ah o ra , s u p o n g a m o s q u e la cla s e Ga m m a , t a m b ié n e s t á d e cla ra d a co m o m ie m b ro d e l
p a q u e t e Grie g o ( y n o e s u n a s u b cla s e d e Alp h a ) . La Cla s e Ga m m a p u e d e a cce d e r
le g a lm e n t e a l m ie m b ro e s t o y P ro t e g id o d e l o b je t o Alp h a y p u e d e lla m a r le g a lm e n t e a
s u m é t o d o m e t o d o P ro t e g id o ( ) :
package Griego;

class Gamma {
void metodoAccesor() {
Alpha a = new Alpha();
a.estoyProtegido = 10; // legal
a.metodoProtegido(); // legal
}
}
Es t o e s m u y s e n cillo . Ah o ra , in ve s t ig u e m o s có m o a fe ct a e l e s p e cifica d o r p o rt e ct e d a u n a
s u b cla s e d e Alp h a .
In t ro d u zca m o s u n a n u e va cla s e , De lt a , q u e d e s cie n d e d e la cla s e Alp h a p e ro re s id e e n
u n p a q u e t e d ife re n t e - La t in . La cla s e De lt a p u e d e a cce d e r t a n t o a e s t o y P ro t e g id o
co m o a m e t o d o P ro t e g id o ( ) , p e ro s o lo e n o b je t o s d e l t ip o De lt a o s u s s u b cla s e s . La
cla s e De lt a n o p u e d e a cce d e r a e s t o y P ro t e g id o o m e t o d o P ro t e g id o ( ) e n o b je t o s d e l
t ip o Alp h a . m e t o d o Ac c e s o r( ) e n e l s ig u ie n t e e je m p lo in t e n t a a cce d e r a la va ria b le
m ie m b ro e s t o y P ro t e g id o d e u n o b je t o d e l t ip o Alp h a , q u e e s ile g a l, y e n u n o b je t o d e l
t ip o De lt a q u e e s le g a l. S im ila rm e n t e , m e t o d o Ac c e s o r( ) in t e n t a in vo ca r a
m e t o d o P ro t e g id o ( ) e n u n o b je t o d e l t ip o Alp h a , q u e t a m b ié n e s ile g a l:
import Griego.*;

package Latin;

class Delta extends Alpha {


void metodoAccesor(Alpha a, Delta d) {
a.estoyProtegido = 10; // ilegal
d.estoyProtegido = 10; // legal
a.metodoProtegido(); // ilegal
d.metodoProtegido(); // legal
}
}
S i u n a cla s e e s u n a s u b cla s e o s e cu e n t ra e n e l m is m o p a q u e t e d e la cla s e co n e l
m ie m b ro p ro t e g id o , la cla s e t ie n e a cce s o a l m ie m b ro p ro t e g id o .

Public
El e s p e cifica d o r d e a cce s o m á s s e n cillo e s 'p u b lic'. To d a s la s cla s e s , e n t o d o s lo s
p a q u e t e s t ie n e n a cce s o a lo s m ie m b ro s p ú b lico s d e la cla s e . Lo s m ie m b ro s p ú b lico s s e
d e cla ra n ó lo s i s u a cce s o n o p ro d u ce re s u lt a d o s in d e s e a d o s s i u n e xt ra ñ o lo s u t iliza .
Aq u í n o h a y s e cre t o s fa m ilia re s ; n o im p o rt a q u e lo s e p a t o d o e l m u n d o .
Pa ra d e cla ra r u n m ie m b ro p ú b lico s e u t iliza la p a la b ra cla ve p u b lic . Po r e je m p lo ,
package Griego;

class Alpha {
public int soyPublico;
public void metodoPublico() {
System.out.println("metodoPublico");
}
}
Re e s crib a m o s n u e s t ra cla s e Be t a u n a ve z m á s y la p o n e m o s e n u n p a q u e t e d ife re n t e
q u e la cla s e Alp h a y n o s a s e g u ra m o s q u e n o e s t á n re la cio n a d a s ( n o e s u n a s u b cla s e ) d e
Alp h a :
import Griego.*;

package Romano;

class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.soyPublico = 10; // legal
a.metodoPublico(); // legal
}
}
Co m o s e p u e d e ve r e n e l e je m p lo a n t e rio r, Be t a p u e d e in s p e ccio n a r y m o d ifica r
le g a lm e n t e la va ria b le s o y P u b lic o e n la cla s e Alp h a y p u e d e lla m a r le g a lm e n t e a l
m é t o d o m e t o d o P u b lic o ( ) .

Acceso de Paquete
Y fin a lm e n t e , e l ú lt im o n ive l d e a cce s o e s e l q u e s e o b t ie n e s i n o s e e s p e cifica n in g ú n
o t ro n ive l d e a cce s o a lo s s m ie m b ro s . Es t e n ive l d e a cce s o p e rm it e q u e la s cla s e s d e l
m is m o p a q u e t e q u e la cla s e t e n g a n a cce s o a lo s m ie m b ro s . Es t e n ive l d e a cce s o a s u m e
q u e la s cla s e s d e l m is m o p a q u e t e s o n a m ig a s d e co n fia n za . Es t e n ive l d e co n fia n za e s
co m o la q u e e xt ie n d e a s u s m e jo re s a m ig o s y q u e in clu s o n o la t ie n e co n s u fa m ilia .
Po r e je m p lo , e s t a ve rs ió n d e la cla s e Alp h a d e cla ra u n a va ria b le y u n m é t o d o co n a cce s o
d e p a q u e t e . Alp h a re s id e e n e l p a q u e t e Grie g o :
package Griego;

class Alpha {
int estoyEmpaquetado;
void metodoEmpaquetado() {
System.out.println("metodoEmpaquetado");
}
}
La cla s e Alp h a t ie n e a cce s o a e s t o y Em p a q u e t a d o y a m e t o d o Em p a q u e t a d o ( ) .
Ad e m á s , t o d a s la s cla s e s d e cla ra d a s d e n t ro d e l m is m o p a q u e t e co m o Alp h a t a m b ié n
t ie n e n a cce s o a e s t o y Em p a q u e t a d o y m e t o d o Em p a q u e t a d o ( ) . S u p o n g a m o s q u e
t a n t o Alp h a co m o Be t a s o n d e cla ra d a s co m o p a rt e d e l p a q u e t e Grie g o :
package Griego;

class Beta {
void metodoAccesor() {
Alpha a = new Alpha();
a.estoyEmpaquetado = 10; // legal
a.metodoEmpaquetado(); // legal
}
}
En t o n ce s Be t a p u e d e a cce d e r le g a lm e n t e a e s t o y Em p a q u e t a d o y
m e t o d o Em p a q u e t a d o ( ) .

Oz it o
Constructores
To d a s la s cla s e s Ja va t ie n e n m é t o d o s e s p e cia le s lla m a d o s Co n s t ru ct o re s q u e s e
u t iliza n p a ra in icia liza r u n o b je t o n u e vo d e e s e t ip o . Lo s co n t ru ct o re s t ie n e n e l
m is m o n o m b re q u e la cla s e - - e l n o m b re d e l co n s t ru ct o r d e la cla s e Re ct a n g le e s
Re c t a n g le ( ) , e l n o m b re d e l co n s t ru ct o r d e la cla s e Th re a d e s Th re a d ( ) , e t c. . .
Ja va s o p o rt a la s o b re ca rg a d e lo s n o m b re s d e m é t o d o s p a ra q u e u n a cla s e p u e d e
t e n e r cu a lq u ie r n ú m e ro d e co n s t ru ct o re s , t o d o s lo s cu a le s t ie n e n e l m is m o n o m b re .
Al ig u a l q u e o t ro s m é t o d o s s o b re ca rg a d o s , lo s co n s t ru ct o re s s e d ife re n cia n u n o s d e
o t ro s e n e l n ú m e ro y t ip o d e s u s a rg u m e n t o s .
Co n s id e re m o s la cla s e Re ct a n g le d e l p a q u e t e ja va . a wt q u e p ro p o rcio n a va rio s
co n s t ru ct o re s d ife re n t e s , t o d o s lla m a d o s Re c t a n g le ( ) , p e ro ca d a u n o co n n ú m e ro
o t ip o d ife re n t e s d e a rg u m e n t o s a p a rt ir d e lo s cu a le s s e p u e d e cre a r u n n u e vo
o b je t o Re ct a n g le . Aq u í t ie n e la s firm a s d e lo s co n s t ru ct o re s d e la cla s e
ja va . a wt . Re ct a n g le :
public Rectangle()
public Rectangle(int width, int height)
public Rectangle(int x, int y, int width, int height)
public Rectangle(Dimension size)
public Rectangle(Point location)
public Rectangle(Point location, Dimension size)
El p rim e r co n s t ru ct o r d e Re ct a n g le in icia liza u n n u e vo Re ct a n g le co n a lg u n o s
va lo re s p o r d e fe ct o ra zo n a b le s , e l s e g u n d o co n s t ru ct o r in icia liza e l n u e vo Re ct a n g le
co n la a lt u ra y a n ch u ra e s p e cifica d a s , e l t e rce r co n s t ru ct o r in icia liza e l n u e vo
Re ct a n g le e n la p o s ició n e s p e cifica d a y co n la a lt u ra y a n ch u ra e s p e cifica d a s , e t c. . .
Típ ica m e n t e , u n co n s t ru ct o r u t iliza s u s a rg u m e n t o s p a ra in icia liza r e l e s t a d o d e l
n u e vo o b je t o . En t o n ce s , cu a n d o s e cre a u n o b je t o , s e d e b e e le g ir e l co n s t ru ct o r
cu yo s a rg u m e n t o s re fle je n m e jo r có m o s e q u ie re in icia liza r e l o b je t o .
Ba s á n d o s e e n e l n ú m e ro y t ip o s d e lo s a rg u m e n t o s q u e s e p a s a n a l co n s t ru ct o r, e l
co m p ila d o r d e t e rm in a cu a l d e e llo s u t iliza r, As í e l co m p ila d o r s a b e q u e cu a n d o s e
e s crib e :
new Rectangle(0, 0, 100, 200);
e l co m p ila d o r u t iliza rá e l co n s t ru ct o r q u e re q u ie re cu a t ro a rg u m e n t o s e n t e ro s , y
cu a n d o s e e s crib e :
new Rectangle(miObjetoPoint, miObjetoDimension);
u t iliza rá e l co n s t ru ct o r q u e re q u ie re co m o a rg u m e n t o s u n o b je t o Po in t y u n o b je t o
Dim e n s io n .
Cu a n d o e s crib a s t u s p ro p ia s cla s e s , n o t ie n e s p o rq u e p ro p o rcio n a r co n s t ru ct o re s . El
co n s t ru ct o r p o r d e fe ct o , e l co n s t ru ct o r q u e n o n e ce s it a a rg u m e n t o s , lo p ro p o rcio n a
a u t o m á t ica m e n t e e l s is t e m a p a ra t o d a s la s cla s e s . S in e m b a rg o , fre cu e n t e m e n t e
s e q u e rrá o n e ce s it a rá p ro p o rcio n a r co n s t ru ct o re s p a ra la s cla s e s .
S e p u e d e d e cla ra r e im p le m e n t a r u n co n s t ru ct o r co m o s e h a ría co n cu a lq u ie r o t ro
m é t o d o e n u n a cla s e . El n o m b re d e l co n s t ru ct o r d e b e s e r e l m is m o q u e e l n o m b re
d e la cla s e y, s i s e p ro p o rcio n a m á s d e u n co n s t ru ct o r, lo s a rg u m e n t o s d e ca d a u n o
d e lo s co n s t ru ct o re s d e b e n d ife re n cia rs e e n e l n ú m e ro o t ip o . No s e t ie n e q u e
e s p e cifica r e l va lo r d e re t o rn o d e l co n s t ru ct o r.
El co n s t ru ct o r p a ra e s t a s u b cla s e d e Th re a d , u n h ilo q u e re a liza a n im a ció n ,
s e le ccio n a a lg u n o s va lo re s p o r d e fe ct o co m o la ve lo cid a d d e cu a d ro , e l n ú m e ro d e
im á g e n e s y ca rg a la s p ro p ia s im á g e n e s :
class AnimationThread extends Thread {
int framesPerSecond;
int numImages;
Image[] images;

AnimationThread(int fps, int num) {


int i;

super("AnimationThread");
this.framesPerSecond = fps;
this.numImages = num;

this.images = new Image[numImages];


for (i = 0; i <= numImages; i++) {
. . .
// Carga las imágenes
. . .
}
}
}
Ob s e rva có m o e l cu e rp o d e u n co n s t ru ct o r e s ig u a l q u e e l cu e rp o d e cu a lq u ie r o t ro
m é t o d o - - co n t ie n e d e cla ra cio n e s d e va ria b le s lo ca le s , b u cle s , y o t ra s s e n t e n cia s .
S in e m b a rg o , h a y u n a lín e a e n e l co n s t ru ct o r d e An im a t io n Th re a d q u e n o s e ve rá
e n u n m é t o d o n o rm a l- - la s e g u n d a lín e a :
super("AnimationThread");
Es t a lín e a in vo ca a l co n s t ru ct o r p ro p o rcio n a d o p o r la s u p e rcla s e d e
An im a t io n Th re a d - - Th re a d . Es t e co n s t ru ct o r p a rt icu la r d e Th re a d a ce p t a u n a ca d e n a
q u e co n t ie n e e l n o m b re d e l Th re a d . Fre cu e n t e m e n t e u n co n s t ru ct o r s e a p ro ve ch a rá
d e l có d ig o d e in icia lzia ció n e s crit o p a ra la s u p e rcla s e d e la cla s e .
En re a lid a d , a lg u n a s cla s e s d e b e n lla m a r a l co n s t ru ct o r d e s u s u p e rcla s e p a ra q u e
e l o b je t o t ra b a je d e fo rm a a p ro p ia d a . Tip ica m e n t e , lla m a r a l co n s t ru ct o r d e la
s u p e rcla s e e s lo p rim e ro q u e s e h a ce e n e l co n s t ru ct o r d e la s u b cla s e : u n o b je t o
d e b e re a liza r p rim e ro la in icia liza ció n d e n ive l s u p e rio r.
Cu a n d o s e d e cla re n co n s t ru ct o re s p a ra la s cla s e s , s e p u e d e n u t iliza r lo s
e s p e cifica d o re s d e a cce s o n o rm a le s p a ra e s p e cifica r s i o t ro s o b je t o s p u e d e n cre a r
e je m p la re s d e s u s cla s e :
p riv a t e
Nig u n a o t ra cla s e p u e d e cre a r u n o b je t o d e s u cla s e . La cla s e p u e d e co n t e n e r
m é t o d o s p ú b lico s y e s o s m é t o d o s p u e d e n co n s t ru ir u n o b je t o y d e vo lve rlo ,
p e ro n a d a m á s .
p ro t e c t e d
S ó lo la s s u b cla s e s d e la cla s e p u e d e n cre a r e je m p la re s d e e lla .
p u b lic
Cu a lq u ie ra p u e d a cre a r u n e je m p la r d e la cla s e .
pa cka g e -a cce s s
Na d ie e xt e rn o a l p a q u e t e p u e d e co n s t ru ir u n e je m p la r d e s u cla s e . Es t o e s
m u y ú t il s i s e q u ie re q u e la s cla s e q u e t e n e m o s e n u n p a q u e t e p u e d a n cre a r
e je m p la re s d e la cla s e p e ro n o s e q u ie re q u e lo h a g a n a d ie m á s .

Oz it o
Escribir un Método finalize()
An t e s d e q u e u n o b je t o s e a re co le ct a d o p o r e l re co le ct o r d e b a s u ra , e l s is t e m a lla m a a l
m é t o d o fin a liz e ( ) . La in t e n ció n d e e s t e m é t o d o e s lib e ra r lo s re cu rs o s d e l s is t e m a ,
co m o fich e ro s o co n e xio n e s a b ie rt a s a n t e s d e e m p e za r la re co le cció n .
Un a cla s e p u e d e p ro p o rcio n a r e s t a fin a liza ció n s im p le m e n t e d e fin ie n d o e im p le m e n t a n d o
u n m é t o d o lla m a d o fin a liz e ( ) . El m é t o d o fin a liz e ( ) d e b e d e cla ra rs e d e la s ig u ie n t e
fo rm a :
protected void finalize () throws throwable
Es t a cla s e a b re u n fich e ro cu a n d o s e co n s t ru ye :
class AbrirUnFichero {
FileInputStream unFichero = null;
AbrirUnFicherp(String nombreFichero) {
try {
unFichero = new FileInputStream(nombreFichero);
} catch (java.io.FileNotFoundException e) {
System.err.println("No se pudo abrir el fichero " + nombreFichero);
}
}
}
Pa ra u n b u e n co m p o rt a m ie n t o , la cla s e Ab rirUn Fich e ro d e b e ría ce rra r e l fich e ro cu a n d o
h a ya fin a liza d o . Aq u í t ie n e s e l m é t o d o fin a liz e ( ) p a ra la cla s e Ab rirUn Fich e ro :
protected void finalize () throws throwable {
if (unFichero != null) {
unFichero.close();
unFichero = null;
}
}
El m é t o d o fin a liz e ( ) e s t á d e cla ra d o e n la cla s e ja va . la n g . Ob je ct . As í cu a n d o e s crib a s u n
m é t o d o fin a liz e ( ) p a ra t u s cla s e s e s t á s s o b re e s crib ie n d o e l d e s u s u p e rcla s e . En
S o b re e s crib ir Mé t o d o s e n co n t ra rá s m á s in fo rm a ció n s o b re la s o b re e s crit u ra d e m é t o d o s .

S i la s u p e rcla s e t ie n e u n m é t o d o fin a liz e ( ) , p ro b a b le m e n t e e s t e m é t o d o d e b e rá lla m a r


a l m é t o d o fin a liz e ( ) d e s u s u p e rcla s e d e s p u é s d e h a b e r t e rm in a d o s u s t a re a s d e
lim p ie za . Es t o lim p ia rá cu a lq u ie r re cu rs o o b t e n id o s in s a b e rlo a t ra vé s d e lo s m é t o d o s
h e re d a d o s d e s d e la s u p e rcla s e .
protected void finalize() throws Throwable {
. . .
// aquí va el código de limpieza de esta clase
. . .
super.finalize();
}

Oz it o
Subclases, Superclases, y Herencia
En Ja va , co m o e n o t ro s le n g u a je s d e p ro g ra m a ció n o rie n t a d o s a o b je t o s , la s cla s e s
p u e d e n d e riva r d e s d e o t ra s cla s e s . La cla s e d e riva d a ( la cla s e q u e p ro vie n e d e o t ra
cla s e ) s e lla m a s u b cla s e . La cla s e d e la q u e e s t á d e riva d a s e d e n o m in a s u p e rcla s e .
De h e ch o , e n Ja va , t o d a s la s cla s e s d e b e n d e riva r d e a lg u n a cla s e . Lo q u e n o s lle va
a la cu e s t ió n ¿ Dó n d e e m p ie za t o d o e s t o ? . La cla s e m á s a lt a , la cla s e d e la q u e
t o d a s la s d e m á s d e s cie n d e n , e s la cla s e Ob je ct , d e fin id a e n ja va . la n g . Ob je ct e s la
ra iz d e la h e re n cia d e t o d a s la s cla s e s .
La s s u b cla s e s h e re d a n e l e s t a d o y e l co m p o rt a m ie n t o e n fo rm a d e la s va ria b le s y
lo s m é t o d o s d e s u s u p e rcla s e . La s u b cla s e p u e d e u t iliza r lo s ít e m s h e re d a d o s d e s u
s u p e rcla s e t a l y co m o s o n , o p u e d e m o d ifica rlo s o s o b re e s crib irlo s . Po r e s o , s e g ú n
s e va b a ja n d o p o r e l á rb o l d e la h e re n cia , la s cla s e s s e co n vie rt e n e n m á s y m á s
e s p e cia liza d a s :
D e fin ic ió n : Un a s u b cla s e e s u n a cla s e q u e d e s cie n d e d e o t ra cla s e . Un a s u b cla s e
h e re d a e l e s t a d o y e l co m p o rt a m ie n t o d e t o d o s s u s a n ce s t ro s . El t é r, m in o
s u p e rcla s e s e re fie re a la cla s e q u e e s e l a n ce s t ro m á s d ire ct o , a s í co m o a t o d a s la s
cla s e s a s ce n d e n t e s .

Oz it o
Crear Subclases
S e d e cla ra q u e u n cla s e e s u n a s u b cla s e d e o t ra cla s e d e n t ro d e La d e cla ra ció n d e
Cla s e . Po r e je m p lo , s u p o n g a m o s q u e q u e re m o s cre a r u n a s u b cla s e lla m a d a
S u b Cla s e d e o t ra cla s e lla m a d a S u p e rCla s e . S e e s crib iría e s t o :
class SubClass extends SuperClass {
. . .
}
Es t o d e cla ra q u e S u b Cla s e e s u n a s u b cla s e d e S u p e rCla s e . Y t a m b ié n d e cla ra
im p lícit a m e n e q u e S u p e rCla s e e s la s u p e rcla s e d e S u b Cla s e . Un a s u b cla s e t a m b ié n
h e re d a va ria b le s y m ie m b ro s d e la s s u p e rcla s e s d e s u s u p e rcla s e , y a s í a lo la rg o
d e l á rb o l d e la h e re n cia . Pa ra h a ce r e s t a e xp lica ció n u n p o co m á s s e n cilla , cu a n d o
e s t e t u t o ria l s e re fie re a la s u p e rcla s e d e u n a cla s e s ig n ifica e l a n ce s t ro m á s d ire ct o
d e la cla s e a s í co m o a t o d a s s u s cla s e s a s ce n d e n t e s .
Un a cla s e Ja va s ó lo p u e d e t e n e r u n a s u p e rcla s e d ire ct a . Ja va n o s o p o rt a la
h e re n cia m ú lt ip le .
Cre a r u n a s u b cla s e p u e d e s e r t a n s e n cillo co m o in clu ir la cla u s u la e x t e n d s e n la
d e cla ra ció n d e la cla s e . S in e m b a rg o , n o rm a lm e n t e s e d e b e rá re a liza r a lg u n a co s a
m á s cu a n d o s e cre a u n a s u b cla s e , co m o s o b re e s crib ir m é t o d o s , e t c. . .

¿Qué variables miembro hereda una subclase?

Re g la : Un a s u b cla s e h e re d a t o d a s la s va ria b le s m ie m b ro s d e s u
s u p e rcla s e q u e p u e d a n s e r a cce s ib le s d e s d e la s u b cla s e ( a m e n o s q u e la
va ria b le m ie m b ro e s t é o cu lt a e n la s u b cla s e ) .
Es t o e s , la s s u b cla s e s :
● h e re d a n a q u e lla s va ria b le s m ie m b ro s d e cla ra d a s co m o p u b lic o
p ro t e c t e d
● h e re d a n a q u e lla s va ria b le s m ie m b ro s d e cla ra d a s s in e s p e cifica d o r
d e a cce s o ( n o rm a lm e n t e co n o cid a s co m o "Am ig a s ") s ie m p re q u e la
s u b cla s e s e s t é e n e l m is m o p a q u e t e q u e la cla s e
● n o h e re d a la s va ria b le s m ie m b ro s d e la s u p e rcla s e s i la s u b cla s e
d e cla ra u n a va ria b le m ie m b ro q u e u t iliza e l m is m o n o m b re . La
va ria b le m ie m b ro d e la s u b cla s e s e d ice q u e o cu lt a a la va ria b le
m ie m b ro d e la s u p e rcla s e .
● n o h e re d a la s va ria b le s m ie m b ro p riv a t e
Ocultar Variables Miembro
Co m o s e m e n cio n ó e n la s e cció n a n t e rio r, la s va ria b le s m ie m b ro s
d e fin id a s e n la s u b cla s e o cu lt a n la s va ria b le s m ie m b ro q u e t ie n e n e l
m is m o n o m b re e n la s u p e rcla s e .
Co m o e s t a ca ra ct e ris t ica d e l le n g u a je Ja va e s p o d e ro s a y co n ve n ie n t e ,
p u e d e s e r u n a fu e n t e d e e rro re s : o cu lt a r u n a va ria b le m ie m b ro p u e d e
h a ce rs e d e lib e ra d a m e n t e o p o r a ccid e n t e . En t o n ce s , cu a n d o n o m b re s t u s
va ria b le s m ie m b ro s e cu id a d o s o y o cu lt a s ó lo la s va ria b le s m ie m b ro q u e
re a lm e n t e d e s e a s o cu lt a r.
Un a ca ra ct e ris t ica in t e re s a n t e d e la s va ria b le s m ie m b ro e n Ja va e s q u e
u n a cla s e p u e d e a cce d e r a u n a va ria b le m ie m b ro o cu lt a a t ra vé s d e s u
s u p e rcla s e . Co n s id e re e s t e p a re ja d e s u p e rcla s e y s u b cla s e :
class Super {
Number unNumero;
}
class Sub extends Super {
Float unNumero;
}
La va ria b le u n N u m e ro d e S u b o cu lt a a la va ira b le u n N u m e ro d e S u p e r.
Pe ro s e p u e d e a cce d e r a la va ria b le d e la s u p e rcla s e u t iliza n d o :
super.unNumero
s u p e r e s u n a p a la b ra cla ve d e l le n g u a je Ja va q u e p e rm it e a u n m é t o d o
re fe rirs e a la s va ria b le s o cu lt a s y m é t o d o s s o b re e s crit o s d e u n a
s u p e rcla s e .

¿Qué métodos hereda una Subclase?


La re g la q u e e s p e cifica lo s m é t o d o s h e re d a d o s p o r u n a s u b cla s e e s
s im ila r a la d e la s va ria b le s m ie m b ro .
Re g la : Un a s u b cla s e h e re d a t o d o s lo s m é t o d o s d e s u s s u p e rcla s e q u e
s o n a cce s ib le s p a ra la s u b cla s e ( a m e n o s q u e e l m é t o d o s e a s o b re e s crit o
p o r la s u b cla s e ) .
Es t o e s , u n a S u b cla s e :
● h e re d a a q u e llo s m é t o d o s d e cla ra d o s co m o p u b lic o p ro t e c t e d

● h e re d a a q u e llo s m é t o d o s s in e s p e cifica d o r d e a cce s o , s ie m p re q u e


la s u b cla s e e s t é e n e l m is m o p a q u e t e q u e la cla s e
● n o h e re d a u n m é t o d o d e la s u p e rcla s e s i la s u b cla s e d e cla ra u n
m é t o d o q u e u t iliza e l m is m o n o m b re . S e d ice q u e e l m é t o d o d e la
s u b cla s e s o b re e s crib e a l m é t o d o d e la s u p e rcla s e .
● n o h e re d a lo s m é t o d o s p riv a t e
Sobreescribir Métodos
La h a b ilid a d d e u n a s u b cla s e p a ra s o b re e s crib ir u n m é t o d o d e s u
s u p e rcla s e p e rm it e a u n a cla s e h e re d a r d e s u s u p e rcla s e a q u e llo s
co m p o rt a m ie n t o s "m á s ce rca n o s " y lu e g o s u p le m e n t a r o m o d ifica r e l
co m p o rt a m ie n t o d e la s u p e rcla s e .

Oz it o
Sobreescribir Métodos
Un a s u b cla s e p u e d e s o b re e s crib ir co m p le t a m e n t e la im p le m e n t a ció n d e u n m é t o d o
h e re d a d o o p u e d e m e jo ra r e l m é t o d o a ñ a d ie n d o le fu n cio n a lid a d .

Reemplazar la Implementación de un Método de una Superclase


Alg u n a s ve ce s , u n a s u b cla s e q u e rría re e m p la za r co m p le t a m e n t e la
im p le m e n t a ció n d e u n m é t o d o d e s u s u p e rcla s e . De h e ch o , m u ch a s
s u p e rcla s e s p ro p o rcio n a n im p le m e n t a cio n e s d e m é t o d o s va cía s co n la
e s p e ra n za d e q u e la m a yo ría , s i n o t o d a s , s u s s u b cla s e s re e m p la ce n
co m p le t a m e n t e la im p le m e n t a ció n d e e s e m é t o d o .
Un e je m p lo d e e s t o e s e l m é t o d o ru n ( ) d e la cla s e Th re a d . La cla s e Th re a d
p ro p o rcio n a u n a im p le m e n t a ció n va cía ( e l m é t o d o n o h a ce n a d a ) p a ra e l
m é t o d o ru n ( ) , p o rq u e p o r d e fin ició n , e s t e m é t o d o d e p e n d e d e la s u b cla s e .
La cla s e Th re a d p o s ib le m e n t e n o p u e d e p ro p o rcio n a r u n a im p le m e n t a ció n
m e d ia n a m e n t e ra zo n a b le d e l m é t o d o ru n ( ) .
Pa ra re e m p la za r co m p le t a m e n t e la im p le m e n t a ció n d e u n m é t o d o d e la
s u p e rcla s e , s im p le m e m t e s e lla m a a u n m é t o d o co n e l m is m o n o m b re q u e
e l d e l m é t o d o d e la s u p e rcla s e y s e s o b re e s crib e e l m é t o d o co n la m is m a
firm a q u e la d e l m é t o d o s o b re e s crit o :
class ThreadSegundoPlano extends Thread {
void run() {
. . .
}
}
La cla s e Th re a d S e g u n d o Pla n o s o b re e s crib e co m p le t a m e n t e e l m é t o d o ru n ( )
d e s u s u p e rcla s e y re e m p la za co m p le t a m e n t e s u im p le m e n t a ció n .

Añadir Implementación a un Método de la Superclase


Ot ra s ve ce s u n a s u b cla s e q u e rrá m a n t e n e r la im p le m e m t a ció n d e l m é t o d o
d e s u s u p e rcla s e y p o s t e rio rm e n t e a m p lia r a lg ú n co m p o rt a m ie n t o e s p e cífico
d e la s u b cla s e . Po r e je m p lo , lo s m é t o d o s co n s t ru ct o re s d e u n a s u b cla s e lo
h a ce n n o rm a lm e n t e - - la s u b cla s e q u ie re p re s e rva r la in icia liza ció n re a liza d a
p o r la s u p e rcla s e , p e ro p ro p o rcio n a in icia liza ció n a d icio n a l e s p e cífica d e la
s u b cla s e .
S u p o n g a m o s q u e q u e re m o s cre a r u n a s u b cla s e d e la cla s e Win d o ws d e l
p a q u e t e ja va . a wt . La cla s e Win d o ws t ie n e u n co n s t ru ct o r q u e re q u ie re u n
a rg u m e n t o d e l t ip o Fra m e q u e e s e l p a d re d e la ve n t a n a :
public Window(Frame parent)
Es t e co n s t ru ct o r re a liza a lg u n a in icia liza ció n e n la ve n t a n a p a ra q u e t ra b a je
d e n t ro d e l s is t e m a d e ve n t a n a s . Pa ra a s e g u ra rn o s d e q u e u n a s u b cla s e d e
Win d o w t a m b ié n t ra b a ja d e n t ro d e l s is t e m a d e ve n t a n a s , d e b e re m o s
p ro p o rcio n a r u n co n s t ru ct o r q u e re a lice la m is m a in icia liza ció n . Mu ch o
m e jo r q u e in t e n t a r re cre a r e l p ro ce s o d e in icia liza ció n q u e o cu rre d e n t ro d e l
co n s t ru ct o r d e Win d o ws , p o d ria m o s u t iliza r lo q u e la cla s e Win d o ws ya
h a ce . S e p u e d e u t iliza r e l có d ig o d e l co n s t ru ct o r d e Win d o ws lla m á m d o lo
d e s d e d e n t ro d e l co n s t ru ct o r d e la s u b cla s e Win d o w:
class Ventana extends Window {
public Ventana(Frame parent) {
super(parent);
. . .
// Ventana especifica su inicialización aquí
. . .
}
}
El co n s t ru ct o r d e Ve n t a n a lla m a p rim e ro a l co n s t ru ct o r d e s u s u p e rcla s e , y
n o h a ce n a d a m á s . Típ ica m e n t e , e s t e e s e l co m p o rt a m ie n t o d e s e a d o d e lo s
co n s t ru ct o re s - - la s s u p e rcla s e s d e b e n t e n e r la o p o rt u n id a d d e re a liza r s u s
t a re a s d e in icia liza ció n a n t e s q u e la s d e s u s u b cla s e . Ot ro s t ip o s d e
m é t o d o s p o d ría n lla m a r a l co n s t ru ct o r d e la s u p e cla s e a l fin a l d e l m é t o d o o
e n e l m e d io .

Métodos que una Subclase no Puede Sobreescibir


● Un a s u b cla s e n o p u e d e s o b re e s crib ir m é t o d o s q u e h a ya n s id o
d e cla ra d o s co m o fin a l e n la s u p e rcla s e ( p o r d e fin ició n , lo s m é t o d o s
fin a le s n o p u e d e n s e r s o b re e s crit o s ) . S i in t e n t a m o s s o b re e s crib ir u n
m é t o d o fin a l, e l co m p ila d o r m o s t ra rá u n m e n s a je s im ila r a e s t e y n o
co m p ila rá e l p ro g ra m a :
FinalTest.java:7: Final methods can't be overriden. Method void iamfinal()
is final in class ClassWithFinalMethod.
void iamfinal() {
^
1 error
Pa ra u n a e xp lica ció n s o b re lo s m é t o d o s fin a le s , p u e d e s ve r: Es crib ir
Mé t o d o s y Cla s e s Fin a le s .
● Un a s u b cla s e t a m p o co p u d e s o b re e s crib ir m é t o d o s q u e s e h a ya n
d e cla ra d o co m o s t a t ic e n la s u p e rcla s e . En o t ra s p a la b ra s , u n a
s u b cla s e n o p u e d e s o b re e s crib ir u n m é t o d o d e cla s e . Pu e d e s ve r
Mie m b ro s d e l Eje m p la r y d e la Cla s e p a ra o b t e n e r u n a e xp lica ció n
s o b re lo s m é t o d o s d e cla s e .

Métodos que una Subclase debe Sobreescribir


La s s u b cla s e s d e b e n s o b re e s crib ir a q u e llo s m é t o d o s q u e h a ya n s id o
d e cla ra d o s co m o a b s t ra c t e n la s u p e rcla s e , o la p ro p ia s u b cla s e d e b e s e r
a b s t ra ct a . Es crib ir Cla s e s y Mé t o d o s Ab s t ra ct o s e xp lica co n m á s d e t a lle lo s
m é t o d o s y cla s e s a b s t ra ct o s .
Oz it o
Escribir Clases y Métodos Finales
Clases Finales
S e p u e d e d e cla ra r q u e u n a cla s e s e a fin a l; e s t o e s , q u e la cla s e n o p u e d a
t e n e r s u b cla s e s . Exis t e n ( a l m e n o s ) d o s ra zo n e s p o r la s q u e s e q u e rría
h a ce r e s t o : ra zo n e s d e s e g u rid a d y d e d is e ñ o .
S e g u rid a d : Un m e ca n is m o q u e lo s h a cke rs u t iliza n p a ra a t a ca r s is t e m a s
e s cre a r s u b cla s e s d e u n a cla s e y lu e g o s u s t it u irla p o r e l o rig in a l. La s
s u b cla s e s p a re ce n y s ie n t e n co m o la cla s e o rig in a l p e ro h a ce n co s a s
b a s t a n t e d ife re n t e s , p ro b a b le m e n t e ca u s a n d o d a ñ o s u o b t e n ie n d o
in fo rm a ció n p riva d a . Pa ra p re ve n ir e s t a cla s e d e s u b ve rs ió n , s e p u e d e
d e cla ra r q u e la cla s e s e a fin a l y a s í p re ve n ir q u e s e cre e cu a lq u ie r
s u b cla s e .
La cla s e S t rin g d e l p a q u e t e ja va . la n g e s u n a cla s e fin a l s ó lo p o r e s t a ra zó n .
La cla s e S t rin g e s t a n vit a l p a ra la o p e ra ció n d e l co m p ila d o r y d e l
in t é rp re t e q u e e l s is t e m a Ja va d e b e g a ra n t iza r q u e s ie m p re q u e u n m é t o d o
o u n o b je t o u t ilice n u n S t rin g , o b t e n g a u n o b je t o ja va . la n g . S t rin g y n o
a lg u n o t ro s t rin g . Es t o a s e g u ra q u e n in g ú n s t rin g t e n d rá n p ro p ie d a d e s
e xt ra ñ a s , in co s is t e n t e s o in d e s e a b le s .
S i s e in t e n t a co m p ila r u n a s u b cla s e d e u n a cla s e fin a l, e l co m p ila d o r
m o s t ra rá u n m e n s a je d e e rro r y n o co m p ila rá e l p ro g ra m a . Ad e m á s , lo s
b yt e s co d e s ve rifica n q u e n o e s t a t e n ie n d o lu g a r u n a s u b ve rs ió n , a l n ive l d e
b yt e co m p ro b a n d o q u e u n a cla s e n o e s u n a s u b cla s e d e u n a cla s e fin a l.
D is e ñ o : Ot ra ra zó n p o r la q u e s e p o d ría q u e re r d e cla ra r u n a cla s e fin a l s o n
ra zo n e s d e d is e ñ o o rie n t a d o a o b je t o s . S e p o d ría p e n s a r q u e u n a cla s e e s
"p e rfe ct a " o q u e , co n ce p t u a lm e n t e h a b la n d o , la cla s e n o d e b e ría t e n e r
s u b cla s e s .
Pa ra e s p e cifica r q u e u n a cla s e e s u n a cla s e fin a l, s e u t iliza la p a la b ra cla ve
fin a l a n t e s d e la p a la b ra cla ve c la s s e n la d e cla ra ció n d e la cla s e . Po r
e je m p lo , s i q u is ie ra m o s d e cla ra r Alg o rit m o d e Aje d re z co m o u n a cla s e fin a l
( p e rfe ct a ) , la d e cla ra ció n s e p a re ce ría a e s t o :
final class AlgoritmodeAjedrez {
. . .
}
Cu a lq u ie r in t e n t o p o s t e rio r d e cre a r u n a s u b cla s e d e Alg o rit m o d e Aje d re z
re s u lt a rá e n e l s ig u ie n t e e rro r d e l co m p ila d o r:
Chess.java:6: Can't subclass final classes: class AlgoritmodeAjedrez
class MejorAlgoritmodeAjedrez extends AlgoritmodeAjedrez {
^
1 error
Métodos Finales
S i la cre a cció n d e cla s e s fin a le s p a re ce a lg o d u ra p a ra n u e s t ra s
n e ce s id a d e s , y re a lm e n t e lo q u e s e q u ie re e s p ro t e g e r s o n a lg u n o s
m é t o d o s d e u n a cla s e p a ra q u e n o s e a n s o b re e s crit o s , s e p u e d e u t iliza r la
p a la b ra cla ve fin a l e n la d e cla ra ció n d e m é t o d o p a ra in d ica r a l co m p ila d o r
q u e e s t e m é t o d o n o p u e d e s e r s o b re e s crit o p o r la s s u b cla s e s .
S e p o d ría d e s e a r h a ce r q u e u n m é t o d o fu e ra fin a l s i e l m é t o d o t ie n e u n a
im p le m e n t a ció n q u e n o d e b e s e r ca m b ia d a y q u e e s crít ica p a ra e l e s t a d o
co n s is t e n t e d e l o b je t o . Po r e je m p lo , e n lu g a r d e h a ce r Alg o rit m o d e Aje d re z
co m o u n a cla s e fin a l, p o d ría m o s h a ce r s ig u ie n t e Mo v im ie n t o ( ) co m o u n
m é t o d o fin a l:
class AlgoritmodeAjedrez {
. . .
final void siguienteMovimiento(Pieza piezaMovida,
PosicionenTablero nuevaPosicion) {
}
. . .
}

Oz it o
Escribir Clases y Métodos Abstractos
Clases Abstractas
Alg u n a s ve ce s , u n a cla s e q u e s e h a d e fin id o re p re s e n t a u n co n ce p t o a b s t ra ct o y
co m o t a l, n o d e b e s e r e je m p la riza d o . Po r e je m p lo , la co m id a e n la vid a re a l.
¿ Ha s vis t a a lg ú n e je m p la r d e co m id a ? No . Lo q u e h a s vis t o s o n e je m p la re s d e
m a n za n a s , p a n , y ch o co la t e . Co m id a re p re s e n t a u n co n ce p t o a b s t ra ct o d e co s a s
q u e s o n co m e s t ib le s . No t ie n e s e n t id o q u e e xis t a u n e je m p la r d e co m id a .
S im ila rm e n t e e n la p ro g ra m a ció n o rie n t a d a a o b je t o s , s e p o d ría m o d e la r
co n ce p t o s a b s t ra ct o s p e ro n o q u e re r q u e s e cre e n e je m p la re s d e e llo s . Po r
e je m p lo , la cla s e Nu m b e r d e l p a q u e t e ja va . la n g re p re s e n t a e l co n ce p t o a b s t ra ct o
d e n ú m e ro . Tie n e s e n t id o m o d e la r n ú m e ro s e n u n p ro g ra m a , p e ro n o t ie n e
s e n t id o cre a r u n o b je t o g e n é rico d e n ú m e ro s . En s u lu g a r, la cla s e Nu m b e r s ó lo
t ie n e s e n t id o co m o s u p e rcla s e d e o t ra s cla s e s co m o In t e g e r y Flo a t q u e
im p le m e n t a n n ú m e ro s d e t ip o s e s p e cífico s . La s cla s e s co m o Nu m b e r, q u e
im p le m e n t a n co n ce p t o s a b s t ra ct o s y n o d e b e n s e r e je m p la riza d a s , s o n lla m a d a s
cla s e s a b s t ra ct a s . Un a cla s e a b s t ra ct a e s u n a cla s e q u e s ó lo p u e d e t e n e r
s u b cla s e s - - n o p u e d e s e r e je m p la riza d a .
Pa ra d e cla ra r q u e u n a cla s e e s u n cla s e a b s t ra ct a , s e u t iliza la p a la b ra cla ve
a b s t ra c t e n la d e cla ra ció n d e la cla s e .
abstract class Number {
. . .
}
S i s e in t e n t a e je m p la riza r u n a cla s e a b s t ra ct a , e l co m p ila d o r m o s t ra rá u n e rro r
s im ila r a e s t e y n o co m p ila rá e l p ro g ra m a :
AbstractTest.java:6: class AbstractTest is an abstract class. It can't be
instantiated.
new AbstractTest();
^
1 error

Métodos Abstractos
Un a cla s e a b s t ra ct a p u e d e co n t e n e r m é t o d o s a b s t ra ct o s , e s t o e s , m é t o d o s q u e
n o t ie n e n im p le m e n t a ció n . De e s t a fo rm a , u n a cla s e a b s t ra ct a p u e d e d e fin ir u n
in t e rfa ce d e p ro g ra m a ció n co m p le t o , in clu s o p o rp o rcio n a a s u s s u b cla s e s la
d e cla ra ció n d e t o d o s lo s m é t o d o s n e ce s a rio s p a ra im p le m e n t a r e l in t e rfa ce d e
p ro g ra m a ció n . S in e m b a rg o , la s cla s e s a b s t ra ct a s p u e d e n d e ja r a lg u n o s d e t a lle s
o t o d a la im p le m e n t a ció n d e a q u e llo s m é t o d o s a s u s s u b cla s e s .
Ve a m o s u n e je m p lo d e cu a n d o s e ría n e ce s a rio cre a r u n a cla s e a b s t ra ct a co n
m é t o d o s a b s t ra ct o s . En u n a a p lica ció n d e d ib u jo o rie n t a d a a o b je t o s , s e p u e d e n
d ib u ja r círcu lo s , re ct á n g u lo s , lín e a s , e t c. . Ca d a u n o d e e s o s o b je t o s g rá fico s
co m p a rt e n cie rt o s e s t a d o s ( p o s ició n , ca ja d e d ib u jo ) y co m p o rt a m ie n t o
( m o vim ie n t o , re d im e n s io n a d o , d ib u jo ) . Po d e m o s a p ro ve ch a rn o s d e e s a s
s im ilit u d e s y d e cla ra rlo s t o d o s a p a rt ir d e u n m is m o o b je t o p a d re - Ob je t o Gra fico .
S in e m b a rg o , lo s o b je t o s g rá fico s t a m b ié n t ie n e n d ife re n cia s s u b t a n cia le s :
d ib u ja r u n círcu lo e s b a s t a n t e d ife re n t e a d ib u ja r u n re ct á n g u lo . Lo s o b je t o s
g rá fico s n o p u e d e n co m p a rt ir e s t o s t ip o s d e e s t a d o s o co m p o rt a m ie n t o s . Po r o t ro
la d o , t o d o s lo s Ob je t o s Gra fico s d e b e n s a b e r co m o d ib u ja rs e a s í m is m o s ; s e
d ife re n cia n e n có m o s e d ib u ja n u n o s y o t ro s . Es t a e s la s it u a ció n p e rfe ct a p a ra
u n a cla s e a b s t ra ct a .
Prim e ro s e d e b e d e cla ra r u n a cla s e a b s t ra ct a , Ob je t o Gra fico , p a ra p ro p o rcio n a r
la s va ria b le s m ie m b ro y lo s m é t o d o s q u e va n a s e r co m p a rt id o s p o r t o d a s la s
s u b cla s e s , co m o la p o s ició n a ct u a l y e l m é t o d o m o v e rA( ) .
Ta m b ié n s e d e b e ría n d e cla ra r m é t o d o s a b s t ra ct o s co m o d ib u ja r( ) , q u e n e ce s it a
s e r im p le m e n t a d o p o r t o d a s la s s u b cla s e s , p e ro d e m a n e ra co m p le t a m e n t e
d ife re n t e ( n o t ie n e s e n t id o cre a r u n a im p le m e n t a ció n p o r d e fe ct o e n la
s u p e rcla s e ) . La cla s e Ob je t o Gra fico s e p a re ce ría a e s t o :
abstract class ObjetoGrafico {
int x, y;
. . .
void moverA(int nuevaX, int nuevaY) {
. . .
}
abstract void dibujar();
}
To d a s la s s u b cla s e s n o a b s t ra ct a s d e Ob je t o Gra fico co m o s o n Circu lo o
Re ct a n g u lo d e b e rá n p ro p ro cio n a r u n a im p le m e n t a ció n p a ra e l m é t o d o d ib u ja r( ) .
class Circulo extends ObjetoGrafico {
void dibujar() {
. . .
}
}
class Rectangulo extends ObjetoGrafico {
void dibujar() {
. . .
}
}
Un a cla s e a b s t ra ct a n o n e ce s it a co n t e n e r u n m é t o d o a b s t ra ct o . Pe ro t o d a s la s
cla s e s q u e co n t e n g a n u n m é t o d o a b s t ra ct o o n o p ro p o rcio n e n im p le m e n a ció n
p a ra cu a lq u ie r m é t o d o a b s t ra ct o d e cla ra d o e n s u s s u p e rcla s e s d e b e s e r
d e cla ra d a co m o u n a cla s e a b s t ra ct a .

Oz it o
La Clase Object
La cla s e Ob je ct e s t á s it u a d a e n la p a rt e m á s a lt a d e l á rb o l d e la h e re n cia e n e l
e n t o rn o d e d e s a rro llo d e Ja va . To d a s la s cla s e s d e l s is t e m a Ja va s o n d e s ce n d e n t e s
( d ire ct o s o in d ire ct o s ) d e la cla s e Ob je ct . Es t a cla s e d e fin e lo s e s t a d o s y
co m p o rt a m ie n t o s b á s ico s q u e t o d o s lo s o b je t o s d e b e n t e n e r, co m o la p o s ib ilid a d d e
co m p a ra rs e u n o s co n o t ro s , d e co n ve rt irs e a ca d e n a s , d e e s p e ra r u n a co n d ició n
va ria b le , d e n o t ifica r a o t ro s o b je t o s q u e la co n d ició n va rib le a ca m b ia d o y d e vo lve r
la cla s e d e l o b je t o .

El método equals()
e q u a ls ( ) s e u t iliza p a ra co m p a ra r s i d o s o b je t o s s o n ig u a le s . Es t e
m é t o d o d e vu e lve t ru e s i lo s o b je t o s s o n ig u a le s , o fa ls e s i n o lo s o n .
Ob s e rve q u e la ig u a ld a d n o s ig n ifica q u e lo s o b je t o s s e a n e l m is m o
o b je t o . Co n s id e re m o s e s t e có d ig o q u e co m p a ra d o s e n t e ro s :
Integer uno = new Integer(1), otroUno = new Integer(1);

if (uno.equals(otroUno))
System.out.println("Los objetos son Iguales");
Es t e có d ig o m o s t ra rá Lo s o b je t o s s o n I g u a le s a u n q u e u n o y o t ro Un o
re fe re n cia n a d o s o b je t o s d is t in t o s . S e le s co n s id e ra ig u a le s p o rq u e s u
co n t e n id o e s e l m is m o va lo r e n t e ro .
La s cla s e s d e b e ria cu t e ; a n s o b re e s crib ir e s t e m é t o d o p ro p o rcio n a n d o la
co m p ro b a ció n d e ig u a ld a d a p ro p ia d a . Un m é t o d o e q u a ls ( ) d e b e ría
co m p a ra r e l co n t e n id o d e lo s o b je t o s p a ra ve r s i s o n fu n cio n a lm e n t e
ig u a le s y d e vo lve r t ru e s i e s a s í.

El método getClass()
El m é t o d o g e t Cla s s ( ) e s u n m é t o d o fin a l ( n o p u e d e s o b re e s crib irs e ) q u e
d e vu e lve u n a re p re s e n t a ció n e n t ie m p o d e e je cu ció n d e la cla s e d e l
o b je t o . Es t e m é t o d o d e vu e lve u n o b je t o Cla s s a l q u e s e le p u e d e p e d ir
va ria in fo rm a ció n s o b re la cla s e , co m o s u n o m b re , e l n o m b re d e s u
s u p e rcla s e y lo s n o m b re s d e lo s in t e rfa ce s q u e im p le m e n t a . El s ig u ie n t e
m é t o d o o b t ie n e y m u e s t ra e l n o m b re d e la cla s e d e u n o b je t o :
void PrintClassName(Object obj) {
System.out.println("La clase del Objeto es " +
obj.getClass().getName());
}
Un u s o m u y m a n e ja d o d e l m é t o d o g e t Cla s s ( ) e s cre a r u n e je m p la r d e
u n a cla s e s in co n o ce r la cla s e e n e l m o m e n t o d e la co m p ila ció n . Es t e
m é t o d o d e e je m p lo , cre a u n n u e vo e je m p la r d e la m is m a cla s e q u e o b j
q u e p u e d e s e r cu a lq u ie r cla s e h e re d a d a d e s d e Ob je ct ( lo q u e s ig n ifica
q u e p o d ría s e r cu a lq u ie r cla s e ) :
Object createNewInstanceOf(Object obj) {
return obj.getClass().newInstance();
}

El método toString()
Es t e m é t o d o d e vu e lve u n a ca d e n a d e t e xt o q u e re p re s e n t a a l o b je t o . S e
p u e d e u t iliza r t o S t rin g p a ra m o s t ra r u n o b je t o . Po r e je m p lo , s e p o d ría
m o s t ra r u n a re p re s e n t a ció n d e l Th re a d a ct u a l d e la s ig u ie n t e fo rm a :
System.out.println(Thread.currentThread().toString());
System.out.println(new Integer(44).toString());
La re p re s e n t a ció n d e u n o b je t o d e p e n d e e n t e ra m e n t e d e l o b je t o . El
S t rin g d e u n o b je t o e n t e ro e s e l va lo r d e l e n t e ro m o s t ra d o co m o t e xt o . El
S t rin g d e u n o b je t o Th re a d co n t ie n e va rio s a t rib u t o s s o b re e l t h re a d ,
co m o s u n o m b re y p rio rid a d . Po r e je m p lo , la s d o s lín e a s a n t e rio re s
d a ría n la s ig u ie n t e s a lid a :
Thread[main,5,main]
4
El m é t o d o t o S t rin g ( ) e s m u y ú t il p a ra d e p u ra ció n y t a m b ié n p u e d e
s o b re e s crib ir e s t e m é t o d o e n t o d a s la s cla s e s .

Otros métodos de Object cubiertos en otras lecciones o secciones


La cla s e Ob je ct p ro p o rcio n a u n m é t o d o , fin a liz e ( ) q u e lim p ia u n o b je t o
a n t e s d e re co le ct a r la b a s u ra . Es t e m é t o d o s e e xp lica e n la le cció n
Elim in a r Ob je t o s n o Ut iliza d o s . Ta m b ié n e n : Es crib ir u n Mé t o d o fin a lize ( )
p u e d e s ve r có m o s o b re e s crib ir e s t e m é t o d o p a ra m a n e ja r la s
n e ce s id a d e s d e fin a liza ció n d e la s cla s e s
La cla s e Ob je ct t a m b ié m p ro p o rcio n a o t ro s cin co m é t o d o s :
● n o t ify ( )

● n o t ify All( )

● w a it ( ) ( t re s ve rs io n e s )

q u e s o n crít ico s cu a n d o s e e s crib e n p ro g ra m a s Ja va co n m ú lt ip le s


t h re a d . Es t o s m é t o d o s a yu d a n a a s e g u ra rs e q u e lo s t h re a d e s t á n
s in cro n iza d o s y s e cu b re n e n Th re a d s d e Co n t ro l.

Oz it o
¿Qué es un Interface?
D e fin ic ió n : Un in t e rfa ce e s u n a co le cció n d e d e fin icio n e s d e m é t o d o s ( s in
im p le m e n t a cio n e s ) y d e va lo re s co n s t a n t e s .

Lo s in t e rfa ce s s e u t iliza n p a ra d e fin ir u n p ro t o co lo d e co m p o rt a m ie n t o q u e p u e d e


s e r im p le m e n t a d o p o r cu a lq u ie r cla s e d e l á rb o l d e cla s e s .
Lo s in t e rfa ce s s o n ú t ile s p a ra :
● ca p t u ra r s im ilit u d e s e n t re cla s e s n o re la cio n a d a s s in fo rza r u n a re la ció n e n t re
e lla s .
● d e cla ra r m é t o d o s q u e u n a o va ria s cla s e s n e ce s it a n im p le m e n t a r.

● re ve la r e l in t e rfa ce d e p ro g ra m a ció n d e u n o b je t o s in re ce la r s u s cla s e s ( lo s


o b je t o s d e e s t e t ip o s o n lla m a d o s o b je t o s a n ó n im o s y p u e d e n s e r ú t ile s
cu a n d o co m p a rt a s u n p a q u e t e d e cla s e s co n o t ro s d e s a rro lla d o re s ) .
En Ja va , u n in t e rfa ce e s u n t ip o d e d a t o d e re fe re n cia , y p o r la n t o , p u e d e u t iliza rs e
e n m u ch o s d e lo s s it io s d o n d e s e p u e d a u t iliza r cu a lq u ie r t ip o ( co m o e n u n
a rg u m e n t o d e m é t o d o s y u n a d e cla ra ció n d e va ria b le s ) . Po d rá s ve r t o d o e s t o e n :
Ut iliza r u n In t e rfa ce co m o u n Tip o .

Los Interfaces No Proporcionan Herencia Múltiple


Alg u n a s ve ce s s e t ra t ra a lo s in t e rfa ce s co m o u n a a lt e rn a t iva a la
h e re n cia m ú lt ip le e n la s cla s e s . A p e s a r d e q u e lo s in t e rfa ce s p o d ría n
re s o lve r a lg u n o s p ro b le m a s d e la h e re n cia m ú lt ip le , s o n a n im a le s
b a s t a n t e s d ife re n t e s . En p a rt icu la r:
● No s e p u e d e n h e re d a r va ria b le s d e s d e u n in t e rfa ce .

● No s e p u e d e n h e re d a r im p le m e n t a cio n e s d e m é t o d o s d e s d e u n
in t e rfa ce .
● La h e re n cia d e u n in t e rfa ce e s in d e p e n d ie n t e d e la h e re n cia d e la
cla s e - - la s cla s e s q u e im p le m e n t a n e l m is m o in t e rfa ce p u e d e n o n o
e s t a r re la cio n a d a s a t ra vé s d e l á rb o l d e cla s e s .

Oz it o
Definir un Interface
Pa ra cre a r u n In t e rfa ce , s e d e b e e s crib ir t a n t o la d e lca ra ció n co m o e l cu e rp o d e l
in t e rfa ce :
declaraciondeInterface {
cuerpodeInterface
}
La D e c la ra c ió n d e I n t e rfa c e d e cla ra va rio s a t rib u t o s d e l in t e rfa ce , co m o s u n o m b re o
s i s e e xt ie n d e d e s d e o t ro in t e rfa ce . El Cu e rp o d e I n t e rfa c e co n t ie n e la s co n s t a n t e s y
la s d e cla ra cio n e s d e m é t o d o s d e l In t e rfa ce .

La Declaración de Interface
Co m o m ín im o , u n a d e cla ra ció n d e in t e rfa ce co n t ie n e la p a la b ra cla ve
in t e rfa c e y e l n o m b re d e l in t e rfa ce q u e s e va a cre a r:
interface Contable {
. . .
}
N o t a : Po r co n ve n ció n , lo s n o m b re s d e in t e rfa ce s e m p ie za n co n u n a le t ra
m a yú s cu la a l ig u a l q u e la s cla s e s . Fre cu e n t e m e n t e lo s n o m b re s d e in t e rfa ce s
t e rm in a n e n "a b le " o "ib le ".
Un a d e cla ra ció n d e in t e rfa ce p u e d e t e n e r o t ro s d o s co m p o n e n t e s : e l
e s p e cifica d o r d e a cce s o p u b lic y u n a lis t a d e "s u p e rin t e rfa ce s ". Un in t e rfa ce
p u e d e e xt e n d e r o t ro s in t e rfa ce s co m o u n a cla s e p u e d e e xt e n d e r o
s u b cla s ifica r o t ra ca s e . S in e m b a rg o , m ie n t ra s q u e u n a cla s e s ó lo p u e d e
e xt e n d e r u n a s u p e rcla s e , lo s in t e rfa ce s p u e d e n e xt e n d e r d e cu a lq u ie r n ú m e ro
d e in t e rfa ce s . As í, u n a d e cla ra ció n co m p le t a d e in t e rfa ce s e p a re ce ría a e s t o :
[public] interface Nombredenterface [extends listadeSuperInterfaces] {
. . .
}
El e s p e cifica d o r d e a cce s o p u b lic in d ica q u e e l in t e rfa ce p u e d e s e r u t iliza d o
p o r t o d a s la s cla s e s e n cu a lq u ie r p a q u e t e . S i e l in t e rfa ce n o s e e s p e cifica
co m o p ú b lico , s ó lo s e rá a cce s ib le p a ra la s cla s e s d e fin id a s e n e l m is m o
p a q u e t e q u e e l in t e rfa ce .
La cla u s u la e x t e n d s e s s im ila r a la u t iliza d a e n la d e cla ra ció n d e u n a cla s e ,
s in e m b a rg o , u n in t e rfa ce p u e d e e xt e n d e r va rio s in t e rfa ce s ( m ie n t ra s u n a
cla s e s ó lo p u e d e e xt e n d e r u n a ) , y u n in t e rfa ce n o p u e d e e xt e n d e r cla s e s .
Es t a lis t a d e s u p e rin t e rfa ce s e s u n lis t a d e lim it a d a p o r co m a s d e t o d o s lo s
in t e rfa ce s e xt e n d id o s p o r e l n u e vo in t e rfa ce .
Un in t e rfa ce h e re d a t o d a s la s co n s t a n t e s y m é t o d o s d e s u s s u p e rin t e rfa ce s a
m e n o s q u e e l in t e rfa ce o cu lt e u n a co n s t a n t e co n e l m is m o n o m b re o
re d e cla re u n m é t o d o co n u n a n u e va d e cla ra ció n .
El cuerpo del Interface
El cu e rp o d e l in t e rfa ce co n t ie n e la s d e cla ra cio n e s d e m é t o d o s p a ra lo s
m é t o d o s d e fin id o s e n e l in t e rfa ce . Im p le m e n t a r Mé t o d o s m u e s t ra có m o
e s crib ir u n a d e cla ra ció n d e m é t o d o . Ad e m á s d e la s d e cla ra cio n e s d e l
m é t o d o s , u n in t e rfa ce p u e d e co n t e n e r d e cla ra cio n e s d e co n s t a n t e s . En
De cla ra r Va ria b le s Mie m b ro s e xis t e m á s in fo rm a ció n s o b re có m o co n s t ru ir
u n a d e cla ra ció n d e u n a va ria b le m ie m b ro .

N o t a : La s d e cla ra cio n e s d e m ie m b ro s e n u n in t e rfa ce n o p e rm it e n e l u s o d e


a lg u n o s m o d ifica d o re s y d e s a co n s e ja n e l u s o d e o t ro s . No s e p o d rá n u t iliza r
t ra n s ie n t , v o la t ile , o s y n c h ro n iz e d e n u n a d e cla ra ció n d e m ie m b ro e n u n
in t e rfa ce . Ta m p o co s e p o d rá u t iliza r lo s e s p e cifica d o re s p riv a t e y p ro t e c t e d
cu a n d o s e d e cla re n m ie m b ro s d e u n in t e rfa ce .

To d o s lo s va lo re s co n s t a n t e s d e fin id o s e n u n in t e rfa ce s s o n im p licit a m e n t e


p ú b lico s , e s t á t ico s y fin a le s . El u s o d e e s t o s m o d ifica d o re s e n u n a d e cla ra ció n
d e co n s t a n t e e n u n in t e rfa ce e s t á d e s a co n s e ja d o p o r fa lt a d e e s t ilo .
S im ila rm e n t e , t o d o s lo s m é t o d o s d e cla ra d o s e n u n in t e rfa ce s o n
im p lícit a m e n t e p ú b lico s y a b s t ra ct o s .
Es t e có d ig o d e fin e u n n u e vo in t e rfa ce lla m a d o co le ccio n q u e co n t ie n e u n
va lo r co n s t a n t e y t re s d e cla ra cio n e s d e m é t o d o s :
interface coleccion {
int MAXIMO = 500;

void añadir(Object obj);


void borrar(Object obj);
Object buscar(Object obj);
int contadorActual();
}
El in t e rfa ce a n t e rio r p u e d e s e r im p le m e n t a d o p o r cu a lq u ie r cla s e q u e
re p re s e n t e u n a co le cció n d e o b je t o s co m o p u e d e n s e r p ila s , ve ct o re s ,
e n la ce s , e t c. . .
Ob s e rva q u e ca d a d e cla ra ció n d e m é t o d o e s t á s e g u id a p o r u n p u n t o y co m a
( ; ) p o rq u e u n in t e rfa ce n o p ro p o rcio n a im p le m e n t a ció n p a ra lo s m é t o d o s
d e cla ra d o s d e n t ro d e é l.

Oz it o
Implementar un Interface
Pa ra u t iliza r u n in t e rfa ce s e d e b e e s crib ir u n a cla s e q u e lo im p le m e n t e . Un a cla s e
d e cla ra t o d o s lo s in t e rfa ce s q u e im p le m e n t a e n s u d e cla ra ció n d e cla s e . Pa ra
d e cla ra r q u e u n a cla s e im p le m e n t a u n o o m á s in t e rfa ce s , s e u t iliza la p a la b ra cla ve
im p le m e n t s s e g u id a p o r u n a lis t a d e lim it a d a p o r co m a s co n lo s in t e rfa ce s
im p le m e n t a d o s p o r la cla s e .
Po r e je m p lo , co n s id e re m o s e l in t e rfa ce co le ccio n p re s e n t a d o e n la p á g in a a n t e rio r.
Ah o ra , s u p o n g a m o s q u e q u e re m o s e s crib ir u n a cla s e q u e im p le m e n t e u n p ila FIFO
( p rim e ro e n e n t ra r, p rim e ro e n s a lir) . Co m o u n a p ila FIFO co n t ie n e o t ro s o b je t o s
t ie n e s e n t id o q u e im p le m e n t e e l in t e rfa ce co le ccio n . La cla s e Pila FIFO d e cla ra q u e
im p le m e n t a e l in t e rfa ce co le ccio n d e e s t a fo rm a :
class PilaFIFO implements coleccion {
. . .
void añadir(Object obj) {
. . .
}
void borrar(Object obj) {
. . .
}
Object buscar(Object obj) {
. . .
}
int contadorActual() {
. . .
}
}
a s í s e g a ra n t iza q u e p ro p o rcio n a im p le m e n t a ció n p a ra lo s m é t o d o s a ñ a d ir( ) ,
b o rra r( ) , b u s c a r( ) y c o n t a d o rAc t u a l( ) .
Po r co n ve n ció n , la cla u s u la im p le m e n t s s ig u e a la cla u s u la e x t e n d s s i e s q u e é s t a
e xis t e .
Ob s e rva q u e la s firm a s d e lo s m é t o d o s d e l in t e rfa ce co le ccio n im p le m e n t a d o s e n la
cla s e Pila FIFO d e b e co rre s p o n d e r e xa ct a m e n t e co n la s firm a s d e lo s m é t o d o s
d e cla ra d o s e n la in t e rfa ce co le ccio n .

Oz it o
Utilizar un Interface como un Tipo
Co m o s e m e n cio ó a n t e rio rm e n t e , cu a n d o s e d e fin e u n n u e vo in t e rfa ce , e n e s e n cia
s e e s t á d e fin ie n d o u n t ip o d e re fe re n cia . S e p u e d e n u t iliza r lo s n o m b re s d e
in t e rfa ce e n cu a lq u ie r lu g a r d o n d e s e u s a ría u n n o m b re d e d a t o d e t ip o s p rim it ivo s
o u n n o m b re d e d a t o s d e l t ip o d e re fe re n cia .
Po r e je m p lo , s u p o n g a m o s q u e s e h a e s crit o u n p ro g ra m a d e h o ja d e cá lcu lo q u e
co n t ie n e u n co n ju n t o t a b u la r d e ce ld a s y ca d a u n a co n t ie n e u n va lo r. Qu e rría m o s
p o d e r p o n e r ca d e n a s , fe ch a s , e n t e ro s , e cu a cio n e s , e n ca d a u n a d e la s ce ld a s d e la
h o ja . Pa ra h a ce r e s t o , la s ca d e n a s , la s fe ch a s , lo s e n t e ro s y la s e cu a cio n e s t ie n e n
q u e im p le m e n t a r e l m is m o co n ju n t o d e m é t o d o s . Un a fo rm a d e co n s e g u ir e s t o e s
e n co n t ra r e l a n ce s t ro co m ú n d e la s cla s e s e im p le m e n t a r a h í lo s m é t o d o s
n e ce s a rio s . S in e m b a rg o , e s t o n o e s u n a s o lu ció n p rá ct ica p o rq u e e l a n ce s t ro
co m ú n m á s fre cu e n t e e s Ob je ct . De h e ch o , lo s o b je t o s q u e p u e d e p o n e r e n la s
ce ld a s d e s u h o ja d e cá lcu lo n o e s t á n re la cio n a d a s e n t re s í, s ó lo p o r la cla s e
Ob je ct . Pe ro n o p u e d e m o d ifica r Ob je ct .
Un a a p ro xim a ció n p o d ría s e r e s crib ir u n a cla s e lla m a d a Va lo rd e Ce ld a q u e
re p re s e n t a ra lo s va lo re s q u e p u d ie ra co n t e n e r u n a ce ld a d e la h o ja d e cá lcu lo .
En t o n ce s s e p o d ría n cre a r d is t in t a s s u b cla s e s d e Va lo rd e Ce ld a p a ra la s ca d e n a s , lo s
e n t e ro s o la s e cu a cio n e s . Ad e m á s d e s e r m u ch o t ra b a jo , e s t a a p ro xim a ció n
a rb it ra ria fu e rza u n a re la ció n e n t re e s a s cla s e s q u e d e o t ra fo rm a n o s e ría
n e ce s a ria , y d e b e ría d u p lica r e im p le m e n t a r d e n u e vo cla s e s q u e ya e xis t e n .
S e p o d ría d e fin ir u n in t e rfa ce lla m a d o Ce llAb le q u e s e p a re ce ría a e s t o :
interface CellAble {
void draw();
void toString();
void toFloat();
}
Ah o ra , s u p o n g a m o s q u e e xis t e n o b je t o s Lín e a y Co lu m n a q u e co n t ie n e n u n
co n ju n t o d e o b je t o s q u e im p le m e n t a n e l in t e rfa ce Ce llAb le . El m é t o d o
s e t Ob je c t At ( ) d e la cla s e Lín e a s e p o d ría p a re ce r a e s t o :
class Línea {
private CellAble[] contents;
. . .
void setObjectAt(CellAble ca, int index) {
. . .
}
. . .
}
Ob s e rva e l u s o d e l n o m b re d e l in t e rfa ce e n la d e cla ra ció n d e la va ria b le m ie m b ro
c o n t e n t s y e n la d e cla ra ció n d e l a rg u m e n t o c a d e l m é t o d o . Cu a lq u ie r o b je t o q u e
im p le m e n t e e l in t e rfa ce Ce llAb le , s in im p o rt a r q u e e xis t a o n o e n e l á rb o l d e cla s e s ,
p u e d e e s t a r co n t e n id o e n e l a rra y c o n t e n t s y p o d ría s e r p a s a d o a l m é t o d o
s e t Ob je c t At ( ) .

Oz it o
Crear Paquetes
Lo s p a q u e t e s s o n g ru p o s re la cio n a d o s d e cla s e s e in t e rfa ce s y p ro p o rcio n a n u n
m e ca n is m o co n ve n ie n t e p a ra m e n e ja r u n g ra n ju e g o d e cla s e s e in t e rfa ce s y e vit a r
lo s co n flict o s d e n o m b re s . Ad e m á s d e lo s p a q u e t e s d e Ja va p u e d e cre a r t u s p ro p io s
p a q u e t e s y p o n e r e n e llo s d e fin icio n e s d e cla s e s y d e in t e rfa ce s u t iliza n d o la
s e n t e n cia p a c k a g e .
S u p o n g a m o s q u e s e e s t á im p le m e n t a n d o u n g ru p o d e cla s e s q u e re p re s e n t a n u n a
co le cció n d e o b je t o s g rá fico s co m o círcu lo s , re ct á n g u lo s , lín e a s y p u n t o s . Ad e m á s
d e e s t a s cla s e s t e n d rá s q u e e s crib ir u n in t e rfa ce Dra g g a b le p a ra q u e la s cla s e s q u e
lo im p le m e n t e n p u e d e m o ve rs e co n e l ra t ó n . S i q u ie re s q u e e s t a s cla s e s e s t é n
d is p o n ib le s p a ra o t ro s p ro g ra m a d o re s , p u e d e s e m p a q u e t a rla s e n u n p a q u e t e ,
d ig a m o s , g ra p h ic s y e n t re g a r e l p a q u e t e a lo s p ro g ra m a d o re s ( ju n t o co n a lg u n a
d o cu m e n t a ció n d e re fe re n cia co m o q u é h a ce n la s cla s e s y lo s in t e rfa ce s y q u é
in t e rfa ce s d e p ro g ra m a ció n s o n p ú b lico s ) .
De e s t a fo rm a , o t ro s p ro g ra m a d o re s p u e d e n d e t e rm in a r fá cilm e n t e p a ra q u é e s t u
g ru p o d e cla s e s , có m o u t iliza rlo s , y có m o re la cio n a rlo s u n o s co n o t ro s y co n o t ra s
cla s e s y p a q u e t e s . Lo s n o m b re s d e cla s e s n o t ie n e n co n flict o s co n lo s n o m b re s d e
la s cla s e s d e o t ro s p a q u e t e s p o rq u e la s cla s e s y lo s in t e rfa ce s d e n t ro d e u n
p a q u e t e s o n re fe re n cia d o s e n t é rm in o s d e s u p a q u e t e ( t é cn ica m e n t e u n p a q u e t e
cre a u n n u e vo e s p a cio d e n o m b re s ) .
S e d e cla ra u n p a q u e t e u t iliza n d o la s e n t e n cia p a cka g e :
package graphics;

interface Draggable {
. . .
}

class Circle {
. . .
}

class Rectangle {
. . .
}
La p rim e ra lín e a d e l có d ig o a n t e rio r cre a u n p a q u e t e lla m a d o g ra p h ic s . To d a s la s
cla s e s e in t e rfa ce s d e fin id a s e n e l fich e ro q u e co n t ie n e e s t a s e n t e n cia s o n
m ie m b ro s d e l p a q u e t e . Po r lo t a n t o , Dra g g a b le , Circle , y Re ct a n g le s o n m ie m b ro s
d e l p a q u e t e g ra p h ic s .
Lo s fich e ro s . c la s s g e n e ra d o s p o r e l co m p ila d o r cu a n d o s e co m p ila e l fich e ro q u e
co n t ie n e e l fu e n t e p a ra Dra g g a b le , Circle y Re ct a n g le d e b e s it u a rs e e n u n d ire ct o rio
lla m a d o g ra p h ic s e n a lg ú n lu g a r s e e l p a t h CLAS S P ATH. CLAS S P ATH e s u n a
lis t a d e d ire ct o rio s q u e in d ica a l s is t e m a d o n d e h a in s t a la d o va ria s cla s e s e
in t e rfa ce s co m p ila d a s Ja va . Cu a n d o b u s q u e u n a cla s e , e l in t é rp re t e Ja va b u s ca u n
d ire ct o rio e n s u CLAS S P ATH cu yo n o m b re co in cid a co n e l n o m b re d e l p a q u e t e d e l
q u e la cla s e e s m ie m b ro . Lo s fich e ro s . c la s s p a ra t o d a s la s cla s e s e in t e rfa ce s
d e fin id a s e n u n p a q u e t e d e b e n e s t a r e n e s e d ire ct o rio d e p a q u e t e .
Lo s n o m b re s d e p a q u e t e s p u e d e n co n t e n e r va rio s co m p o n e n t e s ( s e p a ra d o s p o r
p u n t o s ) . De h e ch o , lo s n o m b re s d e lo s p a q u e t e s d e Ja va t ie n e n va rio s
co m p o n e n t e s : ja v a . u t il, ja v a . la n g , e t c. . . Ca d a co m p o n e n t e d e l n o m b re d e l
p a q u e t e re p re s e n t a u n d ire ct o rio e n e l s is t e m a d e fich e ro s . As í, lo s fich e ro s . c la s s
d e ja v a . u t il e s t á n e n u n d ire ct o rio lla m a d o u t il e n o t ro d ire ct o rio lla m a d o ja v a e n
a lg ú n lu g a r d e l CLAS S P ATH.

CLASSPATH
Pa ra e je cu t a r u n a a p lica ció n Ja va , s e e s p e cifica e l n o m b re d e la
a p lica ció n Ja va q u e s e d e s e a e je cu t a r e n e l in t e rp re t e Ja va . Pa ra e je cu t a r
u n a p p le t , s e e s p e cifica e l n o m b re d e l a p p le t e n u n a e t iq u e t a < AP P LET>
d e n t ro d e u n fich e ro HTML. El n a ve g a d o r q u e e je cu t e e l a p p le t p a s a e l
n o m b re d e l a p p le t a l in t é rp re t e Ja va . En cu a lq u ie r ca s o , la a p lica ció n o e l
a p p le t q u e s e e s t á e je cu t a n d o p o d ría e s t á r e n cu a lq u ie r lu g a r d e l s is t e m a
o d e la re d . Ig u a lm e m e n t e , la a p lica ció n o e l a p p le t p u e d e n u t iliza r o t ra s
cla s e s y o b je t o s q u e e s t á n e n la m is m a o d ife re n t e s lo ca liza cio n e s .
Co m o la s cla s e s p u e d e n e s t a r e n cu a lq u ie r lu g a r, s e d e b e in d ica r a l
in t e rp re t e Ja va d o n d e p u e d e e n co n t ra rla s . S e p u e d e h a ce r e s t o co n la
va ria b le d e e n t o rn o CLAS S PATH q u e co m p re n d e u n a lis t a d e d ire ct o rio s
q u e co n t ie n e n cla s e s Ja va co m p ila d a s . La co n s t ru cció n d e CLAS S PATH
d e p e n d e d e ca d a s is t e m a .
Cu a n d o e l in t e rp re t e o b t ie n e u n n o m b re d e cla s e , d e s d e la lín e a d e
co m a n d o s , d e s d e u n n a ve g a d o r o d e s d e u n a a p lica ció n o u n a p p le t , e l
in t e rp re t e b u s ca e n t o d o s lo s d ire ct o rio s d e CLAS S PATH h a s t a q u e
e n cu e n t ra la cla s e q u e s t á b u s ca n d o .
S e d e b e rá p o n e r e l d ire ct o rio d e n ive l m á s a lt o q u e co n t ie n e la s cla s e s
Ja va e n e l CLAS S PATH. Po r co n ve n ció n , m u ch a g e n t e t ie n e u n d ire ct o rio
d e cla s e s e n s u d ire ct o rio ra iz d o n d e p o n e t o d o s u có d ig o Ja va . S i t u
t ie n e s d ich o d ire ct o rio , d e b e ría s p o n e rlo e n e l CLAS S PATH. S in e m b a rg o ,
cu a n d o s e t ra b a ja co n a p p le t s , e s co n ve n ie n t e p o n e r e l a p p le t e n u n
d ire ct o rio c la s e s d e b a jo d e l d ire ct o rio d o n d e e s t á e l fich e ro HTML q u e
co n t ie n e e l a p p le t . Po r e s t a , y o t ra s ra zo n e s , e s co n ve n ie n t e p o n e r e l
d ire ct o rio a ct u a l e n e l CLAS S PATH.
La s cla s e s in clu id a s e n e l e n t o rn o d e d e s a rro llo Ja va e s t á n d is p o n ib le s
a u t o m á t ica m e n t e p o rq u e e l in t e rp re t e a ñ a d e e l d ire ct o rio co rre ct o a a l
CLAS S PATH cu a n d o a rra n ca .
Ob s e rva q u e e l o rd e n e s im p o rt a n t e . Cu a n d o e l in t e rp re t e Ja va e s t á
b u s ca n d o u n a cla s e , b u s ca p o r o rd e n e n lo s d ire ct o rio s in d ica d o s e n
CLAS S PATH h a s t a q u e e n cu e n t ra la cla s e co n e l n o m b re co rre ct o . El
in t e rp re t e Ja va e je cu t a la p rim e ra cla s e co n e l n o m b re co rre ct o q u e
e n cu e n t re y n o b u s ca e n e l re s t o d e d ire ct o rio s . No rm a lm e n t e e s m e jo r
d a r a la s cla s e s n o m b re s ú n ico s , p e ro s i n o s e p u e d e e vit a r, a s e g u ra t e d e
q u e e l CLAS S PATH b u s ca la s cla s e s e n e l o rd e n a p ro p ia d o . Re cu e rd a e s t o
cu a n d o s e le ccio n e s t u CLAS S PATH y e l á rb o l d e l có d ig o fu e n t e .

N o t a : To d a s la s cla s e s e in t e rfa ce s p e rt e n e ce n a u n p a q u e t e . In clu s o s i n o


e s p e cifica u n o co n la s e n t e n cia p a c k a g e . S i n o s e e s p e cifica la s cla s e s e in t e rfa ce s
s e co n vie rt e n e n m ie m b ro s d e l p a q u e t e p o r d e fe ct o , q u e n o t ie n e n o m b re y q u e
s ie m p re e s im p o rt a d o .

Oz it o
Utilizar Clases e Interfaces desde un Paquete
Pa ra im p o rt a r u n a cla s e e s p e cífica o u n in t e rfa ce a l fich e ro a ct u a l ( co m o la cla s e
Circle d e s d e e l p a q u e t e g ra p h ics cre a d o e n la s e cció n a n t e rio r) s e u t iliza la
s e n t e n cia d e im p o rt :
import graphics.Circle;
Es t a s e n t e n cia d e b e e s t a r a l p rin cip io d e l fich e ro a n t e s d e cu a lq u ie r d e fin ició n d e
cla s e o d e in t e rfa ce y h a ce q u e la cla s e o e l in t e rfa ce e s t é d is p o n ib le p a ra s u u s o
p o r la s cla s e s y lo s in t e rfa ce s d e fin id o s e n e l fich e ro .
S i s e q u ie re im p o rt a r t o d a s la s cla s e s e in t e rfa ce s d e u n p a q u e t e , p o r e je m p lo , e l
p a q u e t e g ra p h ic s co m p le t o , s e u t iliza la s e n t e n cia im p o rt co n u n ca ra ct e r
co m o d ín , u n a s t e ris co '* '.
import graphics.*;
S i in t e n t a u t iliza r u n a cla s e o u n in t e rfa ce d e s d e u n p a q u e t e q u e n o h a s id o
im p o rt a d o , e l co m p ila d o r m o s t ra rá e s t e e rro r:
testing.java:4: Class Date not found in type declaration.
Date date;
^
Ob s e rva q u e s ó lo la s cla s e s e in t e fa ce s d e cla ra d o s co m o p ú b lico s p u e d e n s e r
u t iliza d o s e n cla s e s fu e ra d e l p a q u e t e e n e l fu e ro n d e fin id o s .
El p a q u e t e p o r d e fe ct o ( u n p a q u e t e s in n o m b re ) s ie m p re e s im p o rt a d o . El s is t e m a
d e e je cu ció n t a m b ié n im p o rt a a u t o m á t ica m e n t e e l p a q u e t e ja v a . la n g .
S i p o r s u e rt e , e l n o m b re d e u n a cla s e d e u n p a q u e t e e s e l m is m o q u e e l n o m b re d e
u n a cla s e e n o t ro p a q u e t e , s e d e b e e vit a r la a m b ig ü e d a d d e n o m b re s p re ce d ie n d o
e l n o m b re d e la cla s e co n e l n o m b re d e l p a q u e t e . Po r e je m p lo , p re via m e n t e s e h a
d e fin id o u n a cla s e lla m a d a Re ct a n g le e n e l p a q u e t e g ra p h ic s . El p a q u e t e ja v a . a w t
t a m b ié n co n t ie n e u n a cla s e Re ct a n g le . S i e s t o s d o s p a q u e t e s s o n im p o rt a d o s e n la
m is m a cla s e , e l s ig u ie n t e có d ig o s e ría a m b ig ü o :
Rectangle rect;
En e s t a s it u a ció n s e t ie n e q u e s e r m á s e s p e cíco e in d ica r e xa ct a m e n t e q u e cla s e
Re ct a n g le s e q u ie re :
graphics.Rectangle rect;
S e p u e d e h a ce r e s t o a n t e p o n ie n t o e l n o m b re d e l p a q u e t e a l n o m b re d e la cla s e y
s e p a ra n d o lo s d o s co n u n p u n t o .

Oz it o
Los paquetes de Java
El e n t o rn o d e d e s a rro llo e s t a n d a rd d e Ja va co m p re n d e o ch o p a q u e t e s .

El Paquete de Lenguaje Java


El p a q u e t e d e le n g u a je Ja va , t a m b ié n co n o cid o co m o ja v a . la n g ,
co n t ie n e la s cla s e s q u e s o n e l co ra zó n d e l le n g u a je Ja va . La s cla s e s d e
e s t e p a q u e t e s e a g ru p a n d e la s ig u ie n t e m a n e ra :
Ob je c t
El a b u e lo d e t o d a s la s cla s e s - - la cla s e d e la q u e p a rt e n t o d a s la s
d e m á s . Es t a cla s e s e cu b rió a n t e rio rm e n e e n la le cció n La Cla s e
Ob je ct .
Tip o s d e D a t o s En c u b ie rt o s
Un a co le cció n d e cla s e s u t iliza d a s p a ra e n cu b rir va ria b le s d e t ip o s
p rim it ivo s : Bo o le a n , Ch a ra ct e r, Do u b le , Flo a t , In t e g e r y Lo n g . Ca d a
u n a d e e s t a s cla s e s e s u n a s u b cla s e d e la cla s e a b s t ra ct a Nu m b e r.
S t rin g s
Do s cla s e s q u e im p le m e n t a n lo s d a t o s d e ca ra ct e re s . La s Cla s e s
S t rin g y S t rin g Bu ffe r e s u n a le cció n d o n d e a p re n d e rá s e l u s o d e
e s t o s d o s t ip o s d e S t rin g s .
S y s t e m y Ru n t im e
Es t a s d o s cla s e s p e rm it e n a lo s p ro g ra m a s u t iliza r lo s re cu rs o s d e l
s is t e m a . S ys t e m p ro p o rcio n a u n in t e rfa ce d e p ro g ra m a ció n
in d e p e n d ie n t e d e l s is t e m a p a ra re cu rs o s d e l s is t e m a y Ru n t im e d a
a cce s o d ire ct o a l e n t o rn o d e e je cu ció n e s p e cífico d e u n s is t e m a .
Ut iliza r Re cu rs o s d e l S is t e m a De s crib e la s cla s e s S ys t e m y Ru n t im e
y sus m é todos.
Th re a d
La s cla s e s Th re a d , Th re a d De a t h y Th re a d Gro u p im p le m e n t a n la s
ca p a cid a d e s m u lt it a re a s t a n im p o rt a n t e s e n e l le n g u a je Ja va . El
p a q u e t e ja va . la n g t a m b ié n d e fin e e l in t e rfa ce Ru n n a b le . Es t e
in t e rfa ce e s co n ve n ie n t e p a ra a ct iva r la cla s e Ja va s in s u b cla s ifica r
la cla s e Th re a d . A t ra vé s d e u n e je m p lo d e a p ro xia m ció n Th re a d s
d e Co n t ro l t e e n s e ñ a rá lo s Th re a d s Ja va .
Cla s s
La cla s e Cla s s p ro p o rcio n a u n a d e s crip ció n e n t ie m p o d e e je cu ció n
d e u n a cla s e y la cla s e Cla s s Lo a d e r p e rm it e ca rg a r cla s e s e n lo s
p ro g ra m a s d u ra n t e la e je cu ció n .
Ma t h
Un a lib re ría d e ru t in a s y va lo re s m a t e m á t ico s co m o p i.
Ex c e p t io n s , Erro rs y Th ro w a b le
Cu a n d o o cu rre u n e rro r e n u n p ro g ra m a Ja va , e l p ro g ra m a la n za u n
o b je t o q u e in d ica q u é p ro b le m a e ra y e l e s t a d o d e l in t e rp re t e
cu a n d o o cu rrio e l e rro r. S ó lo lo s o b je t o s d e riva d o s d e la cla s e
Th ro wa b le p u d e n s e r la n za d o s . Exis t e n d o s s u b cla s s e s p rin cip a le s
d e Th ro wa b le : Exce p t io n y Erro r. Exce p t io n e s la fo rm a q u e d e b e n
in t e n t a r ca p t u ra r lo s p ro g ra m a s n o rm a le s . Erro r s e u t iliza p a ra lo s
e rro re s ca t a s t ro fico s - - lo s p ro g ra m a s n o rm a le s n o ca p t u ra n Erro re s .
El p a q u e t e ja va . la n g co n t ie n e la s cla s e s Th ro wa b le , Exce p t io n y
Erro r, y n u m e ro s a s s u b cla s e s d e Exce p t io n y Erro r q u e re p re s e n t a n
p ro b le m a s e s p e cífico s . Ma n e jo d e Erro re s Ut iliza n d o Exce p cio n e s t e
m u e s t ra có m o u t iliza r la s e xce p cio n e s p a ra m a n e ja r e rro re s e n s u s
p ro g ra m a s Ja va .
P ro c e s s
Lo s o b je t o s Pro ce s s re p re s e n t a e l p ro ce s o d e l s is t e m a q u e s e cre a
cu a n d o s e u t iliza e l s is t e m a e n t ie m p o d e e je cu ció n p a ra e je cu t a r
co m a n d o s d e l s is t e m a . El p a q u e t e ja va . la n g d e fin e e in p le m e n t a la
cla s e g e n é rica Pro ce s s .
El co m p ila d o r im p o rt a a u t o m á t ica m e n t e e s t e p a q u e t e . Nin g ú n o t ro p a q u e t e s e
im p o rt a d e fo rm a a u t o m á t ica .

El Paquete I/O de Java


El p a q u e t e I/ O d e Ja va ( ja v a . io ) p ro p o rcio n a u n ju e g o d e ca n a le s d e
e n t ra d a y s a lid a u t iliza d o s p a ra le e r y e s crib ir fich e ro s d e d a t o s y o t ra s
fu e n t e s d e e n t ra d a y s a lid a . La s cla s e s e in t e rfa ce s d e fin id o s e n ja v a . io
s e cu b re n co m p le t a m e n t e e n Ca n a le s d e En t ra d a y S a lid a .

El Paquete de Utilidades de Java


Es t e p a q u e t e , ja v a . u t il, co n t ie n e u n a co le cció n d e cla s e s ú t ile s . En t re
e lla s s e e n cu e n t a n m u ch a s e s t ru ct u ra s d e d a t o s g e n é rica s ( Dict io n a ry,
S t a ck, Ve ct o r, Ha s h t a b le ) u n o b je t o m u y ú t il p a ra d ivid ir ca d e n a s y o t ro
p a ra la m a n ip u a lció n d e ca le n d a rio s . El p a q u e t e ja v a . u t il t a m b ié n
co n t ie n e e l in t e rfa ce Ob s e rve r y la cla s e Ob s e rva b le q u e p e rm it e n a lo s
o b je t o s n o t ifica rs e u n o s a o t ro s cu a n d o h a n ca m b ia d o . La s cla s e s d e
ja v a . u t il n o s e cu b re e n e s t e t u t o ria l a u n q u e a lg u n o s e je m p lo s u t iliza n
e s t a s cla s e s .
El Paquete de Red de Java
El p a q u e t e ja v a . n e t co n t ie n e d e fin icio n e s d e cla s e s e in t e rfa ce s q u e
im p le m e n t a n va ria s ca p a cid a d e s d e re d . La s cla s e s d e e s t e p a q u e t e
in clu ye n u n a cla s e q u e im p le m e n t a u n a co n e xió n URL. S e p u e d e u t iliza r
e s t a s cla s e s p a ra im p le m e n t a r a p lica cio n e s clie n t e - s e rvid o r y o t ra s
a p lica cio n e s d e co m u n ica cio n e s . Co n e ct ivid a d y S e g u rid a d d e l Clie n t e
t ie n e va rio s e je m p lo s d e u t iliza n ció n d e e s t a s cla s e s , in clu ye n d o u n
e je m p lo clie n t e - s e rvid o r q u e u t iliza d a t a g ra m a s .

El Paquete Applet
Es t e p a q u e t e co n t ie n e la cla s e Ap p le t - - la cla s e q u e s e d e b e s u b cla s ifica r
s i s e q u ie re e s crib ir u n a p p le t . En e s t e p a q u e t e s e in clu ye e l in t e rfa ce
Au d io Clip q u e p ro p o rcio n a u n a a b s t ra ció n d e a lt o n ive l p a ra
a u d io . Es crib ir Ap p le t s .

Los Paquetes de Herramientas para Ventanas Abstractas


Tre s p a q u e t e s co m p o n e n la s h e rra m ie n t a s p a ra Ve n t a n a s Ab s t ra ct a s :
ja v a . a w t , ja v a . a w t . im a g e , y ja v a . a w t . p e e r.
El p a q u e t e AWT
El p a q u e t e ja v a . a w t p ro p o rcio n a e le m e n t o s GUI u t iliza d o s p a ra
o b t e n e r in fo rm a ció n y m o s t ra rla e n la p a n t a lla co m o ve n t a n a s ,
b o t o n e s , b a rra s d e d e s p la za m ie n t o , e t c. .
El p a q u e t e AWT Im a g e
El p a q u e t e ja v a . a w t . im a g e co n t ie n e cla s e s e in t e rfa ce s p a ra
m a n e ja r im á g e n e s d e d a t o s , co m o la s e le cció n d e u n m o d e lo d e
co lo r, e l co rt a d o y p e g a d o , e l filt ra d o d e co lo re s , la s e le cció n d e l
va lo r d e u n p ixe l y la g ra b a ció n d e p a rt e s d e la p a n t a lla .
El p a q u e t e AWT Pe e r
El p a q u e t e ja v a . a w t . p e e r co n t ie n e cla s e s e in t e rfa ce s q u e
co n e ct a n lo s co m p o n e n t e s AWT in d e p e n d ie n t e s d e la p la t a fo rm a a
s u im p le m e n t a ció n d e p e n d ie n t e d e la p la t a fo rm a ( co m o s o n lo s
co n t ro le s d e Micro s o ft Win d o ws ) .

Oz it o
Cambios en el JDK 1.1 que afectan a:
Objectos, Clases, e Interfaces
La d e c la ra c ió n d e Cla s e
El JDK 1 . 1 p e rm it e d e cla ra r c la s e s in t e rn a s . Pu e d e s ve r Ca m b io s e n e l
JDK 1 . 1 : Cla s e s In t e rn a s .
Lo s p a q u e t e s d e Ja v a
S e h a n a ñ a d id o q u in ce n u e vo s p a q u e t e s a l ju e g o co n ju n t o ja va . * y s e h a
e lim in a d o u n o . Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : lo s Pa q u e t e s ja va . * .
El P a q u e t e ja v a . la n g
S e h a n a ñ a d id o t re s cla s e s a l p a q u e t e ja va . la n g . Pu e d e s ve r Ca m b io s e n
e l JDK 1 . 1 : e l p a q u e t e ja va . la n g .
El p a q u e t e ja v a . io
S e h a n a ñ a d id o n u e va s cla s e s a l p a q u e t e ja v a . io p a ra s o p o rt a r la le ct u ra
y e s crit u ra d e ca ra ct e re s d e 1 6 Bit s Un ico d e . Pu e d e s ve r Ca m b io s e n e l
JDK 1 . 1 : e l p a q u e t e ja va . io .
El p a q u e t e ja v a . u t il
S e h a n a ñ a d id o n u e va s cla s e s a l p a q u e t e ja v a . u t il p a ra s o p o rt e d e
in t e rn a cio n a liza ció n y m a n e jo d e e ve n t o s . Pu e d e s ve r Ca m b io s e n e l JDK
1 . 1 : e l p a q u e t e ja va . u t il.
El p a q u e t e ja v a . n e t
S e h a n a ñ a d id o m u ch a s cla s e s a l p a q u e t e ja v a . n e t .
El p a q u e t e Ap p le t
Pa ra u n s u m a rio d e lo s ca m b io s e n e l p a q u e t e ja v a . a p p le t p u e d e s ve r,
[ PENDIENTE] .
El P a q u e t e ja v a . a w t
Pa ra in fo rm a icó n s o b re lo s ca m b io s e n lo s p a q u e t e s ja v a . a w t p u e d e s
ve r la s p á g in a s Ca m b io s e n e l GUI: e l AWT cre ce

Oz it o
Las Clases String y StringBuffer
El p a q u e t e ja va . la n g co n t ie n e d o s cla s e s d e ca d e n a s : S t rin g y S t rin g Bu ffe r. Ya
h e m o s vis t o la cla s e S t rin g e n va ria s o ca s io n e s e n e s t e t u t o ria l. La cla s e S t rin g s e
u t iliza cu a n d o s e t ra b a ja co n ca d e n a s q u e n o p u e d e n ca m b ia r. Po r o t ro la d o ,
S t rin g Bu ffe r, s e u t iliza cu a n d o s e q u ie re m a n ip u la r e l co n t e n id o d e u n a ca d e n a .
El m é t o d o re v e rs e I t ( ) d e la s ig u ie n t e cla s e u t iliza la s cla s e s S t rin g y S t rin g Bu ffe r
p a ra in ve rt ir lo s ca ra ct e re s d e u n a ca d e n a . S i t e n e m o s u n a lis t a d e p a la b ra s , s e
p u e d e u t iliza r e s t e m é t o d o e n co n ju n ció n d e u n p e q u e ñ o p ro g ra m a p a ra cre a r u n a
lis t a d e p a la b ra s rít m ica s ( u n a lis t a d e p a la b ra s o rd e n a d a s p o r la s s ila b a s fin a le s ) .
S ó lo s e t ie n e n q u e in ve rt ir la s ca d e n a s d e la lis t a , o rd e n a r la lis t a e in ve rt ir la s
ca d e n a s o t ra ve z.
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);

for (i = (len - 1); i >= 0; i--) {


dest.append(source.charAt(i));
}
return dest.toString();
}
}
El m é t o d o re v e rs e I t ( ) a ce p t a u n a rg u m e n t o d e l t ip o S t rin g lla m a d o s o u rc e q u e
co n t ie n e la ca d e n a q u e s e va a in ve rt ir. El m é t o d o cre a u n S t rin g Bu ffe r, d e s t , co n
e l m is m o t a m a ñ o q u e s o u rc e . Lu e g o h a ce u n b u cle in ve rs o s o b re lo s ca ra ct e re s d e
s o u rc e y lo s a ñ a d e a d e s t , co n lo q u e s e in vie rt e la ca d e n a . Fin a lm e n t e e l m é t o d o
co n vie rt e d e s t , d e S t rin g Bu ffe r a S t rin g .
Ad e m á s d e ilu m in a r la s d ife re n cia s e n t re S t rin g y S t rin g Bu ffe r, e s t a le cció n ilu s t ra
va ria s ca ra ct e ris t ica s d e la s cla s e s S t rin g y S t rin g Bu ffe r: Cre a cció n d e S t rin g s y
S t rin g Bu ffe rs , u t iliza r m é t o d o s a cce s o re s p a ra o b t e n e r in fo rm a ció n s o b re S t rin g o
S t rin g Bu ffe r, m o d ifica r u n S t rin g Bu ffe r y co n ve rt ir u n t ip o S t rin g a o t ro .

Oz it o
¿Por qué dos Clases String?
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);

for (i = (len - 1); i >= 0; i--) {


dest.append(source.charAt(i));
}
return dest.toString();
}
}
El e n t o rn o d e d e s a rro llo Ja va p ro p o rcio n a d o s cla s e s p a ra m a n ip u la r y a lm a ce n a r
d a t o s d e l t ip o ca rá ct e r: S t rin g , p a ra ca d e n a s co n s t a n t e s , y S t rin g Bu ffe r, p a ra
ca d e n a s q u e p u e d e n ca m b ia r.
S t rin g s e u t iliza cu a n d o n o s e q u ie re q u e ca m b ie e l va lo r d e la ca d e n a . Po r
e je m p lo , s i e s crib im o s u n m é t o d o q u e n e ce s it e u n a ca d e n a d e ca ra ct e re s y e l
m é t o d o n o va a m o d ifica r la ca d e n a , d e b e ría m o s u t iliza r u n o b je t o S t rin g .
No rm a lm e n t e , q u e rre m o s u t iliza r S t rin g s p a ra p a s a r ca ra ct e re s a u n m é t o d o y p a ra
d e vo lve r ca ra ct e re s d e s d e u n m é t o d o . El m é t o d o re v e rs e I t ( ) t o m a u n S t rin g
co m o a rg u m e n t o y d e vu e lve u n S t rin g .
La cla s e S t rin g Bu ffe r p ro p o rcin a d a p a ra ca d e n a s va ria b le s ; s e u t iliza cu a n d o
s a b e m o s q u e e l va lo r d e la ca d e n a p u e d e ca m b ia r. No rm a lm e n t e u t iliza re m o s
S t rin g Bu ffe r p a ra co n s t u ir d a t o s d e ca ra ct e re s co m o e n e l m é t o d o re v e rs e I t ( ) .
Co m o s o n co n s t a n t e s , lo s S t rin g s s o n m á s e co n ó m ico s ( u t iliza n m e n o s m e m o ria )
q u e lo s S t rin g Bu ffe rs y p u e d e r s e r co m p a rt id o s . Po r e s o e s im p o rt a n t e u t iliza r
S t rin g s ie m p re q u e s e a a p ro p ia d o .

Oz it o
Crear String y StringBuffer
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);

for (i = (len - 1); i >= 0; i--) {


dest.append(source.charAt(i));
}
return dest.toString();
}
}
El m é t o d o re v e rs e I t ( ) cre a u n S t rin g Bu ffe r lla m a d o d e s t cu ya lo n g it u d in icia l e s
la m is m a q u e la d e s o u rc e . S t rin g Bu ffe r d e s t d e cla ra a l co m p ila d o r q u e d e s t s e
va a u t iliza r p a ra re fe rirs e a u n o b je t o d e l t ip o S t rin g Bu ffe r, e l o p e ra d o r n e w
a s ig n a m e m o ria p a ra u n n u e vo o b je t o y S t rin g Bu ffe r( le n ) in icia liza e l o b je t o .
Es t o s t re s p a s o s - - d e cla ra ció n , e je m p la riza ció n e in icia lzia ció n - - s e d e s crib e n e n :
Cre a r Ob je t o s .

Crear un String
Mu ch o s S t rin g s s e cre a n a p a rt ir d e ca d e n a s lit e ra le s . Cu a n d o e l
co m p ila d o r e n cu e n t ra u n a s e rie d e ca ra ct e re s e n t re co m illa s ( " y ") , cre a
u n o b je t o S t rin g cu yo va lo r e s e l p ro p io t e xt o . Cu a n d o e l co m p ila d o r
e n cu e n t ra la s ig u e n t e ca d e n a , cre a u n o b je t o S t rin g cu yo va lo r e s Ho la
Mu n d o .
"Hola Mundo."
Ta m b ié n s e p u e d e n cre a r o b je t o s S t rin g co m o s e h a ría co n cu a lq u ie r o t ro
o b je t o Ja va : u t iliza n d o n e w .
new String("Hola Mundo.");

Crear un StringBuffer
El m é t o d o co n s t ru ct o r u t iliza d o p o r re v e rs e I t ( ) p a ra in cia liza r d e s t
re q u ie re u n e n t e ro co m o a rg u m e n t o q u e in d iq u e e l t a m a ñ o in icia l d e l
n u e vo S t rin g Bu ffe r.
StringBuffer(int length)
re v e rs e I t ( ) p o d ría h a b e r u t iliza d o e l co n s t ru ct o r p o r d e fe ct o p a ra d e ja r
in d e t e rm in a d a la lo n g it u d d e l b u ffe r h a s t a u n m o m e n t o p o s t e rio r. S in
e m b a rg o , e s m á s e ficie n t e e s p e cifica r la lo n g it u d d e l b u ffe r s i s e co n o ce ,
e n ve z d e a s ig n a r m e m o ria ca d a ve z q u e s e a ñ a d a n ca ra ct e re s a l b u ffe r.
Oz it o
Métodos Accesores
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);

for (i = (len - 1); i >= 0; i--) {


dest.append(source.charAt(i));
}
return dest.toString();
}
}
La s va ria b le s d e e je m p la r d e u n o b je t o e s t á n e n ca p s u la d a s d e n t ro d e l o b je t o ,
o cu lt a s e n s u in t e rio r, s e g u ra s fre n t e a la in s p e cció n y m a n ip u la ció n p o r o t ro s
o b je t o s . Co n cie rt a s e xce p cio n e s b ie n d e fin id a s , lo s m é t o d o s d e l o b je t o n o s o n lo s
ú n ico s a t ra vé s d e lo s cu a le s u n o b je t o p u e d e in s p e ccio n a r o a lt e ra r la s va ria b le s
d e o t ro o b je t o . La e n ca p s u la ció n d e lo s d a t o s d e u n o b je t o lo p ro t e g e d e la
co rru p ció n d e o t ro s o b je t o s y o cu lt a lo s d e t a lle s d e im p le m e n t a ció n a lo s o b je t o s
e xt ra ñ o s . Es t a e n ca p s u la ció n d e d a t o s d e t rá s d e lo s m é t o d o s d e u n o b je t o e s u n a
d e la s p ie d ra s a n g u la re s d e la p ro g ra m a ció n o rie n t a d a a o b je t o s .
Lo s m é t o d o s u t iliza d o s p a ra o b t e n e r in fo rm a ció n d e u n o b je t o s o n co n o cid o s co m o
m é t o d o s a c c e s o re s . El m é t o d o re v e rs e I t ( ) u t iliza d o s m é t o d o s a cce s o re s d e
S t rin g p a ra o b t e n e r in fo rm a ció n s o b re e l s t rin g s o u rc e .
Prim e ro u t iliza e l m é t o d o a cce s o r: le n g t h ( ) p a ra o b t e n e r la lo n g it u d d e la ca d e n a
s o u rc e .
int len = source.length();
Ob s e rva q u e a re v e rs e I t ( ) n o le im p o rt a s i e l S t rin g m a n t ie n e s u lo n g it u d co m o
u n e n t e ro , co m o u n n ú m e ro e n co m a flo t a n t e o in clu s o s i ca lcu la la lo n g it u d a l
vu e lo . re v e rs e I t ( ) s im p le m e n t e u t iliza e l in t e rfa ce p ú b lico d e l m é t o d o le n g t h ( )
q u e d e vu e lve la lo n g it u d d e l S t rin g co m o u n e n t e ro . Es t o d o lo q u e n e ce s it a s a b e r
re v e rs e I t ( ) .
S e g u n d o , u t iliza e l m é t o d o a cce s o r: c h a rAt ( ) q u e d e vu e lve e l ca rá ct e r q u e e s t á
s it u a d o e n la p o s ició n in d ica d a e n s u a rg u m e n t o .
source.charAt(i)
El ca rá ct e r d e vu e lt o p o r c h a rAt ( ) e s e l q u e s e a ñ a d e a l S t rin g Bu ffe r d e s t . Co m o la
va ria b le d e l b u cle i e m p ie za a l fin a l d e s o u rc e y a va n za h a s t a e l p rin cip io d e la
ca d e n a , lo s ca ra ct e re s s e a ñ a d e n e n o rd e n in ve rs o a l S t rin g Bu ffe r.
Más Métodos Accesores
Ad e m á s d e le n g t h ( ) y c h a rAt ( ) , S t rin g s o p o rt a o t ro s m é t o d o s
a cce s o re s q u e p ro p o rcio n a n a cce s o a s u b ca d e n a s y q u e in d ica n la
p o s ició n d e ca ra ct e re s e s p e cífico s e n la ca d e n a . S t rin g Bu ffe r t ie n e s u s
p ro p io s m é t o d o s a cce s o re s s im ila re s .

Oz it o
Modificar un StringBuffer
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);

for (i = (len - 1); i >= 0; i--) {


dest.append(source.charAt(i));
}
return dest.toString();
}
}
El m é t o d o re v e rs e I t ( ) u t iliza e l m é t o d o a p p e n d ( ) d e S t rin g Bu ffe r p a ra a ñ a d ir u n
ca rá ct e r a l fin a l d e la ca d e n a d e d e s t in o : d e s t . S i la a d icció n d e ca ra ct e re s h a ce
q u e a u m e n t e e l t a m a ñ o d e S t rin g Bu ffe r m á s a llá d e s u ca p a cid a d a ct u a l, e l
S t rin g Bu ffe r a s ig n a m á s m e m o ria . Co m o la a s ig n a ció n d e m e m o ria e s u n a
o p e ra ció n re la t iva m e n t e ca ra , d e b e m o s h a ce r u n có d ig o m á s e ficie n t e in icia liza n d o
la ca p a cid a d d e l S t rin g Bu ffe r d e fo rm a ra zo n a b le p a ra e l p rim e r co n t e n id o , a s í
m in im iza re m o s e l n ú m e ro d e ve ce s q u e s e t e n d rá q u e a s ig n a r m e m o ria .
Po r e je m p lo , e l m é t o d o re v e rs e I t ( ) co n s t ru ye u n S t rin g Bu ffe r co n u n a ca p a cid a d
in icia l ig u a l a la d e la ca d e n a fu e n t e , a s e g u rá n d o s e s ó lo u n a a s ig n a ció n d e
m e m o ria p a ra d e s t .
La ve rs ió n d e l m é t o d o a p p e n d ( ) u t iliza d o e n re v e rs e I t ( ) e s s ó lo u n o d e lo s
m é t o d o s d e S t rin g Bu ffe r p a ra a ñ a d ir d a t o s a l fin a l d e u n S t rin g Bu ffe r. Exis t e n
va rio s m é t o d o s a p p e n d ( ) p a ra a ñ a d ir va rio s t ip o s , co m o flo a t , in t , b o o le a n , e
in clu s o o b je t o s , a l fin a l d e l S t rin g Bu ffe r. El d a t o e s co n ve rt id o a ca d e n a a n t e s d e
q u e t e n g a lu g a r la o p e ra ció n d e a d icció n .

Insertar Caracteres
Alg u n a s ve ce s , p o d ría m o s q u e re r in s e rt a r d a t o s e n e l m e d io d e u n
S t rin g Bu ffe r. S e p u e d e h a ce r e s t o u t iliza n d o e l m é t o d o in s e rt ( ) . Es t e
e je m p lo ilu s t ra có m o in s e rt a r u n a ca d e n a d e n t ro d e u n S t rin g Bu ffe r.
StringBuffer sb = new StringBuffer("Bebe Caliente!");
sb.insert(6, "Java ");
System.out.println(sb.toString());
Es t e re t a zo d e có d ig o im p rim e rá :
Bebe Java Caliente!
Co n m u ch o s m é t o d o s in s e rt ( ) d e S t rin g Bu ffe r s e p u e d e e s p e cifica r e l
ín d ice a n t e rio r d o n d e s e q u ie re in s e rt a r e l d a t o . En e l e je m p lo a n t e rio r:
"Ja v a " t ie n e q u e in s e rt a rs e a n t e s d e la 'C' d e "Ca lie n t e ". Lo s ín d ice s
e m p ie za n e n 0 , p o r e s o e l ín d ice d e la 'C' e s e l 6 . Pa ra in s e rt a r d a t o s a l
p rin cip io d e u n S t rin g Bu ffe r s e u t iliza e l ín d ice 0 . Pa ra a ñ a d ir d a t o s a l
fin a l d e l S t rin g Bu ffe r s e u t iliza u n ín d ice co n la lo n g it u d a ct u a l d e l
S t rin g Bu ffe r o a p p e n d ( ) .

Seleccionar Caracteres
Ot ro m o d ifica d o r m u y ú t il d e S t rin g Bu ffe r e s s e t Ch a rAt ( ) , q u e
s e le ccio n a u n ca rá ct e r e n la p o s ició n e s p e cifica d a d e l S t rin g Bu ffe r.
s e t Ch a rAt ( ) e s ú t il cu a n d o s e re u t iliza u n S t rin g Bu ffe r.

Oz it o
Convertir Objetos a Strings
class ReverseString {
public static String reverseIt(String source) {
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);

for (i = (len - 1); i >= 0; i--) {


dest.append(source.charAt(i));
}
return dest.toString();
}
}

El Método toString()
A ve ce s e s co n ve n ie n t e o n e ce s a rio co n ve rt ir u n o b je t o a u n a ca d e n a o
S t rin g p o rq u e s e n e ce s it a rá p a s a rlo a u n m é t o d o q u e s ó lo a ce p t a S t rin g s .
Po r e je m p lo , S y s t e m . o u t . p rin t ln ( ) n o a ce p t a S t rin g Bu ffe rs , p o r lo q u e
n e ce s it a co n ve rt ir e l S t rin g Bu ffe r a S t rin g p a ra p o d e r im p rim irlo . El
m é t o d o re v e rs e I t ( ) u t iliza e l m é t o d o t o S t rin g ( ) d e S t rin g Bu ffe r p a ra
co n ve rt irlo e n u n S t rin g a n t e s d e re t o rn a r.
return dest.toString();
To d a s la s cla s e s h e re d a n t o S t rin g ( ) d e s d e la cla s e Ob je ct y m u ch a s
cla s e s d e l p a q u e t e ja va . la n g s o b re e s crib e n e s t e m é t o d o p a ra
p ro p o rcio n a r u n a im p le m e n t a ció n m á s a co rd e co n la p ro p ia cla s e . Po r
e je m p lo , la s cla s e s Ch a ra ct e r, In t e g e r, Bo o le a n , e t c. . s o b re e s crib e n
t o S t rin g ( ) p a ra p ro p o rcio n a r u n a re p re s e n t a ció n e n S t rin g d e lo s
o b je t o s .

El Método valueOf()
Co m o e s co n ve n ie n t e , la cla s e S t rin g p ro p o rcio n a u n m é t o d o e s t á t ico
v a lu e Of( ) . S e p u e d e u t iliza r e s t e m é t o d o p a ra co n ve rt ir va ria b le s d e
d ife re n t e s t ip o s a u n S t rin g . Po r e je m p lo , p a ra im p rim ir e l n ú m e ro p i:
System.out.println(String.valueOf(Math.PI));

Convertir Cadenas a Números


La cla s e S t rin g n o p o rp o rcio n a n in g ú n m é t o d o p a ra co n ve rt ir u n a ca d e n a
e n u n n ú m e ro . S in e m b a rg o , cu a t ro cla s e s d e lo s "t ip o s e n vo lve n t e s "
( In t e g e r, Do u b le , Flo a t , y Lo n g ) p ro p o rcio n a n u n o s m é t o d o s d e cla s e
lla m a d o s v a lu e Of( ) q u e co n vie rt e n u n a ca d e n a e n u n o b je t o d e e s e
t ip o . Aq u í t e n e m o s u n p e q u e ñ o e je m p lo d e l m é t o d o v a lu e Of( ) d e la
cla s e Flo a t :
String piStr = "3.14159";
Float pi = Float.valueOf(piStr);

Oz it o
Los Strings y el Compilador de Java
El co m p ila d o r d e Ja va u t iliza la s cla s e s S t rin g y S t rin g Bu ffe r d e t rá s d e la e s ce n a p a ra m a n e ja r la s
ca d e n a s lit e ra le s y la co n ca t e n a ció n .

Cadenas Literales
En Ja va s e d e b e n e s p e cifica r la s ca d e n a s lit e ra le s e n t re co m illa s :
"Hola Mundo!"
S e p u e d e n u t iliza r ca d e n a s lit e ra le s e n cu a lq u ie r lu g a r d o n d e s e p u e d a u t iliza r u n o b je t o
S t rin g . Po r e je m p lo , S y s t e m . o u t . p rin t ln ( ) a ce p t a u n a rg u m e n t e o S t rin g , p o r e s o s e p u e d e
u t iliza r u n a ca d e n a lit e ra l e n s u lu g a r:
System.out.println("Hola Mundo!");
Ta m b ié n s e p u e d e n u t iliza r lo s m é t o d o s d e S t rin g d ire ct a m e n t e d e s d e u n a ca d e n a lit e ra l:
int len = "Adios Mundo Cruel".length();
Co m o e l co m p ila d o r cre a a u t o m á t ica m e n t e u n n u e vo o b je t o S t rin g p a ra ca d a ca d e n a lit e ra l
q u e s e e n cu e n t ra , s e p u e d e u t iliza r u n a ca d e n a lit e ra l p a ra in icia liza r u n S t rin g :
String s = "Hola Mundo";
El co n s t ru ct o r a n t e rio r e s e q u iva le n t e p e ro m u ch o m á s e ficie n t e q u e e s t e o t ro , q u e cre a d o s
o b je t o s S t rin g e n ve z d e s ó lo u n o :
String s = new String("Hola Mundo");
El co m p ila d o r cre a la p rim e ra ca d e n a cu a n d o e n cu e n t ra e l lit e ra l "Ho la Mu n d o !", y la
s e g u n d a cu a n d o e n cu e n t ra n e w S t rin g ( ) .

Concatenación y el Operador +
En Ja va , s e p u e d e u t iliza r e l o p e ra d o r + p a ra u n ir o co n ca t e n a r ca d e n a s :
String cat = "cat";
System.out.println("con" + cat + "enacion");
Es t o d e ce p cio n a u n p o co p o rq u e , co m o ya s e s a b e , lo s S t rin g s n o p u d e n m o d ifica rs e . S in
e m b a rg o d e t rá s d e la e s ce n a e l co m p ila d o r u t iliza S t rin g Bu ffe r p a ra im p le m e n t a r la
co n ca t e n a ció n . El e je m p lo a n t e rio r s e co m p ila ría d e la s ig u ie n t e fo rm a :
String cat = "cat";
System.out.println(new StringBuffer().append("con").append(cat).append("enation"));
Ta m b ié n s e p u e d e u t iliza r e l o p e ra d o r + p a ra a ñ a d ir va lo re s a u n a ca d e n a q u e n o s o n
p ro p ia m e n t e ca d e n a s :
System.out.println("Java's Number " + 1);
El co m p ila d o r co n vie rt e e l va lo r n o - ca d e n a ( e l e n t e ro 1 e n e l e je m p lo a n t e rio r) a u n o b je t o
S t rin g a n t e s d e re a liza r la co n ca t e n a ció n .

Oz it o
Cambios en el JDK 1.1:
Que afectan a las clases String y StringBuffer
La s c la s e s S t rin g y S t rin g Bu ffe r
La cla s e S t rin g h a ca m b ia d o p a ra s o p o rt a r la in t e rn a cio n a liza ció n .
Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : La cla s e S t rin g p a ra m á s d e t a lle s . La
cla s e S t rin g Bu ffe r n o s e h a m o d ifica d o e n e l JDK 1 . 1 .

Oz it o
Seleccionar Atributos del Programa
Lo s p ro g ra m a s Ja va s e e je cu t a n d e n t ro d e a lg ú n e n t o rn o . Es t o e s , e n u n e n t o rn o
d o n d e h a y u n a m á q u in a , u n d ire ct o rio a ct u a l , p re fe re n cia s d e l u s u a rio , e l co lo r d e
la ve n t a n a , la fu e n t e , e l t a m a ñ o d e la fu e n t e y o t ro s a t rib u t o s a m b ie n t a le s .
Ad e m á s d e e s t o s a t rib u t o s d e l s is t e m a , u n p ro g ra m a p u e d e a ct iva r cie rt o s
a t rib u t o s co n fig u ra b le s e s p e cífico s d e l p ro g ra m a . Lo s a t rib u t o s d e l p ro g ra m a s o n
fre cu e n t e m e n t e lla m a d o s p re fe re n cia s y p e rm it e n a l u s u a rio co n fig u ra r va ria s
o p cio n e s d e a rra n q u e .
Un p ro g ra m a p o d ría n e ce s it a r in fo rm a ció n s o b re e l e n t o rn o d e l s is t e m a p a ra t o m a r
d e cis io n e s s o b re a lg o o co m o h a ce rlo . Un p ro g ra m a t a m b ié n p o d ría m o d ifica r
cie rt o s a t rib u t o s p ro p io s o p e rm it ir q u e e l u s u a rio lo s ca m b ie . Po r e s o , u n
p ro g ra m a n e ce s it a p o d e r le e r y a lg u n a s ve ce s m o d ifica r va rio s a t rib u t o s d e l
s is t e m a y a t rib u t o s e s p e cífico s d e l p ro g ra m a . Lo s p ro g ra m a s Ja va p u e d e m a n e ja r
a t rib u t o s d e l p ro g ra m a a t ra vé s d e t re s m e ca n is m o s : p ro p ie d a d e s , a rg u m e n t o s d e
la lín e a d e co m a n d o s d e la a p lica ció n y p a rá m e t ro s d e a p p le t s .
● S e le ccio n a r y Ut iliza r Pro p ie d a d e s
● Arg u m e n t o s d e la Lín e a d e Co m a n d o s d e la Ap p lica ció n
❍ Co n ve n cio n e s d e Arg u m e n t o s d e la Lín e a d e Co m a n d o s
❍ An a liza r lo s Arg u m e n t o s d e la Lín e a d e Co m a n d o s
● P a rá m e t ro s d e Ap p le t s Lo s p a rá m e t ro s d e a p p le t s s o n s im ila re s
a lo s a rg u m e n t o s d e la lín e a d e co m a n d o s p e ro s e u t iliza n co n a p p le t s ,
n o co n a p lica cio n e s . Es t o s p a rá m e t ro s s e u t iliza n p a ra s e le ccio n a r u n o
o m á s a t rib u t o s d e u n a lla m a d a a l a p p le t . Es t o s p a rá m e t ro s s e ve rá n
m á s a d e la n t e cu a n d o t ra t e m o s co n lo s a p p le t s .
● No t a s s o b re e l JDK 1 . 1

Oz it o
Seleccionar y Utilizar Propiedades
En Ja va , lo s a t rib u t o s d e l p ro g ra m a e s t á n re p re s e n t a d o s p o r la cla s e Pro p e rt ie s d e l p a q u e t e
ja va . u t il. Un o b je t o Pro p ie rt ie s co n t ie n e u n ju e g o d e p a re ja s cla ve / va lo r. Es t a s p a re ja s
cla ve / va lo r s o n co m o la s e n t ra d a s d e u n d iccio n a rio : la cla ve e s la p a la b ra , y e l va lo r e s la
d e fin ició n .
Ta n t o la cla ve co m o e l va lo r s o n ca d e n a s . Po r e je m p lo , o s . n a m e e s la cla ve p a ra u n a d e
la s p ro p ie d a d e s d e l s is t e m a p o r d e fe ct o d e Ja va - - e l va lo r co n t ie n e e l n o m b re d e l s is t e m a
o p e ra t ivo a ct u a l. Ut ilice la cla ve p a ra b u s ca r u n a p ro p ie d a d e n la lis t a d e p ro p ie d a d e s y
o b t e n e r s u va lo r. En m i s is t e m a , cu a n d o b u s co la p ro p ie d a d o s . n a m e , s u va lo r W in d o w s
9 5 / N T. El t u yo p ro b a b le m e n t e s e rá d ife re n t e .
La s p ro p ie d a d e s e s p e cífica s d e u n p ro g ra m a d e b e n s e r m a n t e n id a s p o r e l p ro p io p ro g ra m a .
La s p ro p ie d a d e s d e l s is t e m a la s m a n t ie n e la cla s e ja va . la n g . S ys t e m . Pa ra m á s in fo rm a ció n
s o b re la s p ro p ie d a d e s d e l s is t e m a p u e d e s re fe rirt e a : Pro p ie d a d e s d e l S is t e m a e n la le cció n
Ut iliz a r lo s Re cu rs o s d e l S is t e m a .
S e p u e d e u t iliza r la cla s e Pro p ie rt ie s d e l p a q u e t e ja va . u t il p a ra m a n e ja r a t rib u t o s
e s p e cífico s d e u n p ro g ra m a . S e p u e d e ca rg a r lo s p a re s cla ve / va lo r d e n t ro d e u n o b je t o
Pro p ie rt ie s u t iliza n d o u n s t re a m , g ra b a r la s p ro p ie d a d e s a u n s t re a m y o b t e n e r in fo rm a ció n
s o b re la s p ro p ie d a d e s re p re s e n t a d a s p o r e l o b je t o Pro p ie rt ie s .

Seleccionar un Objeto Properties


Fre cu e n t e m e n t e , cu a n d o u n p ro g ra m a a rra n ca , u t iliza u n có d ig o s im ila r a e s t e
p a ra s e le ccio n a r u n o b je t o Pro p ie rt ie s :
. . .
// selecciona las propiedades por defecto
Properties defaultProps = new Properties();
FileInputStream defaultStream = new FileInputStream("defaultProperties");
defaultProps.load(defaultStream);
defaultsStream.close();

// selecciona las propiedades reales


Properties applicationProps = new Properties(defaultProps);
FileInputStream appStream = new FileInputStream("appProperties");
applicationProps.load(appStream);
appStream.close();
. . .
Prim e ro la a p lica ció n s e le ccio n a u n o b je t o Pro p e rt ie s p a ra la s p ro p ie d a d e s p o r
d e fe ct o . Es t e o b je t o co n t ie n e u n co n ju n t o d e p ro p ie d a d e s cu yo s va lo re s n o s e
u t iliza n e xp lícit a m e n t e e n n in g u n a p a rt e . Es t e fra g m e n t e o d e có d ig o u t iliza e l
m é t o d o lo a d ( ) p a ra le e r e l va lo r p o r d e fe ct o d e s d e u n fich e ro d e d is co lla m a d o
d e fa u lt P ro p e rt ie s . No rm a lm e n t e la s a p lica cio n e s g u a rd a n s u s p ro p ie d a d e s e n
fich e ro s d e d is co .
Lu e g o , la a p lica ció n u t iliza u n co n s t ru ct o r d ife re n t e p a ra cre a r u n s e g u n d o o b je t o
Pro p e rt ie s a p p lic a t io n P ro p s . Es t e o b je t o u t iliza d e fa u lt P ro p s p a ra
p ro p o rcio n a rle s u s va lo re s p o r d e fe ct o .
De s p u é s e l có d ig o ca rg a u n ju e g o d e p ro p ie d a d e s d e n t ro d e a p p lic a t io n P ro p s
d e s d e u n fich e ro lla m a d o a p p P ro p e rt ie s . La s p ro p ie d a d e s ca rg a d a s e n
a p p P ro p e rt ie s p u e d e n s e le ccio n a rs e e n b a s e a l u s u a iro o e n b a s e a l s is t e m a , lo
q u e s e a m á s a p ro p ia d o p a ra ca d a p ro g ra m a . Lo q u e e s im p o rt a n t e e s q u e e l
p ro g ra m a g u a rd e la s Pro p ie d a d e s e n u n p o s ició n "CONOCIDA" p a ra q u e la
p ró xim a lla m a d a a l p ro g ra m a p u e d a re cu p e ra rla s . Po r e je m p lo , e l n a ve g a d o r
Ho t Ja va g ra b a la s p ro p ie d a d e s e n e l d ire ct o rio ra iz d e l u s u a rio .
S e u t iliza e l m é t o d o s a v e ( ) p a ra e s crib ir la s p ro p ie d a d e s e n u n ca n a l:
FileOutputStream defaultsOut = new FileOutputStream("defaultProperties");
applicationProps.save(defaultsOut, "---No Comment---");
defaultsOut.close();
El m é t o d o s a v e ( ) n e ce s it a u n s t re a m d o n d e e s crib ir, y u n a ca d e n a q u e s e u t iliza
co m o co m e n t a rio a l p rin cip io d e la s a lid a .

Obtener Información de las Propiedades


Un a ve z q u e s e h a n s e le ccio n a d o la s p ro p ie d a d e s d e u n p o g ra m a , s e p u e d e p e d ir
in fo rm a ció n s o b re la p ro p ie d a d e s co n t e n id a s . La cla s e Pro p e rt ie s p ro p o rcio n a
va rio s m é t o d o s p a ra o b t e n e r e s t a in fo rm a ció n d e la s p ro p ie d a d e s :
g e t P ro p e rt y ( ) ( 2 ve rs io n e s )
De vu e lve e l va lo r d e la p ro p ie d a d e s p e cifica d a . Un a ve rs ió n p e rm it e u n
va lo r p o r d e fe ct o , s i n o s e e n cu e n t ra la cla s e , s e d e vu e lve e l va lo r p o r
d e fe ct o .
lis t ( )
Es crib e t o d a s la s p ro p ie d a d e s e n e l ca n a l e s p e cifica d o . Es t o e s ú t il p a ra
d e p u ra ció n .
p ro p e rt y N a m e s ( )
De vu e lve u n a lis t a co n t o d a s la s cla ve s co n t e n id a s e n e l o b je t o Pro p e rt ie s .

Co n s id e ra c io n e s d e S e g u rid a d : Ob s e rva q u e e l a cce s o a la s p ro p ie d a d e s e s t á s u je t o a la


a p ro b a ció n d e l m a n e ja d o r d e S e g u rid a d . El p ro g ra m a d e e je m p lo e s u n a a p lica ció n
s o lit a ria , q u e p o r d e fe ct o , n o t ie n e m a n e ja d o r d e s e g u rid a d . S i s e in t e n t a u t iliza r e s t e
có d ig o e n u n a p p le t , p o d ría n o t ra b a ja r d e p e n d ie n d o d e l n a ve g a d o r. Pu e d e s ve r: En t e n d e r
la s Ca p a cid a d e s y Re s t riccio n e s d e u n Ap p le t p a ra o b t e n e r m á s in fo rm a ció n s o b re la s
re s t riccio n e s d e s e g u rid a d e n lo s a p p le t s .

Oz it o
Argumentos de la Línea de Comandos
Un a a p lica ció n Ja va p u e d e a ce p t a r cu a lq u ie r n ú m e ro d e a rg u m e n t o s d e s d e la lín e a
d e co m a n d o s . Lo s a rg u m e n t o s d e la lín e a d e co m a n d o s p e rm it e n a l u s u a rio va ria r
la o p e ra ció n d e u n a a p lica ció n , Po r e je m p lo , u n a a p lica ció n p o d ría p e rm it ir q u e e l
u s u a rio e s p e cifica ra u n m o d o ve rb o s o - - e s t o e s , e s p e cifica r q u e la a p lica ció n
m u e s t re t o d a la in fo rm a ció n p o s ib le - - co n e l a rg u m e n t o - v e rb o s e .
Cu a n d o lla m a a u n a a p lica ció n , e l u s u a rio t e cle a lo s a rg u m e n t o s d e la lín e a d e
co m a n d o s d e s p u é s d e l n o m b re d e la a p lica ció n . S u p o n g a m o s , p o r e je m p lo , q u e
e xis t e u n a a p lica ció n Ja va , lla m a d a S o rt , q u e o rd e n a la s lín e a s d e u n fich e ro , y
q u e lo s d a t o s q u e s e q u ie re o rd e n a r e s t á n e n u n fich e ro lla m a d o frie n d s . t x t . S i
e s t u vie ra m o s u t iliza n d o Win d o ws 9 5 / NT, lla m a ría a la a p lica ció n S o rt co n s u
fich e ro d e d a t o s d e la s ig u ie n t e fo rm a :
C:\> java Sort friends.txt
En e l le n g u a je Ja va , cu a n d o s e lla m a a u n a a p lica ció n , e l s is t e m a d e e je cu ció n p a s a
lo s a rg u m e n t o s d e la lín e a d e co m a n d o s a l m é t o d o m a in d e la a p lica ció n ,
m e d ia n t e u n a rra y d e S t rin g s . Ca d a S t rin g d e l a rra y co n t ie n e u n a rg u m e n t o . En e l
e je m p lo a n t e rio r, lo s a rg u m e n t o s d e la lín e a d e co m a n d o s d e la a p lica ció n S o rt s o n
u n a rra y co n u n a s o la ca d e n a q u e co n t ie n e "frie n d s . t x t ".

Ejemplo de Argumentos
Es t a s e n cilla a p lica ció n m u e s t ra t o d o s lo s a rg u m e n t o s d e la lín e a d e
co m a n d o s u n o p o r u n o e n ca d a lín e a :
class Echo {
public static void main (String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i]);
}
}
I n t e n t a Es t o : Lla m a a la a p lica ció n Ech o . Aq u í t ie n e d u n e je m p lo d e
co m o lla m a rla u t iliza n d o Win d o ws 9 5 / NT:
C:\> java Echo Bebe Java Caliente
Bebe
Java
Caliente
Ha b rá a o b s e rva d o q u e la a p lica ció n m u e s t ra ca d a p a la b ra e n u n a lín e a
d is t in t a . Es t o e s a s í p o rq u e e l e s p a cio s e p a ra lo s a rg u m e n t o s d e la lín e a
d e co m a n d o s . S i q u ie re s q u e Be b e Ja v a Ca lie n t e s e a in t e rp re t a d o
co m o u n s ó lo a rg u m e n t o d e b e s p o n e rlo e n t re co m illa s :
% java Echo "Bebe Java Caliente"
Bebe Java Caliente
Convenciones
Exis t e n va ria s co n ve n cio n e s q u e s e d e b e rá n o b s e rva r cu a n d o s e a ce p t e n
y p ro ce s e n a rg u m e n t o s d e la lín e a d e co m a n d o s co n u n a a p lica ció n Ja va .

Analizar Argumentos de la Línea de Comandos


La m a yo ría d e la s a p lica cio n e s a ce p t a n va rio s a rg u m e n t o s d e la lín e a d e
co m a n d o s q u e le p e rm it e n a l u s u a rio va ria r la e je cu ció n d e la a p lica ció n ,
Po r e je m p lo , e l co m a n d o UNIX q u e im p rim e e l co n t e n id o d e u n
d ire ct o rio - - ls - - a cce p t a a rg u m e n t o s q u e d e t e rm in a n q u é a t rib u t o s d e
fich e ro s s e va n a m o s t ra r y e l o rd e n e n q u e lo va n a h a ce r.
No rm a lm e n t e , e l u s u a iro p u e d e e s p e cifica r lo s a rg u m e n t o s e n cu a lq u ie r
o rd e n p o r lo t a n t o re q u ie re q u e la a p lica ció n s e a ca p a z d e a n a liz a rlo s .

Oz it o
Convenciones para los Argumentos de la Línea de
Comandos
El le n g u a je Ja va s ig u e la s co n ve n cio n e s d e UNIX q u e d e fin e n t re s t ip o s d ife re n t e s d e
a rg u m e n t o s :
● Pa la b ra s ( t a m b ié n co n o cid o s co m o o p cio n e s )

● Arg u m e n t o s q u e re q u ie re n a rg u m e n t o s
● Ba n d e ra s
Ad e m á s , u n a a p lica ció n d e b e o b s e rva r la s s ig u ie n t e s co n ve n cio n e s p a ra u t iliza r lo s a rg u m e n t o s
d e la lín e a d e co m a n d o s e n Ja va :
● El g u ió n ( - ) p re ce d e a la s o p cio n e s , b a n d e ra s o s e rie s d e b a n d e ra s .

● Lo s a rg u m e n t o s p u e d e n ir e n cu a lq u ie r o rd e n , e xce p t o cu a n d o s e a u n a rg u m e n t o q u e
re q u ie re o t ro s a rg u m e n t o s .
● La s b a n d e ra s p u e d e n lis t a rs e e n cu a lq u ie r o rd e n , s e p a ra d a m e n t e o co m b in a d a s : - xn o - n x o
-x -n.
● Típ ica m e n t e lo s n o m b re s d e fich e ro va n a l fin a l.

● El p ro g ra m a im p rim e u n m e n s a je d e e rro r d e u t iliza ció n cu a n d o n o s e re co n o ce u n


a rg u m e n t o d e la lín e a d e co m a n d o s . Es t a s s e n t e n cia s p u e d e n t e n e r e s t a fo rm a :
utilización: nombre_aplicación [ argumentos_opcionales ] argumentos_requeridos

Opciones
Lo s a rg u m e n t o s co m o - ve rb o s e s o n a rg u m e n t o s d e p a la b ra y d e b e n e s p e cifica rs e
co m p le t a m e n t e e n la lín e a d e co m a n d o s . Po r e je m p lo , - ve r n o co rre s p o n d e ría co n
- ve rb o s e .

S e p u e d e n u t iliza r s e n t e n cia s co m o e s t a p a ra co m p ro b a r lo s a rg u m e n t o s d e p a la b ra s :
if (argument.equals("-verbose"))
vflag = true;
Es t a s e n t e n cia co m p ru e b a s i la p a la b ra - ve rb o s e e s t á e n la lín e a d e a rg u m e n t o s y a ct iva
u n a b a n d e ra e n e l p ro g ra m a p a ra q u e e s t e s e e je cu t e e n m o d o ve rb o s o .

Argumentos que Requieren Argumentos


Alg u n o s a rg u m e n t o s n e ce s it a n m á s in fo rm a ió n . Po r e je m p lo , u n a rg u m e n t o co m o
- o u t p u t p o d ría p e rm it ir q u e e l u s u a rio re d irig ie ra la s a lid a d e l p ro g ra m a . S in e m b a rg o , la
o p ció n - o u t p u t e n s o lit a rio n o o fre ce la in fo rm a ció n s u ficie n t e a la a p lica ció n : ¿ Có m o
s a b e la a p lica ció n d ó n d e re d irig ir la s a lid a ? Po r lo t a n t o e l u s u a rio d e b e e s p e cifica r
t a m b ié n u n n o m b re d e fich e ro . No rm a lm e n t e , e l ít e m s ig u ie n t e d e la lín e a d e
co m a n d o s p ro p o rcio n a la in fo rm a ció n a d icio n a l p a ra e l a rg u m e n t o q u e a s í lo re q u ie re .
S e p u e d e u t iliza r la s ig u ie n t e s e n t e n cia p a ra e m p a re ja r a rg u m e n t o s q u e re q u ie re n
a rg u m e n t o s :
if (argument.equals("-output")) {
if (nextarg < args.length)
outputfile = args[nextarg++];
else
System.err.println("-output requiere un nombre de fichero");
}
Ob s e rva q u e e l có d ig o s e a s e g u ra d e q u e e l u s u a rio h a e s p e cifica d o re a lm e n t e u n
a rg u m e n t o s ig u ie n t e a n t e s d e in t e n t a r u t iliza rlo .

Banderas
Ls s b a n d e ra s s o n ca rá ct e re s q u e m o d ifica n e l co m p o rt a m ie n e o d e l p ro g ra m a d e a lg u n a
m a n e ra . Po r e je m p lo , la b a n d e ra - t p ro p o rcio n a d a a l co m a n d o ls d e UNIX in d ica q u e la
s a lid a d e b e o rd e n a rs e p o r la fe ch a d e lo s fich e ro s . La m a yo ría d e la s a p lica cio n e s
p e rm it e n a l u s u a rio e s p e cifica r b a n d e ra s s e p a ra d a s e n cu a lq u ie r o rd e n :
-x -n o -n -x
Ad e m á s , p a ra h a ce r u n u s o m á s s e n cillo , la s a p liccio n e s d e b e rá n p e rm it ir q u e e l
u s u a rio co n ca t e n e b a n d e ra s y la s e s p e cifiq u e e n cu a lq u ie r o rd e n :
-nx o -xn
El p ro g ra m a d e e je m p lo d e s crit o e n la p á g in a s ig u ie n t e im p le m e n t a u n s e n cillo
a lg o rit m o p a ra p ro ce s a r b a n d e ra s q u e p u e d e n e s p e cifica rs e e n cu a lq u ie r o rd e n ,
s e p a ra d a s o d e fo rm a co m b in a d a .

Oz it o
Analizar Argumentos de la Línea de Comandos
Es t e p ro g ra m a , lla m a d o P a rs e Cm d Lin e , p ro p o rcio n a u n a fo rm a b á s ica p a ra co n s t ru ir t u p ro p io
a n a liza d o r d e a rg u m e n t o s :
class ParseCmdLine {
public static void main(String[] args) {

int i = 0, j;
String arg;
char flag;
boolean vflag = false;
String ficheroSalida = "";

while (i < args.length && args[i].startsWith("-")) {


arg = args[i++];

// Utiliza este tipo de chequeo para argumentos de "palabra"


if (arg.equals("-verboso")) {
System.out.println("modo verboso mode activado");
vflag = true;
}

// Utiliza este tipo de chequeo para argumentos que requieren argumentos


else if (arg.equals("-output")) {
if (i < args.length)
ficheroSalida = args[i++];
else
System.err.println("-output requiere un nombre de fichero");
if (vflag)
System.out.println("Fichero de Salida = " + ficheroSalida);
}

// Utiliza este tipo de chequeo para una serie de banderas


else {
for (j = 1; j < arg.length(); j++) {
flag = arg.charAt(j);
switch (flag) {
case 'x':
if (vflag) System.out.println("Opción x");
break;
case 'n':
if (vflag) System.out.println("Opción n");
break;
default:
System.err.println("ParseCmdLine: opción ilegal " + flag);
break;
}
}
}
}
if (i == args.length)
System.err.println("Utilización: ParseCmdLine [-verboso] [-xn]
[-output unfichero] nombre de Fichero");
else
System.out.println("Correcto!");
}
}
Ace p t a u n a rg u m e n t o d e ca d a u n o d e lo s t ip o s : u n a rg u m e n t o d e p a la b ra , u n a rg u m e n t o q u e
re q u ie re u n a rg u m e n t o y d o s b a n d e ra s . Ad e m á s , e s t e p ro g ra m a n e ce s it a u n n o m b re d e fich e ro .
Aq u í t ie n e s u n a s e n t e n cia d e u t iliza ció n d e e s t e p ro g ra m a :
Utilización: ParseCmdLine [-verboso] [-xn] [-output unfichero] nombrefichero
Lo s a rg u m e n t o s e n t re lo s co rch e t e s s o n o p cio n e s : e l a rg u m e n t o n o m b re fich e ro e s o b lig a t o rio .

Oz it o
Cambios del API que afectan a los Atributos del
Programa
S e h a a ñ a d id o u n a s e g u n d a lis t a d e m é t o d o s a la cla s e P ro p e rt ie s e n la ve rs ió n
1 . 1 d e l JDK. Pu e d e s ve r Ca m b io s e n e l JDK1 . 1 : La cla s e Pro p e rt ie s p a ra m á s
d e t a lle s . fo r d e t a ils .

Oz it o
Utilizar los Recursos del Sistema
Alg u n a s ve ce s , u n p ro g ra m a n e ce s it a a cce d e r a lo s re cu rs o s d e l s is t e m a , co m o lo s
ca n a le s d e I/ O e s t a n d a rd o la h o ra d e l s is t e m a . Un p ro g ra m a p o d ría u t iliza r e s t o s
re cu rs o s d ire ct a m e n t e d e s d e e l e n t o rn o d e e je cu ció n , p e ro s ó lo p o d ría e je cu t a rs e
e n e l e n t o rn o d o n d e fu e e s crit o . Ca d a ve z q u e s e q u is ie ra e je cu t a r u n p ro g ra m a e n
u n n u e vo e n t o rn o s e d e b e rá "p o rt a r" e l p ro g ra m a re e s crib ie n d o la s s e ccio n e s d e l
có d ig o d e p e n d ie n t e s d e l s is t e m a .
El e n t o rn o d e d e s a rro llo d e Ja va re s u e lve e s t e p ro b le m a p e rm it ie n d o a lo s
p ro g ra m a s q u e u t ilice n lo s re cu rs o s d e l s is t e m a a t ra vé s d e u n in t e rfa ce d e
p ro g ra m a ció n in d e p e n d ie n t e d e l s is t e m a im p le m e n t a d o p o r la cla s e S ys t e m
( m ie m b ro d e l p a q u e t e ja va . la n g ) .

Oz it o
Utilizar la Clase System
Al co n t ra rio q u e la m a yo ría d e la s cla s e s , n o s e d e b e e je m p la riza r la cla s e S ys t e m
p a ra u t iliza rla . Pa ra s e r m á s p re cis o s , n o s e p u e d e e je m p la riza r- - e s u n a cla s e fin a l
y t o d o s s u s co n s t ru ct o re s s o n p riva d o s .
To d a s la s va ria b le s y m é t o d o s d e la cla s e S ys t e m s o n m é t o d o s y va ria b le s d e cla s e
- - e s t á n d e cla ra d a s co m o s t a t ic . Pa ra u n a co m p le t a e xp lica ció n s o b re la s va ria b le s
y m é t o d o s d e cla s e y e n q u é s e d ife re n cia n d e la s va ria b le s y m é t o d o s d e
e je m p la r, p u e d e re fe rirs e a Mie m b ro s d e l Eje m p la r y d e la Cla s e .

Pa ra u t iliza r u n a va ria b le d e cla s e , s e u s a d ire ct a m e n t e d e s d e e l n o m b re d e la


cla s e u t iliza n d o la n o t a ció n d e p u n t o ( '. ') d e Ja va . Po r e je m p lo , p a ra re fe rirs e a la
va ria b le s o u t d e la cla s e S ys t e m , s e a ñ a d e e l n o m b re d e la va ria b le a l n o m b re d e
la cla s e s e p a ra d o s p o r u n p u n t o . As í:
System.out
S e p u e d e lla m a r a lo s m é t o d o s d e cla s e d e u n a fo rm a s im ila r. Po r e je m p lo , p a ra
lla m a r a l m é t o d o g e t P ro p e rt y ( ) d e la cla s e S ys t e m s e a ñ a d e e l n o m b re d e l
m é t o d o a l n o m b re d e la cla s e s e p a ra d o s p o r u n p u n t o :
System.getProperty(argument);
El s ig u e n t e p ro g ra m a Ja va u t iliza d o s ve ce s la cla s e S ys t e m , p rim e ro p a ra o b t e n e r
e l n o m b re d e l u s u a rio a ct u a l y lu e g o p a ra m o s t ra rlo .
class UserNameTest {
public static void main(String[] args) {
String name;
name = System.getProperty("user.name");
System.out.println(name);
}
}
Ha b rá s o b s e rva d o q u e e l p ro g ra m a n u n ca e je m p la riza u n o b je t o d e la cla s e
S ys t e m . S o lo re fe re n cia a l m é t o d o g e t P ro p e rt y ( ) y la va ria b le o u t d ire ct a m e n t e
d e s d e la cla s e .
El e je m p lo a n t e rio r u t iliza e l m é t o d o g e t P ro p e rt y ( ) p a ra b u s ca r e n la b a s e d e
d a t o s d e p ro p ie d a d e s u n a p ro p ie d a d lla m a d a "u s e r. n a m e ". Pro p ie d a d e s d e l
S is t e m a m á s a d e la n t e e n e s t a le cció n cu e n t a m á s co s a s s o b re la s p ro p ie d a d e s d e l
s is t e m a y e l m é t o d o g e t P ro p e rt y ( ) .
El e je m p lo t a m b ié n u t liza S y s t e m . o u t , u n Prin t S t re a m q u e im p le m e n t a e l ca n a l d e
s a lid a e s t a n d a rd . El m é t o d o p rin t ln ( ) im p rim e e l a rg u m e n t o e n e l ca n a l d e s a lid a
e s t a n d a rd . La s ig u ie n t e p á g in a d e e s t á le cció n e xp lica e l ca n a l d e s a lid a e s t a n d a rd
y lo s o t ro s d o s ca n a le s p ro p o rcio n a d o s p o r la cla s e S ys t e m .
Oz it o
Los Canales de I/O Estandard
Lo s co n ce p t o s d e lo s ca n a le s d e I/ O e s t a n d a rd s o n u n co n ce p t o d e la lib re ría C q u e
h a s id o a s im ila d o d e n t ro d e l e n t o rn o Ja va . Exis t e n t re s ca n a le s e s t a n d a rd , t o d o s
lo s cu a le s s o n m a n e ja d o s p o r la cla s e ja va . la n g . S ys t e m :
En t ra d a e s t a n d a rd - - re fe re n cia d o p o r S y s t e m . in
u t iliza d o p a ra la e n t ra d a d e l p ro g ra m a , t íp ica m e n t e le e la e n t ra d a in t ro d u cid a
p o r e l u s u a rio .
S a lid a e s t a n d a rd - - re fe re n cia d o p o r S y s t e m . o u t
u t iliza d o p a ra la s a lid a d e l p ro g ra m a , t íp ica m e n t e m u e s t ra in fo rm a ció n a l
u s u a rio .
Erro r e s t a n d a rd - - re fe re n cia d o p o r S y s t e m . e rr
u t iliza d o p a ra m o s t ra r m e n s a je s d e e rro r a l u s u a rio .

Canal de Entrada Estandard


La cla s e S ys t e m p ro p o rcio n a u n ca n a l p a ra le e r t e xt o - - e l ca n a l d e
e n t ra d a e s t a n d a rd . El p ro g ra m a d e e je m p lo d e Tu e rca s y To rn illo s d e l
Le n g u a je Ja v a u t iliza e l ca n a l d e l e n t ra d a e s t a n d a rd p a ra co n t a r lo s
ca ra ct e re s t e cle a d o s p o r e l u s u a rio .

Los Canales de Salida y de Error Estandards


Pro b a b le m e n t e lo s p u n t o s m á s u t iliza d o s d e la cla s e S ys t e m s e a n lo s
ca n a le s d e s a lid a y d e e rro r e s t a n d a rd , q u e s e u t iliza n p a ra m o s t ra rle
t e xt o a l u s u a rio .
El ca n a l d e s a lid a e s t a n d a rd s e u t iliza n o rm a lm e n t e p a ra la s s a lid a s d e
co m a n d o s , e s t o e s , p a ra m o s t ra r e l re s u lt a d o d e u n co m a n d o d e l
u s u a rio . El ca n a l d e e rro r e s t a n d a rd s e u t iliza p a ra m o s t ra r cu a lq u ie r
e rro r q u e o cu rra d u ra n t e la e je cu ció n d e l p ro g ra m a .

Los métodos print(), println(), y write()


Ta n t o la s a lid a e s t a n d a rd co m o e l e rro r e s t a n d a rd d e riva n d e la cla s e
Prin t S t re a m . As í, s e u t iliza u n o d e lo s t re s m é t o d o s d e Prin t S t re a m p a ra
im p rim ir e l t e xt o e n e l ca n a l: p rin t ( ) , p rin t ln ( ) , y w rit e ( ) .
Lo s m é t o d o s p rin t ( ) y p rin t ln ( ) s o n e s e n cia lm e n t e e l m is m o : lo s d o s
e s crib e n s u a rg u m e n t o S t rin g e n e l ca n a l. La ú n ica d ife re n cia e n t re e s t o s
d o s m é t o d o s e s q u e p rin t ln ( ) a ñ a d e u n ca rá ct e r d e n u e va lín e a a l fin a l
d e la s a lid a , y p rin t ( ) n o lo h a ce . En o t ra s p a la b ra s , e s t o
System.out.print("Duke no es un Pingüino!\n");
e s e q u iva le n t e a e s t o
System.out.println("Duke no es un Pingüino!");
Ob s e rva e l ca rá ct e r e xt ra \ n e n la lla m a d a a l p rim e r m é t o d o ; e s e l
ca rá ct e r p a ra n u e va lín e a . p rin t ln ( ) a ñ a d e a u t o m á t ica m e n t e e s t e
ca rá ct e r a s u s a lid a .
El m é t o d o w rit e ( ) e s m e n o s u t iliza d o q u e lo s a n t e rio re s y s e u t iliza p a ra
e s crib ir b yt e s e n u n ca n a l. w rit e ( ) s e u t iliza p a ra e s crib ir d a t o s q u e n o
s e a n AS CII.

Argumentos para print() y println()


Lo s m é t o d o s p rin t ( ) y p rin t ln ( ) t o m a n u n s ó lo a rg u m e n t o . Es t e
a rg u m e n t o p u e d e s e r cu a lq u ie ra d e lo s s ig u ie n t e s t ip o s : Ob je ct , S t rin g ,
c h a r[ ] , in t , lo n g , flo a t , d o u b le , y b o o le a n . Ad e m á s e xis t e u n a ve rs ió n
e xt ra d e p rin t ln ( ) q u e n o t ie n e a rg u m e n t o s q u e im p rim e u n a n u e va
lín e a e n e l ca n a l.

Imprimir Objetos de Diferentes Tipos de Datos


El s ig u ie n t e p ro g ra m a u t iliza p rin t ln ( ) p a ra s a ca r d a t o s d e va rio s t ip o s
p o r e l ca n a l d e s a lid a e s t a n d a rd .
class DataTypePrintTest {
public static void main(String[] args) {

Thread objectData = new Thread();


String stringData = "Java Mania";
char[] charArrayData = { 'a', 'b', 'c' };
int integerData = 4;
long longData = Long.MIN_VALUE;
float floatData = Float.MAX_VALUE;
double doubleData = Math.PI;
boolean booleanData = true;

System.out.println(objectData);
System.out.println(stringData);
System.out.println(charArrayData);
System.out.println(integerData);
System.out.println(longData);
System.out.println(floatData);
System.out.println(doubleData);
System.out.println(booleanData);
}
}
El p ro g ra m a a n t e rio r t e n d ría e s t a s a lid a :
Thread[Thread-4,5,main]
Java Mania
abc
4
-9223372036854775808
3.40282e+38
3.14159
true
Ob s e rva q u e s e p u e d e im p rim ir u n o b je t o - - e l p rim e r p rin t ln ( ) im p rim e
u n o b je t o Th re a d y e l s e g u n d o im p rim e u n o b je t o S t rin g . Ca u n d o s e
u t ilice p rin t ( ) o p rin t ln ( ) p a ra im p rim ir u n o b je t o , lo s d a t o s im p re s o s
d e p e n d e n d e l t ip o d e l o b je t o . En e l e je m p lo , im p rim ir u n S t rin g m u e s t ra
e l co n t e n id o d e la ca d e n a . S in e m b a rg o , im p rim ir u n Th re a d m u e s t ra u n a
ca d e n a co n e s t e fo rm a t o :
ThreadClass[nombre,prioridad,grupo]

Oz it o
Propiedades del Sistema
La cla s e S ys t e m m a n t ie n e u n co n ju n t o d e p ro p ie d a d e s - - p a re ja s cla ve / va lo r - - q u e d e fin e n
a t rib u t o s d e l e n t o rn o d e t ra b a jo a ct u a l. Cu a n d o a rra n ca e l s is t e m a d e e je cu ció n p o r p rie m ra ve z,
la s p ro p ie d a d e s d e l s is t e m a s e in icia liza n p a ra co n t e n e r in fo rm a ció n s o b re e l e n t o rn o d e e je cu ció n .
In clu ye n d o in fo rm a ció n s o b re e l u s u a rio a ct u a l, la ve rs ió n a ct u a l d e l ru n t im e d e Ja va , e in clu s o e l
ca rá ct e r u t iliza d o p a ra s e p a ra r co m p o n e n t e s e n u n n o m b re d e fich e ro .
Aq u í t ie n e u n a lis t a co m p le t a d e la s p ro p ie d a d e s d e l s is t e m a q u e p u e d e o b t e n e r e l s is t e m a cu a n d o
a rra n ca y lo q u e s ig n ifica n :
Clave Significado Acceden los Applets
------------------- ------------------------------ -------------
"file.separator" File separator (e.g., "/") si

"java.class.path" Java classpath no


"java.class.version" Java class version number si
"java.home" Java installation directory no
"java.vendor" Java vendor-specific string si
"java.vendor.url" Java vendor URL si
"java.version" Java version number si

"line.separator" Line separator si

"os.arch" Operating system architecture si


"os.name" Operating system name si

"path.separator" Path separator (e.g., ":") si

"user.dir" User's current working directory no


"user.home" User home directory no
"user.name" User account name no
Lo s p ro g ra m a s Ja va p u e d e r le e r o e s crib ir la s p ro p ie d a d e s d e l s is t e m a a t ra vé s d e va rio s m é t o d o s
d e la cla s e S ys t e m . S e p u e d e u t iliza r u n a cla ve p a ra b u s ca r u n a p ro p ie d a d e n la lis t a d e
p ro p ie d a d e s , o s e p u e d e o b t e n e r e l co n ju n t o co m p le t o d e p ro p ie d a d e s d e u n a ve z. Ta m b ié n s e
p u e d e ca m b ia r e l co n ju n t o d e p ro p ie d a d e s co m p le t a m e n t e .

Co n s id e ra c io n e s d e S e g u rid a d : Lo s Ap p le t s p u e d e n a cce d e r a la s p ro p ie d a d e s d e l s is t e m a p e ro
n o a t o d a s . Pa ra o b t e n e r u n a lis t a co m p le t a d e la s p ro p ie a d e s d e l s is t e m a q u e p u e d e n y n o p u e d e n
s e r u t iliza d a s p o r lo s a p p le t s , p u e d e s ve r : Le e r la s Pro p ie d a d e s d e l S is t e m a . Lo s a p p le t s n o p u e d e n
e s crib ir la s p ro p ie d a d e s d e l s is t e m a .

Leer las Propiedades del Sistema


La cla s e S ys t e m t ie n e d o s m é t o d o s q u e s e p u e d e n u t iliza r p a ra le e r la s p ro p ie d a d e s d e l
s is t e m a : g e t P ro p e rt y ( ) y g e t P ro p e rt ie s .
La cla s e S ys t e m t ie n e d o s ve rs io n e s d ife re n t e s d e g e t P ro p e rt y ( ) . Am b a s ve rs io n e s
d e vu e lve n e l va lo r d e la p ro p ie d a d n o m b ra d a e n la lis t a d e a rg u m e n t o s . La m á s s im p le
d e la s d o s g e t P ro p e rt y ( ) t o m a u n s ó lo a rg u m e n t o : la cla ve d e la p ro p ie d a d q u e q u ie re
b u s ca r. Po r e je m p lo , p a ra o b t e n e r e l va lo r d e p a t h . s e p a ra t o r, u t iliza m o s la s ig u ie n t e
s e n t e n cia :
System.getProperty("path.separator");
Es t e m é t o d o d e vu e lve u n a ca d e n a q u e co n t ie n e e l va lo r d e la p ro p ie d a d . S i la p ro p ie d a d
n o e xis t e , e s t a ve rs ió n d e g e t P ro p e rt y ( ) d e vu e lve n u ll.
Lo q u e n o s lle va a la s ig u ie n t e ve rs ió n d e g e t P ro p e rt y ( ) . Es t a ve rs ió n re q u ie re d o s
a rg u m e n t o s S t rin g : e l p rim e r a rg u m e n t o e s la cla ve q u e b u s ca m o s y e l s e g u n d o e s e l
va lo r p o r d e fe ct o d e vu e lt o s i la cla ve n o s e e n cu e n t ra o n o t ie n e n in g ú n va lo r. Po r
e je m p lo , e s t a lla m a d a a g e t P ro p e rt y ( ) b u s ca la p ro p ie d a d d e l s is t e m a lla m a d a
s u b lim in a l. m e s s a g e . Es t o n o e s u n a p ro p ie d a d vá lid a d e l s is t e m a , p o r lo q u e e n lu g a r
d e d e vo lve r n u ll, e s t e m é t o d o d e vo lve rá e l va lo r p ro p o rcio n a d o p o r e l s e g u n d o
a rg u m e n t o : "Co m p ra Ja v a a h o ra ".
System.getProperty("subliminal.message", "Compra Java ahora!");
S e d e b e rá u t iliza r e s t a ve rs ió n d e g e t P ro p e rt y ( ) s i n o s e q u ie re co rre r e l rie s g o d e u n a
e xce p ció n Nu llPo in t e rExce p t io n , o s i re a lm e n t e s e q u ie re p ro p o rcio n a r u n va lo r p o r
d e fe ct o p a ra u n a p ro p ie d a d q u e n o t ie n e va lo r o q u e n o h a p o d id o s e r e n co n t ra d a .
El ú lt im o m é t o d o p ro p o rcio n a d o p o r la cla s e S ys t e m p a ra a cce r a lo s va lo re s d e la s
p ro p ie d a d e s e s e l m é t o d o g e t P ro p e rt ie s ( ) q u e d e vu e lve Pro p ie d a d u n o b je t o q u e
co n t ie n e e l co n ju n t o co m p le t o d e la s p ro p ie d a d e s d e l s is t e m a . S e p u e d e n u t iliza r va rio s
m é t o d o s d e la cla s e Pro p ie rt ie s p a ra co n s u lt a r va lo re s e s p e cífico s o p a ra lis t a r e l co n ju n t o
co m p le t o d e p ro p ie d a d e s . Pa ra m á s in fo rm a ció n s o b re la cla s e Pro p ie rt ie s , p u e d e s ve r
S e le ccio n a r y u t iliza r Pro p ie d a d e s .

Escribir Propiedades del Sistema


S e p u e d e m o d ifica r e l co n ju n t o e xis t e n t e d e la s p ro p ie d a d e s d e l s is t e m a , u t iliza n d o e l
m é t o d o s e t P ro p e rt ie s ( ) d e la cla s e S ys t e m . Es t e m é t o d o t o m a u n o b je t o Pro p ie rt ie s
q u e h a s id o in icia liza d o p a ra co n t e n e r p a re ja s d e cla ve / va lo r p a ra la s p ro p ie d a d e s q u e s e
q u ie re n m o d ifica r. Es t e m é t o d o re e m p la za e l co n ju n t o co m p le t o d e la s p ro p ie d a d e s d e l
s is t e m a p o r la s n u e va s re p re s e n t a d a s p o r e l o b je t o Pro p ie rt ie s .
Aq u í t e n e m o s u n p e q u e ñ o p ro g ra m a d e e je m p lo q u e cre a u n o b je t o Pro p ie rt ie s y lo
in icia liza d e s d e u n fich e ro :
subliminal.message=Buy Java Now!
El p ro g ra m a d e e je m p lo u t iliza S y s t e m . s e t P ro p e rt ie s ( ) p a ra in s t a la r e l n u e vo o b je t o
Pro p ie rt ie s co m o e l co n ju n t o a ct u a l d e p ro p ie d a d e s d e l s is t e m a .
import java.io.FileInputStream;
import java.util.Properties;

class PropertiesTest {
public static void main(String[] args) {
try {
// selecciona el nuevo objeto propierties a partir de
"myProperties.txt"
FileInputStream propFile = new FileInputStream("myProperties.txt");
Properties p = new Properties(System.getProperties());
p.load(propFile);

// selecciona las propiedades del sistema


System.setProperties(p);
System.getProperties().list(System.out); // selecciona las nuevas
propiedades
} catch (java.io.FileNotFoundException e) {
System.err.println("Can't find myProperties.txt.");
} catch (java.io.IOException e) {
System.err.println("I/O failed.");
}
}
}
Ob s e rva q u e e l p ro g ra m a d e e je m p lo cre a u n o b je t o Pro p e rt ie s , p , q u e s e u t iliza co m o
a rg u m e n t o p a ra s e t P ro p e rt ie s ( ) :
Properties p = new Properties(System.getProperties());
Es t a s e n t e n cia in icia liza e l n u e vo o b je t o Pro p ie rt ie s , p co n e l co n ju n t o a ct u a l d e
p ro p ie d a d e s d e l s is t e m a , q u e e n e l ca s o d e e s t e p e q u e ñ o p ro g ra m a e s e l ju e g o d e
p ro p ie d a d e s in icia liza d o p o r e l s is t e m a d e e je cu ció n . Lu e g o e l p ro g ra m a ca rg a la s
p ro p ie d a d e s a d icio n a le s e n p d e s d e e l fich e ro m y P ro p e rt ie s . t x t y s e le ccio n a la s
p ro p ie a d e s d e l s is t e m a e n p . Es t o t ie n e e l e fe ct o d e a ñ a d ir la s p ro p ie d a d e s lis t a d a s e n
m y P ro p e rt ie s . t x t a l ju e g o d e p ro p ie d a d e s cre a d o p o r e l s is t e m a d e e je cu ció n d u ra n t e e l
a rra n q u e . Ob s e rva q u e s e p u e d e cre a r p s in n in g ú n o b je t o Pro p e rt ie s co m o e s t e :
Properties p = new Properties();
S i s e h a ce e s t o la a p lica ció n n o t e n d rá a cce s o a la s p ro p ie a d e s d e l s is t e m a .
Ob s e rva t a m b ié n q u e la s p ro p ie d a d e s d e l s is t e m a s e p u e d e n s o b re e s crib ir! Po r e je m p lo ,
s i m y P ro p e rt ie s . t x t co n t ie n e la s ig u ie n t e lín e a , la p ro p ie d a d d e l s is t e m a ja v a . v e n d o r
s e rá s o b re e s crit a :
java.vendor=Acme Software Company
En g e n e ra l, t e n cu id a d o d e n o s o b re e s crib ir la s p ro p ie d a d e s d e l s is t e m a .
El m é t o d o s e t P ro p e rt ie s ( ) ca m b ia e l co n ju n t o d e la s p ro p ie d a d e s d e l s is t e m a p a ra la
a p lica ció n q u e s e e s t á e je cu t a n d o . Es t o s ca m b io s n o s o n p e rs is t e n t e s . Es t o e s , ca m b ia r
la s p ro p ie d a d e s d e l s is t e m a d e n t ro d e u n a a p lica ció n n o t e n d rá n in g ú n e fe ct o e n
p ró xim a s lla m a d a s a l in t é rp re t e Ja va p a ra e s t a u o t ra s a p lica cio n e s . El s is t e m a d e
e je cu ció n re - in icia liza la s p ro p ie d a d e s d e l s is t e m a ca d a ve z q u e a rra n ca . S i s e q u ie re q u e
lo s ca m b io s e n la s p ro p ie d a d e s d e l s is t e m a s e a n p e rs is t e n t e s , s e d e b e n e s crib ir lo s
va lo re s e n u n fich e ro a n t e s d e s a lir y le e rlo s d e n u e vo cu a n d o a rra n q u e la a p lica ció n .

Oz it o
Forzar la Finalización y la Recolección de Basura
El s is t e m a d e e je cu ció n d e Ja va re a liza la s t a re a s d e m a n e jo d e m e m o ria p o r t í.
Cu a n d o u n p ro g ra m a h a t e rm in a d o d e u t iliza r u n o b je t o - - e s t o e s , cu a n d o ya n o
h a y m á s re fe re n cia s a e s e o b je t o - e l o b je t o e s fin a liz a d o y lu e g o s e re co g e la
b a s u ra .
Es t a s t a re a s s u ce d e n a s ín cro n a m e n t e e n s e g u n d o p la n o . S in e m b a rg o , s e p u e d e
fo rza r la fin a liza ció n d e u n o b je t o y la re co le cció n d e b a s u ra u t iliza n d o lo s m é t o d o s
a p ro p ia d o s d e la cla s e S ys t e m .

Finalizar Objetos
An t e s d e re co le ct a r la b a s u ra d e u n o b je t o , e l s is t e m a d e e je cu ció n d e
Ja va le d a la o p o rt u n id a d d e lim p ia rs e a s í m is m o . Es t e p a s o e s co n o cid o
co m o fin a liza ció n y s e co n s ig u e m e d ia n t e u n a lla m a d a a l m é t o d o
fin a liz e ( ) d e l o b je t o . El o b je t o d e b e s o b re e s crib ir e s t e m é t o d o p a ra
re a liza r cu a lq u ie r t a re a d e lim p ie za fin a l co m o la lib e ra ció n d e re cu rs o s
d e l s is t e m a co m o fich e ro s o co n e xio n e s . Pa ra m á s in fo rm a ció n s o b re e l
m é t o d o fin a liz e ( ) p u e d e s ve r: Es crib ir u n m é t o d o fin a lize ( ) .

S e p u e d e fo rza r q u e o cu rra la fin a liza ció n d e u n o b je t o lla m a n d o a l


m é t o d o ru n Fin a liz a t io n ( ) d e la cla s e S ys t e m .
System.runFinalization();
Es t e m é t o d o lla m a a lo s m é t o d o s fin a liz e ( ) d e t o d o s lo s o b je t o s q u e
e s t á n e s p e ra n d o p a ra s e r re co le ct a d o s .

Ejecutar el Recolector de Basura


S e le p u e d e p e d ir a l re co le ct o r d e b a s u ra q u e s e e je cu t e e n cu a lq u ie r
m o m e n t o lla m a n d o a l m é t o d o g c ( ) d e la cla s e S ys t e m :
System.gc();
S e p o d ría q u e re r e je cu t a r e l re co le ct o r d e b a s u ra p a ra a s e g u ra rn o s q u e
lo h a ce e n e l m e jo r m o m e n t o p a ra e l p ro g ra m a e n lu g a r d e h a ce rlo
cu a n d o le s e a m á s co n ve n ie n t e a l s is t e m a d e e je cu ció n .
Po r e je m p lo , u n p ro g ra m a p o d ría d e s e a r e je cu t a r e l re co le ct o r d e b a s u ra
a n t e s d e e n t ra r e n u n cá lcu lo o u n a s e cció n d e u t iliza ció n d e m e m o ria
e xt e n s iva , o cu a n d o s e p a q u e va a e s t a r o cu p a d o a lg u n t ie m p o . El
re co le ct o r d e b a s u ra re q u ie re u n o s 2 0 m ilis e g u n d o s p a ra re a liza r s u
t a re a , p o r e s o u n p ro g ra m a s ó lo d e b e e je cu t a rlo cu a n d o n o t e n g a n in g ú n
im p a ct o e n s u p ro g ra m a - - e s t o e s , q u e e l p ro g ra m a a n t icip e q u e e l
re co le ct o r d e b a s u ra va a t e n e r t ie m p o s u ficie n t e p a ra t e rm in a r s u
t ra b a jo .
Oz it o
Otros Métodos de la Clase System
La cla s e S ys t e m co n t ie n e o t ro s m é t o d o s q u e p ro p o rcio n a n va ria s fu n cio n a lid a d e s in clu ye n d o la co p ia
d e a rra ys y la o b t e n ció n d e la h o ra a ct u a l.

Copiar Arrays
El m é t o d o a rra y c o p y ( ) d e la cla s e S ys t e m s e u t iliza p a ra re a liza r u n a co p ia e ficie n t e d e lo s
d a t o s d e u n a rra y a o t ro . Es t e m é t o d o re q u ie re cin co a rg u m e n t o s :
public static
void copiaarray(Object fuente, int indiceFuente, Object destino, int
indiceDestino, int longitud)
Lo s d o s a rg u m e n t o s d e l t ip o Ob je ct in d ica n lo s a rra y d e o rig e n y d e d e s t in o . Lo s t re s
a rg u m e n t o s e n t e ro s in d ica n la p o s ició n e n lo s a rra y d e o rig e n y d e s t in o y e l n ú m e ro d e
e le m e n t o s a co p ia r.
El s ig u ie n t e p ro g ra m a u t iliza c o p ia a rra y ( ) p a ra co p ia r a lg u n o s e le m e n t o s d e s d e
c o p ia D e s d e a c o p ia A.
class Prueba {
public static void main(String[] args) {
byte[] copiaDesde = { 'd', 'e','s', 'c', 'a', 'f', 'e', 'i', 'n', 'a', 'd',
'o' };
byte[] copiaA = new byte[7];

System.copiaarray(copiaDesde, 3, copiaA, 0, 7);


System.out.println(new String(copiaA, 0));
}
}
Co n la lla m a d a a l m é t o d o c o p ia a rra y ( ) e n e s t e p ro g ra m a d e e je m p lo co m ie n za la co p ia e n
e l e le m e n t o n ú m e ro 3 d e l a rra y fu e n t e - - re cu e rd a q u e lo s ín d ice s d e lo s a rra ys e m p ie za n e n
ce ro , p o r e s o la co p ia e m p ie za e n e l e le m e n t o 'c'. Lu e g o c o p ia a rra y ( ) p o n e lo s e le m e n t o s
co p ia d o s e n la p o s ició n 0 d e l a rra y d e s t in o c o p ia A. Co p ia 7 e le m e n t o s : 'c', 'a ', 'f', 'e ', 'i', 'n ',
y 'a '. Efe ct iva m e n t e , e l m é t o d o c o p ia a rra y ( ) s a ca "ca fe in a " d e "d e s ca fe in a d o ".
Ob s e rva q u e e l a rra y d e d e s t in o d e b e s e r a s ig n a d o a n t e s d e lla m a r a a rra y c o p y ( ) y d e b e
s e r lo s u ficie n t e m e n t e la rg o p a ra co n t e n e r lo s d a t o s co p ia d o s .

Obtener la Hora Actual


El m é t o d o c u rre n t Tim e Millis ( ) d e vu e lve la h o ra a ct u a l e n m ilis e g u n d o s d e s d e la s 0 0 : 0 0 : 0 0
d e l 1 d e En e ro d e 1 9 7 0 . Es t e m é t o d o s e u t iliza co m u n m e n t e e n p ru e b a s d e re n d im ie n t o ;
o b t e n e r la h o ra a ct u a l, re a liza r la o p e ra ció n q u e s e q u ie re co n t ro la r, o b t e n e r d e n u e vo la
h o ra a ct u a l- - la d ife re n cia e n t re la s d o s h o ra s e s e l t ie m p o q u e h a t a rd a d o e n re a liza rs e la
o p e ra ció n .
En in t e rfa ce s g rá fico s d e u s u a rio s e l t ie m p o e n t re d o s p u ls a cio n e s d e l ra t ó n s e u t iliza p a ra
d e t e rm in a r s u e l u s u a rio h a re a liza d o u n d o b le click. El s ig u ie n t e a p p le t u t iliza
c u rre n t Tim e Millis ( ) p a ra ca lcu la r e l n ú m e ro d e m ilis e g u n d o s e n t re lo s d o s clicks d e l ra t ó n .
S i e l t ie m p o e n t re lo s d o s clicks e s m e n o r d e 2 0 0 m ilis e g u n d o s , lo s d o s clicks d e ra t ó n s e
in t e rp re t a n co m o u n d o b le click.
S u n a v e g a d o r n o e n t ie n d e la e t iq u e t a APPLET.

Aq u íi t ie n e s e l có d ig o fu e n t e p a ra e l a p p le t Tim in g Is Eve ryt h in g :


import java.awt.*;
public class TimingIsEverything extends java.applet.Applet {

public long firstClickTime = 0;


public String displayStr;

public void init() {


displayStr = "Ha un Doble Click aquí";
}
public void paint(Graphics g) {
Color fondo = new Color(255, 204, 51);
g.setColor(fondo);
g.drawRect(0, 0, size().width-1, size().height-1);
g.setColor(Color.black);
g.drawString(displayStr, 40, 30);
}
public boolean mouseDown(java.awt.Event evt, int x, int y) {
long clickTime = System.currentTimeMillis();
long clickInterval = clickTime - firstClickTime;
if (clickInterval < 200) {
displayStr = "Doble Click!! (Intervalo = " + clickInterval + ")";
firstClickTime = 0;
} else {
displayStr = "Un solo Click!!";
firstClickTime = clickTime;
}
repaint();
return true;
}
}
S e p o d ría u t iliza r e l va lo r d e vu e lt o p o r e s t e m é t o d o p a ra ca lcu la r la h o ra y fe ch a a ct u a le s .
S in e m b a rg o , e n co n t ra rá s m á s co n ve n ie n t e o b t e n e r la h o ra y fe ch a a ct u a le s d e s d e la cla s e
Da t e d e l p a q u e t e ja va . u t il.

Salir del Entorno de Ejecución.


Pa ra s a lir d e l in t é rp re t e Ja va , lla m a a l m é t o d o S y s t e m . e x it ( ) . De b e s p a s a rle u n có d ig o d e
s a lid a e n u n e n t e ro y e l in t e rp re t e s a ld rá co n e s e có d ig o d e s a lid a :
System.exit(-1);
N o t a : El m é t o d o e x it ( ) h a ce s a lir d e l in t é rp re t e Ja va , n o s ó lo d e l p ro g ra m a Ja va - - t e n
cu id a d o cu a n d o u t ilice e s t á fu n ció n .

Co n s id e ra c io n e s d e S e g u rid a d : La lla m a d a a l m é t o d o e x it ( ) e s t á s u je t a a la s
re s t riccio n e s d e s e g u rid a d . Po r e s o d e p e n d ie n d o d e l n a ve g a d o r d o n d e s e e s t é e je cu t a n d o e l
a p p le t , u n a lla m a d a a e x it ( ) d e s d e u n a p p le t p o d ría re s u lt a r e n u n a e xce p ció n
S e cu rit yExce p t io n .

Selecionar y Obtener el Manejador de Seguridad


El co n t ro la d o r d e s e g u rid a d e s u n o b je t o q u e re fu e rza cie rt a vig ila n cia d e s e g u rid a d p a ra u n a
a p lica ció n Ja va . S e p u e d e s e le ccio n a r e l co n t ro la d o r d e s e g u rid a d a ct u a l p a ra u n a a p lica ció n
u t iliza n d o e l m é t o d o s e t S e c u rit y Ma n a g e r( ) d e la cla s e S ys t e m , y s e p u e d e re cu p e ra r e l
co n t ro la d o r d e s e g u rid a d a ct u a l u t iliza n d o e l m é t o d o g e t S e c u rit y Ma n a g e r( ) .

Co n s id e ra c io n e s d e S e g u rid a d : El co n t ro la d o r d e s e g u rid a d d e u n a a p lica ció n s ó lo p u e d e


s e le ccio n a rs e u n a ve z. No rm a lm e n t e , u n n a ve g a d o r s e le ccio n a s u co n t ro la d o r d e s e g u rid a d
d u ra n t e e l a rra n q u e . Po r e s o , la m a yo ría d e la s ve ce s , lo s a p p le t s n o p u e d e n s e le ccio n a r e l
co n t ro la d o r d e s e g u rid a d p o rq u e ya h a s id o s e le ccio n a d o . S i u n a p p le t h a ce e s t o re s u lt a rá
u n a S e cu rit yExce p t io n .

Oz it o
Cambios en el JDK 1.1:
Utilizar los Recursos del Sistema
Lo s S t re a m s d e I / O Es t á n d a rd s
La cla s e S y s t e m s o p o rt a t re s n u e vo s m é t o d o s q u e p e rm it e n a u m e n t a n
lo s s t re a m s d e I/ O e s t á n d a rd s . Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : La
cla s e S ys t e m .
P ro p ie d a d e s d e l S is t e m a
El m é t o d o g e t e n v h a s id o e lim in a d o . Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 :
La cla s e S ys t e m .
Fin a liz a r Ob je c t o s
El n u e vo m é t o d o ru n Fin a liz e rs On Ex it , d e la cla s e S y s t e m p e rm it e
s e le ccio n a r s i lo s fin a liza d o re s s o n lla m a d o s cu a n d o t u p ro g ra m a fin a lice .
Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : La cla s e S ys t e m .

Métodos Misceláneos del Sistema

El e je m p lo d e c o p ia d e Arra y
Arra yCo p yTe s t . ja va u t iliza u n co n s t ru ct o r d e S t rin g q u e h a s id o
e lim in a d o . Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : Eje m p lo d e co p ia d e
Arra ys .
El Ap p e t Tim in g I s Ev e ry t h in g
Tim in g Is Eve ryt h in g . ja va u t iliza u n API d e l AWT q u e e s t á o b s o le t o .
Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : El Ap p le t Tim in g Is Eve ryt h in g .

Oz it o
Manejo de Errores utilizando Excepciones
Exis t e u n a re g la d e o ro e n e l m u n d o d e la p ro g ra m a ció n : e n lo s p ro g ra m a s o cu rre n
e rro re s . Es t o e s s a b id o . Pe ro ¿ q u é s u ce d e re a lm e n t e d e s p u é s d e q u e h a o cu rrid o e l
e rro r? ¿ Có m o s e m a n e ja e l e rro r? ¿ Qu ié n lo m a n e ja ? , ¿ Pu e d e re cu p e ra rlo e l
p ro g ra m a ?
El le n g u a je Ja va u t iliza e x c e p c io n e s p a ra p ro p o rcio n a r ca p a cid a d e s d e m a n e jo d e
e rro re s . En e s t a le cció n a p re n d e rá s q u é e s u n a e xce p ció n , có m o la n za r y ca p t u ra r
e xce p cio n e s , q u é h a ce r co n u n a e xce p ció n u n a ve z ca p t u ra d a , y có m o h a ce r u n
m e jo r u s o d e la s e xce p cio n e s h e re d a d a s d e la s cla s e s p ro p o rcio n a d a s p o r e l
e n t o rn o d e d e s a rro llo d e Ja va .

Oz it o
¿Qué es una Excepción y por qué debo tener
cuidado?
El t é rm in o e x c e p c ió n e s u n fo rm a co rt a d a la fra s e "s u ce s o e xce p cio n a l" y p u e d e
d e fin irs e d e la s ig u ie n t e fo rm a :
D e fin ic ió n : Un a e x c e p c ió n e s u n e ve n t o q u e o cu rre d u ra n t e la e je cu ció n d e l
p ro g ra m a q u e in t e rru m p e e l flu jo n o rm a l d e la s s e n t e n cia s .

Mu ch a s cla s e s d e e rro re s p u e d e n u t iliza r e xce p cio n e s - - d e s d e s e rio s p ro b le m a s d e


h a rd wa re , co m o la a ve ría d e u n d is co d u ro , a lo s s im p le s e rro re s d e p ro g ra m a ció n ,
co m o t ra t a r d e a cce d e r a u n e le m e n t o d e u n a rra y fu e ra d e s u s lím it e s . Cu a n d o
d ich o e rro r o cu rre d e n t ro d e u n m é t o d o Ja va , e l m é t o d o cre a u n o b je t o 'e xce p t io n '
y lo m a n e ja fu e ra , e n e l s is t e m a d e e je cu ció n . Es t e o b je t o co n t ie n e in fo rm a ció n
s o b re la e xce p ció n , in clu ye n d o s u t ip o y e l e s t a d o d e l p ro g ra m a cu a n d o o cu rrió e l
e rro r. El s is t e m a d e e je cu ció n e s e l re s p o n s a b le d e b u s ca r a lg ú n có d ig o p a ra
m a n e ja r e l e rro r. En t e rm in o lo g ía ja va , cre a r u n a o b je t o e xce p t io n y m a n e ja rlo p o r
e l s is t e m a d e e je cu ció n s e lla m a la n z a r u n a e x c e p c ió n .
De s p u é s d e q u e u n m é t o d o la n ce u n a e xce p ció n , e l s is t e m a d e e je cu ció n e n t ra e n
a cció n p a ra b u s ca r e l m a n e ja d o r d e la e xce p ció n . El co n ju n t o d e "a lg u n o s " m é t o d o s
p o s ib le s p a ra m a n e ja r la e xce p ció n e s e l co n ju n t o d e m é t o d o s d e la p ila d e
lla m a d a s d e l m é t o d o d o n d e o cu rrió e l e rro r. El s is t e m a d e e je cu ció n b u s ca h a cia
a t rá s e n la p ila d e lla m a d a s , e m p e za n d o p o r e l m é t o d o e n e l q u e o cu rrió e l e rro r,
h a s t a q u e e n cu e n t ra u n m é t o d o q u e co n t ie n e e l "m a n e ja d o r d e e xce p ció n "
a d e cu a d o . Un m a n e ja d o r d e e xce p ció n e s co n s id e ra d o a d e cu a d o s i e l t ip o d e la
e xce p ció n la n za d a e s e l m is m o q u e e l d e la e xce p ció n m a n e ja d a p o r e l m a n e ja d o r.
As í la e xce p ció n s u b e s o b re la p ila d e lla m a d a s h a s t a q u e e n cu e n t ra e l m a n e ja d o r
a p ro p ia d o y u n a d e la s lla m a d a s a m é t o d o s m a n e ja la e xce p ció n , s e d ice q u e e l
m a n e ja d o r d e e xce p ció n e le g id o c a p t u ra la e x c e p c ió n .
S i e l s is t e m a d e e je cu ció n b u s ca e xh a u s t iva m e n t e p o r t o d o s lo s m é t o d o s d e la p ila
d e lla m a d a s s in e n co n t ra r e l m a n e ja d o r d e e xce p ció n a d e cu a d o , e l s is t e m a d e
e je cu ció n fin a liza ( y co n s e cu e n t e m e n t e y e l p ro g ra m a Ja va t a m b ié n ) .
Me d ia n t e e l u s o d e e xce p cio n e s p a ra m a n e ja r e rro re s , lo s p ro g ra m a s Ja va t ie n e n
la s s ig u ie n t e s ve n t a ja s fre n t e a la s t é cn ica s d e m a n e jo d e e rro re s t ra d icio n a le s :
● Ve n t a ja 1 : S e p a ra r e l Ma n e jo d e Erro re s d e l Có d ig o "No rm a l"

● Ve n t a ja 2 : Pro p a g a r lo s Erro re s s o b re la Pila d e Lla m a d a s


● Ve n t a ja 3 : Ag ru p a r lo s Tip o s d e Erro re s y la Dife re n cia ció n d e é s t o s
Ventaja 1: Separar el Manejo de Errores del Código "Normal"
En la p ro g ra m a ció n t ra d icio n a l, la d e t e cció n , e l in fo rm e y e l m a n e jo d e
e rro re s s e co n vie rt e e n u n có d ig o m u y lia d o . Po r e je m p lo , s u p o n g a m o s
q u e t e n e m o s u n a fu n ció n q u e le e u n fich e ro co m p le t o d e n t ro d e la
m e m e o ria . En p s e u d o - có d ig o , la fu n ció n s e p o d ría p a re ce r a e s t o :
leerFichero {
abrir el fichero;
determinar su tamaño;
asignar suficiente memoria;
leer el fichero a la memoria;
cerrar el fichero;
}
A p rim e ra vis t a e s t a fu n ció n p a re ce b a s t a n t e s e n cilla , p e ro ig n o ra t o d o s
a q u e llo e rro re s p o t e n cia le s :
● ¿ Qu é s u ce d e s i n o s e p u e d e a b rir e l fich e ro ?

● ¿ Qu é s u ce d e s i n o s e p u e d e d e t e rm in a r la lo n g it u d d e l fich e ro ?

● ¿ Qu é s u ce d e s i n o h a y s u ficie n t e m e m o ria lib re ?

● ¿ Qu é s u ce d e s i la le ct u ra fa lla ?

● ¿ Qu é s u ce d e s i n o s e p u e d e ce rra r e l fich e ro ?

Pa ra re s p o n d e r a e s t a s cu e s t io n e s d e n t ro d e la fu n ció n , t e n d ría m o s q u e
a ñ a d ir m u ch o có d ig o p a ra la d e t e cció n y e l m a n e jo d e e rro re s . El a s p e ct o
fin a l d e la fu n ció n s e p a re ce ría e s t o :
codigodeError leerFichero {
inicializar codigodeError = 0;
abrir el fichero;
if (ficheroAbierto) {
determinar la longitud del fichero;
if (obtenerLongitudDelFichero) {
asignar suficiente memoria;
if (obtenerSuficienteMemoria) {
leer el fichero a memoria;
if (falloDeLectura) {
codigodeError = -1;
}
} else {
codigodeError = -2;
}
} else {
codigodeError = -3;
}
cerrar el fichero;
if (ficheroNoCerrado && codigodeError == 0) {
codigodeError = -4;
} else {
codigodeError = codigodeError and -4;
}
} else {
codigodeError = -5;
}
return codigodeError;
}
Co n la d e t e cció n d e e rro re s , la s 7 lín e a s o rig in a le s ( e n n e g rit a ) s e h a n
co ve rt id o e n 2 9 lín e a s d e có d ig o - - a a u m e n t a d o ca s i u n 4 0 0 % . Lo p e o r,
e xis t e t a n t a d e t e cció n y m a n e jo d e e rro re s y d e re t o rn o q u e e n la s 7
lín e a s o rig in a le s y e l có d ig o e s t á t o t a lm e n t e a t e s t a d o . Y a ú n p e o r, e l flu jo
ló g ico d e l có d ig o t a m b ié n s e p ie rd e , h a cie n d o d íficil p o d e r d e cir s i e l
có d ig o h a ce lo co rre ct o ( s i ¿ s e cie rra e l fich e ro re a lm e n t e s i fa lla la
a s ig n a ció n d e m e m o ria ? ) e in clu s o e s d íficil a s e g u ra r q u e e l có d ig o
co n t in u e h a cie n d o la s co s a s co rre ct a s cu a n d o s e m o d ifiq u e la fu n ció n
t re s m e s e s d e s p u é s d e h a b e rla e s crit o . Mu ch o s p ro g ra m a d o re s
"re s u e lve n " e s t e p ro b le m a ig n o rá d o lo - - s e in fo rm a d e lo s e rro re s cu a n d o
e l p ro g ra m a n o fu n cio n a .
Ja va p ro p o rcio n a u n a s o lu ció n e le g a n t e a l p ro b le m a d e l t ra t a m ie n t o d e
e rro re s : la s e xce p cio n e s . La s e xce p cio n e s le p e rm it e n e s crib ir e l flu jo
p rin cip a l d e s u có d ig o y t ra t a r lo s ca s o s e xce p cio n a le s e n o t ro lu g a r. S i la
fu n ció n le e rFc ih e ro u t iliza ra e xce p cio n e s e n lu g a r d e la s t é cn ica s d e
m a n e jo d e e rro re s t ra d icio n a le s s e p o d ría p a re ce r a e s t o :
leerFichero {
try {
abrir el fichero;
determinar su tamaño;
asignar suficiente memoria;
leer el fichero a la memoria;
cerrar el fichero;
} catch (falloAbrirFichero) {
hacerAlgo;
} catch (falloDeterminacionTamaño) {
hacerAlgo;
} catch (falloAsignaciondeMemoria) {
hacerAlgo;
} catch (falloLectura) {
hacerAlgo;
} catch (falloCerrarFichero) {
hacerAlgo;
}
}
Ob s e rva q u e la s e xce p cio n e s n o e vit a n e l e s fu e rzo d e h a ce r e l t ra b a jo d e
d e t e ct a r, in fo rm a r y m a n e ja r e rro re s . Lo q u e p ro p o rcio n a n la s
e xce p cio n e s e s la p o s ib ilid a d d e s e p a ra r lo s d e t a lle s o s cu ro s d e q u é
h a ce r cu a n d o o cu rre a lg o fu e ra d e la n o rm a l.
Ad e m á s , e l fa ct o r d e a u m e n t o d e cá o d ig o d e e s t e e s p ro g ra m a e s d e u n
2 5 0 % - - co m p a ra d o co n e l 4 0 0 % d e l e je m p lo a n t e rio r.

Ventaja 2: Propagar los Errores sobre la Pila de Llamadas


Un a s e g u n d a ve n t a ja d e la s e xe p cio n e s e s la p o s ib ilid a d d e l p ro p a g a r e l
e rro r e n co n t ra d o s o b re la p ila d e lla m a d a s a m é t o d o s . S u p o n g a m o s q u e
e l m é t o d o le e rFic h e ro e s e l cu a rt o m é t o d o e n u n a s e rie d e lla m a d a s a
m é t o d o s a n id a d a s re a liza d a s p o r u n p ro g ra m a p rin cip a l: m e t o d o 1 lla m a
a m e t o d o 2 , q u e lla m a a m e t o d o 3 , q u e fin a lm e n t e lla m a a le e rFic h e ro .
metodo1 {
call metodo2;
}
metodo2 {
call metodo3;
}
metodo3 {
call leerFichero;
}
S u p o n g a m o s t a m b ié n q u e m e t o d o 1 e s e l ú n ico m é t o d o in t e re s a d o e n e l
e rro r q u e o cu rre d e n t ro d e le e rFic h e ro . Tra d icio n a lm e n t e la s t é cn ica s
d e n o t ifica ció n d e l e rro r fo rza ría n a m e t o d o 2 y m e t o d o 3 a p ro p a g a r e l
có d ig o d e e rro r d e vu e lt o p o r le e rFic h e ro s o b re la p ila d e lla m a d a s h a s t a
q u e e l có d ig o d e e rro r lle g u e fin a lm e n t e a m e t o d o 1 - - e l ú n ico m é t o d o
q u e e s t á in t e re s a d o e n é l.
metodo1 {
codigodeErrorType error;
error = call metodo2;
if (error)
procesodelError;
else
proceder;
}
codigodeErrorType metodo2 {
codigodeErrorType error;
error = call metodo3;
if (error)
return error;
else
proceder;
}
codigodeErrorType metodo3 {
codigodeErrorType error;
error = call leerFichero;
if (error)
return error;
else
proceder;
}
Co m o s e a p re n d ió a n t e rio rm e n t e , e l s is t e m a d e e je cu ció n Ja va b u s ca
h a cia a t rá s e n la p ila d e lla m a d a s p a ra e n co n t ra r cu a lq u ie r m é t o d o q u e
e s t é in t e re s a d o e n m a n e ja r u n a e xce p ció n p a rt icu la r. Un m é t o d o Ja va
p u e d e "e s q u iva r" cu a lq u ie r e xce p ció n la n za d a d e n t ro d e é l, p o r lo t a n t o
p e rm it e a lo s m é t o d o s q u e e s t á n p o r e n cim a d e é l e n la p ila d e lla m a d a s
p o d e r ca p t u ra rlo . S ó lo lo s m é t o d o s in t e re s a d o s e n e l e rro r d e b e n
p re o cu p a rs e d e d e t e ct a rlo .
metodo1 {
try {
call metodo2;
} catch (excepcion) {
procesodelError;
}
}
metodo2 throws excepcion {
call metodo3;
}
metodo3 throws excepcion {
call leerFichero;
}
S in e m b a rg o , co m o s e p u e d e ve r d e s d e e s t e p s e u d o - có d ig o , re q u ie re
cie rt o e s fu e rzo p o r p a rt e d e lo s m é t o d o s ce n t ra le s . Cu a lq u ie r e xce p ció n
ch e q u e a d a q u e p u e d a s e r la n za d a d e n t ro d e u n m é t o d o fo rm a p a rt e d e l
in t e rfa ce d e p ro g ra m a ció n p ú b lico d e l m é t o d o y d e b e s e r e s p e cifica d o e n
la cla u s u la t h ro w s d e l m é t o d o . As í e l m é t o d o in fo rm a a s u lla m a d o r
s o b re la s e xce p cio n e s q u e p u e d e la n za r, p a ra q u e e l lla m a d o r p u e d a
d e cid ir co n cie n zu d a e in t e lig e n t e m e n t e q u é h a ce r co n e s a e xce p ció n .
Ob s e rva d e n u e vo la d ife re n cia d e l fa ct o r d e a u m e n t o d e có d ig o y e l
fa ct o r d e o fu s ca ció n e n t re la s d o s t é cn ica s d e m a n e jo d e e rro re s . El
có d ig o q u e u t iliza e xce p cio n e s e s m á s co m p a ct o y m á s fá cil d e e n t e n d e r.

Ventaja 3: Agrupar Errores y Diferenciación


Fre cu e n t e m e n t e la s e xce p cio n e s s e d ivid e n e n ca t e g o ria s o g ru p o s . Po r
e je m p lo , p o d ría m o s im a g in a r u n g ru p o d e e xce p cio n e s , ca d a u n a d e la s
cu a le s re p re s e n t a ra u n t ip o d e e rro r e s p e cífico q u e p u d ie ra o cu rrir
d u ra n t e la m a n ip u la ció n d e u n a rra y: e l ín d ice e s t á fu e ra d e l ra n g o d e l
t a m a ñ o d e l a rra y, e l e le m e n t o q u e s e q u ie re in s e rt a r e n e l a rra y n o e s
d e l t ip o co rre ct o , o e l e le m e n t o q u e s e e s t á b u s ca n d o n o e s t á e n e l
a rra y. Ad e m á s , p o d e m o s im a g in a r q u e a lg u n o s m é t o d o s q u e rría n
m a n e ja r t o d a s la s e xce p cio n e s d e e s a ca t e g o ria ( t o d a s la s e xce p cio n e s
d e a rra y) , y o t ro s m é t o d o s p o d ría m a n e ja r s ó lo a lg u n a s e xce p cio n e s
e s p e cífica s ( co m o la e xce p ció n d e ín d ice n o vá lid o ) .
Co m o t o d a s la s e xce p cio n e s la n za d a s d e n t ro d e lo s p ro g ra m a s Ja va s o n
o b je t o s d e p rim e ra cla s e , a g ru p a r o ca t e g o riza r la s e xce p cio n e s e s u n a
s a lid a n a t u ra l d e la s cla s e s y la s s u p e rcla s e s . La s e xce p cio n e s Ja va
d e b e n s e r e je m p la re s d e la cla s e Th ro wa b le , o d e cu a lq u ie r d e s ce n d ie n t e
d e é s t a . Co m o d e la s o t ra s cla s e s Ja va , s e p u e d e n cre a r s u b cla s e s d e la
cla s e Th ro wa b le y s u b cla s e s d e e s t a s s u b cla s e s . Ca d a cla s e 'h o ja ' ( u n a
cla s e s in s u b cla s e s ) re p re s e n t a u n t ip o e s p e cífico d e e xce p ció n y ca d a
cla s e 'n o d o ' ( u n a cla s e co n u n a o m á s s u b cla s e s ) re p re s e n t a u n g ru p o d e
e xce p cio n e s re la cio n a d a s .
In va lid In d e xExce p t io n , Ele m e n t Typ e Exce p t io n , y
No S u ch Ele m e n t Exce p t io n s o n t o d a s cla s e s h o ja s . Ca d a u n a re p re s e n t a
u n t ip o e s p e cífico d e e rro r q u e p u e d e o cu rrir cu a n d o s e m a n ip u la u n
a rra y. Un m é t o d o p u e d e ca p t u ra r u n a e xce p ció n b a s a d a e n s u t ip o
e s p e cífico ( s u cla s e in m e d ia t a o in t e rfa ce ) . Po r e je m p lo , u n a m a n e ja d o r
d e e xce p ció n q u e s ó lo co n t ro le la e xce p ció n d e ín d ice n o vá lid o , t ie n e
u n a s e n t e n cia c a t c h co m o e s t a :
catch (InvalidIndexException e) {
. . .
}
Arra yExce p t io n e s u n a cla s e n o d o y re p re s e n t a cu a lq u ie r e rro r q u e p u e d a
o cu rrir d u ra n t e la m a n ip u la ció n d e u n o b je t o a rra y, in clu ye n d o a q u e llo s
e rro re s re p re s e n t a d o s e s p e cífica m e n t e p o r u n a d e s u s s u b cla s e s . Un
m é t o d o p u e d e ca p t u ra r u n a e xce p ció n b a s a d a e n e s t e g ru p o o t ip o
g e n e ra l e s p e cifica n d o cu a lq u ie ra d e la s s u p e rcla s e s d e la e xce p ció n e n la
s e n t e n cia c a t c h . Po r e je m p lo , p a ra ca p t u ra r t o d a s la s e xce p cio n e s d e
a rra y, s in im p o rt a r s u s t ip o s e s p e cífico s , u n m a n e ja d o r d e e xce p ció n
e s p e cifica ría u n a rg u m e n t o Arra yExce p t io n :
catch (ArrayException e) {
. . .
}
Es t e m a n e ja d o r p o d ría ca p t u ra r t o d a s la s e xce p cio n e s d e a rra y,
in clu ye n d o In va lid In d e xExce p t io n , Ele m e n t Typ e Exce p t io n , y
No S u ch Ele m e n t Exce p t io n . S e p u e d e d e s cu b rir e l t ip o d e e xce p ció n
p re cis o q u e h a o cu rrid o co m p ro b a n d o e l p a rá m t e ro d e l m a n e ja d o r e .
In clu s o p o d ría m o s s e le ccio n a r u n m a n e ja d o r d e e xce p cio n e s q u e
co n t ro la ra cu a lq u ie r e xce p ció n co n e s t e m a n e ja d o r:
catch (Exception e) {
. . .
}
Lo s m a n e ja d o re s d e e xce p cio n e s q u e s o n d e m a s ia d o g e n e ra le s , co m o e l
m o s t ra d o a q u í, p u e d e n h a ce r q u e e l có d ig o s e a p ro p e n s o a e rro re s
m e d ia n t e la ca p t u ra y m a n e jo d e e xce p cio n e s q u e n o s e h u b ie ra n
a n t icip a d o y p o r lo t a n t o n o s o n m a n e ja d a s co rre ct a m e n t e d e n t ro d e
m a n e ja d o r. Co m o re g la n o s e re co m ie n d a e s crib ir m a n e ja d o re s d e
e xce p cio n e s g e n e ra le s .
Co m o h a s vis t o , s e p u e d e n cre a r g ru p o s d e e xce p cio n e s y m a n e ja rla s d e
u n a fo rm a g e n e ra l, o s e p u e d e e s p e cifica r u n t ip o d e e xce p ció n
e s p e cífico p a ra d ife re n cia r e xce p cio n e s y m a n e ja rla s d e u n m o d o e xa ct o .

¿ Y ahora qué?
Ah o ra q u e h a s e n t e n d id o q u é s o n la s e xce p cio n e s y la s ve n t a ja s d e s u
u t iliza n ció n e n lo s p ro g ra m a s Ja va , e s h o ra d e a p re n d e r có m o u t iliza rla s .

Oz it o
Primer Encuentro con las Excepciones Java
InputFile.java:8: Warning: Exception java.io.FileNotFoundException
must be caught, or it must be declared in throws clause of this method.
fis = new FileInputStream(filename);
^
El m e n s a je d e e rro r a n t e rio r e s u n o d e lo s d o s m e n s a je s s im ila re s q u e ve rá s s i in t e n t a s
co m p ila r la cla s e In p u t File , p o rq u e la cla s e In p u t File co n t ie n e lla m a d a s a m é t o d o s q u e
la n za n e xce p cio n e s cu a n d o s e p ro d u ce u n e rro r. El le n g u a je Ja va re q u ie re q u e lo s
m é t o d o s ca p t u re n o e s p e cifiq u e n t o d a s la s e xce p cio n e s ch e q u e a d a s q u e p u e d a n s e r
la n za d a s d e s d e d e n t ro d e l á m b it o d e e s e m é t o d o . ( Lo s d e t a lle s s o b re lo q u e o cu rre lo s
p u e d e s ve r e n la p ró xim a p á g in a Re q u e rim ie n t o s d e Ja va p a ra Ca p t u ra r o Es p e cifica r. )
S i e l co m p ila d o r d e t e ct a u n m é t o d o , co m o lo s d e In p u t File , q u e n o cu m p le n e s t e
re q u e rim ie n t o , m u e s t ra u n e rro r co m o e l a n t e rio r y n o co m p ila e l p ro g ra m a .
Ech e m o s u n vis t a zo a In p u t File e n m á s d e t a lle y ve a m o s q u e s u ce d e .
La cla s e In p u t File e n vu e lve u n ca n a l File In p u t S t re a m y p ro p o rcio n a u n m é t o d o ,
g e t Lin e ( ) , p a ra le e r u n a lín e a e n la p o s ició n a ct u a l d e l ca n a l d e e n t ra d a .
// Nota: Esta clase no se compila por diseño!
import java.io.*;

class InputFile {

FileInputStream fis;

InputFile(String filename) {
fis = new FileInputStream(filename);
}

String getLine() {
int c;
StringBuffer buf = new StringBuffer();

do {
c = fis.read();
if (c == '\n') // nueva línea en UNIX
return buf.toString();
else if (c == '\r') { // nueva línea en Windows 95/NT
c = fis.read();
if (c == '\n')
return buf.toString();
else {
buf.append((char)'\r');
buf.append((char)c);
}
} else
buf.append((char)c);
} while (c != -1);

return null;
}
}
El co m p ila d o r d a rá e l p rim e r e rro r e n la p rim e ra lín e a q u e e s t á e n n e g rit a . Es t a lín e a
cre a u n o b je t o File In p u t S t re a m y lo u t iliza p a ra a b rir u n fich e ro ( cu yo n o m b re s e p a s a
d e n t ro d e l co n s t ru ct o r d e l File In p u t S t re a m ) .
En t o n ce s , ¿ Qu é d e b e h a ce r e l File In p u t S t re a m s i e l fich e ro n o e xis t e ? Bie n , e s o
d e p e n d e d e lo q u e q u ie ra h a ce r e l p ro g ra m a q u e u t iliza e l File In p u t S t re a m . Lo s
im p le m e n t a d o re s d e File In p u t S t re a m n o t e n ia n n i id e a d e lo q u e q u ie re h a ce r la cla s e
In p u t File s i n o e xis t e e l fich e ro . ¿ De b e File In p u t S t re a m t e rm in a r e l p ro g ra m a ? ¿ De b e
in t e n t a r u n n o m b re a lt e rn a t ivo ? o ¿ d e b e ró a cre a r u n fich e ro co n e l n o m b re in d ica d o ?
No e xis t e u n fo rm a p o s ib le d e q u e lo s im p le m e t a d o re s d e File In p u t S t re a m p u d ie ra n
e le g ir u n a s o lu ció n q u e s irvie ra p a ra t o d o s lo s u s u a rio s d e File In p u t S t re a m . Po r e s o
e llo s la n za ro n u n a e xce p ció n . Es t o e s , s i e l fich e ro n o m b ra d o e n e l a rg u m e n t o d e l
co n s t ru ct o r d e File In p u t S t re a m n o e xis t e , e l co n s t ru ct o r la n za u n a e xce p ció n
ja va . io . File No t Fo u n d Exce p t io n . Me d ia n t e e l la n za m ie n t o d e e s t a e xce p ció n ,
File In p u t S t re a m p e rm it e q u e e l m é t o d o lla m a d o r m a n e je e s e e rro r d e la fo rm a q u e
co n s id e re m á s a p ro p ia d a .
Co m o p u e d e s ve r e n e l lis t a d o , la cla s e In p u t File ig n o ra co m p le t a m e n t e e l h e ch o d e
q u e e l co n s t ru ct o r d e File In p u t S t re a m p u e d e la n za r u n e xce p ció n . S in e m b a rg o , El
le n g u a je Ja va re q u ie re q u e u n m é t o d o o b ie n la n ce o e s p e cifiq u e t o d a s la s e xce p cio n e s
ch e q u e a d a s q u e p u e d e n s e r la n za d a s d e s d e d e n t ro d e s u á m b it o . Co m o la Cla s e
In p u t File n o h a ce n in g u n a d e la s d o s co s a s , e l co m p ila d o r re h u s a s u co m p ila ció n e
im p rim e e l m e n s a je d e e rro r.
Ad e m á s d e l p rim e r e rro r m o s t ra d o a rrib a , s e p o d rá ve r e l s ig u ie n t e m e n s a je d e e rro r
cu a n d o s e co m p ile la cla s e In p u t File :
InputFile.java:15: Warning: Exception java.io.IOException must be caught,
or it must be declared in throws clause of this method.
while ((c = fis.read()) != -1) {
^
El m é t o d o g e t Lin e ( ) d e la cla s e In p u t File le e u n a lín e a d e s d e e l File In p u t S t re a m q u e
fu e a b ie rt o p o r e l co n s t ru ct o r d e In p u t File . El m é t o d o re a d ( ) d e File In p u t S t re a m la n za
la e xce p ció n ja va . io . IOExce p t io n s i p o r a lg u n a ra zó n n o p u d ie ra le e r e l fich e ro . De
n u e vo , la cla s e In p u t File n o h a ce n in g ú n in t e n t o p o r ca p t u ra r o e s p e cifica r e s t a
e xce p ció n lo q u e s e co n vie rt e e n e l s e g u n d o m e n s a je d e e rro r.
En e s t e p u n t o , t e n e m o s d o s o p cio n e s . S e p u e d e ca p t u ra r la s e xce p cio n e s co n lo s
m é t o d o s a p ro p ia d o s e n la cla s e In p u t File , o s e p u e d e e s q u iva rla s y p e rm it ir q u e o t ro s
m é t o d o s a n t e rio re s e n la p ila d e lla m a d a s la s ca p t u re n . De cu a lq u ie r fo rm a , lo s
m é t o d o s d e In p u t File d e b e n h a ce r a lg o , o ca p t u ra r o e s p e cifica r la s e xce p cio n e s , a n t e s
d e p o d e r co m p ila r la cla s e In p u t File . Aq u í t ie n e la cla s e In p u t File De cla re d , q u e co rrie g e
lo s e rro re s d e In p u t File m e d ia n t e la e s p e cifica ció n d e la s e xce p cio n e s .
La s ig u ie n t e p á g in a le d e s crib e co n m á s d e t a lle s lo s Re q u e rim ie n t o s d e Ja va p a ra
Ca p t u ra r o Es p e cifica r. La s p á g in a s s ig u ie n t e s le e n s e ñ a rá n có m o cu m p lir e s t o s
re q u e rim ie n t o s .

Oz it o
Requerimientos de Java para Capturar o
Especificar Excepciones
Co m o s e m e n cio n ó a n t e rio m e n t e , Ja va re q u ie re q u e u n m é t o d o o ca p t u re o
e s p e cifiq u e t o d a s la s e xce p cio n e s ch e q u e a d a s q u e s e p u e d e n la n za r d e n t ro d e s u
á m b it o . Es t e re q u e rim ie n t o t ie n e va rio s co m p o n e n t e s q u e n e ce s it a n u n a m a yo r
d e s crip ció n :

Capturar
Un m é t o d o p u e d e ca p t u ra r u n a e xce p ció n p ro p o rcio n a n d o u n m a n e ja d o r
p a ra e s e t ip o d e e xce p ció n . La p á g in a s ig u ie n t e , Tra t a r co n Exce p cio n e s ,
in t ro d u ce u n p ro g ra m a d e e je m p lo , le e xp lica có m o ca p t u ra r
e xce p cio n e s , y le m u e s t ra có m o e s crib ir u n m a n e ja d o r d e e xce p cio n e s
p a ra e l p ro g ra m a d e e je m p lo .

Especificar
S i u n m é t o d o d e cid e n o ca p t u ra r u n a e xce p ció n , d e b e e s p e cifica r q u e
p u e d e la n za r e s a e xce p ció n . ¿ Po r q u e é h icie ro n e s t e re q u e rm ie n t o lo s
d is e ñ a d o re s d e Ja va ? Po rq u e u n a e xce p ció n q u e p u e d e s e r la n za d a p o r
u n m é t o d o e s re a lm e n t e u n a p a rt e d e l in t e rfa ce d e p ro g ra m a ció n p ú b lico
d e l m é t o d o : lo s lla m a d o re s d e u n m é t o d o d e b e n co n o ce r la s e xce p cio n e s
q u e e s e m é t o d o p u e d e la n za r p a ra p o d e r d e cid ir in t e lig e n t e y
co n cie n zu d a m e n t e q u é h a ce r s o n e s a s e xce p cio n e s . As í, e n la firm a d e l
m é t o d o d e b e e s p e cifica r la s e xce p cio n e s q u e e l m é t o d o p u e d e la n za r.
La s ig u ie n t e p á g in a , Tra t a r co n Exce p cio n e s , le e xp lica la e s p e cifica ció n
d e e xce p cio n e s q u e u n m é t o d o p u e d e la n za r y le m u e s t ra có m o h a ce rlo .

Excepciones Chequeadas
Ja va t ie n e d ife re n t e s t ip o s d e e xce p cio n e s , in lcu ye n d o la s e xce p cio n e s d e
I/ O, la s e xce p cio n e s e n t ie m p o d e e je cu ció n , y la s d e s u p ro p ia cre a ció n .
La s q u e n o s in t e re s a n a n o s o t ro s p a ra e s t a e xp lica ció n s o n la s
e xce p cio n e s e n t ie m p o d e e je cu ció n , Es t a s e xce p cio n e s s o n a q u e lla s q u e
o cu rre n d e n t ro d e l s is t e m a d e e je cu ció n d e Ja va . Es t o in clu ye la s
e xce p cio n e s a rit m é t ica s ( co m o d ivid ir p o r ce ro ) , e xce p cio n e s d e p u n t e ro
( co m o in t e n t a r a cce d e r a u n o b je t o co n u n a re fe re n cia n u la ) , y
e xce p cio n e s d e in d e xa ció n ( co m o in t e n t a r a cce d e r a u n e le m e n t o d e u n
a rra y co n u n ín d ice q u e e s m u y g ra n d e o m u y p e q u e ñ o ) .
La s e xce p cio n e s e n t ie m p o d e e je cu ció n p u e d e n o cu rrir e n cu a lq u ie r
p a rt e d e u n p ro g ra m a y e n u n p ro g ra m a t íp ico p u e d e n s e r m u y
n u m e ro s a s . Mu ch a s ve ce s , e l co s t o d e ch e q u e a r t o d a s la s e xce p cio n e s
e n t ie m p o d e e je cu ció n e xce d e d e lo s b e n e ficio s d e ca p t u ra rla s o
e s p e cifica rla s . As í e l co m p ila d o r n o re q u ie re q u e s e ca p t u re n o
e s p e cifiq u e n e s t a s e xce p cio n e s , p e ro s e p u e d e h a ce r.
La s e xce p cio n e s ch e q u e a d a s s o n e xce p cio n e s q u e n o s o n e xce p cio n e s e n
t ie m p o d e e je cu ció n y q u e s o n ch e q u e a d a s p o r e l co m p ila d o r ( e s t o e s , e l
co m p ila d o r co m p ru e b a q u e e s a s e xce p cio n e s s o n ca p t u ra d a s o
e s p e cifica d a s ) .
Alg u n a s ve ce s e s t o s e co n s id e ra co m o u n b u cle ce rra d o e n e l m e ca n is m o
d e m a n e jo d e e xce p cio n e s d e Ja va y lo s p ro g ra m a d o re s s e ve n t e n t a d o s
a co n ve rt ir t o d a s la s e xce p cio n e s e n e xce p cio n e s e n t ie m p o d e e je cu ció n .
En g e n e ra l, e s t o n o e s t á re co m e n d a d o . La co n t ro ve rs ia - - Exce p cio n e s
e n Tie m p o d e Eje cu ció n co n t ie n e u n a e xp lica ció n d e t a lla d a s o b re có m o
u t iliza r la s e xce p cio n e s e n t ie m p o d e e je cu ció n .

Excepciones que pueden ser lanzadas desde el ámbito de un


método
Es t a s e n t e n cia p o d ría p a re ce r o b via a p rim e ra vis t a : s ó lo h a y q u e fija rs e
e n la s e n t e n cia t h ro w . S in e m b a rg o , e s t a s e n t e n cia in clu ye a lg o m á s n o
s ó lo la s e xce p cio n e s q u e p u e d e n s e r la n za d a s d ire ct a m e n t e p o r e l
m é t o d o : la cla ve e s t a e n la fra s e d e n t ro d e l á m b it o d e . Es t a fra s e in clu ye
cu a lq u ie r e xce p ció n q u e p u e d a s e r la n za d a m ie n t ra s e l flu jo d e co n t ro l
p e rm a n e zca d e n t ro d e l m é t o d o . As í, e s t a s e n t e n cia in clu ye :
● e xce p cio n e s q u e s o n la n za d a s d ire ct a m e n t e p o r e l m é t o d o co n la
s e n t e n cia t h ro w d e Ja va , y
● la s e xce p cio n e s q u e s o n la n za d a s p o r e l m é t o d o in d ire ct a m e n t e a
t ra vé s d e lla m a d a s a o t ro s m é t o d o s .

Oz it o
Tratar con Excepciones
Prim e r En cu e n t ro co n la s Exce p cio n e s d e Ja va d e s crib ió b re ve m e n t e có m o fu e
in t o d u cid o e n la s e xce p cio n e s Ja va : co n u n e rro r d e l co m p ila d o r in d ica n d o q u e la s
e xce p cio n e s d e b e n s e r ca p t u ra d a s o e s p e cifica d a s . Lu e g o Re q u e rim ie n t o s d e Ja va
p a ra la Ca p t u ra o Es p e cifica ció n e xp licó q u é s ig n ifica n e xa ct a m e n t e lo s m e n s a je s
d e e rro r y p o r q u é lo s d is e ñ a d o re s d e Ja va d e cid ie ro n h a ce r e s t o s re q u e rim ie n t o s .
Ah o ra va m o s a ve r có m o ca p t u ra r u n a e xce p ció n y có m o e s p e cifica r o t ra .

El ejemplo: ListOfNumbers
La s s e ccio n e s p o s t e rio re s , s o b re co m o ca p t u ra r y e s p e cifica r
e xce p cio n e s , u t iliza n e l m is m o e je m p lo . Es t e e je m p lo d e fin e e
im p le m e m t a u n cla s e lla m a d a Lis t OfNu m b e rs . Es t a cla s e lla m a a d o s
cla s e s d e lo s p a q u e t e s d e Ja va q u e p u e d e n la n za r e xce p cio n e s . Ca p t u ra r
y Ma n e ja r Exce p cio n e s m o s t ra rá có m o e s crib ir m a n e ja d o re s d e
e xce p cio n e s p a ra la s d o s e xce p cio n e s , y Es p e cifica r la s Exce p cio n e s
La n za d a s p o r u n Mé t o d o m o s t ra rá có m o e s p e cifica r e s a s e xce p cio n e s e n
lu g a r d e ca p t u ra rla s .

Capturar y Manejar Excepciones


Un a ve z q u e t e h a s fa m ilia riza d o co n la cla s e Lis t OfNu m b e rs y co n la s
e xce p cio n e s q u e p u e d e n s e r la n za d a s , p u e d e s a p re n d e r có m o e s crib ir
m a n e ja d o re s d e e xce p ció n q u e p u e d a n ca p t u ra r y m a n e ja r e s a s
e xce p cio n e s .
Es t a s e cció n cu b re lo s t re s co m p o n e n t e s d e u n a m a n e ja d o r d e e xce p ció n
- - lo s b lo q u e s t ry , c a t c h , y fin a lly - - y m u e s t ra có m o u t iliza rlo s p a ra
e s crib ir u n m a n e ja d o r d e e xce p ció n p a ra e l m é t o d o w rit e Lis t ( ) d e la
cla s e Lis t OfNu m b e rs . Ad e m á s , e s t a s e cció n co n t ie n e u n a p á g in a q u e
p a s e a a lo la rg o d e l m é t o d o w rit e Lis t ( ) y a n a liza lo q u e o cu rre d e n t ro
d e l m é t o d o e n va rio s e s ce n a rio s .

Especificar las Excepciones que pueden ser Lanzadas por un


Método
S i n o e s a p ro p ia d o q u e u n m é t o d o ca p t u re y m a n e je u n a e xce p ció n
la n za d a p o r u n m é t o d o q u e é l h a lla m a d o , o s i e l m é t o d o la n za s u p ro p ia
e xce p ció n , d e b e e s p e cifica r e n la firm a d e l m é t o d o q u e é s t e p u e d e la n za r
u n a e xce p ció n . Ut iliza n d o la cla s e Lis t OfNu m b e rs , e s t a s e cció n le
m u e s t ra có m o e s p e cifica r la s e xce p cio n e s la n za d a s p o r u n m é t o d o .
Oz it o
El ejemplo: ListOfNumbers
La s d o s s e ccio n e s s ig u ie n t e s q u e cu b re n la ca p t u ra y e s p e cifica ció n d e e xce p cio n e s
u t iliza n e s t e e je m p lo :
import java.io.*;
import java.util.Vector;

class ListOfNumbers {
private Vector victor;
final int size = 10;

public ListOfNumbers () {
int i;
victor = new Vector(size);
for (i = 0; i < size; i++)
victor.addElement(new Integer(i));
}
public void writeList() {
PrintStream pStr = null;

System.out.println("Entering try statement");


int i;
pStr = new PrintStream(
new BufferedOutputStream(
new FileOutputStream("OutFile.txt")));

for (i = 0; i < size; i++)


pStr.println("Value at: " + i + " = " + victor.elementAt(i));

pStr.close();
}
}
Es t e e je m p lo d e fin e e im p le m e n t e a u n a cla s e lla m a d a Lis t OfNu m b e rs . S o b re s u
co n s t ru cció n , e s t a cla s e cre a u n Ve ct o r q u e co n t ie n e d ie z e le m e n t o s e n t e ro s co n
va lo re s s e cu e n cia le s d e l 0 a l 9 . Es t a cla s e t a m b ié n d e fin e u n m é t o d o lla m a d o
w rit e Lis t ( ) q u e e s crib e lo s n ú m e ro s d e la lis t a e n u n fich e ro lla m a d o "Ou t File . t xt ".
El m é t o d o w rit e Lis t ( ) lla m a a d o s m é t o d o s q u e p u e d e n la n za r e xce p cio n e s . Prim e ro
la s ig u ie n t e lín e a in vo ca a l co n s t ru ct o r d e File Ou t p u t S t re a m , q u e la n za u n a e xce p ció n
IOExce p t io n s i e l fich e ro n o p u e d e s e r a b ie rt o p o r cu a lq u ie r ra zó n :
pStr = new PrintStream(new BufferedOutputStream(new
FileOutputStream("OutFile.txt")));
S e g u n d o , e l m é t o d o e le m e n t At ( ) d e la cla s e Ve ct o r la n za u n a e xcp e ció n
Arra yIn d e xOu t OfBo u n d s Exce p t io n s i s e le p a s a u n ín d ice cu yo va lo r s e a d e m a s ia d o
p e q u e ñ o ( u n n ú m e ro n e g a t ivo ) o d e m a s ia d o g ra n d e ( m a yo r q u e e l n ú m e ro d e
e le m e n t o s q u e co n t ie n e re a lm e n t e e l Ve ct o r) . Aq u í e s t á có m o Lis t OfNu m b e rs in vo ca a
e le m e n t At ( ) :
pStr.println("Value at: " + i + " = " + victor.elementAt(i));
S i s e in t e n t a co m p ila r la cla s e Lis t OfNu m b e rs , e l co m p ila d o r d a rá u n m e n s a je d e e rro r
s o b re la e xce p ció n la n za d a p o r e l co n s t ru ct o r d e File Ou t p u t S t re a m , p e ro n o m u e s t ra
n in g ú n e rro r s o b re la e xce p ció n la n za d a p o r e le m e n t At ( ) .
Es t o e s p o rq u e la e xce p ció n la n za d a p o r File Ou t p u t S t re a m , e s u n a e s ce p ció n
ch e q u e a d a y la la n za d a p o r e le m e n t At ( ) e s u n a e je cu ció n d e t ie m p o d e e je cu ció n .
Ja va s ó lo re q u ie re q u e s e e s p e cifiq u e n o ca p t u re n la s e xce p cio n e s ch e q u e a d a s . Pa ra
m á s in fo rm a ció n , p u e d e s ve Re q u e rim ie n t o s d e Ja va p a ra Ca p t u ra r o Es p e cifica r.

La s ig u ie n t e s e cció n , Ca p t u ra y Ma n e jo d e Exce p cio n e s , le m o s t ra rá có m o e s crib ir u n


m a n e ja d o r d e e xce p ció n p a ra e l m é t o d o w rit e Lis t ( ) d e Lis t OfNu m b e rs .
De s p u é s d e e s t o , u n a s e cció n lla m a d a Es p e cifica r la s Exce p cio n e s La n za d a s p o r u n
Mé t o d o , m o s t ra rá có m o e s p e cifica r q u e e l m é t o d o w rit e Lis t ( ) la n za e xce p cio n e s e n
lu g a r d e ca p t u ra rla s .

Oz it o
Capturar y Manejar Excepciones
La s s ig u ie n t e s p á g in a s m u e s t ra n có m o co n s t ru ir u n m a n e ja d o r d e e xce p cio n e s p a ra
e l m é t o d o w rit e Lis t ( ) d e s crit o e n El e je m p lo : Lis t OfNu m b e rs . La s t re s p rim e ra s
p á g in a s lis t a d a s a b a jo d e s crib e n t re s co m p o n e n t e s d ife re n t e s d e u n m a n e ja d o r d e
e xce p cio n e s y le m u e s t ra n có m o p u e d e n u t iliza rs e e s o s co m p o n e n t e s e n e l m é t o d o
w rit e Lis t ( ) . La cu a rt a p á g in a t ra t a s o b re e l m é t o d o w rit e Lis t ( ) re s u lt a n t e y
a n a liza lo q u e o cu rre d e n t ro d e l có d ig o d e e je m p lo a t ra vé s d e va rio s e s ce n a rio s .

El Bloque try
El p rim e r p a s o e n la e s crit u ra d e u n a m a n e ja d o r d e e xce p cio n e s e s p o n e r
la s e n t e n cia Ja va d e n t ro d e la cu a l s e p u e d e p ro d u cir la e xce p ció n d e n t ro
d e u n b lo q u e t ry . S e d ice q u e e l b lo q u e t ry g o b ie rn a la s s e n t e n cia s
e n ce rra d a s d e n t ro d e é l y d e fin e e l á m b it o d e cu a lq u ie r m a n e ja d o r d e
e xce p cio n e s ( e s t a b le cid o p o r e l b lo q u e c a t c h s u b s e cu e n t e ) a s o cia d o co n
é l.

Los bloques catch


De s p u é s s e d e b e a s o cia r u n m a n e ja d o r d e e xce p cio n e s co n u n b lo q u e
t ry p ro p o rcio n á n d o le u n o o m á s b lo q u e s c a t c h d ire ct a m e n t e d e s p u é s
d e l b lo q u e t ry .

El bloque finally
El b lo q u e fin a lly d e Ja va p ro p o rcio n a u n m e ca n is m o q u e p e rm it e a s u s
m é t o d o s lim p ia rs e a s i m is m o s s in im p o rt a r lo q u e s u ce d e d e n t ro d e l
b lo q u e t ry . S e u t iliza e l b lo q u e fin a lly p a ra ce rra r fich e ro s o lib e ra r o t ro s
re cu rs o s d e l s is t e m a .

Poniéndolo Todo Junto


La s s e ccio n e s a n t e rio re s d e s crib é n có m o co n s t ru ir lo s b lo q u e s d e có d ig o
t ry , c a t c h , y fin a lly p a ra e l e je m p lo w rit e Lis t ( ) . Ah o ra , p a s e a re m o s
s o b re e l có d ig o p a ra in ve s t ig a r q u e s u ce d e e n va rio s e s ce n a rio s .

Oz it o
El bloque try
El p rim e r p a s o e n la co n s t ru cció n d e u n m a n e ja d o r d e e xce p cio n e s e s e n ce rra r la s
s e n t e n cia s q u e p o d ría n la n za r u n a e xce p ció n d e n t ro d e u n b lo q u e t ry . En g e n e ra l,
e s t e b lo q u e s e p a re ce a e s t o :
try {
sentencias Java
}
El s e g m e n t o d e có d ig o e t iq u e t a d o s e n t e n c ia s ja v a e s t á co m p u e s t o p o r u n a o m á s
s e n t e n cia s le g a le s d e Ja va q u e p o d ría n la n za r u n a e xce p ció n .
Pa ra co n s t ru ir u n m a n e ja d o r d e e xce p có n p a ra e l m é t o d o w rit e Lis t ( ) d e la cla s e
Lis t OfNu m b e rs , s e n e ce s it a e n ce rra r la s e n t e n cia q u e la n za la e xce p ció n e n e l
m é t o d o w rit e Lis t ( ) d e n t ro d e u n b lo q u e t ry .
Exis t e m á s d e u n a fo rm a d e re a liza r e s t a t a re a . Po d ría m o s p o n e r ca d a u n a d e la s
s e n t e n cia s q u e p o t e n cia lm e n t e p u d ie ra n la n za r u n a e xce p ció n d e n t ro d e s u p ro p io
b lo q u e t ry , y p ro p o rcio n a r m a n e ja d o re s d e e xce p cio n e s s e p a ra d o s p a ra ca d a u n o
d e lo s b lo q u e s t ry . O p o d ría m o s p o n e r t o d a s la s s e n t e n cia s d e w rit e Lis t ( ) d e n t ro
d e u n s ó lo b lo q u e t ry y a s o cia r va rio s m a n e ja d o re s co n é l. El s u g u ie n t e lis t a d o
u t iliza u n s ó lo b lo q u e t ry p a ra t o d o e l m é t o d o p o rq u e e l có d ig o t ie n d e a s e r m á s
fá cil d e le e r.
PrintStream pstr;

try {
int i;

System.out.println("Entering try statement");


pStr = new PrintStream(
new BufferedOutputStream(
new FileOutputStream("OutFile.txt")));

for (i = 0; i < size; i++)


pStr.println("Value at: " + i + " = " + victor.elementAt(i));
}
S e d ice q u e e l b lo q u e t ry g o b ie rn a la s s e n t e n cia s e n ce rra d a s d e n t ro d e l é l y
d e fin e e l á m b it o d e cu a lq u ie r m a n e ja d o r d e e xce p ció n ( e s t a b le cid o p o r s u
s u b s e cu e n t e b lo q u e c a t c h ) a s o cia d o co n é l. En o t ra s p a la b ra s , s i o cu rre u n a
e xce p ció n d e n t ro d e l b lo q u e t ry , e s t a e xce p ció n s e rá m a n e ja d a p o r e l m a n e ja d o r
d e e xce p ció n a s o cia d o co n e s t a s e n t e n cia t ry .
Un a s e n t e n cia t ry d e b e ir a co m p a ñ a d a d e a l m e n o s u n b lo q u e c a t c h o u n b lo q u e
fin a lly .
Oz it o
Los bloques catch
Co m o s e a p re n d ió e n la p á g in a a n t e rio r, la s e n t e n cia t ry d e fin e e l á m b it o d e s u s m a n e ja d o re s d e
e xce p ció n a s o cia d o s . S e p u e d e n a s o cia r m a n e ja d o re s d e e xce p ció n a u n a s e n t e n cia t ry
p ro p o rcio n a n d o u n o o m á s b lo q u e s c a t c h d ire ct a m e n t e d e s p u é s d e l b lo q u e t ry :
try {
. . .
} catch ( . . . ) {
. . .
} catch ( . . . ) {
. . .
} . . .
No p u e d e h a b e r n in g ú n có d ig o e n t re e l fin a l d e la s e n t e n cia t ry y e l p rin cip io d e la p rim e ra
s e n t e n cia c a t c h . La fo rm a g e n e ra l d e u n a s e n t e n cia c a t c h e n Ja va e s e s t a :
catch (AlgunObjetoThrowable nombreVariable) {
Sentencias Java
}
Co m o p u e d e s ve r, la s e n t e n cia c a t c h re q u ie re u n s ó lo a rg u m e n t o fo rm a l. Es t e a rg u m e n t o p a re ce
u n a rg u m e n t o d e u n a d e cla ra ció n d e m é t o d o . El t ip o d e l a rg u m e n t o Alg u n Ob je t o Th ro w a b le
d e cla ra e l t ip o d e e xce p ció n q u e e l m a n e ja d o r p u e d e m a n e ja r y d e b e s e r e l n o m b re d e u n a cla s e
h e re d a d a d e la cla s e Th ro wa b le d e fin id a e n e l p a q u e t e ja va . la n g . ( Cu a n d o lo s p ro g ra m a s Ja va
la n za n u n a e xce p ció n re a lm e n t e e s t á n la n za d o u n o b je t o , s ó lo p u e d e n la n za rs e lo s o b je t o s
d e riva d o s d e la cla s e Th ro wa b le . Ap re n d e rá s có m o la n za r e xce p cio n e s e n la le cció n ¿ Có m o La n za r
Exce p cio n e s ? . )

n o m b re Va ria b le e s e l n o m b re p o r e l q u e e l m a n e ja d o r p u e d e re fe rirs e a la e xce p ció n ca p t u ra d a .


Po r e je m p lo , lo s m a n e ja d o re s d e e xce p cio n e s p a ra e l m é t o d o w rit e Lis t ( ) ( m o s t ra d o s m á s
a d e la n t e ) lla m a n a l m é t o d o g e t Me s s a g e ( ) d e la e xce p ció n u t iliza n d o e l n o m b re d e e xce p ció n
d e cla ra d o e :
e.getMessage()
S e p u e d e a cce d e r a la s va ria b le s y m é t o d o s d e la s e xce p cio n e s e n la m is m a fo rm a q u e a cce d e a
lo s d e cu a lq u ie r o t ro o b je t o . g e t Me s s a g e ( ) e s u n m é t o d o p ro p o rcio n a d o p o r la cla s e Th ro wa b le
q u e im p rim e in fo rm a ció n a d icio n a l s o b re e l e rro r o cu rrid o . La cla s e Th ro wa b le t a m b ié n
im p le m e n t a d o s m é t o d o s p a ra re lle n a r e im p rim ir e l co n t e n id o d e la p ila d e e je cu ció n cu a n d o
o cu rre la e xce p ció n . La s s u b cla s e s d e Th ro wa b le p u e d e n a ñ a d ir o t ro s m é t o d o s o va ria b le s d e
e je m p la r, Pa ra b u s ca r q u é m e t o d o s im p le m e n t a r e n u n a e xcp e ció n , s e p u e d e co m p ro b a r la
d e fin ició n d e la cla s e y la s d e fin icio n e s d e la s cla s e s a n t e ce s o ra s .
El b lo q u e c a t c h co n t ie n e u n a s e rie d e s e n t e n cia s Ja va le g a le s . Es t a s s e n t e n cia s s e e je cu t a n
cu a n d o s e lla m a a l m a n e ja d o r d e e xce p ció n . El s is t e m a d e e je cu ció n lla m a a l m a n e ja d o r d e
e xce p ció n cu a n d o e l m a n e ja d o r e s e l p rim e ro e n la p ila d e lla m a d a s cu yo t ip o co in cid e co n e l d e la
e xce p ció n la n za d a .
El m é t o d o w rit e Lis t ( ) d e la cla s e d e e je m p lo Lis t OfNu m b e rs u t iliza d o s m a n e ja d o re s d e
e xce p ció n p a ra s u s e n t e n cia t ry , co n u n m a n e ja d o r p a ra ca d a u n o d e lo s t ip o s d e e xce p cio n e s
q u e p u e d e n la n za rs e d e n t ro d e l b lo q u e t ry - - Arra yIn d e xOu t OfBo u n d s Exce p t io n y IOExce p t io n .
try {
. . .
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}

Ocurre una IOException


S u p o n g a m o s q u e o cu rre u n a e xce p ció n IOExce p t io n d e n t ro d e l b lo q u e t ry . El s is t e m a
d e e je cu ció n in m e d ia n t a m e n t e t o m a p o s e s ió n e in t e n t a lo ca liza r e l m a n e ja d o r d e
e xce p ció n a d e cu a d o . El s is t e m a d e e je cu ció n e m p ie za b u s ca n d o a l p rin cip io d e la p ila d e
lla m a d a s . S in e m b a rg o , e l co n s t ru ct o r d e File Ou t p u t S t re a m n o t ie n e u n m a n e ja d o r d e
e xce p ció n a p ro p ia d o p o r e s o e l s is t e m a d e e je cu ció n co m p ru e b a e l s ig u ie n t e m é t o d o e n
la p ila d e lla m a d a s - - e l m é t o d o w rit e Lis t ( ) . Es t e m é t o d o t ie n e d o s m a n e ja d o re s d e
e xce p cio n e s : u n o p a ra Arra yIn d e xOu t OfBo u n d s Exce p t io n y o t ro p a ra IOExce p t io n .
El s is t e m a d e e je cu ció n co m p ru e b a lo s m a n e ja d o re s d e w rit e Lis t ( ) p o r e l o rd e n e n e l
q u e a p a re ce n d e s p u é s d e l b lo q u e t ry . El p rim e r m a n e ja d o r d e e xce p ció n cu yo
a rg u m e n t o co rre s p o n d a co n e l d e la e xce p ció n la n za d a e s e l e le g id o p o r e l s is t e m a d e
e je cu ció n . ( El o rd e n d e lo s m a n e ja d o re s d e e xce p ció n e s im p o rt a n t e !) El a rg u m e n t o d e l
p rim e r m a n e ja d o r e s u n a Arra yIn d e xOu t OfBo u n d s Exce p t io n , p e ro la e xce p ció n q u e s e
h a la n za d o e ra u n a IOExce p t io n . Un a e xce p ció n IOExce p t io n n o p u e d e a s ig n a rs e
le g a lm e n t e a u n a Arra yIn d e xOu t OfBo u n d s Exce p t io n , p o r e s o e l s is t e m a d e e je cu ció n
co n t in ú a la b ú s q u e d a d e u n m a n e ja d o r d e e xce p ció n a p ro p ia d o .
El a rg u m e n t o d e l s e g u n d o m a n e ja d o r d e e xce p ció n d e w rit e Lis t ( ) e s u n a IOExce p t io n .
La e xce p ció n la n za d a p o r e l co n s t ru ct o r d e File Ou t p u t S t re a m t a m b ié n e s u n u n a
IOExce p t io n y p o r e s o p u e d e s e r a s ig n a d a a l a rg u m e n t o d e l m a n e ja d o r d e e xce p cio n e s
d e IOExce p t io n . As í, e s t e m a n e ja d o r p a re ce e l a p ro p ia d o y e l s is t e m a d e e je cu ció n
e je cu t a e l m a n e ja d o r, e l cu a l im p rim e e s t a s e n t e n cia :
Caught IOException: OutFile.txt
El s is t e m a d e e je cu ció n s ig u e u n p ro ce s o s im ila r s i o cu rre u n a e xce p ció n
Arra yIn d e xOu t OfBo u n d s Exce p t io n . Pa ra m á s d e t a lle s p u e d e s ve r: Po n ié n d o lo t o d o Ju n t o
q u e t e lle va a t ra vé s d e m é t o d o w rit e Lis t ( ) d e s p u é s d e h a b e rlo co m p le t a d o ( q u e d a u n
p a s o m á s ) e in ve s t ig a lo q u e s u ce d e e n va rio s e s ce n a rio s .

Capturar Varios Tipos de Excepciones con Un Manejador


Lo s d o s m a n e ja d o re s d e e xce p ció n u t iliza d o s p o r e l m é t o d o w rit e Lis t ( ) s o n m u y
e s p e cia liza d o s . Ca d a u n o s ó lo m a n e ja u n t ip o d e e xce p ció n . El le n g u a je Ja va p e rm it e
e s crib ir m a n e ja d o re s d e e xce p cio n e s g e n e ra le s q u e p u e d e n m a n e ja r va rio s t ip o s d e
e xce p cio n e s .
Co m o ya s a b e s , la s e xce p cio n e s Ja va s o n o b je t o s d e la cla s e Th ro wa b le ( s o n e je m p la re s
d e la cla s e Th ro wa b le a d e a lg u n a d e s u s s u b cla s e s ) . Lo s p a q u e t e s Ja va co n t ie n e n
n u m e ro s a s cla s e s d e riva d a s d e la cla s e Th ro wa b le y a s í co n s t ru ye n u n á rb o l d e cla s e s
Th ro wa b le .
El m a n e ja d o r d e e xce p ció n p u e d e s e r e s crit o p a ra m a n e ja r cu a lq u ie r ca ls e h e re d a d a d e
Th ro wa b le . S i s e e s crib e u n m a n e ja d o r p a ra u n a cla s e 'h o ja ? ( u n a cla s e q u e n o t ie n e
s u b cla s e s ) , s e h a b rá e s crit o u n m a n e ja d o r e s p e cia liza d o : s ó lo m a n e ja e xce p cio n e s d e
u n t ip o e s p e cífico . S i s e e s crib e u n m a n e ja d o r p a ra u n a cla s e 'n o d o ' ( u n a cla s e q u e
t ie n e s u b cla s e s ) , s e h a b rá e s crit o u n m a n e ja d o r g e n e ra l: s e p o d rá m a n e ja r cu a lq u ie r
e xce p ció n cu yo t ip o s e a e l d e la cla s e n o d o o d e cu a lq u ie ra d e s u s s u b cla s e s .
Mó d ifiq u e m o s d e n u e vo e l m é t o d o w rit e Lis t ( ) . S ó lo e s t a ve z, e s crib a m o s lo p a ra q u e
m a n e je la s d o s e xce p cio n e s IOExce p t io n s y Arra yIn d e xOu t OfBo u n d s Exce p t io n s . El
a n t e ce s o r m á s ce rca n o d e e s t a s d o s e xce p cio n e s e s la cla s e Exce p t io n . As í u n
m a n e ja d o r d e e xce p ció n q u e q u is ie ra m a n e ja r lo s d o s t ip o s s e p a re ce ría a e s t o :
try {
. . .
} catch (Exception e) {
System.err.println("Exception caught: " + e.getMessage());
}
La cla s e Exce p t io n e s t á b a s t a n t e a rrib a e n e l á rb o l d e h e re n cia s d e la cla s e Th ro wa b le .
Po r e s o , a d e m á s d e ca p t u ra r lo s t ip o s d e IOExce p t io n y
Arra yIn d e xOu t OfBo u n d s Exce p t io n e s t e m a n e ja d o r d e e xce p cio n e s , p u e d e ca p t u ra r o t ro s
m u ch o s t ip o s . Ge n e ra lm e n t e h a b la n d o , lo s m a n e ja d o re s d e e xce p ció n d e b e n s e r m á s
e s p e cia liza d o s .
Lo s m a n e ja d o re s q u e p u e d e n ca p t u ra r la m a yo ría o t o d a s la s e xce p cio n e s s o n m e n o s
u t iliza d o s p a ra la re cu p e ra có n d e e rro re s p o rq u e e l m e n e ja d o r t ie n e q u e d e t e rm in a r q u é
t ip o d e e xce p ció n h a o cu rrid o d e t o d a s fo rm a s ( p a ra d e t e rm in a r la m e jo r e s t ra t e g ia d e
re cu p e ra ció n ) . Lo s m a n e ja d o re s d e e xce p cio n e s q u e s o n d e m a s ia d o g e n e ra le s p u e d e n
h a ce r e l có d ig o m á s p ro p e n s o a e rro re s m e d ia n t e la ca p t u ra y m e n e jo d e e xce p cio n e s
q u e n o fu e ro n a n t icip a d a s p o r e l p ro g ra m a d o r y p a ra la s q u e e l m a n e ja d o r n o e s t á
d is e ñ a d o .

Oz it o
El bloque finally
El p a s o fin a l e n la cre a ció n d e u n m a n e ja d o r d e e xce p ció n e s p ro p o rcio n a r u n m e ca n is m o q u e lim p ie e l
e s t a d o d e l m é t o d o a n t e s ( p o s ib le m e n t e ) d e p e rm it ir q u e e l co n t ro l p a s e a o t ra p a rt e d ife re n t e d e l
p ro g ra m a . S e p u e d e h a ce r e s t o e n ce rra n d o e l có d ig o d e lim p ie za d e n t ro d e u n b lo q u e fin a lly .
El b lo q u e t ry d e l m é t o d o w rit e Lis t ( ) h a e s t a d o t ra b a ja n d o co n u n Prin t S t re a m a b ie rt o . El p ro g ra m a
d e b e ría ce rra r e s e ca n a l a n t e s d e p e m it ir q u e e l co n t ro l s a lg a d e l m é t o d o w rit e Lis t ( ) . Es t o p la n t e a u n
p ro b le m a co m p lica d o , ya q u e e l b lo q u e t ry d e l w rit e Lis t ( ) t ie n e t re s p o s ib le s s a lid a s :
1 . La s e n t e n cia n e w File Ou t p u t S t re a m fa lla y la n za u n a IOExce p t io n .
2 . La s e n t e n cia v ic t o r. e le m e n t At ( i) fa lla y la n za u n a Arra yIn d e xOu t OfBo u n d s Exce p t io n .
3 . To d o t ie n e é xit o y e l b lo q u e t ry s a le n o rm a lm e n t e .
El s is t e m a d e e je cu ció n s ie m p re e je cu t a la s s e n t e n cia s q u e h a y d e n t ro d e l b lo q u e fin a lly s in im p o rt a r
lo q u e s u ce d a d e n t ro d e l b lo q u e t ry . Es t o e s , s in im p o rt a r la fo rm a d e s a lid a d e l b lo q u e t ry d e l m é t o d o
w rit e Lis t ( ) d e b id o a lo s e s ce n a rio s 1 , 2 ó 3 lis t a d o s a rrib a , e l có d ig o q u e h a y d e n t ro d e l b lo q u e
fin a lly s e rá e je cu t a d o d e t o d a s fo rm a s .
Es t e e s e l b lo q u e fin a lly p a ra e l m é t o d o w rit e Lis t ( ) . Lim p ia y cie rra e l ca n a l Prin t S t re a m .
finally {
if (pStr != null) {
System.out.println("Closing PrintStream");
pStr.close();
} else {
System.out.println("PrintStream not open");
}
}

¿Es realmente necesaria la sentencia finally?


La p rim e ra n e ce s id a d d e la s e n t e n cia fin a lly p o d ría n o a p a re ce r d e fo rm a in m e d ia t a . Lo s
p ro g ra m a d o re s s e p re g u n t a n fre cu e n t e m e n t e "¿ Es re a lm e n t e n e ce s a ria la s e n t e n cia fin a lly o
e s s ó lo a zu ca r p a ra m i Ja va ? " En p a rt icu la r lo s p ro g ra m a d o re s d e C+ + d u d a n d e la
n e ce s id a d d e e s t a s e n t e n cia p o rq u e C+ + n o la t ie n e .
Es t a n e ce s id a d d e la s e n t e n cia fin a lly n o a p a re ce h a s t a q u e s e co n s id e ra lo s ig u ie n t e :
¿ có m o s e p o rd ría ce rra r e l Prin t S t re a m e n e l m é t o d o w rit e Lis t ( ) s i n o s e p ro p o rcio n a ra u n
m a n e ja d o r d e e xce p ció n p a ra la Arra yIn d e xOu t OfBo u n d s Exce p t io n y o cu rre u n a
Arra yIn d e xOu t OfBo u n d s Exce p t io n ? ( s e ría s e n cillo y le g a l o m it ir u n m a n e ja d o r d e e xce p ció n
p a ra Arra yIn d e xOu t OfBo u n d s Exce p t io n p o rq u e e s u n a e xce p ció n e n t ie m p o d e e je cu ció n y e l
co m p ila d o r n o a le rt a d e q u e w rit e Lis t ( ) co n t ie n e u n a lla m a d a a u n m é t o d o q u e p u e d e
la n za r u n a ) .
La re s p u e s t a e s q u e e l Prin t S t re a m n o s e ce rra ría s i o cu rrie ra u n a e xce p ció n
Arra yIn d e xOu t OfBo u n d s Exce p t io n y w rit e Lis t ( ) n o p ro p o rcio n a ra u m a n e ja d o r p a ra e lla - - a
m e n o s q u e w rit e Lis t ( ) p ro p o rcio n a ra u n a s e n t e n cia fin a lly .
Exis t e n o t ro s b e n e ficio s d e la u t iliza ció n d e la s e n t e n cia fin a lly . En e l e je m p lo d e
w rit e Lis t ( ) e s p o s ib le p ro p o rcio n a r u n có d ig o d e lim p ie za s in la in t e rve n ció n d e u n a
s e n t e n cia fin a lly . Po r e je m p lo , p o d ría m o s p o n e r e l có d ig o p a ra ce rra r e l Prin t S t re a m a l fin a l
d e l b lo q u e t ry y d e n u e vo d e n t ro d e l m a n e ja d o r d e e xce p ció n p a ra
Arra yIn d e xOu t OfBo u n d s Exce p t io n , co m o s e m u e s t ra a q u í:
try {
. . .
pStr.close(); // No haga esto, duplica el código
} catch (ArrayIndexOutOfBoundsException e) {
pStr.close(); // No haga esto, duplica el código
System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
S in e m b a rg o , e s t o d u p lica e l có d ig o , h a cié n d o lo d íficil d e le e r y p ro p e n s o a e rro re s s i s e
m o d ifica m á s t a rd e , Po r e je m p lo , s i s e a ñ a d e có d ig o a l b lo q u e t ry q u e p u d ie ra la n za r o t ro
t ip o d e e xce p ció n , s e t e n d ría q u e re co rd a r e l ce rra r e l Prin t S t re a m d e n t ro d e l n u e vo
m a n e ja d o r d e e xce p ció n ( lo q u e s e o lvid a rá s e g u ro s i s e p a re ce a m í) .

Oz it o
Poniéndolo Todo Junto
Cu a n d o s e ju n t a n t o d o s lo s co m p o n e n t e s , e l m é t o d o w rit e Lis t ( ) s e p a re ce a e s t o :
public void writeList() {
PrintStream pStr = null;

try {
int i;

System.out.println("Entrando en la Sentencia try");


pStr = new PrintStream(
new BufferedOutputStream(
new FileOutputStream("OutFile.txt")));

for (i = 0; i < size; i++)


pStr.println("Value at: " + i + " = " + victor.elementAt(i));
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " +
e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
if (pStr != null) {
System.out.println("Cerrando PrintStream");
pStr.close();
} else {
System.out.println("PrintStream no está abierto");
}
}
}
El b lo q u e t ry d e e s t e m é t o d o t ie n e t re s p o s ib ilid a d e s d e s a lid a d ire re n t e s :
1 . La s e n t e n cia n e w File Ou t p u t S t re a m fa lla y la n za u n a IOExce p t io n .
2 . La s e n t e n cia v ic t o r. e le m e n t At ( i) fa lla y la n za u n a
Arra yIn d e xOu t OfBo u n d s Exce p t io n .
3 . To d o t ie n e é xit o y la s e n t e n cia t ry s a le n o rm a lm e n t e .
Es t á p á g in a in ve s t ig a e n d e t a lle lo q u e s u ce d e e n e l m é t o d o w rit e Lis t d u ra n t e ca d a
u n a d e e s a s p o s ib ilid a d e s d e s a lid a .

Escenario 1:Ocurre una excepción IOException


La s e n t e n cia n e w File Ou t p u t S t re a m ( "Ou t File . t x t ") p u e d e fa lla r p o r
va ria s ra zo n e s : e l u s u a rio n o t ie n e p e rm is o d e e s crit u ra s o b re e l fich e ro o e l
d ire ct o rio , e l s is t e m a d e fich e ro s e s t á lle n o , o n o e xis t e e l d ire ct o rio . S i
cu a lq u ie ra d e e s t a s s it u a cio n e s e s ve rd a d e ra e l co n s t ru ct o r d e
File Ou t p u t S t re a m la n za u n a e xce p ció n IOExce p t io n .
Cu a n d o s e la n za u n a e xce p ció n IOExce p t io n , e l s is t e m a d e e je cu ció n p a ra
in m e d ia t a m e n t e la e je cu ció n d e l b lo q u e t ry . Y lu e g o in t e n t a lo ca liza r u n
m a n e ja d o r d e e xce p ció n a p ro p ia d o p a ra m a n e ja r u n a IOExce p t io n .
El s is t e m a d e e je cu ció n co m ie n za s u b ú s q u e d a a l p rin cip io d e la p ila d e
lla m a d a s . Cu a n d o o cu rrió la e xce p ció n , e l co n s t ru ct o r d e File Ou t p u t S t re a m
e s t a b a a l p rin cip io d e la p ila d e lla m a d a s . S in e m b a rg o , e s t e co n s t ru ct o r n o
t ie n e u n m a n e ja d o r d e e xce p ció n a p ro p ia d o p o r lo q u e e l s is t e m a
co m p ru e b a e l s ig u ie n t e m é t o d o q u e h a y e n la p ila d e lla m a d a s - - e l m é t o d o
w rit e Lis t ( ) . Es t e m é t o d o t ie n e d o s m a n e ja d o re s d e e xce p cio n e s : u n o p a ra
Arra yIn d e xOu t OfBo u n d s Exce p t io n y o t ro p a ra IOExce p t io n .
El s is t e m a d e e je cu ció n co m p ru e b a lo s m a n e ja d o re s d e w rit e Lis t ( ) p o r e l
o rd e n e n e l q u e a p a re ce n d e s p u é s d e l b lo q u e t ry . El p rim e r m a n e ja d o r d e
e xce p ció n cu yo a rg u m e n t o co rre s p o n d a co n e l d e la e xce p ció n la n za d a e s e l
e le g id o p o r e l s is t e m a d e e je cu ció n . ( El o rd e n d e lo s m a n e ja d o re s d e
e xce p ció n e s im p o rt a n t e !) El a rg u m e n t o d e l p rim e r m a n e ja d o r e s u n a
Arra yIn d e xOu t OfBo u n d s Exce p t io n , p e ro la e xce p ció n q u e s e h a la n za d o e ra
u n a IOExce p t io n . Un a e xce p ció n IOExce p t io n n o p u e d e a s ig n a rs e
le g a lm e n t e a u n a Arra yIn d e xOu t OfBo u n d s Exce p t io n , p o r e s o e l s is t e m a d e
e je cu ció n co n t in ú a la b ú s q u e d a d e u n m a n e ja d o r d e e xce p ció n a p ro p ia d o .
El a rg u m e n t o d e l s e g u n d o m a n e ja d o r d e e xce p ció n d e w rit e Lis t ( ) e s u n a
IOExce p t io n . La e xce p ció n la n za d a p o r e l co n s t ru ct o r d e File Ou t p u t S t re a m
t a m b ié n e s u n a u n a IOExce p t io n y p o r e s o p u e d e s e r a s ig n a d a a l
a rg u m e n t o d e l m a n e ja d o r d e e xce p cio n e s d e IOExce p t io n . As í, e s t e
m a n e ja d o r p a re ce e l a p ro p ia d o y e l s is t e m a d e e je cu ció n e je cu t a e l
m a n e ja d o r, e l cu a l im p rim e e s t a s e n t e n cia :
Caught IOException: OutFile.txt
De s p u é s d e q u e s e h a ya e je cu t a d o e l m a n e ja d o r d e e xce p ció n , e l s is t e m a
p a s a e l co n t ro l a l b lo q u e fin a lly . En e s t e e s ce n a rio p a rt icu la r, e l ca n a l
Prin t S t re a m n u n ca s e h a a b ie rt o , a s í e l p S t r e s n u ll y n o s e cie rra . De s p u é s
d e q u e s e h a ya co m p le t a d o la e je cu ció n d e l b lo q u e fin a lly , e l p ro g ra m a
co n t in u a co n la p rim e ra s e n t e n cia d e s p u é s d e e s t e b lo q u e .
La s a lid a co m p le t a q u e s e p o d rá ve r d e s d e e l p ro g ra m a Lis t OfNu m b e rs
cu a n d o s e la n za u n e xce p ció n IOExce p t io n e s e s t a :
Entrando en la sentecia try
Caught IOException: OutFile.txt
PrintStream no está abierto

Escenario 2: Ocurre una excepción ArrayIndexOutOfBoundsException


Es t e e s ce n a rio e s e l m is m o q u e e l p rim e ro e xce p t o q u e o cu rre u n e rro r
d ife re n t e d e n t ro d e l b lo q u e t ry . En e s t e e s ce n a rio , e l a rg u m e n t o p a s a d o a l
m é t o d o e le m e n t At ( ) d e Ve ct o r e s t á fu e ra d e lím it e s . Es t o e s , e l a rg u m e n t o
e s m e n o r q u e ce ro o m a yo r q u e e l t a m a ñ o d e l a rra y. ( De la fo rm a e n q u e
e s t á e s crit o e l có d ig o , e s t o e s re a lm e n t e im p o s ib le , p e ro s u p o n g a m o s q u e
s e h a in t ro d u cid o u n e rro r cu a n d o a lg u ie n lo h a m o d ifica d o ) .
Co m o e n e l e s ce n a rio 1 , cu a n d o o cu re u n a e xce p ció n e l s is t e m a d e
e je cu ció n p a ra la e je cu ció n d e l b lo q u e t ry e in t e n t a lo ca liza r u n m a n e ja d o r
d e e xce p ció n a p ro p ia d o p a ra Arra yIn d e xOu t OfBo u n d s Exce p t io n . El s is t e m a
b u s ca co m o lo h izo a n t e rio rm e n t e . Lle g a a la s e n t e n cia c a t c h e n e l m é t o d o
w rit e Lis t ( ) q u e m a n e ja e xce p cio n e s d e l t ip o
Arra yIn d e xOu t OfBo u n d s Exce p t io n . Co m o e l t ip o d e la e xce p ció n
co rre s p o n d e co n e l d e e l m a n e ja d o r, e l s is t e m a e je cu t a e l m a n e ja d o r d e
e xce p ció n .
De s p u é s d e h a b e r e je cu t a d o e l m a n e ja d o r d e e xce p ció n , e l s is t e m a p a s a e l
co n t ro l a l b lo q u e fin a lly . En e s t e e s ce n a rio p a rt icu la r, e l ca n a l Prin t S t re a m
s i q u e s e h a a b ie rt o , a s í q u e e l b lo q u e fin a lly lo ce rra rá . De s p u é s d e q u e e l
b lo q u e fin a lly h a ya co m p le t a d o s u e je cu ció n , e l p ro g ra m a co n t in ú a co n la
p rim e ra s e n t e n cia d e s p u é s d e e s t e b lo q u e .
Aq u í t ie n e s la s a lid a co m p le t a q u e d a rá e l p ro g ra m a Lis t OfNu m b e rs s i
o cu rre u n a e xce p ció n Arra yIn d e xOu t OfBo u n d s Exce p t io n :
Entrando en la sentencia try
Caught ArrayIndexOutOfBoundsException: 10 >= 10
Cerrando PrintStream

Escenario 3: El bloque try sale normalmente


En e s t e e s ce n a rio , t o d a s la s s e n t e n cia s d e n t ro d e l á m b it o d e l b lo q u e t ry s e
e je cu t a n d e fo rm a s a t is fa ct o ria y n o la n za n e xce p cio n e s . La e je cu ció n ca e a l
fin a l d e l b lo q u e t ry y e l s is t e m a p a s a e l co n t ro l a l b lo q u e fin a lly . Co m o
t o d o h a s a lid o s a t is fa ct o rio , e l Prin t S t re a m a b ie rt o s e cie rra cu a n d o e l
b lo q u e fin a lly co n s ig u e e l co n t ro l. De n u e vo , De s p u é s d e q u e e l b lo q u e
fin a lly h a ya co m p le t a d o s u e je cu ció n , e l p ro g ra m a co n t in ú a co n la p rim e ra
s e n t e n cia d e s p u é s d e e s t e b lo q u e .
Aq u í t ie n e s la s a lid a cu a n d o e l p ro g ra m a Lis t OfNu m b e rs cu a n d o n o s e
la n za n e xce p cio n e s :
Entrando en la sentencia try
Cerrando PrintStream

Oz it o
Especificar las Excepciones Lanzadas por un Método
Le s e cció n a n t e rio r m o s t ra b a co m o e s crib ir u n m a n e ja d o r d e e xce p ció n p a ra e l m é t o d o
w rit e Lis t ( ) d e la cla s e Lis t OfNu m b e rs . Alg u n a s ve ce s , e s a p ro p ia d o ca p t u ra r la s
e xce p cio n e s q u e o cu rre n p e ro e n o t ra s o ca s io n e s , s in e m b a rg o , e s m e jo r d e ja r q u e u n
m é t o d o s u p e rio r e n la p ila d e lla m a d a s m a n e je la e xce p ció n . Po r e je m p lo , s i s e e s t á
u t iliza n d o la cla s e Lis t OfNu m b e rs co m o p a rt e d e u n p a q u e t e d e cla s e s , p ro b a b le m e n t e n o
s e q u e rrá a n t icip a r la s n e ce s id a d e s d e t o d o s lo s u s u a rio s d e s u p a q u e t e . En e s t e ca s o , e s
m e jo r n o ca p t u ra r la s e xce p cio n e s y p e rm it ir q u e a lg u ín la ca p t u re m á s a rrib a e n la p ila
d e lla m a d a s .
S i e l m é t o d o w rit e Lis t ( ) n o ca p t u ra la s e xce p cio n e s q u e p u e d e n o cu rrir d e n t ro d e é l,
d e b e e s p e cifica r q u e p u e d e la n za r e xce p cio n e s . Mo d ifiq u e m o s e l m é t o d o w rit e Lis t ( ) p a ra
e s p e cifica r q u e p u e d e la n za r e xce p cio n e s . Co m o re co rd a t o rio , a q u í t ie n e s la ve rs ió n
o rig in a l d e l m é t o d o w rit e Lis t ( ) :
public void writeList() {
System.out.println("Entrando en la sentencia try");
int i;
pStr = new PrintStream(
new BufferedOutputStream(
new FileOutputStream("OutFile.txt")));

for (i = 0; i < size; i++)


pStr.println("Value at: " + i + " = " + victor.elementAt(i));
}
Co m o re co rd a rá s , la s e t e n cia n e w File Ou t p u t S t re a m ( "Ou t File . t x t ") p o d ría la n za r u n
e xce p ció n IOExce p t io n ( q u e n o e s u n a e xce p ció n e n t ie m p o d e e je cu ció n ) . La s e n t e n cia
v ic t o r. e le m e n t At ( i) p u e d e la n za r u n a e xce p ció n Arra yIn d e xOu t OfBo u n d s Exce p t io n ( q u e
e s u n a s u b cla s e d e la cla s e Ru n t im e Exce p t io n , y e s u n a e xce p ció n e n t ie m p o d e
e je cu ció n ) .
Pa ra e s p e cifica r q u e w rit e Lis t ( ) la n za e s t a s d o s e xce p cio n e s , s e a ñ a d e la cla u s u la
t h ro w s a la firm a d e l m é t o d o d e w rit e Lis t ( ) . La cla u s u la t h ro w s e s t á co m p u e s t a p o r la
p a la b ra cla ve t h ro w s s e g u id a p o r u n a lis t a s e p a ra d a p o r co m a s d e t o d a s la s e xce p cio n e s
la n za d a s p o r e l m é t o d o . Es t a cla u s u la va d e s p u é s d e l n o m b re d e l m é t o d o y a n t e s d e la
lla ve a b ie rt a q u e d e fin e e l á m b it o d e l m é t o d o . Aq u í t ie n e s u n e je m p lo :
public void writeList() throws IOException, ArrayIndexOutOfBoundsException {
Re cu e rd a q u e la e xce p ció n Arra yIn d e xOu t OfBo u n d s Exce p t io n e s u n a e xce p ció n e n t ie m p o
d e e je cu ció n , p o r e s o n o t ie n e p o rq u e e s p e cifica rs e e n la s e n t e cia t h ro w s p e ro p u e d e
h a ce rs e s i s e q u ie re .

Oz it o
La Sentencia throw
To d o s lo s m é t o d o s Ja va u t iliza n la s e n t e n cia t h ro w p a ra la n za r u n a e xce p ció n . Es t a
s e n t e n cia re q u ie re u n s ó lo a rg u m e n t o , u n o b je t o Th ro wa b le . En e l s is t e m a Ja va , lo s
o b je t o s la n za b le s s o n e je m p la re s d e la cla s e Th ro wa b le d e fin id a e n e l p a q u e t e ja va . la n g .
Aq u í t ie n e s u n e je m p lo d e la s e n t e n cia t h ro w :
throw algunObjetoThrowable;
S i s e in t e n t a la n za r u n o b je t o q u e n o e s 'la n za b le ', e l co m p ila d o r re h u s a la co m p ila ció n d e l
p ro g ra m a y m u e s t ra u n m e n s a je d e e rro r s im ila r a é s t e :
testing.java:10: Cannot throw class java.lang.Integer; it must be a subclass
of class java.lang.Throwable.
throw new Integer(4);
^
La p á g in a s ig u ie n t e , La cla s e Th ro wa b le y s u s S u b cla s e s , cu e n t a n m á s co s a s s o b re la cla s e
Th ro wa b le .
Ech e m o s u n vis t a zo a la s e n t e n cia t h ro w e n s u co n t e xt o . El s ig u ie n t e m é t o d o e s t á t o m a d o
d e u n a cla s e q u e im p le m e n t a u n o b je t o p ila n o rm a l. El m é t o d o p o p ( ) s a ca e l e le m e n t o
s u p e rio r d e la p ila y lo d e vu e lve :
public Object pop() throws EmptyStackException {
Object obj;

if (size == 0)
throw new EmptyStackException();

obj = objectAt(size - 1);


setObjectAt(size - 1, null);
size--;
return obj;
}
El m é t o d o p o p ( ) co m p ru e b a s i h a y a lg ú n e le m e n t o e n la p ila . S i la p ila e s t á va cía ( s u
t a m a ñ o e s ig u a l a ce ro ) , e je m p la riza u n n u e vo o b je t o d e la cla s e Em p t yS t a ckExce p t io n y lo
la n za . Es t a cla s e e s t á d e fin id a e n e l p a q u e t e ja va . u t il. En p á g in a s p o s t e rio re s p o d rá s ve r
có m o cre a r t u s p ro p ia s cla s e s d e e xce p cio n e s . Po r a h o ra , t o d o lo q u e n e ce s it a s re co rd a r e s
q u e s e p u e d e n la n za r o b je t o s h e re d a d o s d e s d e la cla s e Th ro wa b le .

La clausula throws
Ha b rá s o b s e rva d o q u e la d e cla ra ció n d e l m é t o d o p o p ( ) co n t ie n e e s t a cla u s u la :
throws EmptyStackException
La cla u s u a l t h ro w s e s p e cifica q u e e l m é t o d o p u e d e la n za r u n a e xce p ció n
Em p t yS t a ckExce p t io n . Co m o ya s a b e s , e l le n g u a je Ja va re q u ie re q u e lo s
m é t o d o s ca p t u re n o e s p e cifiq u e n t o d a s la s e xce p cio n e s ch e q u e a d a s q u e p u e d a n
s e r la n za d a s d e n t ro d e s u á m b it o . S e p u e d e h a ce r e s t o co n la cla u s u la t h ro w s
d e la d e cla ra ció n d e l m é t o d o . Pa ra m á s in fo rm a ció n s o b re e s t o s re q u e rim ie n t o s
p u e d e s ve r Re q u e rim ie n t o s Ja va p a ra Ca p t u ra r o Es p e cifica r.

Ta m b ié n p u e d e s ve r, Es p e cifica r la s Exce p cio n e s la n za d a s p o r u n Mé t o d o p a ra


o b t e n e r m á s d e t a lle s s o b re có m o u n m é t o d o p u e d e la n za r e xce p cio n e s .

Oz it o
La clase Throwable y sus Subclases
Co m o s e a p re n d ió e n la p á g in a a n t e iro r, s ó lo s e p u e d e n la n za r o b je t o s q u e e s t é n
d e riva d o s d e la cla s e Th ro wa b le . Es t o in clu ye d e s ce n d ie n t e s d ire ct o s ( e s t o e s ,
o b je t o s d e la cla s e Th ro wa b le ) y d e s ce n d ie n t e in d ire ct o s ( o b je t o s d e riva d o s d e
h ijo s o n ie t o s d e la cla s e Th ro wa b le ) .
Es t e d ia g ra m a ilu s t ra e l á rb o l d e h e re n cia d e la cla s e Th ro wa b le y s u s s u b cla s e s
m á s im p o rt a n t e s :

Co m o s e p u e d e ve r e n e l d ia g ra m a , la cla s e Th ro wa b le t ie n e d o s d e s ce n d ie n t e s
d ire ct o s : Erro r y Exce p t io n .

Error
Cu a n d o fa lla u n e n la ce d in á m ico , y h a y a lg ú n fa llo "h a rd wa re " e n la
m á q u in a virt u a l, é s t a la n za u n e rro r. Tip ica m e n t e lo s p ro g ra m a s Ja va n o
ca p t u ra n lo s Erro re s . Pe ro s ie m p re la n za rá n e rro re s .

Exception
La m a yo ría d e lo s p ro g ra m a s la n za n y ca p t u ra n o b je t o s d e riva d o s d e la
cla s e Exce p t io n . Un a Exce p ció n in d ica q u e h a o cu rrid o u n p ro b le m a p e ro
q u e e l p ro b le m a n o e s d e m a s ia d o s e rio . La m a yo ría d e lo s p ro g ra m a s
q u e e s crib a rá s la n za rá n y ca p t u ra rá n e xce p cio n e s .
La cla s e Exce p t io n t ie n e m u ch o s d e s ce n d ie n t e d e fin id o s e n lo s p a q u e t e s
Ja va . Es t o s d e s ce n d ie n t e s in d ica n va rio s t ip o s d e e xce p cio n e s q u e
p u e d e n o cu rrir. Po r e je m p lo , Ille g a lAcce s s Exce p t io n s e ñ a la q u e n o s e
p u e d e e n co n t ra r u n m é t o d o p a rt icu la r, y Ne g a t ive Arra yS ize Exce p t io n
in d ica q u e u n p ro g ra m a in t e n t a cre a r u n a rra y co n t a m a ñ o n e g a t ivo .
Un a s u b cla s e d e Exce p t io n t ie n e u n s ig n ifica d o e s p e cia l e n e l le n g u a je
Ja va : Ru n t im e Exce p t io n .

Excepciones en Tiempo de Ejecución


La cla s e Ru n t im e Exce p t io n re p re s e n t a la s e xce p cio n e s q u e o cu rre n
d e n t ro d e la m á q u in a virt u a l Ja va ( d u ra n t e e l t ie m p o d e e je cu ció n ) . Un
e je m p lo d e e s t a s e xce p cio n e s e s Nu llPo in t e rExce p t io n , q u e o cu rre
cu a n d o u n m é t o d o in t e n t a a cce d e r a u n m ie m b ro d e u n o b je t o a t ra vé s
d e u n a re fe re n cia n u la . Es t a e xce p ció n p u e d e o cu rrir e n cu a lq u ie r lu g a r
e n q u e u n p ro g ra m a in t e n t e d e s re fe re n cia r u n a re fe re n cia a u n o b je t o .
Fre cu e n t e m e n t e e l co s t e d e ch e q u e a r e s t a s e xce p cio n e s s o b re p a s a lo s
b e n e ficio s d e ca p t u ra rla s .
Co m o la s e xce p cio n e s e n t ie m p o d e e je cu ció n e s t á n o m n ip re s e n t e s e
in t e n t a r ca p t u ra r o e s p e cifica rla s t o d a s e n t o d o m o m e n t o p o d ría r s e r u n
e je rcicio in fru ct u o s o ( y u n có d ig o in fru ct u o s o , im p o s ib le d e le e r y d e
m a n t e n e r) , e l co m p ila d o r p e rm it e q u e e s t a s e xce p cio n e s n o s e ca p t u re n
n i s e e s p e cifiq u e n .
Lo s p a q u e t e s Ja va d e fin e n va ria s cla s e s Ru n t im e Exce p t io n . S e p u e d e n
ca p t u ra r e s t a s e xce p cio n e s a l ig u a l q u e la s o t ra s . S in e m b a rg o , n o s e
re q u ire q u e u n m é t o d o e s p e cifiq u e q u e la n za e xce p cio n e s e n t ie m p o d e
e je cu ció n . Ad e m á s p u e d e s cre a r s u s p ro p ia s s u b cla s e s d e
u n t im e Exce p t io n . Exce p cio n e s e n Tie m p o d e Eje cu ció n - - La Co n t ro ve rs ia
co n t ie n e u n a e xp lica ció n d e t a lla d a s o b re có m o u t iliza r la s e xce p cio n e s e n
t ie m p o d e e je cu ció n .

Oz it o
Crear Clases de Excepciones
Cu a n d o d is e ñ e s u n p a q u e t e d e cla s e s ja va q u e co la b o re p a ra p ro p o rcio n a r a lg u n a
fu n ció n ú t il a s u s u s u a rio s , d e b e rá s t ra b a ja r d u ro p a ra a s e g u ra rt e d e q u e la s cla s e s
in t e ra ct u a n co rre ct a m e n t e y q u e s u s in t e rfa ce s s o n fá cile s d e e n t e n d e r y
u t iliza r. De b ría s e s t a r m u ch o t ie m p o p e n s a n d o s o b re e llo y d is e ñ a r la s e xce p cio n e s
q u e e s a s cla s e s p u e d e n la n za r.
S u p o n q u e e s t á s e s crib ie n d o u n a cla s e co n u n a lis t a e n la za d a q u e e s t á s p e n s a n d o
e n d is t rib u ir co m o fre e wa re . En t re o t ro s m é t o d o s la cla s e d e b e ría s o p o rt a r e s t o s :
o b je c t At ( in t n )
De vu e lve e l o b je t o e n la p o s ició n n d e la lis t a .
firs t Ob je c t ( )
De vu e lve e l p rim e r o b je t o d e la lis t a .
in d e x Of( Ob je c t o )
Bu s ca e l Ob je t o e s p e cifica d o e n la lis t a y d e vu e lve s u p o s ició n e n e lla .

¿Qué puede ir mal?


Co m o m u ch o s p ro g ra m a d o re s u t iliza rá n t u cla s e d e lis t a e n la za d a ,
p u e d e s e s t a r s e g u ro d e q u e m u ch o s d e e llo s la u t iliza rá n m a l o a b u s a rá n
d e lo s m é t o d o s d e la cla s e . Ta m b ié n , a lg u n a lla m a d a le g it im a a lo s
m é t o d o s d e la cla s e p o d ría d a r a lg ú n re s u lt a d o in d e fin id o . No im p o rt a ,
co n re s p e ct o a lo s e rro re s , q u e rrá a q u e t u cla s e s e a lo m á s ro b u s t a
p o s ib le , p a ra h a ce r a lg o ra zo n a b le co n lo s e rro re s , y co m u n ica r lo s
e rro re s a l p ro g ra m a lla m a d o r. S in e m b a rg o , n o p u e d e s a n t icip a r co m o
q u ie re ca d a u s u a rio d e s u s cla s e e n la za d a q u e s e co m p o rt e n s u s o b je t o s
a n t e la a d ve rs id a d . Po r e s o , lo m e jo r q u e p u e d e s h a ce r cu a n d o o cu rre u n
e rro r e s la n za r u n a e xce p ció n .
Ca d a u n o d e lo s m é t o d o s s o p o rt a d o s p o r la lis t a e n la za d a p o d ría la n za r
u n a e xce p ció n b a jo cie rt a s co n d icio n e s , y ca d a u n o p o d ría la n za r u n t ip o
d ife re n t e d e e xce p ció n . Po r e je m p lo :
o b je c t At ( )
la n za rá u n a e xce p ció n s i s e p a s a u n e n t e ro a l m é t o d o q u e s e a
m e n o r q u e 0 o m a yo r q u e e l n ú m e ro d e o b je t o s q u e h a y re a lm e n t e
e n la lis t a .
firs t Ob je c t ( )
la n za rá u n a e xce p ció n s i la lis t a n o co n t ie n e o b je t o s .
in d e x Of( )
la n za rá u n a e xce p ció n s i e l o b je t o p a s a d o a l m é t o d o n o e s t á e n la
lis t a .
Pe ro ¿ q u é t ip o d e e xce p ció n d e b e ría la n za r ca d a m é t o d o ? ¿ De b e ría s e r
u n a e xce p ció n p o rp o rcio n a d a p o r e l e n t o rn o d e d e s a rro llo d e Ja va ? O
¿ De b e ría n s e r e xce p cio n e s p ro p ia s ?

Elegir el Tipo de Excepción Lanzada


Tra n t á n d o s e d e la e le cció n d e l t ip o d e e xce p ció n a la n za r, t ie n e s d o s
o p cio n e s :
1 . Ut iliza r u n a e s crit a p o r o t ra p e rs o n a . Po r e je m p lo , e l e n t o rn o d e
d e s a rro llo d e Ja va p ro p o rcio n a m u ch a s cla s e s d e e xce p cio n e s q u e
p o d ría s u t iliza r.
2 . Es crib irla s t u m is m o .
Ne ce s it a rá s e s crib ir t u s p ro p ia s cla s e s d e e xce p cio n e s s i re s p o n d e s "S i" a
a lg u n a d e la s s ig u e n t e s p re g u n t a s . S i n o e s a s í, p ro b a b le m e n t e p o d rá s
u t iliza r a lg u n a e xce p ció n ya e s crit a :
● ¿ Ne ce s it a s u n t ip o d e e xce p ció n q u e n o e s t á re p re s e n t a d a p o r lo
e xis t e n t e s e n e l e n t o rn o d e d e s a rro llo d e Ja va ?
● ¿ Ayu d a ría a s u s u s u a rio s s i p u d ie ra n d ife re n cia r s u s e xce p cio n e s d e
la s o t ra s la n za d a s p o r cla s e s e s crit a s p o r p o r o t ro s ve n d e d o re s ?
● ¿ La n za e l có d ig o m á s u n a e xce p ció n re la cio n a d a ?

● S i u t iliza s e xce p cio n e s d e o t ro s , ¿ Po d rá n s u s u s u a rio s t e n e r a cce s o


a e s t a s e xce p cio n e s ? Un a p re g u n t a s im ila r e s "¿ De b e ría t u p a q u e t e
s e r in d e p e n d ie n t e y a u t o - co n t e n e d o r? "
La cla s e d e lis t a e n la za d a p u e d e la n za r va ria s e xce p cio n e s , y s e ría
co n ve n ie n t e p o d e r ca p t u ra r t o d a s la s e xce p cio n e s la n za d a s p o r la lis t a
e n la za co n u n m a n e ja d o r. S i p la n e a s d is t rib u ir la lis t a e n la za d a e n u n
p a q u e t e , t o d o e l có d ig o re la cio n a d o d e b e e m p a q u e t a rs e ju n t o . As í p a ra
la lis t a e n la za d a , d e b e ría s cre a r t u p ro p io á rb o l d e cla s e s d e e xce p cio n e s .
El s ig u ie n t e d ia g ra m a ilu s t ra u n a p o s ib ilid a d d e l á rb o l d e cla s e s p a ra s u
lis t a e n la za d a :

Lin ke d Lis t Exce p t io n e s la cla s e p a d re d e t o d a s la s p o s ib le s e xce p cio n e s


q u e p u e d e n s e r la n za d a s p o r la cla s e d e la lis t a e n la za d a , Lo s u s u a rio s
d e e s t a cla s e p u e d e n e s crib ir u n s ó lo m a n e ja d o r d e e xce p cio n e s p a ra
m a n e ja rla s t o d a s co n u n a s e n t e n cia c a t c h co m o e s t a :
catch (LinkedListException) {
. . .
}
O, p o d rñ ia e s crib ir m a n e ja d o re s m á s e s p e cia liza d o s p a ra ca d a u n a d e la s
s u b cla s e s d e Lin ke d Lis t Exce p t io n .

Elegir una Superclase


El d ia g ra m a a n t e rio r n o in d ica la s u p e rcla s e d e la cla s e
Lin ke d Lis t Exce p t io n . Co m o ya s a b e s , la s e xce p cio n e s d e Ja va d e b e n s e r
e je m p la re s d e la cla s e Th ro wa b le o d e s u s s u b cla s e s . Po r e s o p o d ría
t e n t a rt e h a ce r Lin ke d Lis t Exce p t io n co m o u n a s u b cla s e d e la cla s e
Th ro wa b le . S in e m b a rg o , e l p a q u e t e ja va . la n g p ro p o rcio n a d o s cla s e s
Th ro wa b le q u e d ivid e n lo s t ip o s d e p ro b le m a s q u e p u e d e n o cu rrir e n u n
p ro g ra m a ja va : Erro re s y Exce p ció n . La m a yo ría d e lo s a p p le t s y d e la s
a p lica cio n e s q u e e s crib e s la n za n o b je t o s q u e s o n Exce p cio n e s . ( Lo s
e rro re s e s t á n re s e rva d o s p a ra p ro b le m a s m á s s e rio s q u e p u e d e n o cu rrir
e n e l s is t e m a . )
Te o ríca m e n t e , cu a lq u ie r s u b cla s e d e Exce p t io n p o d ría s e r u t iliza d a co m o
p a d re d e la cla s e Lin ke d Lis t Exce p t io n . S in e m b a rg o , u n rá p id o e xa m e n
d e e s a s cla s e s m u e s t ra q u e o s o n d e m a s ia d o e s p e cia liza d a s o n o e s t á n
re la cio n a d a s co n Lin ke d Lis t Exce p t io n p a ra s e r a p ro p ia d a s . As i q u e e l
p a d re d e la cla s e Lin ke d Lis t Exce p t io n d e b e ría s e r Exce p t io n .
Co m o la s e xce p cio n e s e n t ie m p o d e e je cu ció n n o t ie n e n p o r q u é s e r
e s p e cifica d a s e n la cla u s u la t h ro w s d e u n m é t o d o , m u ch o s
d e s a rro lla d o re s d e p a q u e t e s s e p re g u n t a n : "¿ No e s m á s s e n cillo h a ce r
q u e t o d a s m is e xce p cio n e s s e a n h e re d a d a s d e Ru n t im e Exce p t io n ? " La
re s p u e s t a a e s t a p re g u n t a co n m á s d e t a lle e n Exce p cio n e s e n Tie m p o d e
Eje cu ció n - - La Co n t ro ve rs ia . La lín e a in fe rio r d ice q u e n o d e b e ría s
u t iliza r s u b cla s e s d e Ru n t im e Exce p t io n e n t u s cla s e s a m e n o s q u e t u s
e xce p cio n e s s e a n re a lm e n t e e n t ie m p o d e e je cu ció n ! Pa ra la m a yo ría d e
n o s o t ro s , e s t o s ig n ifica "NO, t u s e xce p cio n e s n o d e b e n d e s ce n d e r d e la
cla s e Ru n t im e Exce p t io n . "

Convenciones de Nombres
Es u n a b u e n a p rá ct ica a ñ a d ir la p a la b ra "Exce p t io n " a l fin a l d e l n o m b re
d e t o d a s la s cla s e s h e re d a d a s ( d ire ct a o in d ire ct a m e n t e ) d e la cla s e
Exce p t io n . De fo rm a s im ila r, lo s n o m b re s d e la s cla s e s q u e s e h e re d e n
d e s d e la cla s e Erro r d e b e ría n t e rm in a r co n la p a la b ra "Erro r".
Oz it o
Excepciones en Tiempo de Ejecución -- La Controversia
Co m o e l le n g u a je Ja va n o re q u ie re q u e lo s m é t o d o s ca p t u re n o e s p e cifiq u e n la s e xce p cio n e s e n
t ie m p o d e e je cu ció n , e s u n a t e n t a ció n p a ra lo s p ro g ra m a d o re s e s crib ir có d ig o q u e la n ce s ó lo
e xce p cio n e s d e t ie m p o d e e je cu ció n o h a ce r q u e t o d a s s u s s u b cla s e s d e e xce p cio n e s h e re d e n d e
la cla s e Ru n t im e Exce p t io n . Es t o s a t a jo s d e p ro g ra m a ció n p e rm it e n a lo s p ro g ra m a d o re s e s crib ir
có d ig o Ja va s in p re o cu p a rs e p o r lo s co n s ig u ie n t e s :
InputFile.java:8: Warning: Exception java.io.FileNotFoundException must be caught,
or it must be declared in throws clause of this method.
fis = new FileInputStream(filename);
^
e rro re s d e l co m p ila d o r y s in p re o cu p a rs e p o r e s p e cifica r o ca p t u ra r n in g u n a e xce p ció n . Mie n t ra s
e s t a fo rm a p a re ce co n ve n ie n t e p a ra lo s p ro g ra m a d o re s , e s q u iva lo s re q u e rim ie n t o s d e Ja va d e
ca p t u ra r o e s p e cifica r y p u e d e n ca u s a r p ro b le m a s a lo s p ro g ra m a d o re s q u e u t ilice n t u s cla s e s .
¿ Po r q u é d e cid ie ro n lo s d is e ñ a d o re s d e Ja va fo rza r a u n m é t o d o a e s p e cifia r t o d a s la s e xce p cio n e s
ch e q u e a d a s n o ca p t u ra d a s q u e p u e d e n s e r la n za d a s d e n t ro d e s u á m b it o ? Co m o cu a lq u ie r
e xce p ció n q u e p u e d a s e r la n za d a p o r u n m é t o d o e s re a lm e n t e u n a p a rt e d e l in t e rfa ce d e
p ro g ra m a ció n p ú b lico d e l m é t o d o : lo s lla m a d o re s d e u n m é t o d o d e b e n co n o ce r la s e xce p cio n e s
q u e e l m é t o d o p u e d e la n za r p a ra p o d e r d e cid ir co n cie n zu d a e in t e lig e n t e m e n t e q u é h a ce r co n
e s t a s e xce p cio n e s . La s e xce p cio n e s q u e u n m é t o d o p u e d e la n za r s o n co m o u n a p a rt e d e l in t e rfa ce
d e p ro g ra m a ció n d e l m é t o d o co m o s u s p a rá m e t ro s y d e vu e lve n u n va lo r.
La s ig u ie n t e p re g u n t a p o d ría s e r: " Bie n ¿ S i e s b u e n o d e o cu m e n t a r e l API d e u n m é t o d o
in clu ye n d o la s e xce p cio n e s q u e p u e d a la n za r, p o r q u é n o e s p e cifica r t a m b ié n la s e xce p cio n e s d e
t ie m p o d e e je cu ció n ? ".
La s e xce p cio n e s d e t ie m p o d e e je cu ció n re p re s e n t a n p ro b le m a s q u e s o n d e t e ct a d o s p o r e l s is t e m a
d e e je cu ció n . Es t o in clu ye e xce p cio n e s a rit m é t ica s ( co m o la d ivis ió n p o r ce ro ) , e xce p cio n e s d e
p u n t e ro s ( co m o in t e n t a r a cce d e r a u n o b je t o co n u n re fe t e n cia n u la ) , y la s e xce p cio n e s d e
in d e xa ció n ( co m o in t e n t a r a cce d e r a u n e le m e m t o d e u n a rra y a t ra vé s d e u n ín d ice d e m a s ia d o
g ra n d e o d e m a s ia d o p e q u e ñ o ) .
La s e xce p cio n e s d e t ie m p o d e e je cu ció n p u e d e n o cu rrir e n cu a lq u ie r lu g a r d e l p ro g ra m a y e n u n
p ro g ra m a t íp ico p u e d e n s e r m u y n u m e ro s a s . Típ ica m e n t e , e l co s t e d e l ch e q u e o d e la s
e xce p cio n e s d e t ie m p o d e e je cu ció n e xce d e d e lo s b e n e ficio s d e ca p t u ra rla s o e s p e cifica rla s . As í e l
co m p ila d o r n o re q u ie re q u e s e ca p t u re n o e s p e cifiq u e n la s e xce p cio n e s d e t ie m p o d e e je cu ció n ,
p e ro s e p u e d e h a ce r.
La s e xce p cio n e s ch e q u e a d a s re p re s e n t a n in fo rm a ció n ú t il s o b re la o p e ra ció n le g a lm e n t e
e s p e cifica d a s o b re la q u e e l lla m a d o r p o d ría n o t e n e r co n t ro l y e l lla m a d o r n e ce s it a e s t a r
in fo rm a d o s o b re e lla - - p o r e je m p lo , e l s is t e m a d e fich e ro s e s t á lle n o , o e l o rd e n a d o r re m o t o h a
ce rra d o la co n e xió n , o lo s p e rm is o s d e a cce s o n o p e rm it e n e s t a a cció n .
¿ Qu é s e co n s ig u e s i s e la n za u n a e xce p ció n Ru n t im e Exce p t io n o s e cre a u n a s u b cla s e d e
Ru n t im e Exce p t io n s ó lo p o rq u e n o s e q u ie re e s p e cifica rla ? S im p le m e n t e , s e o b t ie n e la p o s ib ilid a d
d e la n za r u n a e xce p ció n s in e s p e cifica r lo q u e s e e s t á h a cie n d o . En o t ra s p a la b ra s , e s u n a fo rm a
d e e vit a r la d o cu m e n t a ció n d e la s e xce p cio n e s q u e p u e d e la n za r u n m é t o d o . ¿ Cu á n d o e s b u e n o
e s t o ? Bie n , ¿ cu á n d o e s b u e n o e vit a r la d o cu m e n t a ció n s o b re e l co m p o rt a m ie n t o d e lo s m é t o d o s ?
La re s p u e s t a e s "NUNCA".
Re g la s d e l P u lg a r:
● S e p u e d e d e t e ct a r y la n za r u n a e xce p ció n d e t ie m p o d e e je cu ció n cu a n d o s e e n cu e n t ra u n
e rro r e n la m á q u in a virt u a l, s in e m b a rg o , e s m á s s e n cillo d e ja r q u e la m á q u in a virt u a l lo
d e t e ct e y lo la n ce . No rm a lm e n t e , lo s m é t o d o s q u e e s crib a s la n za rá n e xce p cio n e s d e l t ip o
Exce p t io n , n o d e l t ip o Ru n t im e Exce p t io n .
● De fo rm a s im ila r, p u e d e s cre a r u n a s u b cla s e d e Ru n t im e Exce p t io n cu a n d o e s t a s cre a n d o u n
e rro r e n la m á q u in a virt u a l ( q u e p ro b a b le m e n t e n o lo h a rá ) , De o t ro m o d o u t iliza rá la cla s e
Exce p t io n .
● No la n ce s u n a e xce p ció n e n t ie m p o d e e je cu ció n o cre e s u n a s u b cla s e d e Ru n t im e Exce p t io n
s im p le m e n t e p o rq u e n o q u ie re s p re o cu p a rt e d e e s p e cifica rla .

Oz it o
Cambios del API que Afectan al Manejo de Errores
Utilizando Excepciones
Ma n e jo d e Erro re s Ut iliz a n d o Ex c e p c io n e s
Au n q u e e l m e ca n is m o b á s ico d e l m a n e jo d e e xce p cio n e s n o h a
c a m b ia d o e n e l JDK 1 . 1 , s e h a n a ñ a d id o m u ch a s n u e va s cla s e s d e
e xce p cio n e s y e rro re s . Co m p ru e b a la Do cu m e n t a ció n o n lin e d e l API.
El e je m p lo Lis t OfN u m b e rs
El e je m p lo Lis t OfNu m b e rs u t iliza m é t o d o s d e s fa s a d o s . Pu e d e s ve r
Ca m b io s e n e l JDK 1 . 1 : El e je m p lo Lis t OfNu m b e rs
La c la s e Th ro w a b le y s u s s u b c la s e s
El JDK 1 . 1 re q u ie re a lg ú n ca m b io m e n o r e n la cla s e Th ro wa b le d e b id o a
la in t e rn a cio n a liza ció n . Pu e d e s ve r: Ca m b io s e n e l JDK 1 . 1 : la Cla s e
Th ro wa b le

Oz it o
Threads de Control
Ab a jo t ie n e s t re s co p ia s d e u n a p p le t q u e a n im a d ife re n t e s a lg o rit m o s d e
o rd e n a có n . No , e s t a le cció n n o t ra t a d e lo s a lg o rit m o s d e o rd e n a ció n . Pe ro e s t o s
a p p le t s p ro p o rcio n a n u n a fo rm a vis u a l d e e n t e n d e r u n a p o d e ro s a ca p a cid a d d e l
le n g u a je Ja va - - lo s t h re a d s .
Bu rb u ja D o b le Bu rb u ja Rá p id o

Ah o ra a rra n ca ca d a u n o d e e s t o s a p p le t s , u n o p o r u n o , p u ls a n d o co n e l ra t ó n
d e n t ro d e e llo s . ¿ Ob s e rva s a lg o ? S i! Lo s a p p e lt s s e e s t á n e je cu t a n d o a la ve z.
¿ Ob s e rva s a lg o m á s ? S i! Pu e d e s m o ve rt e p o r e s t a p á g in a o t ra e r u n o d e lo s
p a n e le s d e l n a ve g a d o r m ie n t ra s e s t o s t re s a p p le t s e s t á n o rd e n a n d o s u s d a t o s .
To d o e s t o s e d e b e a l p o d e r d e lo s 'h ilo s ' t h re a d s .

Oz it o
¿Qué es un Thread?
To d o s lo s p ro g ra m a d o re s e s t á n fa m ilia riza d o s co n la e s crit u ra d e p ro g ra m a s
s e cu e n cia le s . Tú p ro b a b le m e n t e h a ya s e s crit o u n p ro g ra m a q u e m u e s t re "He llo
Wo rld !", o q u e o rd e n e u n a lis t a d e n o m b re s , o q u e ca lcu le la lis t a d e n ú m e ro s
p rim o s . Es t o s s o n p ro g ra m a s s e cu e n cia le s : ca d a u n o t ie n e u n p rin cip io , u n a
s e cu e n cia d e e je cu ció n y u n fin a l. En u n m o m e n t o d a d o d u ra n t e la e je cu ció n d e l
p ro g ra m a h a y u n s ó lo p u n t o d e e je cu ció n .
Un Th re a d e s s im ila r a lo s p ro g ra m a s s e cu e n cia le s d e s crit o s a rrib a : u n s ó lo t h re a d
t a m b ié n t ie n e u n p rin cip io , u n fin a l, u n a s e cu e n cia , y e n u n m o m e n t o d a d o d u ra n t e
e l t ie m p o d e e je cu ció n d e l t h re a d s ó lo h a y u n p u n t o d e e je cu ció n . S in e m b a rg o , u n
t h re a d p o r s i m is m o n o e s u n p ro g ra m a . No p u e d e e je cu t a rs e p o r s í m is m o , p e ro s i
co n u n p ro g ra m a .
D e fin ic ió n : Un t h re a d e s u n flu jo s e cu e n cia l d e co n t ro l d e n t ro d e u n p ro g ra m a .

No h a y n a d a n u e vo e n e l co n ce p t o d e u n s ó lo t h re a d . Pe ro e l ju e g o re a l a lre d e d o r
d e lo s t h re a d s n o e s t á s o b re lo s t h re a d s s e cu e n cia le s s o lit a rio s , s in o s o b re la
p o s ib ilid a d d e q u e u n s o lo p ro g ra m a e je cu t e va rio s t h re a d s a la ve z y q u e re a lice n
d ife re n t e s t a re a s .
El n a ve g a d o r Ho t Ja va e s u n e je m p lo d e u n a a p lica ció n m u lt i- t h re a d . De n t ro d e l
n a ve g a d o r Ho t Ja va p u e d e s m o ve rt e p o r la p á g in a m ie n t ra s b a ja s u n a p p le t o u n a
im a g e n , s e e je cu t a u n a a n im a ció n o e s cu ch a s u n s o n id o , im p rim e s la p á g in a e n
s e g u n d o p la n o m ie n t ra s d e s ca rg a s u n a n u e va p á g in a , o ve s có m o lo s t re s
a lg o rit m o s d e o rd e n a ció n a lca n za n la m e t a .
Alg u n o s t e xt o s u t iliza n e l n o m b re p ro ce s o d e p o co p e s o e n lu g a r d e t h re a d . Un
t h re a d e s s im ila r a u n p ro ce s o re a l e n e l q u e u n t h re a d y u n p ro g ra m a e n e je cu ció n
s o n u n s ó lo flu jo s e cu e n cia l d e co n t ro l. S in e m b a rg o , u n t h re a d s e co n s id e ra u n
p ro ce s o d e p o co p e s o p o rq u e s e e je cu t a d e n t ro d e l co n t e xt o d e u n p ro g ra m a
co m p le t o y s e a p ro ve ch a d e lo s re cu rs o s a s ig n a d o s p o r e s e p ro g ra m a y d e l e n t o rn o
de é ste .
Co m o u n flu jo s e cu e n cia l d e co n t ro l, u n t h re a d d e b e co n s e g u ir a lg u n o s d e s u s
p ro p io s re cu rs o s d e n t ro d e u n p ro g ra m a e n e je cu ció n . ( De b e t e n e r s u p ro p ia p ila
d e e je cu ció n y co n t a d o r d e p ro g ra m a , p o r e je m p lo ) . El có d ig o q u e s e e je cu t a
d e n t ro d e u n Th re a d t ra b a ja s ó lo e n é s t e co n t e xt o . As í, a lg u n o s t e xt o u t iliza n e l
t é rm in o co n t e x t o d e e je cu ció n co m o u n s in ó n im o p a ra lo s t h re a d s .

Oz it o
Un sencillo Thread de Ejemplo
Es t e e je m p lo d e fin e d o s cla s e s : S im p le Th re a d y Two Th re a d s Te s t . Em p e ce m o s
n u e s t ra e xp lo ra ció n d e la a p lica ció n co n la cla s e S im p le Th re a d - - u n a s u b cla s e d e
la cla s e Th re a d , q u e e s p ro p o rcio n a d a p o r e l p a q u e t e ja va . la n g :
class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
System.out.println("HECHO! " + getName());
}
}
El p rim e r m é t o d o d e e s t a cla s e e s u n co n s t ru ct o r q u e t o m a u n a ca d e n a co m o s u
ú n ico a rg u m e n t o . Es t e co n s t ru ct o r e s t á im p le m e n t a d o m e d ia n t e u n a lla m a d a a l
co n s t u rct o r d e la s u p e rcla s e y e s in t re s a n t e p a ra n o s o t ro s s ó lo p o rq u e s e le ccio n a e l
n o m b re d e l Th re a d , q u e s e u s a rá m á s a d e la n t e e n e l p ro g ra m a .
El s ig u ie n t e m é t o d o e s e l m é t o d o ru n ( ) . Es t e m é t o d o e s e l co ra zó n d e cu a lq u ie r
Th re a d y d o n d e t ie n e lu g a r la a cció n d e l Th re a d . El m é t o d o ru n ( ) d e la cla s e
S im p le Th re a d co n t ie n e u n b u cle fo r q u e it e ra d ie z ve ce s . En ca d a it e ra ció n e l
m é t o d o m u e s t ra e l n ú m e ro d e it e ra ció n y e l n o m b re d e l Th re a d , lu e g o e s p e ra
d u ra n t e u n in t e rva lo a le a t o rio d e h a s t a 1 s e g u n d o . De s p u é s d e h a b e r t e m rin a d o e l
b u cle , e l m é t o d o ru n ( ) im p rim e "HECHO!" co n e l n o m b re d e l Th re a d .
La cla s e Two Th re a d s p ro p o rcio n a u n m é t o d o m a in ( ) q u e cre a d o s t h re a d s
S im p le Th re a d : u n o lla m a d o "Ja m a ica " y o t ro lla m a d a o "Fiji". ( S i n o q u ie re s d e cid ir
d o n d e ir d e va ca cio n e s p u e d e s u t iliza r e s t e p ro g ra m a p a ra a yu d a rt e a e le g ir - - ve a
la is la cu yo t h re a d s im p rim a "HECHO!" p rim e ro ) .
class TwoThreadsTest {
public static void main (String[] args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
}
}
El m é t o d o m a in ( ) t a m b ié n a rra n ca ca d a u n o d e lo s t h re a d s in m e d ia t a m e n t e
d e s p u é s s ig u ie n d o s u co n s t ru cció n co n u n a lla m a d a a l m é t o d o s t a rt ( ) . El
p ro g ra m a d a ría u n a s a lid a p a re cid a a e s t a :
0 Jamaica
0 Fiji
1 Fiji
1 Jamaica
2 Jamaica
2 Fiji
3 Fiji
3 Jamaica
4 Jamaica
4 Fiji
5 Jamaica
5 Fiji
6 Fiji
6 Jamaica
7 Jamaica
7 Fiji
8 Fiji
9 Fiji
8 Jamaica
HECHO! Fiji
9 Jamaica
HECHO! Jamaica
Ob s e rva có m o la s a lid a d e ca d a u n o d e lo s t h re a d s s e m e zcla co n la s a lid a d e l o t ro .
Es t o e s p o rq u e lo s d o s t h re a d s S im p le Th re a d s e e s t á n e je cu t a n d o d e fo rm a
co n cu rre n t e . As í, lo s d o s m é t o d o s ru n ( ) s e s t á n e je cu t a n d o a l m is m o t ie m p o y
ca d a t h re a d e s t á m o s t rá n d o s u s a lid a a l m is m o t ie m p o q u e e l o t ro .
P ru e b a e s t o : Mo d ifica e l p ro g ra m a p rin cip a l y cre a u n t e rce r Th re a d lla m a d o "Bo ra
Bo ra ". Co m p ila e l p ro g ra m a y e je cú t a lo d e n u e vo . ¿ Ha ca m b ia d o la is la d e d e s t in o
d e s u s va ca cio n e s ?

Oz it o
Atributos de un Thread
Po r a h o ra , t e h a s fa m ilia riza d o co n lo s t h re a d s y h a s vis t o u n s e n cillo p ro g ra m a
Ja va q u e e je cu t a d o s t h re a d co n cu rre n t e m e n t e . Es t a p á g in a p re s e n t a va ria s
ca ra ct e rís t ica s e s p e cífica s d e lo s t h re a d s Ja va y p ro p o rcio n a e n la ce s a la s p á g in a s
q u e e xp lica n ca d a ca ra ct e rís t ica co n m á s d e t a lle .
Lo s t h re d a s ja va e s t á n im p le m e n t a d o s p o r la cla s e Th re a d , q u e e s u n a p a rt e d e l
p a q u e t e ja va . la n g . Es t a cla s e im p le m e n t a u n a d e fin ició n d e t h re a d s in d e p e n d ie n t e
d e l s is t e m a . Pe ro b a jo la ca m p a n a , la im p le m e n t a ció n re a l d e la o p e ra ció n
co n cu rre n t e la p ro p o rcio n a u n a im p le m e n t a ció n e s p e cífica d e l s is t e m a . Pa ra la
m a yo ría d e la s a p lica cio n e s , la im p le m e n t a ció n b á s ica n o im p o rt a . S e p u e d e
ig n o ra r la im p le m e n t a ció n b á s ica y p ro g ra m a r e l API d e lo s t h re a d d e s crit o e n
e s t a s le ccio n e s y e n o t ra d o cu m e n t a ció n p ro p o rcio n a d a co n e l s is t e m a Ja va .
Cu e rp o d e l Th re a d
To d a la a cció n t ie n e lu g a r e n e l cu e rp o d e l t h re a d - - e l m é t o d o ru n ( ) . S e
p u e d e p ro p o rcio n a r e l cu e rp o d e u n Th re a d d e u n a d e e s t a s d o s fo rm a s :
s u b cla s ifica n d o la cla s e Th re a d y s o b re e s crib ie n d o s u m é t o d o ru n ( ) , o
cre a n d o u n t h re a d co n u n o b je t o d e la cla s e Ru n n a b le y s u t a rg e t .
Es t a d o d e u n Th re a d
A lo la rg o d e s u vid a , u n t h re a d t ie n e u n o o va rio s e s t a d o s . El e s t a d o d e u n
t h re a d in d ica q u é e s t á h a cie n d o e l Th re a d y lo q u e e s ca p a z d e h a ce r d u ra n t e
s u t ie m p o d e vid a : ¿ s e e s t á e je cu t a n d o ? , ¿ e s t á e s p e ra n d o ? ¿ o e s t á m u e rt o ?
La p rio rid a d d e u n Th re a d
Un a p rio rid a d d e l Th re a d le d ice a l t e m p o riza d o r d e t h re a d s d e Ja va cu a n d o s e
d e b e e je cu t a r e s t e t h re a d e n re la ció n co n lo s o t ro s .
Th re a d s D a e m o n
Es t o s t h re a d s s o n a q u e llo s q u e p o rp o rcio n a n u n s e rvicio p a ra o t ro s t h re a d s
d e l s is t e m a . Cu a lq u ie r t h re a d Ja va p u e d e s e r u n t h re a d d a e m o n .
Gru p o s d e Th re a d s
To d o s lo s t h re a d s p e rt e n e ce n a u n g ru p o . La cla s e Th re a d Grp u p ,
p e rt e n e cie n t e a l p a q u e t e ja va . la n g d e fin e e im p le m e n t a la s ca p a cid a d e s d e u n
g ru p o d e t h re a d re la cio n a d o s .

Oz it o
El Cuerpo de un Thread
To d a la a cció n t ie n e lu g a r e n e l cu e rp o d e l t h re a d , q u e e s e l m é t o d o ru n ( ) d e l
t h re a d . De s p u é s d e cre a r e in icia liza r u n t h re a d , e l s is t e m a d e e je cu ció n lla m a a s u
m é t o d o ru n ( ) . El có d ig o d e e s t e m é t o d o im p le m e n t a e l co m p o rt a m ie n t o p a ra e l
q u e fu e cre a d o e l t h re a d . Es la ra zó n d e e xis t ir d e l t h re a d .
Fre cu e n t e m e n t e , e l m é t o d o ru n ( ) d e u n t h re a d e s u n b u cle . Po r e je m p lo , u n
t h re a d d e a n im a ció n p o d ría it e ra r a t ra vé s d e u n b u cle y m o s t ra r u n a s e rie d e
im á g e n e s . Alg u n a s ve ce s u n m é t o d o ru n ( ) re a liza u n a o p e ra ció n q u e t a rd a m u ch o
t ie m p o , co m o d e s ca rg a r y e je cu t a r u n s o n id o o u n a p e lícu la JPEG.
Pu e d e s e le g ir u n a d e e s t a s d o s fo rm a s p a ra p ro p o rcio n a r u n m é t o d o ru n ( ) a u n
t h re a d Ja va :
1 . Cre a r u n a s u b cla s e d e la cla s e Th re a d d e fin id a e n e l p a q u e t e ja va . la n g y
s o b re e s crib ir e l m é t o d o ru n ( ) .
Eje m p lo : La cla s e S im p le Th re a d d e s crit a e n En e je m p lo s e n cillo d e Th re a d .
2 . Pro p o rcio n a r u n a cla s e q u e im p le m e n t e e l in t e rfa ce Ru n n a b le , t a m b ié n
d e fin id o e n e l p a q u e t e ja va . la n g . Ah o ra , cu a n d o s e e je m p la rice u n t h re a d
( b ie n d ire ct a m e n t e d e s d e la cla s e Th re a d o d e s d e u n a d e s u s s u b cla s e s ) , d a le
a l n u e vo t h re a d u n m a n e ja d o r a u n e je m p la r d e la cla s e Ru n n a b le . Es t e
o b je t o Ru n n a b le p ro p o rcio n a e l m é t o d o ru n ( ) p a ra e l t h re a d .
Eje m p lo : El a p p le t d e u n re lo j q u e ve rá s e n la p á g in a s ig u ie n t e .
Exis t e n va ria s b u e n a s ra zo n e s p a ra e le g ir u n o d e e s t a s d o s o p cio n e s . S in e m b a rg o ,
p a ra la m a yo ría d e lo s ca s o s , la m e jo r o p ció n s e rá s e g u ir e s t á re g la d e l p u lg a r:
Re g la d e l P u lg a r: s i t u cla s e d e b e s e r u n a s u b cla s e d e o t ra cla s e ( e l e je m p lo m á s
co m ú n s o n lo a p p le t s ) , d e b e rá s u t iliza r Ru n n a b le d e s crit o e n la s e cció n Nº 2 .

Oz it o
Un Applet de un Reloj Digital
Es t e a p p le t m u e s t ra la h o ra a ct u a l y la a ct u a liza ca d a s e g u n d o . Pu e d e s m o ve rt e p o r la p á g in a o re a liza r
cu a lq u ie r o t ra t a re a m ie n t ra s e l re lo j co n t in u a a ct u a liza n d o s e p o rq u e e l có d ig o q u e a ct u a liza e l re lo j y lo
m u e s t ra s e e je cu t a d e n t ro d e u n t h re a d .
Es t a s e cció n e xp lica e l có d ig o fu e n t e d e e s t e a p p le t . En p a rt icu la r, e s t a p á g in a d e s crb ie lo s s e g m e n t o s d e
có d ig o q u e im p le m e n t a e l co m p o rt a m ie n t o d e l t h re a d d e l re lo j; n o d e s crib e e l có d ig o q u e e s t á
re la cio n a d o co n e l ciclo d e vid a d e l a p p le t . S i n o h a s e s crit o s u s p ro p io s a p p le t s o s i n o e s t á s fa m ilia riza d o
co n e l ciclo d e vid a d e u n a a p p le t , p o d ría s e n co n t ra r la s re s p u e s t a s e n El ciclo d e vid a d e u n Ap p le t a n t e s
d e p ro ce d e r co n e s t a p á g in a .

Decidir Utilizar el Interface Runnable


El a p p le t d e l re lo j u t iliza e l in t e rfa ce Ru n n a b le p a ra p ro p o rcio n a r e l m é t o d o ru n ( ) p a ra s u
t h re a d . Pa ra e je cu t a rs e d e n t ro d e u n n a ve g a d o r co m p a t ib le co n Ja va , la cla s e Clo ck d e b e
d e riva r d e la cla s e Ap p le t . S in e m b a rg o e s t e a p p le t t a m b ié n n e ce s it a u n t h re a d p a ra p o d e r
a ct u a liza r co n t in u a m e n t e la p a n t a lla s in t o m a r p o s e s ió n d e l p ro ce s o e n e l q u e s e e s t á
e je cu t a n d o . ( Alg u n o s n a ve g a d o re s , p e ro n o t o d o s , cre a n u n n u e vo t h re a d p a ra ca d a a p p le t
p a ra im p e d ir q u e u n a p p le t d e s co rt é s t o m e p o s e s ió n d e l t h re a d p rin cip a l d e l n a ve g a d o r. S in
e m b a rg o , n o d e b e ría s co n t a r co n e s t o cu a n d o e s crib a s t u s a p p le t s ; lo s a p p le t s d e b e n cre a r s u s
p ro p io s t h re a d s cu a n d o h a g a n u n t ra b a jo d e ca lcu lo in t e n s ivo ) . Co m o e l le n g u a je Ja va n o
s o p o rt a la h e re n cia m ú lt ip le , la cla s e Cla s s n o p u e d e h e re d a rs e d e s d e la cla s e Th re a d y d e la
cla s e Ap p le t a la ve z. Po r e s o , la cla s e Clo ck d e b e u t iliza r e l in t e rfa ce Ru n n a b le p a ra
p ro p o rcio n a r e l co m p o rt a m ie n t o d e s u s t h re a d .
Lo s a p p le t s n o s o n t h re a d s , n i n in g ú n n a ve g a d o r e xis t e n t e - - co m p a t ib le s co n Ja va o
vis u a liza d o e s d e a p p le t s cre a n t h re a d s a u t o m á t ica n t e e n e l q u e e je cu t a r a p p le t s . Po r lo t a n t o ,
s i u n a p p le t , n e ce s it a u n t h re a d d e b e cre á rs e lo e l m is m o . El a p p le t d e l re lo j n e ce s it a u n t h re a d
e n e l q u e re a liza r la s a ct u a liza cio n e s d e p a n t a lla p o rq u e s e a ct u a liza d e fo rm a fre cu e n t e y e l
u s u a rio n e ce s it a p o d e r re a liza r o t ra s t a re a s a la ve z q u e s e e je cu t a e l re lo j ( co m o ir a o t ra
p á g in a o m o ve rs e p o r é s t a ) .

El Interface Runnable
El a p p le t d e l re lo j p ro p o rcio n a u n m é t o d o ru n ( ) p a ra s u t h re a d m e d ia n t e e l in t e rfa ce Ru n n a b le .
La d e fin ició n d e la lca s e Clo ck in d ica q u e e s u n a s u b cla s e d e la cla s e Ap p le t y q u e im p le m e n t a
e l in t e rfa ce Ru n n a b le . S i n o e s t á s fa m ilia riza d o co n lo s in t e rfa ce s p u e d e s re vis a r la in fo rm a ció n
d e la le cció n "Ob je t o s , Cla s e s , e In t e rfa ce s "
class Clock extends Applet implements Runnable {
El in t e rfa ce Ru n n a b le d e fin e u n s ó lo m é t o d o lla m a d o ru n ( ) q u e n o a ce p t a n in g ú n a rg u m e n t o y
q u e n o d e vu e lve n in g ú n va lo r. Co m o la cla s e Clo ck im p le m e n t a e l in t e rfa ce Ru n n a b le , d e b e
p ro p o rcio n a r u n a im p le m e n t a ció n p a ra e l m é t o d o ru n ( ) co m o e s t á d e fin id o e n e l in t e rfa ce . S in
e m b a rg o , a n t e s d e e xp lica r e l m é t o d o ru n ( ) d e la cla s e Clo ck, e ch e m o s u n vis t a zo a lo s o t ro s
e le m e n t o s d e l có d ig o d e e s t a cla s e :

Crear el Thread
La a p lica ció n e n la q u e s e e je cu t a e l a p p le t lla m a a l m é t o d o s t a rt ( ) d e l a p p le t cu a n d o e l
u s u a rio vis it a la p á g in a d e l a p p le t . El a p p le t d e l re lo j cre a u n Th re a d , c lo c k Th re a d , e n s u
m é t o d o s t a rt ( ) y a rra n ca e l t h re a d .
public void start() {
if (clockThread == null) {
clockThread = new Thread(this, "Clock");
clockThread.start();
}
}
Prim e ro e l m é t o d o s t a rt ( ) co m p ru e b a s i c lo c k Th re a d e s n u lo . S i lo e s , s ig n ifica q u e e l a p p le t
a ca b a d e s e r ca rg a d o o q u e h a s id o p a ra d o a n t e rio rm e n t e y s e d e b e cre a r u n n u e vo Th re a d . De
o t ro m o d o , s ig n ifica q u e e l a p p le t ya s e e s t á e je cu t a n d o . El a p p le t cre a u n n u e vo Th re a d co n
e s t a lla m a d a :
clockThread = new Thread(this, "Clock");
Ob s e rva q u e t h is - - e l a p p le t Clo ck - - e s e l p rim e r a rg u m e n t o d e l co n s t ru ct o r d e l t h re a d . El
p rim e r a rg u m e n t o d e e s t e co n s t ru ct o r Th re a d d e b e im p le m e n t a r e l in t e rfa ce Ru n n a b le y s e
co n vie rt e e n e l o rig e n d e l t h re a d . Cu a n d o s e co n s t ru ye d e e s t a fo rm a , e l t h re a d d e l re lo j
o b t ie n e s u m é t o d o ru n ( ) d e s d e e l o b je t o Ru n n a b le o rig e n - - e n e s t e ca s o e l a p p le t Clo ck.
El s e g u n d o a rg u m e n t o e s s ó lo e l n o m b re d e l t h re a d .

Parar el Thread
Cu a n d o a b a n d o n e s la p á g in a q u e m u e s t ra e l Re lo j, la a p lica ció n e n la q u e e l a p p le t s e e s t á
e je cu t a n d o lla m a a l m é t o d o s t o p ( ) d e l a p p le t . El m é t o d o s t o p ( ) d e l a p p le t Clo ck p o n e
c lo c k Th re a d a n u lo . Es t o le d ice a l b u cle p rin cip a l e n e l m é t o d o ru n ( ) q u e t e rm in e ( o b s e rva la
s ig u ie n t e s e cció n ) , la a ct u a liza ció n d e l re lo j re s u lt a n d o e ve n t u a lm e n t e e n la p a ra d a d e l t h re a d
y la re co le cció n d e b a s u ra .
public void stop() {
clockThread = null;
}
Po d ría s u t iliza r c lo c k Th re a d . s t o p ( ) e n s u lu g a r, lo q u e p a ra ría in m e d ia t a m e n t e e l t h re a d d e l
re lo j. S in e m b a rg o , e l m é t o d o s t o p ( ) d e la cla s e Th re a d t ie n e u n e fe ct o s ú b it o , lo q u e s ig n ifica
q u e e l m é t o d o ru n ( ) p o d ría e s t a r e n m e d io d e u n a o p e ra ció n crít ica cu a n d o s e p a re e l t h re a d .
Pa ra lo s m é t o d o s ru n ( ) m á s co m p le jo s , u t iliza r e l m é t o d o s t o p ( ) d e la cla s e Th re a d p o d ría
d e ja r e l p ro g ra m a e n u n e s t a d o in co s is t e n t e . Po r e s t a ra zó n , e s m e jo r e vit a r e l u s o d e l m é t o d o
s t o p ( ) d e la cla s e Th re a d cu a n d o s e a p o s ib le .
S i re vis it a la p á g in a d e n u e vo , s e lla m a o t ra ve z a l m é t o d o s t a rt ( ) y e l re lo j a rra n ca d e n u e vo
co n u n n u e vo t h re a d .

El Método Run
Y fin a lm e n t e , e l m é t o d o ru n ( ) d e l a p p le t Clo ck im p le m e n t a e l co ra zó n d e e s t e a p p le t y s e
p a ra ce a e s t o :
public void run() {
// El bucle termina cuando clockThread se pone a null en stop()
while (Thread.currentThread() == clockThread) {
repaint();
try {
clockThread.sleep(1000);
} catch (InterruptedException e){
}
}
}
Co m o s e vió e n la s e cció n a n t e rio r, cu a n d o s e le p id e a l a p p le t q u e s e p a re , e s t e s e le ccio n a
c lo c k Th re a d a n u ll; e s t o p e rm it e q u e e l m é t o d o ru n ( ) s e p a cu a n d o d e b e p a ra r. As í, la
p rim e ra lín e a d e l m é t o d o ru n ( ) t ie n e u n b u cle h a s t a q u e c lo c k Th re a d s e a n u lo . De n t ro d e l
b u cle , e l a p p le t s e re p in t a a s í m is m o y le d ice a l Th re a d q u e e s p e re d u ra n t e 1 s e g u d o ( 1 0 0 0
m ilis e g u n d o s ) . Lu e g o e l m é t o d o re p a in t ( ) d e l a p p le t lla m a a l m é t o d o p a in t ( ) d e l a p p le t , q u e
a ct u a liza e l á re a d e p a n t a lla d e l a p p le t . El m é t o d o p a in t ( ) d e n u e s t ro a p p le t Clo ck o b t ie n e la
h o ra a ct u a l y la m u e s t ra e n la p a n t a lla :
public void paint(Graphics g) {
Date now = new Date();
g.drawString(now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), 5,
10);
}

Oz it o
El Estado del Thread
El s ig u ie n t e d ia g ra m a ilu s t ra lo s d is t in t o s e s t a d o s q u e p u e d e t e n e r u n Th re a d Ja va
e n cu a lq u ie r m o m e n t o d e s u vid a . Ta m b ié n ilu s t ra la s lla m a d a s a m é t o d o s q u e
p ro vo ca n la s t ra n s icio n e s d e u n e s t a d o a o t ro . Es t e n o e s u n d ia g ra m a d e e s t a d o
fin it o p e ro d a u n id e a g e n e ra l d e l la s fa ce t a s m á s in t e re s a n t e s y co m u n e s e n la
vid a d e u n t h re a d . El re s t o d e e s t á p á g in a e xp lica e l ciclo d e vid a d e u n t h re a d ,
ba sá ndose e n sus e sta dos.

Un "Nuevo Thread"
La s ig u ie n t e s e n t e n cia cre a u n n u e vo t h re a d p e ro n o lo a rra n ca , p o r lo
t a n t o d e ja e l t h re a d e n e l e s t a d o : "Ne w Th re a d " = "Nu e vo Th re a d ".
Thread miThread = new MiClaseThread();
Cu a n d o u n t h re a d e s t á e n e s t e e s t a d o , e s s ó lo u n o b je t o Th re a d va cío .
No s e h a n a s ig n a d o re cu rs o s d e l s is t e m a t o d a vía p a ra e l t h re a d . As í,
cu a n d o u n t h re a d e s t á e n e s t e e s t a d o , lo ú n ico q u e s e p u e d e h a ce r e s
a rra n ca rlo o p a ra rlo . Lla m a r a o t ro s m é t o d o s d is t in t o s d e s t a rt ( ) o
s t o p ( ) n o t ie n e s e n t id o y ca u s a u n a e xce p ció n d e l t ip o
Ille g a lTh re a d S t a t e Exce p t io n .

Ejecutable
Ah o ra co n s id e re m o s e s t a s d o s lín e a s d e có d ig o :
Thread miThread = new MiClaseThread();
miThread.start();
Cu a n d o e l m é t o d o s t a rt ( ) cre a lo s re cu rs o s d e l s is t e m a n e ce s a rio s p a ra
e je cu t a r e l t h re a d , p ro g ra m a e l t h re a d p a ra e je cu t a rs e , y lla m a a l
m é t o d o ru n ( ) d e l t h re a d . En e s t e p u n t o e l t h re a d e s t á e n e l e s t a d o
"Eje cu t a b le ". Es t e e s t a d o s e lla m a "Eje cu t a b le " m e jo r q u e "Eje cu t a n d o "
ya q u e e l t h re a d t o d a vía n o h a e m p e za d o a e je cu t a rs e cu a n d o e s t á e n
e s t e e s t a d o . Mu ch o s p ro ce s a d o re s t ie n e n u n s ó lo p ro ce s a d o r, h a cie n d o
p o s ib le q u e t o d o s lo s t h re a d s s e a n "Eje cu t a b le s " a l m is m o t ie m p o . Po r
e s o , e l s is t e m a d e e je cu ció n d e Ja va d e b e im p le m e n t a r u n e s q u e m a d e
p ro g ra m a ció n p a ra co m p a rt ir e l p ro ce s a d o r e n t re t o d o s lo s t h re a d s
"Eje cu t a b le s ". ( Pu e d e s ve r la p á g in a Prio rid a d d e u n Th re a d p a ra o b t e n e r
m á s in fo rm a ció n s o b re la p ro g ra m a ció n . ) S in e m b a rg o , p a ra la m a yo ría
d e lo s p ro p o s it o s p u e d e s p e n s a r e n "Eje cu t a b le " co m o u n s e n cillo
"Eje cu t a n d o ". Cu a n d o u n t h re a d s e e s t á e je cu t a n t o - - e s t á "Eje cu t a b le " y
e s e l t h re a d a ct u a l - - la s in s t ru ccio n e s d e s u m é t o d o ru n ( ) s e e je cu t a n
d e fo rm a s e cu e n cia l.

No Ejecutable
Un t h re a d e n t ra e n e l e s t a d o "No Eje cu t a b le " cu a n d o o cu rre u n o d e e s t o s
cu a t ro e ve n t o s :
● Alg u ie n lla m a a s u m é t o d o s le e p ( ) .

● Alg u ie n lla m a a s u m é t o d o s u s p e n d ( ) .

● El t h re a d u t iliza s u m é t o d o w a it ( ) p a ra e s p e ra r u n a co n d ició n
va ria b le .
● El t h re a d e s t á b lo q u e a d o d u ra n t e la I/ O.

Po r e je m p lo , la lín e a e n n e g rit a d e l s ig u ie n t e fra g m e n t o d e co d ig o p o n e a


d o rm ir m iTh re a d d u ra n t e 1 0 s e g u n d o s ( 1 0 . 0 0 0 m ilis e g u n d o s ) :
Thread miThread = new MiClaseThread();
miThread.start();
try {
miThread.sleep(10000);
} catch (InterruptedException e){
}
Du ra n t e lo s 1 0 s e g u n d o s q u e m iTh re a d e s t á d o rm id o , in clu s o s i e l
p ro ce s o s e vu e lve d is p o n ib le m iTh re a d n o s e e je cu t a . De s p u é s d e 1 0
s e g u n d o s , m iTh re a d s e co n vie rt e e n "Eje cu t a b le " d e n u e vo y, s i e l
p ro ce s a r e s t á d is p o n ib le s e e je cu t a .
Pa ra ca d a e n t ra d a e n e l e s t a d o "No Eje cu t a b le " m o s t ra d o e n fig u ra ,
e xis t e u n a ru t a d e e s ca p e d is t in t a y e s p e cífica q u e d e vu e lve e l t h re a d a l
e s t a d o "Eje cu t a b le ". Un a ru t a d e e s ca p e s ó lo t ra b a ja p a ra s u e n t ra d a
co rre s p o n d ie n t e . Po r e je m p lo , s i u n t h re a d h a s id o p u e s t o a d o rm ir
d u t a n t e u n cie rt o n ú m e ro d e m ilis e g u n d o s d e b e n p a s a r e s o s
m ilis e g u n d o s a n t e s d e vo lve rs e "Eje cu t a b le " d e n u e vo . Lla m a r a l m é t o d o
re s u m e ( ) e n u n t h re a d d o rm id o n o t ie n e e fe ct o .
Es t a lis t a in d ica la ru t a d e e s ca p e p a ra ca d a e n t ra d a e n e l e s t a d o "No
Eje cu t a b le ":
● S i s e h a p u e s t o a d o rm ir u n t h re a d , d e b e n p a s a r e l n ú m e ro d e
m ilis e g u n d o s e s p e cifica d o s .
● S i s e h a s u s p e n d id o u n t h re a d , a lg u ie n d e b e lla m a r a s u m é t o d o
re s u m e ( ) .
● S i u n t h re a d e s t á e s p e ra n d o u n a co n d ició n va ria b le , s ie m p re q u e e l
o b je t o p ro p ie t a rio d e la va ria b le re n u n cie m e d ia n t e n o t ify ( ) o
n o t ify All( ) .
● S i u n t h re a d e s t á b lo q u e a d o d u ra n t e la I/ O, cu a n d o s e co m p le t e la
I/ O.

Muerto
Un t h re a d p u e d e m o rir d e d o s fo rm a s : p o r ca u s a s n a t u ra re s o s ie n d o
a s e s in a d o ( p a ra d o ) . Un a m u e rt e n a t u ra l s e p ro d u ce cu a n d o s u m é t o d o
ru n ( ) s a le n o rm a lm e n t e . Po r e je m p lo , e l b u cle w h ile e n e s t e m é t o d o e s
u n b u cle fin it o - - it e ra 1 0 0 ve ce s y lu e g o s a le .
public void run() {
int i = 0;
while (i < 100) {
i++;
System.out.println("i = " + i);
}
}
Un t h re a d co n e s t e m é t o d o ru n ( ) m o riría n a t u a lm e n t e d e s p u é s d e q u e
e l b u cle y e l m é t o d o ru n ( ) s e h u b ie ra n co m p le t a d o .
Ta m b ié n p u e d e m a t a r u n t h re a d e n cu a lq u ie r m o m e n t o lla m a n d o a s u
m é t o d o s t o p ( ) . El s ig u ie n t e có d ig o cre a y a rra n ca m iTh re a d lu e g o lo
p o n e a d o rm ir d u ra n t e 1 0 s e g u n d o s . Cu a n d o e l t h re a d a ct u a l s e
d e s p ie rt a , la lín e a e n n e g rit a m a t a m iTh re a d .
Thread miThread = new MiClaseThread();
miThread.start();
try {
Thread.currentThread().sleep(10000);
} catch (InterruptedException e){
}miThread.stop();
El m é t o d o s t o p ( ) la n za u n o b je t o Th re a d De a t h h a cia a l t h re a d a
e lim in a r. As í, cu a n d o s e m a t a a l t h re a d d e e s t a fo rm a , m u e re d e fo rm a
a s ín cro n a . El t h re a d m o ririá cu a n d o re cib a re a lm e n t e la e xce p ció n
Th re a d De a t h .
El m é t o d o s t o p ( ) p ro vo ca u n a t e rm in a ció n s ú b it a d e l m é t o d o ru n ( ) d e l
t h re a d . S i e l m é t o d o ru n ( ) e s t u vie ra re a liza n d o cá lcu lo s s e n s ib le s ,
s t o p ( ) p o d ría d e ja r e l p ro g ra m a e n u n e s t a d o in co n s is t e n t e .
No rm a lm e n t e , n o s e d e b e ría lla m a r a l m é t o d o s t o p ( ) p e ro s i s e d e b e ría
p ro p o rcio n a r u n a t e rm in a ció n e d u ca d a co m o la s e le cció n d e u n a b a n d e ra
q u e in d iq u e q u e e l m é t o d o ru n ( ) d e b e ría s a lir.

La Excepción IllegalThreadStateException
El s is t e m a d e e je cu ció n la n za u n a e xce p ció n Ille g a lTh re a d S t a t e Exce p t io n
cu a n d o lla m a a u n m é t o d o e n u n t h re a d y e l e s t a d o d e l t h re a d n o
p e m m it e e s a lla m a d a a m é t o d o . Po r e je m p lo , e s t a e xce p ció n s e la n za
cu a n d o s e lla m a a s u s p e n d ( ) e n u n t h re a d q u e n o e s t á "Eje cu t a b le ".
Co m o s e h a m o s t ra d o e n va rio s e je m p lo s d e t h re a d s e n e s t á le cció n ,
cu a n d o s e lla m e a u n m é t o d o d e u n t h re a d q u e p u e d a la n za r u n a
e xce p ció n , s e d e b e ca p t u ra r y m a n e ja r la e xce p ció n , o e s p e cifica r a l
m é t o d o lla m a d o r q u e s e la n za la e xce p ció n n o ca p t u ra d a . Pu e d e s ve r la
in fo rm a ció n s o b re e l m a n e jo d e e xce p cio n e s e n Ja va e n Exce p cio n e s

El Método isAlive()
Un a ú lt im a p a la b ra s o b re e l e s t ra d o d e l t h re a d : e l in t e rfa ce d e
p ro g ra m a ció n d e la cla s e Th re a d in clu ye u n m é t o d o lla m a d o is Aliv e ( ) .
Es t e m é t o d o d e vu e lve t ru e s i e l t h re a d h a s id o a rra n ca d o y n o h a
p a ra d o . As í, s i e l m é t o d o is Aliv e ( ) d e vu e lve fa ls e s a b rá s q u e s e t ra t a d e
u n "Nu e vo t h re a d " o d e u n t h re a d "Mu e rt o ". Po r e l co n t ra rio s i d e vu e lve
t ru e s a b rá s q u e e l t h re a d e s á "Eje cu t a b le " o "No Eje cu t a b le ". No s e
p u e d e d ife re n cia r e n t re u n "Nu e vo t h re a d " y u n t h re a d "Mu e rt o ", co m o
t a m p o co s e p u e d e h a ce r e n t re u n t h re a d "Eje cu t a b le " y o t ro "No
Eje cu t a b le "

Oz it o
La Prioridad de un Thread
An t e rio rm e n t e e n e s t a le cció n , h e m o s re cla m a d o q u e lo s a p p le t s s e e je cu t e n d e fo rm a
co n cu rre n t e . Mie n t ra s co n ce p t u a lm e n t e e s t o e s cie rt o , e n la p rá ct ica n o lo e s . La
m a yo ría d e la s co n fig u ra cio n e s d e o rd e n a d o re s s ó lo t ie n e n u n a CPU, p o r e s o lo s t h re a d s
re a lm e n t e s e e je cu t a n d e u n o e n u n o d e fo rm a q u e p ro p o rcio n a n u n a ilu s ió n d e
co n cu rre n cia . La e je cu ció n d e va rio s t h re a d s e n u n a s o la CPU, e n a lg u n o s ó rd e n e s , e s
lla m a d a p ro g ra m a ció n . El s is t e m a d e e je cu ció n d e Ja va s o p o rt a u n a lg o rit m o d e
p ro g ra m a ció n d e t e rm in is t ico m u y s e n cillo co n o cid o co m o p ro g ra m a ció n d e p rio rid a d
fija . Es t e a lg o rit m o p ro g ra m a lo s t h re a d s b a s á n d o s e e n s u p rio rid a d re la t iva a o t ro s
t h re a d s "Eje cu t a b le s ".

Cu a n d o s e cre a u n t h re a d Ja va , h e re d a s u p rio rid a d d e s d e e l t h re a d q u e lo h a cre a d o .


Ta m b ié n s e p u e d e m o d ifica r la p rio rid a d d e u n t h re a d e n cu a lq u ie r m o m e n t o d e s p u é s
d e s u cre a cció n u t iliza n d o e l m é t o d o s e t P rio rit y ( ) . La s p rio rid a d e s d e u n t h re a d s o n
u n ra n g o d e e n t e ro s e n t re MIN_ PRIORITY y MAX_ PRIORITY ( co n s t a n t e s d e fin id a s e n la
cla s e Th re a d ) . El e n t e ro m á s a lt o , e s la p rio rid a d m á s a lt a . En u n m o m e n t o d a d o ,
cu a n d o va rio s t h re a d s e s t á lis t o s p a ra s e r e je cu t a d o s , e l s is t e m a d e e je cu ció n e lig e
a q u e llo s t h re a d "Eje cu t a b le s " co n la p rio rid a d m á s a lt a p a ra s u e je cu ció n . S ó lo cu a n d o
e l t h re a d s e p a ra , a b a n d o n a o s e co n vie rt e e n "No Eje cu t a b le " p o r a lg u n a ra zó n
e m p e za rá s u e je cu ció n u n t h re a d co n p rio rid a d in fe rio r. S i d o s t h re a d s co n la m is m a
p rio rid a d e s t á n e s p e ra n d o p o r la CPU, e l p ro g ra m a d o r e lig e u n o d e e llo s e n u n a fo rm a
d e co m p e t ició n . El t h re a d e le g id o s e e je cu t a rá h a s t a q u e o cu rra a lg u n a d e la s
s ig u ie n t e s co n d icio n e s :
● Un t h re a d co n p rio rid a d s u p e rio r s e vu e lve "Eje cu t a b le ".

● Ab a n d o n a , o s u m é t o d o ru n ( ) s a le .

● En s is t e m a s q u e s o p o rt a n t ie m p o - co m p a rt id o , s u t ie m p o h a e xp ira d o .

Lu e g o e l s e g u n d o t h re a d t ie n e u n a o p rt u n id a d p a ra e je cu t a rs e , y a s í co n t in u a m e n t e
h a s t a q u e e l in t e rp re t e a b a n d o n e .
El a lg o rit m o d e p ro g ra m a ció n d e t h re a d s d e l s is t e m a d e e je cu ció n d e Ja va t a m b ié n e s
p re e m p t iv o . S i e n cu a lq u ie r m o m e n t o u n t h re a d co n p rio rid a d s u p e rio r q u e t o d o s lo s
d e m á s s e vu e lve "Eje cu t a b le ", e l s is t e m a e lig e e l n u e vo t h re a d co n p rio rid a d m á s a lt a .
S e d ice q u e e l t h re a d co n p rio rid a d s u p e rio r p re va le ce s o b re lo s o t ro s t h re a d s .

Re g la d e l P u lg a r: En u n m o m e n t o d a d o , e l t h re a d co n p rio rid a d s u p e rio r s e e s t á


e je cu t a n d o . S in e m b a rg o , e s t e n o e s u n a g a ra n t ía . El p ro g ra m a d o r d e t h re a d s p o d ría
e le g ir o t ro t h re a d co n p rio rid a d in fe rio r p a ra e vit a r e l h a m b re . Po r e s t a ra zó n , e l u s o d e
la s p rio rid a d e s s ó lo a fe ct a a la p o lit ica d e l p ro g ra m a d o r p a ra p ro p ó s it o s d e e ficie n cia .
No d e p e n d a s d e la p rio rid a d d e lo s t h re a d s p a ra a lg o rit m o s in co rre ct o s .

La carrera de Threads
Es t e có d ig o fu e n t e Ja va im p le m e n t a u n a p p le t q u e a n im a u n a ca rre ra e n t re
d o s t h re a d s "co rre d o re s " co n d ife re n t e s p rio rid a d e s . Cu a n d o p u ls e s co n e l
ra t ó n s o b re e l a p p le t , a rra n ca n lo s d o s co rre d o re s . El co rre d o r s u p e rio r ,
lla m a d o "2 ", t ie n e u n a p rio rid a d 2 . El s e g u n d o co rre d o r, lla m a d o "3 ", t ie n e
u n a p rio rid a d 3 .
P ru e b a e s t o : Pu ls a s o b re e l a p p le t in fe rio r p a ra in icia r la ca rre ra .
Es t e e s e l m é t o d o ru n ( ) p a ra lo s d o s co rre d o re s .
public int tick = 1;
public void run() {
while (tick < 400000) {
tick++;
}
}
Es t e m é t o d o s ó lo cu e n t a d e s d e 1 h a s t a 4 0 0 . 0 0 0 . La va ria b le t ic k e s p ú b lica
p o rq u e la u t iliza e l a p p le t p a ra d e t e rm in a r cu a n t o h a p ro g re s a d o e l co rre d o r
( có m o d e la rg a e s s u lín e a ) .
Ad e m á s d e lo s d o s t h re a d s co rre d o re s , e l a p p le t t ie n e u n t e rce r t h re a d q u e
co n t ro la e l d ib u jo . El m é t o d o ru n ( ) d e e s t e t h re a d co n t ie n e u n b u cle in fin it o ;
d u ra n t e ca d a it e ra ció n d e l b u cle d ib u ja u n a lín e a p a ra ca d a co rre d o r ( cu ya
lo n g it u d s e ca lcu la m e d ia n t e la va ria b le t ic k ) , y lu e g o d u e rm e d u ra n t e 1 0
m ilis e g u n d o s . Es t e t h re a d t ie n e u n a p rio rid a d d e 4 - - s u p e rio r q u e la d e lo s
co rre d o re s . Po r e s o , s ie m p re q u e s e d e s p ie rt e ca d a 1 0 m ilis e g u n d o s , s e
co n vie rt e e n e l t h re a d d e m a yo r p rio rid a d , p re va le ce s o b re e l t h re a d q u e s e
e s t á e je cu t a n d o , y d ib u ja la s lín e a s . S e p u e d e ve r có m o la s lín e a s va n
a t ra ve s a n d o la p á g in a .
Co m o p u e d e s ve r, e s t o n o e s u n a ca rre ra ju s t a p o rq u e u n co rre d o r t ie n e m á s
p rio rid a d q u e e l o t ro . Ca d a ve z q u e e l t h re a d q u e d ib u ja a b a n d o n a la CPU
p a ra irs e a d o rm ir d u ra n t e 1 0 m ilis e g u n d o s , e l p ro g ra m a d o r e lig e e l t h re a d
e je cu t a b le co n u n a p rio rid a d s u p e rio r; e n e s t e ca s o , s ie m p re s e rá e l co rre d o r
lla m a d o "3 ". Aq u í t ie n e s o t ra ve rs ió n d e l a p p le t q u e im p le m e n t a u n a ca rre ra
ju s t a , e s t o e s , lo s d o s co rre d o re s t ie n e n la m is m a p rio rid a d y t ie n e n la s
m is m a s p o s ib ilid a d e s p a ra s e r e le g id o s .
P ru e b a e s t o : Pu ls a s o b re e l Ap p le t p a ra in icia r la ca rre ra .
En e s t a ca rre ra , ca d a ve z q u e e l t h re a d d e d ib u jo a b a n d o n a la CPU, h a y d o s
t h re a d s e je cu t a b le s co n ig u a l p rio rid a d - - lo s co rre d o re s - - e s p e ra n d o p o r la
CPU; e l p ro g ra m a d o r d e b e e le g ir u n o d e lo s t h re a d s . En e s t a s it u a ció n , e l
p ro g ra m a d o r e lig e e l s ig u ie n t e t h re a d e n u n a e s p e cie d e co m p e t ició n
d e p o rt iva .

Threads Egoistas
La cla s e Ru n n e r u t iliza d a e n la s ca rre ra s a n t e rio re s re a lm e n t e im p le m e n t e a
u n co m p o rt a m ie n d o "s o cia lm e n t e - p e rju d icio s o ". Re cu e rd a e l m é t o d o ru n ( )
d e la cla s e Ru n n e r u t iliza d o e n la s ca rre ra s :
public int tick = 1;
public void run() {
while (tick < 400000) {
tick++;
}
}
El b u cle w h ile d e l m é t o d o ru n ( ) e s t á e n u n m é t o d o a ju s t a d o . Es t o e s , u n a
ve z q u e e l p ro g ra m a d o r e lig e u n t h re a d co n e s t e cu e rp o d e t h re a d p a ra s u
e je cu ció n , e l t h re a d n u n ca a b a n d o n a vo lu n t a ria m e n t e e l co n t ro l d e la CPU - -
e l t h re a d s e co n t in ú a e je cu t a n d o h a s t a q u e e l b u cle w h ile t e rm in a
n a t u ra lm e n t e o h a s t a q u e e l t h re a d e s s u p e ra d o p o r u n t h re a d co n p rio rid a d
s u p e rio r.
En a lg u n a s s it u a cio n e s , t e n e r t h re a d s "e g o is t a s " n o ca u s a n in g ú n p ro b le m a
p o rq u e p re va le n ce n lo s t h re a d s co n p rio rid a d s u p e rio r ( co m o e l t h re a d d e l
d ib u jo p re va le ce s o b re s lo s t h re a d s e g o is t a s d e lo s co rre d o re s . S in e m b a rg o ,
e n o t ra s s it u a cio n e s , lo s t h re a d s co n m é t o d o s ru n ( ) a va ricio s o s d e CPU,
co m o lo s d e la cla s e Ru n n e r, p u e d e n t o m a r p o s e s ió n d e la CPU h a cie n d o q u e
o t ro s t h re a d s e s p e re n p o r m u ch o t ie m p o a n t e s d e o b t e n e r u n a o p o rt u n id a d
p a ra e je cu t a rs e .

Tiempo-Compartido
En s is t e m a s , co m o Win d o ws 9 5 , la lu ch a co n t ra e l co m p o rt a m ie n t o e g o is t a d e
lo s t h re a d s t ie n e u n a e s t ra t e g ia co n o cid a co m o t ie m p o - co m p a rt id o . Es t a
e s t ra t e g ia e n t ra e n ju e g o cu a n d o e xis t e n va rio s t h re a d s "Eje cu t a b le s " co n
ig u a l p rio rid a d y e s t o s t h re a d s s o n lo s q u e t ie n e n u n a p rio rid a d m a yo r d e lo s
q u e e s t á n co m p it ie n d o p o r la CPU. Po r e je m p lo , e s t e p ro g ra m a Ja va ( q u e
e s t á b a s a d o e n la ca rre ra d e Ap p le t s a n t e rio r) cre a d o s t h re a d s e g o is t a s co n
la m is m a p rio rid a d q u e t ie n e n e l s ig u ie n t e é t o d o ru n ( ) :
public void run() {
while (tick < 400000) {
tick++;
if ((tick % 50000) == 0) {
System.out.println("Thread #" + num + ", tick = " + tick);
}
}
}
Es t e m é t o d o co n t ie n e u n b u cle a ju s t a d o q u e in cre m e n t a e l e n t e ro t ic k y ca d a
5 0 . 0 0 0 t icks im p rim e e l in d e n t ifica d o r d e l t h re a d y s u co n t a d o r t ic k .
Cu a n d o s e e je cu t a e l p ro g ra m a e n u n s is t e m a co n t ie m p o - co m p a rt id o , ve rá s
lo s m e n s a je s d e lo s d o s t h re a d s , in t e rm it e n t e m e n t e u n o y o t ro . Co m o e s t o :
Thread #1, tick = 50000
Thread #0, tick = 50000
Thread #0, tick = 100000
Thread #1, tick = 100000
Thread #1, tick = 150000
Thread #1, tick = 200000
Thread #0, tick = 150000
Thread #0, tick = 200000
Thread #1, tick = 250000
Thread #0, tick = 250000
Thread #0, tick = 300000
Thread #1, tick = 300000
Thread #1, tick = 350000
Thread #0, tick = 350000
Thread #0, tick = 400000
Thread #1, tick = 400000
Es t o e s p o rq u e u n s is t e m a d e t ie m p o co m p a rt id o d ivid e la CPU e n e s p a cio s
d e t ie m p o e it e ra t iva m e n t e le d a a ca d a t h re a d co n p rio rid a d s u p e rio r u n
e s p a cio d e t ie m p o p a ra e je cu t a rs e . El s is t e m a d e t ie m p o co m p a rt id o it e ra a
t ra vé s d e lo s t h re a d s co n la m is m a p rio rid a d s u p e rio r o t o rg á n d o le s u n
p e q u e ñ o e s p a cio d e t ie m p o p a ra q u e s e e je cu t e n , h a s t a q u e u n o o m á s d e
e s t o s t h re a d s fin a liza n , o h a s t a q u e a p a re zca u n t h re a d co n p rio rid a d
s u p e rio r. Ob s e rva q u e e l t ie m p o co m p a rt id o n o o fre ce g a ra n t ia s s o b re la
fre cu e n cia y e l o rd e n e n q u e s e va n a e je cu t a r lo s t h re a d s .
Cu a n d o e je cu t e s e s t e p ro g ra m a e n u n s is t e m a s in t ie m p o co m p a rt id o , s in
e m b a rg o , ve ra s q u e lo s m e n s a je s d e u n t h re a d t e rm in a n d e im p rim ie rs e
a n t e s d e q u e e l o t ro t e n g a u n a o p o rt u n id a d d e m o s t ra r u n s ó lo m e n s a je .
Co m o e s t o :
Thread #0, tick = 50000
Thread #0, tick = 100000
Thread #0, tick = 150000
Thread #0, tick = 200000
Thread #0, tick = 250000
Thread #0, tick = 300000
Thread #0, tick = 350000
Thread #0, tick = 400000
Thread #1, tick = 50000
Thread #1, tick = 100000
Thread #1, tick = 150000
Thread #1, tick = 200000
Thread #1, tick = 250000
Thread #1, tick = 300000
Thread #1, tick = 350000
Thread #1, tick = 400000
Es t o e s p o rq u e e l s is t e m a s in t ie m p o co m p a rt id o e lig e u n o d e lo s t h re a d s co n
ig u a l p rio rid a d p a ra e je cu t a rlo y le p e rm it e e je cu t a rs e h a s t a q u e a b a n d o n e la
CPU o h a s t a q u e a p a re zca u n t h re a d co n p rio rid a d s u p e rio r.

N o t a : El s is t e m a d e e je cu ció n Ja va n o im p le m e n t a ( y p o r lo t a n t o n o
g a ra n t iza ) e l t ie m p o co m p a rt id o . S in e m b a rg o , a lg u n o s s is t e m a s e n lo s q u e
s e p u e d e e je cu t a r Ja va s i s o p o rt a n e l t ie m p o co m p a rt id o . Lo s p ro g ra m a s Ja va
n o d e b e ría n s e r re la t ivo s a l t ie m p o co m p a rt id o ya q u e p o d ría n p ro d u cir
re s u lt a d o s d ife re n t e s e n d is t in t o s s is t e m a s .
P ru e b a e s t o : Co m p ila y e je cu t a la s cla s e s Ra ce Te s t y S e lfis h Ru n n e r e n t u
o rd e n a d o r. ¿ Pu e d e s d e cir s i s u s is t e m a t ie n e t ie m p o co m p a rt id o ?
Co m o t e p u e d e s im a g in a r, e s crib ir có d ig o q u e h a g a u n u s o in t e n s ivo d e la
CPU p u e d e t e n e r re p e rcu s io n e s n e g a t iva s e n o t ro s t h re a d s q u e s e e je cu t a n
e n e l m is m o p ro ce s o . En g e n e ra l, s e d e b e ría in t e n t a r e s crib ir t h re a d s co n
"b u e n co m p o rt a m ie n t o " q u e a b a n d o n e n vo lu n t a ria m e n t e la CPU d e fo rm a
p e rió d ica y le d e n u n a o p o rt u n id a d a o t ro s t h re a d s p a ra q u e s e e je cu t e n . En
p a rt icu la r, n o e s crib a s n u n ca có d ig o Ja va q u e t ra t e co n t ie m p o co m p a rt id o - -
e s t o g a ra n t iza p rá ct ica m e n t e q u e t u p ro g ra m a d a rá d ife re n t e s re s u lt a d o s e n
d is t in t o s s is t e m a s d e o rd e n a d o r.
Un t h re a d p u e d e a b a n d o n a r la CPU ( s in ir a d o rm ir o a lg ú n o t ro m é t o d o
d rá s t ico ) co n u n a lla m a d a a l m é t o d o y ie ld ( ) . Es t e m é t o d o d a u n a
o p o rt u n id a d a o t ro s t h re a d s co n la m is m a p rio rid a d . S i n o e xis t e n o t ro s
t h re a d s co n la m is m a p rio rid a d e n e l e s t a d o "e je cu t a b le ", e s t e m é t o d o s e rá
ig n o ra d o .
P ru e b a e s t o : Re e s crib e la cla s e S e lfis h Ru n n e r p a ra q u e s e a u n Po lit e Ru n n e r
"Co rre d o r Ed u ca d o " m e d ia n t e u n a lla m a d a a l m é t o d o y ie ld ( ) d e s d e e l
m é t o d o ru n ( ) . As e g u re s e d e m o d ifica r e l p ro g ra m a p rin cip a l p a ra cre a r
Po lit e Ru n n e rs e n ve z d e S e lfis h Ru n n e rs . Co m p ila y e je cu t a la s n u e va s cla s e s
e n t u o rd e n a d o r. ¿ No e s t á m e jo r a h o ra ?

Sumario
● La m a yo ría d e lo s o rd e n a d o re s s ó lo t ie n e n u n a CPU, lo s t h re a d s d e b e n co m p a rt ir
la CPU co n o t ro s t h re a d s . La e je cu ció n d e va rio s t h re a s e n u n s ó lo CPU, e n
cu a lq u ie r o rd e n , s e lla m a p ro g ra m a ció n . El s is t e m a d e e je cu ció n Ja va s o p o rt a u n
a lg o rit m o d e p ro g ra m a ció n d e t e rm in ís t ico q u e e s co n o cid o co m o p ro g ra m a ció n d e
p rio rid a d fija .
● A ca d a t h re a d Ja va s e le d a u n a p rio rid a d n u m é rica e n t re MIN_ PRIORITY y
MAX_ PRIORITY ( co n s t a n t e s d e fin id a s e n la cla s e Th re a d ) . En u n m o m e n t o d a t o ,
cu a n d o va rio s t h re a d s e s t á n lis t o s p a ra e je cu t a rs e , e l t h re a d co n p rio rid a d s u p e rio r
s e rá e l e le g id o p a ra s u e je cu ció n . S ó lo cu a n d o e l t h re a d p a ra o s e s u s p e n d e p o r
a lg u n a ra zó n , s e e m p e za rá a e je cu t a r u n t h re a d co n p rip o rid a d in fe rio r.
● La p ro g ra m a ció n d e la CPU e s t o t a lm e n t e p re e m p t iva . S i u n t h re a d co n p rio rid a d
s u p e rio r q u e e l q u e s e e s t á e je cu t a n d o a ct u a lm e n t e n e ce s it a e je cu t a rs e , t o m a
in m e d ia t a m e n t e p o s e s ió n d e l co n t ro l s o b re la CPU.
● El s is t e m a d e e je cu ció n d e Ja va n o h a ce a b a n d o n a r a u n t h re a d e l co n t ro l d e la
CPU p o r o t ro t h re a d co n la m is m a p rio rid a d . En o t ra s p a la b ra s , e l s is t e m a d e
e je cu ció n d e Ja va n o co m p a rt e e l t ie m p o . S in e m b a rg o , a lg u n o s s is t e m a s s i lo
s o p o rt a n p o r lo q u e n o s e d e b e e s crib ir có d ig o q u e e s t é re la cio n a d o co n e l t ie m p o
co m p a rt id o .
● Ad e m á s , u n t h re a d cu a lq u ie ra , e n cu a lq u ie r m o m e n t o , p u e d e ce d e r e l co n t ro l d e la
CPU lla m a n d o a l m é t o d o y ie ld ( ) . Lo s t h re a d s s ó lo p u e d e n 'p re s t a r' la CPU a o t ro s
t h re a d s co n la m is m a p rio rid a q u e é l - - in t e n t a r ce d e rle la CPU a u n t h re a d co n
p rio rid a d in fe rio r n o t e n d rá n in g ú n e fe ct o .
● Cu a n d o t o d o s lo s t h re a d s "e je cu t a b le s " d e l s is t e m a t ie n e n la m is m a p rio rid a d , e l
p ro g ra m a d o r e lig e a u n o d e e llo s e n u n a e s p e cie d e o rd e n d e co m p e t ició n .

Oz it o
Threads Servidores
Cu a lq u ie r t h re a d Ja va p u e d e s e r u n t h re a d d a e m o n "S e rvid o r". Lo s t h re a d s
d a e m o n p ro p o rcio n a n s e rvicio s p a ra o t ro s t h re a d s q u e s e e s t á n e je cu t a n d o e n e l
m is m o p ro ce s o q u e é l. Po r e je m p lo , e l n a ve g a d o r Ho t Ja va u t iliza cu a t ro t h re a d s
d a e m o n lla m a d o s "Im a g e Fe t ch e r" p a ra b u s ca r im á g e n e s e n e l s is t e m a d e fich e ro s
e n la re d p a ra lo s t h re a d s q u e la s n e ce s it e n . El m é t o d o ru n ( ) d e u n t h re a d
d a e m o n n o rm a lm e n t e e s u n b u cle in fin it o q u e e s p e ra u n a p e t ició n d e s e rvicio .
Cu a n d o e l ú n ico t h re a d e n u n p ro ce s o e s u n t h re a d d a e m o n , e l in t e rp re t e s a le .
Es t o t ie n e s e n t id o p o rq u e a l p e rm a n e ce r s ó lo e l t h re a d d a e m o n , n o e xis t e n in g ú n
o t ro t h re a d a l q u e p o d e r p ro p o rcin a le u n s e rvicio .
Pa ra e s p e cifica r q u e u n t h re a d e s u n t h re a d d a e m o n , s e lla m a a l m é t o d o
s e t D a e m o n ( ) co n e l a rg u m e n t o t ru e . Pa ra d e t e rm in a r s i u n t h re a d e s u n t h re a d
d a e m o n s e u t iliza e l m é t o d o a cce s o r is D a e m o n ( ) .

Oz it o
Grupos de Threads
Ca d a t h re a d d e Ja va e s m ie m b ro d e u n g ru p o d e t h re a d s . Lo s g ru p o s p ro p o rcio n a n u n
m e ca n is m o p a ra la co le cció n d e va rio s t h re a d s d e n t ro d e u n s ó lo o b je t o y la
m a n ip u la ció n d e e s o s t h re a d s d e u n a ve z, m e jo r q u e d e fo rm a in d ivid u a l. Po r e je m p lo ,
s e p u e d e a rra n ca r o s u s p e n d e r t o d o s lo s t h re a d s d e u n g ru p o co n u n a s ó la lla m a d a a u n
m é t o d o . Lo s g ru p o s d e t h re a d s d e Ja va e s t á n im p le m e n t a d o s p o r la cla s e Th re a d Gro u p
d e l p a q u e t e ja va . la n g .
El s is t e m a d e e je cu ció n p o n e u n t h re a d d e n t ro d e u n g ru p o d u ra n t e s u co n s t ru cció n .
Cu a n d o s e cre a u n t h re a d , t a m b ié n s e p u e d e p e rm it ir q u e e l s is t e m a d e e je cu ció n p o n g a
e l n u e vo t h re a d e n a lg ú n g ru p o p o r d e fe ct o ra zo n a b le o s e p u e d e e s p e cifica r
e xp licit a m e n t e e l g ru p o d e l n u e vo t h re a d . El t h re a d e s u n m ie m b ro p e rm a n e n t e d e l
g ru p o a l q u e s e u n ió d u ra n t e s u cre a cció n - - n o s e p u e d e m o ve r u n t h re a d a o t ro g ru p o
d e s p u é s d e h a b e r s id o cre a d o .

El Grupo de Threads por Defecto


S i s e cre a u n n u e vo Th re a d s in e s p e cifica r s u g ru p o e n e l co n s t ru ct o r, e l
s is t e m a d e e je cu ció n a u t o m á t ica m e n t e s it ú a e l n u e vo t h re a d e n e l m is m o
g ru p o q u e d e l t h re a d q u e lo cre ó ( co n o cid o co m o e l g ru p o d e t h re a d s a ct u a l y
e l t h re a d a ct u a l, re s p e ct iva m e n t e ) . En t o n ce s , s i s e d e ja s in e s p e cifica r e l
g ru p o d e t h re a d s cu a n d o s e cre a u n t h re a d , ¿ q u é g ru p o co n t ie n e e l t h re a d ?
Cu a n d o s e a rra n ca p o r p rim e ra ve z u n a a p lica ció n Ja va , e l s is t e m a d e
e je cu ció n cre a u n Th re a d Gro u p lla m a d o "m a in ". En t o n ce s , a m e n o s q u e s e
e s p e cifiq u e o t ra co s a , t o d o s lo s n u e vo s t h re a d s q u e s e cre e n s e co n vie rt e n e n
m ie m b ro s d e l g ru p o d e t h re a d s "m a in ".

N o t a : S i s e cre a u n t h re a d d e n t ro d e u n a p p le t , e l g ru p o d e l n u e vo t h re a d
p o d ría s e r d is t in t o d e "m a in " - - d e p e n d e d e l n a ve g a d o r o d e l vis u a liza d o r
d o n d e s e e s t é e je cu t a n d o a l a p p le t . Pu e d e s re fe rirs e a Th re a d s e n Ap p le t s
p a ra o b t e n e r m á s in fo rm a ció n s o b re lo s g ru p o s d e t h re a d s e n lo s a p p le t s .

Mu ch o s p ro g ra m a d o re s ja va ig n o ra n p o r co m p le t o lo s g ru p o s d e t h re a d s y
p e rm it e n a l s is t e m a d e e je cu ció n q u e m a n e je t o d o s lo d e t a lle s co n re s p e ct o a
lo s g ru p o s d e t h re a d s . S in e m b a rg o , s i t u p ro g ra m a cre a m u ch o s t h re a d s q u e
d e b e n s e r m a n ip u la d o s co m o u n g ru p o , o s i e s t á s im p le m e n t a n d o u n
Co n t ro la d o r d e S e g u rid a d d e clie n t e , p ro b a b le m e n t e q u e rrá s m á s co n t ro l s o b re
lo s g ru p o s d e t h re a d s . Co n t in ú e le ye n d o p a ra m á s d e t a lle s !

Crear un Thread en un Grupo Específico


Co m o s e m e n cio n ó a n t e rio rm e n t e , u n t h re a d e s u n m ie m b ro p e rm a n e n t e d e l
g ru p o a l q u e s e u n ió cu a n d o fu e cre a d o - - n o s e p u e d e m o ve r u n t h re a d a o t ro
g ru p o d e s p u e s d e h a b e r s id o cre a d o . As í, s i s e d e s e a p o n e r s i n u e vo t h re a d e n
u n g ru p o d is t in t o a l d e d e fe ct o , s e d e b e e s p e cifica r e xp lícit a m e n t e e l g ru p o e n
q u e cre a r e l t h rre a d . La cla s e Th re a d t ie n e t re s co n s t ru ct o re s q u e p e rm it e n
s e le ccio n a r u n n u e vo g ru p o d e t h re a d s :
public Thread(ThreadGroup grupo, Runnable fuente)
public Thread(ThreadGroup grupo, String nombre)
public Thread(ThreadGroup grupo, Runnable fuente, String nombre)
Ca d a u n o d e e s t o s co n s t ru ct o re s cre a u n n u e vo t h re a d , lo in icia liza b a s a n d o s e
e n lo s p a rá m e t ro s Ru n n a b le y S t rin g , y lo h a ce m ie m b ro d e l g ru p o
e s p e cifica d o . Po r e je m p lo , e l s ig u ie n t e e je m p lo cre a u n g ru p o d e t h re a d s
( m iGru p o D e Th re a d ) y lu e g o cre a u n t h re a d ( m iTh re a d ) e n e s e g ru p o .
ThreadGroup miGrupoDeThread = new ThreadGroup("Mi Grupo de Threads");
Thread miThread = new Thread(miGrupoDeThread, "un thread de mi grupo");
El Th re a d Gro u p p a s a d o a l co n s t ru ct o r d e l Th re a d n o t ie n e q u e s e r
n e ce s a ria m e n t e u n g ru p o q u e h a ya s cre a d o - - p u e d e s e r u n g ru p o cre a d o p o r
e l s is t e m a d e e je cu ció n Ja va , o u n g ru p o cre a d o p o r la a p lica ció n d o n d e s e
e s t á e je cu t a n d o e l a p p le t .

Obtener el Grupo de un Thread


Pa ra e n co n t ra r e l g ru p o e n e l q u e e s t á u n t h re a d , p u e d e lla m a r a s u m é t o d o
g e t Th re a d Gro u p ( ) .
theGroup = miThread.getThreadGroup();

La Clase ThreadGroup
Un a ve z q u e o b t e n id o e l Gru p o d e u n t h re a d , p u e d e s p e d ir m á s in fo rm a ció n
s o b re e l g ru p o , co m o cu á n t o s t h re a d s m á s h a y e n e l g ru p o . Ta m b ié n s e
p u e d e n m o d ifica r t o d o s lo s t h re a d s d e l g ru p o ( co m o s u s p e n d e rlo s , p a ra rlo s ,
e t c. . . ) co n u n a s o la lla m a d a a u n m é t o d o .

Oz it o
La Clase ThreadGroup
La cla s e Th re a d Gro u p m a n e ja g ru p o s d e t h re a d s p a ra la s a p lica cio n e s Ja va . Un Th re a d Gro u p p u e d e
co n t e n e r cu a lq u ie r n ú m e ro d e t h re a d s . Lo s t h re a d s d e u n g ru p o g e n e ra lm e n t e e s t á n ; re la cio n a d o s d e
a lg u n a fo rm a , co m o p o r q u ié n fu e ro n cre a d o s , q u é fu n ció n re a liza n o cu á n d o d e b e n a rra n ca r o p a ra r.
Un t h re a d Gro u p n o s ó lo p u e d e co n t e n e r t h re a d s , t a m b ié n p u e d e co n t e n e r o t ro s Th re a d Gro u p s . El g ru p o
p rin cip a l e n u n a a p lica ció n Ja va e s e l g ru p o d e t h re a d s lla m a d o "m a in ". S e p u e d e n cre a r t h re a d s y
g ru p o s d e t h re a d s d e n t ro d e l g ru p o "m a in ". Ta m b ié n s e p u e d e n cre a r t h re a d s y g ru p o s d e t h re a d s
d e n t ro d e s u b g ru p o s d e "m a in " y a s í s u ce s iva m e n t e . Es t o re s u lt a e n u n a h e re n cia d e l t ip o ra iz d e lo s
t h re a d s y lo s g ru p o s d e t h re a d s .
La cla s e Th re a d Gro u p t ie n e m é t o d o s q u e p u e d e n s e r ca t e g o riza d o s d e la s ig u ie n t e fo rm a :

Métodos de Manejo de la Colección


El Th re a d Gro u p p ro p o rcio n a u n ju e g o d e m é t o d o s q u e m a n e ja lo s t h re a d s y lo s s u b g ru p o s
d e n t ro d e u n g ru p o y p e rm it e q u e o t ro s o b je t o s le p re g u n t e n a Th re a d Gro u p s o b re s u
co n t e n id o . Po r e je m p lo , s e p u e d e lla m a r a l m é t o d o a c t iv e Co u n t ( ) p a ra e n co n t ra r e l n ú m e ro
d e t h re a d s a ct ivo s a ct u a lm e n t e d e n t ro d e l g ru p o . Es t e m é t o d o s e u t iliza fre cu e n t e m e n t e co n
e l m é t o d o e n u m e ra t e ( ) p a ra o b t e n e r u n a rra y co n la s re fe re n cia s d e t o d o s lo s t h re a d s
a ct ivo s e n e l Th re a d Gro u p . Po r e je m p lo , e l m é t o d o lis t Cu rre n t Th re a d s ( ) d e l s ig u ie n t e
e je m p lo re lle n a u n a rra y co n t o d o s lo s t h re a d s a ct ivo s e n e l g ru p o a ct u a l e im p im e s u s
n o m b re s :
class EnumerateTest {
void listCurrentThreads() {
ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
int numThreads;
Thread[] listOfThreads;

numThreads = currentGroup.activeCount();
listOfThreads = new Thread[numThreads];
currentGroup.enumerate(listOfThreads);
for (int i = 0; i < numThreads; i++) {
System.out.println("Thread #" + i + " = " + listOfThreads[i].getName());
}
}
}
Ot ro s m é t o d o s d e m a n e jo d e la co le cció n p ro p o rcio n a d o s p o r la cla s e Th re a d Gro u p in clu ye n
a c t iv e Gro u p Co u n t ( ) y lis t ( ) .

Métodos que Operan sobre el Grupo


La cla s e Th re a d Gro u p s o p o rt a va rio s a t rib u t o s q u e s o n s e le ccio n a d o s y re cu p e ra d o s p a ra e l
g ru p o e n s u t o t a lid a d . Es t o s a t rib u t o s in clu ye n la p rio rid a d m á xim a q u e u n t h re a d p u e d e t e n e r
d e n t ro d e l g ru p o , s i e l g ru p o e s u n g ru p o "d a e m o n ", e l n o m b re d e l g ru p o , y e l n o m b re d e l
p a d re d e l g ru p o .
Lo s m é t o d o s q u e s e le ccio n a n y o b t ie n e n e s t o s a t rib u t o s o p e ra n a n ive l d e g ru p o . Es t o e s ,
p u e d e n in s p e ccio n a r e l a t rib u t o d e l o b je t o Th re a d Gro u p , p e ro n o a fe ct a n a lo s t h re a d s q u e
h a y d e n t ro d e l g ru p o . El s ig u ie n t e lis t a d o m u e s t ra lo s m é t o d o s d e Th re a d Gro p u p q u e o p e ra n a
n ive l d e g ru p o :
● g e t Ma x P rio rit y ( ) , y s e t Ma x P rio rit y ( )

● g e tDa e m o n ( ) , y s e tDa e m o n ( )

● g e tNa m e ( )

● g e t P a re n t ( ) , y p a re n t Of( )
● t o S t rin g ( )
As í, p o r e je m p lo , cu a n d o s e u t iliza s e t Ma x P rio rit y ( ) p a ra ca m b ia r la p rio rid a d m á xim a d e l
g ru p o , s ó lo e s t á ca m b ia n d o e l a t rib u t o e n e l g ru p o , n o e s t á ca m b ia n d o la p rio rid a d d e n in g u n o
d e lo s t h re a d d e l g ru p o . Co n s id e re m o s e s t e p e q u e ñ o p ro g ra m a q u e cre a u n g ru p o y u n t h re a d
d e n t ro d e é l:
class MaxPriorityTest {
public static void main(String[] args) {

ThreadGroup groupNORM = new ThreadGroup(


"Un grupo con prioridad normal");
Thread priorityMAX = new Thread(groupNORM,
"Un thread con prioridad máxima");

// Selecciona la prioridad del thread al máximo (10)


priorityMAX.setPriority(Thread.MAX_PRIORITY);

// Selecciona la prioridad del grupo a normal (5)


groupNORM.setMaxPriority(Thread.NORM_PRIORITY);

System.out.println("Máxima prioridad del grupo = " +


groupNORM.getMaxPriority());
System.out.println("Prioridad del Thread = " +
priorityMAX.getPriority());
}
}
Cu a n d o s e cre a e l g ru p o g ro u p N ORM h e re d a s u a t rib u t o d e p rio rid a d m á xim a d e s d e s u g ru p o
p a d re . En e s t e ca s o , la p rio rid a d d e l g ru p o p a d re e s la m á xim a ( MAX_ PRIORITY) p e rm it id a
p o r e l s is t e m a d e e je cu ió n d e Ja va . Lu e g o e l p ro g ra m a s e le ccio n a la p rio rid a d d e l t h re a d
p rio rit y MAX a l m á xim o p e rm it id o p o r e l s is t e m a Ja va . Lu e g o e l p ro g ra m a b a ja la p rio rid a d
d e l g ru p o a n o rm a l ( NORM_ PRIORITY) . El m é t o d o s e t Ma x P rio rit y ( ) n o a fe ct a a la p rio rid a d
d e l t h re a d p rio rit y MAX, p o r e s o e n e s t e p u n t o , e l t h re a d p rio rit y MAX t ie n e n u n p rio rid a d d e
1 0 q u e e s m a yo r q u e la p rio rid a d m á xim a d e s u g ru p o g ro u p N ORM. Es t a e s la s a lid a d e l
p ro g ra m a :
Prioridad máxima del Grupo = 5
Prioridad del Thread = 10
Co m o p u e d e s ve r u n t h re a d p u e d e t e n e r u n a p rio rid a d s u p e rio r q u e e l m á xim o p e rm it id o p o r
s u g ru p o s ie m p re q u e la p rio rid a d d e l t h re a d s e h a ya s e le ccio n a d o a n t e s d e h a b e r b a ja d o la
p rio rid a d m á xim a d e l g ru p o . La p rio rid a d m á xim a d e u n g ru p o d e t h re a d s s e u t iliza p a ra
lim it a r la p rio rid a d d e lo s t h re a d s cu a n d o s o n cre a d o s d e n t ro d e u n g ru p o o cu a n d o s e u t iliza
s e t P rio rit y ( ) p a ra ca m b ia r la p rio rid a d d e l t h re a d . Ob s e rva q u e s e t Ma x P rio rit y ( ) t a m b ié n
ca m b ia la p rio rid a d m á xim a d e t o d o s s u s s u b g ru p o s .
S in e m b a rg o , e l e s t a d o d a e m o n d e u n g ru p o s ó lo s e a p lica a l g ru p o . Ca m b ia r e l e s t a d o
d a e m o n d e u n g ru p o n o a fe ct a a l e s t a d o d a e m o n d e lo s t h re a d s q u e h a y d e n t ro d e l g ru p o .
Ad e m á s , e l e s t a d o d a e m o n d e u n g ru p o n o im p lica d e n in g u n a fo rm a e l e s t a d o d a e m o n d e s u s
t re a d s - - s e p u e d e p o n e r cu a lq u ie r t h re a d d e n t ro d e u n g ru p o d e t h re a d s d a e m o n . El d a e m o n
d e u n g ru p o d e t h re a d s s ó lo im p lica q u e e l g ru p o p u e d e s e r d e s t ru id o cu a n d o t o d o s lo s
t h re a d s s e h a n t e rm in a d o .

Métodos que Operan con Todos los Threads de un Grupo.


La cla s e Th re a d Gro u p t ie n e t re s m é t o d o s q u e le p e rm it e n m o d ifica r e l e s t a d o a ct u a l d e t o d o s
lo s t h re a d s d e u n g ru p o .
● re s u m e ( )

● s to p( )

● s us pe nd( )
Es t o s m é t o d o s a p lica n e l ca m b io d e e s t a d o a p ro p ia d o a t o d o s lo s t h re a d s d e l g ru p o y s u s
s u b g ru p o s .

Métodos de Restricción de Acceso


La cla s e Th re a d Gro u p p o r s i m is m a n o im p o n e n in g u n a re s t ricció n d e a cce s o , co m o p e rm it ir
q u e lo s t h re a d s d e u n g ru p o p u e d a n in s p e ccio n a r o m e d ifica r t h re a d s d e u n g ru p o d ife re n t e .
Ma s b ie n la s cla s e s Th re a d y Th re a d Gro u p co o p e ra n co n lo s m a n e ja d o re s d e s e g u rid a d
( s u b cla s e s d e la cla s e ja va . la n g . S e cu rit yMa n a g e r) , q u e p u e d e im p o n e r re s t riccio n e s d e a cce s o
b a s á n d o s e e n lo s m ie m b ro s d e u n g ru p o d e t h re a d s .
La s cla s e s Th re a d y t h re a d Gro u p t ie n e n u n m é t o d o , c h e c k Ac c e s s ( ) , q u e lla m a a l m é t o d o
c h e c k Ac c e s s ( ) d e l co n t ro la d o r d e s e g u rid a d a ct u a l. El co n t ro la d o r d e s e g u rid a d d e cid e s i
p e rm it e e l a cce s o b a s á n d o s e e n lo s m ie m b ro s d e l g ru p o d e t h re a d s in vo lu cra d o . S i e l a cce s o
n o e s t á p e rm it id o , e l m é t o d o c h e c k Ac c e s s ( ) la n za u n a e xce p ció n S e cu rit yExce p t io n . De o t ro
m o d o e l m é t o d o c h e c k Ac c e s s ( ) s im p le m e n t e re t o rn a .
La s ig u ie n t e lis t a m u e s t ra va rio s m é t o d o s d e Th re a d Gro u p q u e lla m a n a c h e c k Ac c e s s ( )
a n t e s d e re a liza r la a cció n d e l m é t o d o . Es t o s e co n o ce co m o a cce s o re g u la d o , e s t o e s , a cce s o s
q u e d e b e n s e r a p ro b a d o s p o r e l co n t ro la d o r d e s e g u rid a d a n t e s d e p o d e r s e r co m p le t a d o s .
● Th re a d Gro u p ( Th re a d Gro u p p a d r e , S t rin g n o m b r e )

● s e t D a e m o n ( b o o le a n is D a e m o n )

● s e t Ma x P rio rit y ( in t m a x P r io r it y )

● s to p( )

● s us pe nd( )

● re s u m e ( )

● d e s t ro y ( )

Es t a e s u n a lis t a d e m é t o d o s d e la cla s e Th re a d q u e lla m a n a c h e c k Ac c e s s ( ) a n t e s d e


p ro ce d e r:
● Co n s t ru ct o re s q u e e s p e cifica n u n g ru p o d e t h re a d s .

● s to p( )

● s us pe nd( )

● re s u m e ( )

● s e t P rio rit y ( in t p r io r it y )

● s e t N a m e ( S t rin g n a m e )

● s e t D a e m o n ( b o o le a n is D a e m o n )

Un a a p lica ció n Ja va s o lit a ria n o t ie n e u n co n t ro la d o r d e s e g u rid a d p o r d e fe ct o . Es t o e s , p o r


d e fe ct o , n o s e im p o n e n re s t riccio n e s a n in g ú n t h re a d p a ra q u e p u e d a in s p e ccio n a r o m o d ifica r
cu a lq u ie r o t ro t h re a d , s in im p o rt a r e l g ru p o e n e l q u e s e e n cu e t ra . S e p u e d e d e fin ir e
im p le m e n t a r p ro p ia s re s t riccio n e s d e a cce s o p a ra lo s g ru p o s d e t h re a d s m e d ia n t e la
s u b cla s ifica ció n d e la cla s e S e cu rit yMa n a g e r, s o b re e s crib ie n d o lo s m é t o d o s a p ro p ia d o s , e
in s t a la n d o lo co m o e l co n t ro la d o r d e s e g u rid a d p a ra s u a p lica ció n .
El n a ve g a d o r Ho t Ja va e s u n e je m p lo d e a p lica ció n q u e im p le m e n t a s u p ro p io co n t ro la d o r d e
s e g u rid a d . Ho t Ja va n e ce s it a a s e g u ra rs e d e q u e lo s a p p le t s t e n g a n u n b u e n co m p o rt a m ie n t o y
n o h a g a n co s a s s u cia s a o t ro s a p p le t s q u e s e e s t á n e je cu t a n d o a l m is m o t ie m p o ( co m o b a ja r
la p rio rid a d d e o t ro s t h re a d s d e o t ro s a p p le t s ) . El co n t ro la d o r d e s e g u rid a d d e Ho t Ja va n o
p e rm it e q u e u n t h re a d m o d ifiq u e t h re a d s d e o t ro g ru p o . Po r fa vo r, o b s e rva q u e la s
re s t riccio n e s d e a cce s o b a s a d a s e n lo s g ru p o s d e t h re a d s p u e d e n va ria r d e u n n a ve g a d o r a
o t ro y p o r e s o t u s a p p le t s p u e d e n t e n e r co m p o rt a m ie n t o s d ife re n t e s e n d ife re n t e s
n a ve g a d o re s .

Oz it o
Programas con Varios Threads
Sincronización de Threads
Fre cu e n t e m e n t e , lo s t h re a d s n e ce s it a n co m p a rt ir d a t o s . Po r e je m p lo ,
s u p o n g a m o s q u e e xis t e u n t h re a d q u e e s crib e d a t o s e n u n fich e ro
m ie n t ra s , a l m is m o t ie m p o , o t ro t h re a d e s t á le ye n d o e l m is m o fich e ro .
Cu a n d o lo s t h re a d s co m p a rt e n in fo rm a ció n n e ce s it a n s icro n iza rs e p a ra
o b t e n e r lo s re s u lt a d o s d e s e a d o s .

Imparcialidad, Hambre y Punto Muerto


S i s e e s crib e u n p ro g ra m a e n e l q u e va rio s t h re a d s co n cu rre n t e s d e b e n
co m p e t ir p o r lo s re cu rs o s , s e d e b e t o m a r la s p re ca u cio n e s n e ce s a ria s
p a ra a s e g u ra rs e la ju s t icia . Un s is t e m a e s ju s t o cu a n d o ca d a t h re a d
o b t ie n e s u ficie n t e a cce s o a lo s re cu rs o s lim it a d o s co m o p a ra t e n e r u n
p ro g re s o ra zo n a b le . Un s is t e m a ju s t o p re vie n e e l h a m b re y e l p u n t o
m u e rt o . El h a m b re o cu rre cu a n d o u n o o m á s t h re a d s d e u n p ro g ra m a
e s t á n b lo q u e a d o s p o r g a n a r e l a cce s o a u n re cu rs o y a s í n o p u e d e n
p ro g re s a r. El p u n t o m u e rt o e s la ú lt im a fo rm a d e h a m b re ; o cu rre cu a n d o
d o s o m á s t h re a d s e s t á n e s p e ra n d o u n a co n d ició n q u e n o p u e d e s e r
s a t is fe ch a . El p u n t o m u e rt o o cu rre m u y fre cu e n t e m e n t e cu a n d o d o s ( o
m á s ) t h re a d s e s t á n e s p e ra n d o a q u e e l o t ro u o t ro s h a g a a lg o .

Volatile
Lo s p ro g ra m a s p u e d e n m o d ifica r va ria b le s m ie m b ro s fu e ra d e la
p ro t e cció n d e u n m é t o d o o u n b lo q u e s in cro n iza d o s y p u e d e d e cla ra r q u e
la va ria b le m ie m b ro e s v o la t ile .
S i u n a va ria b le m ie m b ro e s d e cla ra d a co m o vo la t ile , e l s is t e m a d e
e je cu ció n Ja va u t iliza e s t a in fo rm a ció n p a ra a s e g u ra rs e q u e la va ria b le
s e a ca rg a d a d e s d e la m é m o ria a n t e s d e ca d a u s o , y a lm a ce n a d a e n la
m e m o ria d e s p u é s d e u t iliza rla . Es t o a s e g u ra q u e e l va lo r d e la va ria b le
e s co n s is t e n t e y co h e re n t e a lo la rg o d e l p ro g ra m a .

Oz it o
Sincronización de Threads
La s le ccio n e s a n t e rio re s co n t e n ía n e je m p lo s co n t h re a d s a s ín cro n o s e in d e p e n d ie n t e s . Es t o e s , ca d a
t h re a d co n t e n ía t o d o s lo s d a t o s y m é t o d o s n e ce s a rio s y n o re q u e ria n re cu rs o s e xt e rn o s . Ad e m á s , lo s
t h re a d s d e e s o s e je m p lo s s e e je cu t a b a n e n s u p ro p io e s p a cio s in co n ce rn ir s o b re e l e s t a d o o a ct ivid a d
d e o t ro s t h re a d s q u e s e e je cu t a b a n d e fo rm a co n cu rre n t e .
S in e m b a rg o , e xis t e n m u ch a s s it u a cio n e s in t e re s a n t e s d o n d e e je cu t a r t h re a d s co n cu rre n t e s q u e
co m p a rt a n d a t o s y d e b a n co n s id e ra r e l e s t a d o y a ct ivid a d d e o t ro s t h re a d s . Es t e co n ju n t o d e s it u a cio n e s
d e p ro g ra m a ció n s o n co n o cid o s co m o e s ce n a rio s 'p ro d u ct o r/ co n s u m id o r'; d o n d e e l p ro d u ct o r g e n e ra u n
ca n a l d e d a t o s q u e e s co n s u m id o p o r e l co n s u m id o r.
Po r e je m p lo , p u e d e s im a g in a r u n a a p lica ció n Ja va d o n d e u n t h re a d ( e l p ro d u ct o r) e s crib e d a t o s e n u n
fich e ro m ie n t ra s q u e u n s e g u n d o t h re a d ( e l co n s u m id o r) le e lo s d a t o s d e l m is m o fich e ro . O s i t e cle a s
ca ra ct e re s e n e l t e cla d o , e l t h re a d p ro d u ct o r s it u a la s p u ls a cio n e s e n u n a p ila d e e ve n t o s y e l t h re a d
co n s u m id o r le e lo s e ve n t o s d e la m is m a p ila . Es t o s d o s e je m p lo s u t iliza n t h re a d s co n cu rre n t e s q u e
co m p a rt e n u n re cu rs o co m ú n ; e l p rim e ro co m p a rt e u n fich e ro y e l s e g u n d o u n a p ila d e e ve n t o s . Co m o
lo s t h re a d s co m p a rt e n u n re cu rs o co m ú n , d e b e n s in cro n iza rs e d e a lg u n a fo rm a .
Es t a le cció n e n s e ñ a la s in cro n iza ció n d e t h re a d s Ja va m e d ia n t e u n s e n cillo e je m p lo d e
p ro d u ct o r/ co n s u m id o r.

El Ejemplo Productor/Consumidor
El Pro d u ct o r g e n e ra u n e n t e ro e n t re 0 y 9 ( in clu s ive ) , lo a lm a ce n a e n u n o b je t o "Cu b b yHo le ",
e im p rim e e l n ú m e ro g e n e ra d o . Pa ra h a ce r m á s in t e re s a n t e e l p ro b le m a d e la s in cro n iza ció n ,
e l p ro d cu t o r d u e rm e d u ra n t e u n t ie m p o a le a t o rio e n t re 0 y 1 0 0 m ilis e g u n d o s a n t e s d e re p e t ir
e l ciclo d e g e n e ra ció n d e n ú m e ro s :
class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;

public Producer(CubbyHole c, int number) {


cubbyhole = c;
this.number = number;
}

public void run() {


for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("Productor #" + this.number + " pone: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
}
}
}
}
El Co n s u m id o r, e s t á n d o h a m b rie n t o , co n s u m e t o d o s lo s e n t e ro s d e Cu b b yHo le ( e xa ct a m e n t e n
e l m is m o o b je t o e n q u e e l p ro d u ct o r p u s o lo s e n t e ro s e n p rim e r lu g a r) t a n rá p id a m e n t e co m o
e s t é n d is p o n ib le s .
class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;

public Consumer(CubbyHole c, int number) {


cubbyhole = c;
this.number = number;
}

public void run() {


int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("Consumidor #" + this.number + " obtiene: " + value);
}
}
}
En e s t e e je m p lo e l Pro d u ct o r y e l Co n s u m id o r co m p a rt e n d a t o s a t ra vé s d e u n o b je t o
Cu b b y Ho le co m ú n . Ob s e rva rá a q u e n in g u n o d e lo s d o s h a ce n in g ú n e s fu e rzo s e a e l q u e s e a
p a ra a s e g u ra rs e d e q u e e l co n s u m id o r o b t ie n e ca d a va lo r p ro d u cid o u n a y s ó lo u n a ve z. La
s in cro n iza ció n e n t re e s t o s d o s t h re a d s re a lm e n t e o cu rre a u n n ive l in fe rio r, d e n t ro d e lo s
m é t o d o s g e t ( ) y p u t ( ) d e l o b je t o Cu b b yHo le . S in e m b a rg o , a s u m a m o s p o r u n m o m e n t o q u e
e s t o s d o s t h re a d s n o e s t á n s in cro n iza d o s y ve a m o s lo s p ro b le m a s p o t e n cia le s q u e p o d ría
p ro vo ca r e s t a s it u a ció n .
Un p ro b le m a s e ría cu a n d o e l Pro d u ct o r fu e ra m á s rá p id o q u e e l Co n s u m id o r y g e n e ra ra d o s
n ú m e ro s a n t e s d e q u e e l Co n s u m id o r t u vie ra u n a p o s ib ilid a d d e co n s u m ir e l p rim e r n ú m e ro .
As í e l Co n s u m id o r s e s a lt a ría u n n ú m e ro . Pa rt e d e la s a lid a s e p o d ría p a re ce r a e s t o :
. . .
Consumidor #1 obtiene: 3
Productor #1 pone: 4
Productor #1 pone: 5
Consumidor #1 obtiene: 5
. . .
Ot ro p ro b le m a p o d ría a p a re ce r s i e l co n s u m id o r fu e ra m á s rá p id o q u e e l Pro d u ct o r y
co n s u m ie ra e l m is m o va lo r d o s o m á s ve ce s . En e s t a s it u a ció n e l Co n s u m id o r im p rim irá e l
m is m o va lo r d o s ve ce s y p o d ría p ro d u cir u n a s a lid a co m o e s t a :
. . .
Productor #1 pone: 4
Consumidor #1 obtiene: 4
Consumidor #1 obtiene: 4
Productor #1 pone: 5
. . .
De cu a lq u ie r fo rm a , e l re s u lt a d o e s e rró n e o . S e q u ie re q u e e l co n s u m id o r o b t e n g a ca d a e n t e ro
p ro d u cid o p o r e l Pro d u ct o r y s ó lo u n a ve z. Lo s p ro b le m a s co m o lo s e s crit o s a n t e rio rm e n t e , s e
lla m a n co n d icio n e s d e ca rre ra . S e a lca n za n cu a n d o va rio s t h re a d s e je cu t a d o s a s ín cro n a m e n t e
in t e n t a n a cce d e r a u n m is m o o b je t o a l m is m o t ie m p o y o b t ie n e n re s u lt a d o s e rró n e o s .
Pa ra p re ve n ir e s t a s co n d icio n e s e n n u e s t ro e je m p lo Pro d u ct o r/ Co n s u m id o r, e l
a lm a ce n a m ie n t o d e u n n u e vo e n t e ro e n Cu b b yHo le p o r e l Pro d u ct o r d e b e e s t a r s in cro n iza d o
co n la re cu p e ra ció n d e l e n t e ro p o r p a rt e d e l Co n s u m id o r. El Co n s u m id o r d e b e co n s u m ir ca d a
e n t e ro e xa ct a m e n t e u n a ve z. El p ro g ra m a Pro d u ct o r/ Co n s u m id o r u t iliza d o s m e ca n is m o s
d ife re n t e s p a ra s in cro n iza r lo s t h re a d s Pro d u ce r y Co n s u m e r; lo s m o n it o re s , y lo s m é t o d o s
n o t ify ( ) y w a it ( ) .

Monitores
Lo s o b je t o s , co m o e l Cu b b yHo le q u e s o n co m p a rt id o s e n t re d o s t h re a d s y cu yo a cce s o d e b e
s e r s in cro n iza d o s o n lla m a d o s co n d icio n e s v a ria b le s . El le n g u a je Ja va p e rm it e s in cro n iza r
t h re a d s a lre d e d o r d e u n a co n d ició n va ria b le m e d ia n t e e l u s o d e m o n it o re s . Lo s m o n it o re s
p re vie n e n q u e d o s t h re a d s a cce d a n s im u lt á n e a m e n t e a la m is m a va ria b le .
Los métodos notify() y wait()
En u n n ive l s u p e rio r, e l e je m p lo Pro d u ct o r/ Co n s u m id o r u t iliza lo s m é t o d o s n o t ify ( ) y w a it ( )
d e l o b je t o p a ra co o rd in a r la a ct iva d a d d e lo s d o s t h re a d s . El o b je t o Cu b yHo le u t iliza n o t ify ( )
y w a it ( ) p a ra a s e g u ra rs e d e q u e ca d a va lo r s it u a d o e n é l p o r e l Pro d u ct o r e s re cu p e ra d o u n a
ve z y s ó lo u n a p o r e l Co n s u m id o r.

El programa Principal
Aq u í t ie n e s u n a p e q u e ñ a a p lica ció n Ja va q u e cre a u n o b je t o Cu b b yHo le , u n Pro d u ce r, u n
Co n s u m e r y a rra n ca lo s d o s t h re a d s .
class ProducerConsumerTest {
public static void main(String[] args) {
CubbyHole c = new CubbyHole();
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1);

p1.start();
c1.start();
}
}

La Salida
Aq u í t ie n e s la s a lid a d e l p ro g ra m a Pro d u ce rCo n s u m e rTe s t .
Producer #1 pone: 0
Consumidor #1 obtiene: 0
Productor #1 pone: 1
Consumidor #1 obtiene: 1
Productor #1 pone: 2
Consumidor #1 obtiene: 2
Productor #1 pone: 3
Consumidor #1 obtiene: 3
Productor #1 pone: 4
Consumidor #1 obtiene: 4
Productor #1 pone: 5
Consumidor #1 obtiene: 5
Productor #1 pone: 6
Consumidor #1 obtiene: 6
Productor #1 pone: 7
Consumidor #1 obtiene: 7
Productor #1 pone: 8
Consumidor #1 obtiene: 8
Productor #1 pone: 9
Consumidor #1 obtiene: 9

Oz it o
Monitores Java
El le n g u a je Ja va y e l s is t e m a d e e je cu ció n s o p o rt a n la s in cro n iza xió n d e t h re a d s
m e d ia n t e e l u s o d e m o n it o re s . En g e n e ra l, u n m o n it o r e s t á a s o cia d o co n u n o b je t o
e s p e cifico ( u n a co n d ició n va ria b le ) y fu n cio n a co m o u n b lo q u e o p a ra e s e d a t o .
Cu a n d o u n t h re a d m a n t ie n e e l m o n it o r p a ra a lg ú n d a t o d e l o b je t o , lo s o t ro s
t h re a d s e s t á n b lo q u e a d o s y n o p u e d e n n i in s p e ccio n a r n i m o d ifica r e l d a t o .
Lo s s e g m e n t o s d e có d ig o d e n t ro d e p ro g ra m a q u e a cce d e n a l m is m o d a t o d e n t ro
d e t h re a d s co n cu rre n t e s s e p a ra d o s s o n co n o cid o s co m o s e ccio n e s crít ica s . En e l
le n g u a je Ja va , s e p u e d e n m a rca r la s s e ccio n e s crít ica s d e l p ro g ra m a co n la p a la b ra
cla ve s y n c h ro n iz e d .
N o t a : Ge n e ra lm e n t e , la s e cció n crít ica s e n lo s p ro g ra m a s Ja va s o n m é t o d o s . S e
p u e d e n m a rca r s e g m e n t o s p e q u e ñ o s d e có d ig o co m o s in cro n iza d o s . S in e m b a rg o ,
e s t o vio la lo s p a ra d ig m a s d e la p ro g ra m a ció n o rie n t a d a a o b je t o s y p ro d u ce u n
có d ig o q u e e s d íficil d e le e r y d e m a n t e n e r. Pa ra la m a yo ría d e lo s p ro p ó s it o s d e
p ro g ra m a ció n e n Ja va , e s m e jo r u t iliza r s y n c h ro n iz e d s ó lo a n ive l d e m é t o d o s .
En e l le n g u a je Ja va s e a s o cia u n ú n ico m o n it o r co n ca d a o b je t o q u e t ie n e u n
m é t o d o s in cro n iza d o . La cla s e Cu b b yHo le d e l e je m p lo Pro d u ce r/ Co n s u m e r d e la
p á g in a a n t e rio r t ie n e d o s m é t o d o s s in cro n iza d o s : e l m é t o d o p u t ( ) , q u e s e u t iliza
p a ra ca m b ia r e l va lo r d e Cu b b yHo le , y e l m é t o d o g e t ( ) , q u e s e u t iliza p a ra e l
re cu p e ra r e l va lo r a ct u a l. As í e l s is t e m a a s o cia u n ú n ico m o n it o r co n ca d a e je m p la r
d e Cu b b yHo le .
Aq u í t ie n e s e l có d ig o fu e n t e d e l o b je t o Cu b b yHo le . La s lín e a s e n n e g rit a
p ro p o rcio n a n la s in cro n iza ció n d e lo s t h re a d s :
class CubbyHole {
private int contents;
private boolean available = false;

public synchronized int get() {


while (available == false) {
try {
wait();
} catch (InterruptedException e) {
}
}
available = false;
notify();
return contents;
}

public synchronized void put(int value) {


while (available == true) {
try {
wait();
} catch (InterruptedException e) {
}
}
contents = value;
available = true;
notify();
}
}
La cla s e Cu b b y Ho le t ie n e d o s va ria b le s p riva d a s : c o n t e n t s , q u e e s e l co n t e n id o
a ct u a l d e Cu b b yHo le , y la va ria b le b o o le a n a a v a ila b le , q u e in d ica s i s e p u e d e
re cu p e ra r e l co n t e n id o d e Cu b b yHo le . Cu a n d o a v a ila b le e s ve rd a d e ra in d ica q u e e l
Pro d u ct o r h a p u e s t o u n n u e vo va lo r e n Cu b b yHo le y q u e e l Co n s u m id o r t o d a vía n o
la h a co n s u m id o . El Co n s u m id o r s ó lo p u e d e co n s u m ir e l va lo r d e Cu b b yHo le cu a n d o
a v a ila b le e s ve rd a d e ra .
Co m o Cu b b yHo le t ie n e d o s m é t o d o s s in cro n iza d o s , ja va p ro p o rcio n a u n ú n ico
m o n it o r p a ra ca d a e je m p la r d e Cu b b yHo le ( in clu ye n d o e l co m p a rt id o p o r e l
Pro d u ct o r y e l Co n s u m id o r) . S ie m p re q u e e l co n t ro l e n t ra e n u n m é t o d o
s in cro n iza d o , e l t h re a d q u e h a lla m a d o e l m é t o d o a d q u ie re e l m o n it o r d e l o b je t o
cu yo m é t o d o h a s id o lla m a d o . Ot ro s t h re a d s n o p u e d e n lla m a r a u n m é t o d o
s in cro n iza d o d e l m is m o o b je t o h a s t a q u e e l m o n it o r s e a lib e ra d o .

N o t a : Lo s Mo n it o re s Ja va s o n Re - e n t ra n t e s . Es t o e s , e l m is m o t h re a d p u e d e lla m a r
a u n m é t o d o s in cro n iza d o d e u n o b je t o p a ra e l q u e ya t ie n e e l m o n it o r, e s d e cir,
p u e d e re - a d q u irir e l m o n it o r.

As í, s ie m p re q u e e l Pro d u ct o r lla m a a l m é t o d o p u t ( ) d e Cu b b yHo le , a d q u ie re e l


m o n it o r d e l o b je t o Cu b b yHo le , y a s í e vit a q u e e l co n s u m id o r p u e d a lla m a r a l
m é t o d o g e t ( ) d e Cu b b yHo le . ( El m é t o d o w a it ( ) lib e ra t e m p o ra lm e n t e e l m o n it o r
co m o s e ve rá m á s a d e la n t e ) .
public synchronized void put(int value) {
// El productor adquiere el monitor
while (available == true) {
try {
wait();
} catch (InterruptedException e) {
}
}
contents = value;
available = true;
notify();
// El productor libera el monitor
}
Cu a n d o e l m é t o d o p u t ( ) re t o rn a , e l Pro d u ct o r lib e ra e l m o n it o r y p o r lo t a n t o
d e s b lo q u e a e l o b je t o Cu b b yHo le .
S ie m p re q u e e l Co n s u m id o r lla m a a l m é t o d o g e t ( ) d e Cu b b yHo le , a d q u ie re e l
m o n it o r d e e s e o b je t o y p o r lo t a n t o e vit a q u e e l p ro d u ct o r p u e d a lla m a r a l m é t o d o
put( ) .
public synchronized int get() {
// El consumidor adquier el monitor
while (available == false) {
try {
wait();
} catch (InterruptedException e) {
}
}
available = false;
notify();
return contents;
// el Consumidor libera el monitor
}
La a d q u is ició n y lib e ra ció n d e l m o n it o r la h a ce a u t o m á t ica m e n t e e l s is t e m a d e
e je cu ció n d e Ja va . Es t o a s e g u ra q u e n o p u e d a n o cu rrir co n d icio n e s d e co m p e t ició n
e n la im p le m e n t a ció n d e lo s t h re a d s , a s e g u ra n d o la in t e g rid a d d e lo s d a t o s .
P ru e b a e s t o : Elim in a la s lín e a s q u e e s t á n e n n e g rit a e n e l lis t a d o d e la cla s e
Cu b b yHo le m o s t ra d a a rrib a . Re co m p ila e l p ro g ra m a y e je cu t a lo d e n u e vo . ¿ Qu é
s u ce d e ? Co m o n o s e h a re a liza d o n in g ú n e s fu e rzo e xp lícit o p a ra s icro n iza r lo s
t h re a d s , e l Co n s u m id o r co n s u m e co n u n a b a n d o n o t e m e ra rio y o b t ie n e s ó lo u n a
ris t ra d e ce ro s , e n lu g a r d e o b t e n e r lo s e n t e ro s e n t re 0 y 9 e xa ct a m e n t e u n a ve z
ca d a u n o .

Oz it o
Los Monitores Java son Re-entrantes
El s is t e m a d e e je cu ció n d e Ja va p e rm it e q u e u n t h re a d re - a d q u ie ra e l m o n it o r q u e
ya p o s e e re a lm e n t e p o rq u e lo s m o n it o re s Ja va s o n re - e n t ra n t e s . Lo s m o n it o re s
re - e n t ra n t e s s o n im p o rt a n t e s p o rq u e e lim in a n la p o s ib ilid a d d e q u e u n s ó lo t h re a d
p o n g a e n p u n t o m u e rt o u n m o n it o r q u e ya p o s e e .
Co n s id e re m o s e s t a cla s e :
class Reentrant {
public synchronized void a() {
b();
System.out.println("Estoy aquí, en a()");
}
public synchronized void b() {
System.out.println("Estoy aquí, en b()");
}
}
Es t a cla s e co n t ie n e d o s m é t o d o s s in cro n iza d o s : a ( ) y b ( ) . El p rim e r m é t o d o
s in cro n iza d o , lla m a a l o t ro m é t o d o s in cro n iza d o .
Cu a n d o e l co n t ro l e n t ra e n e l m é t o d o a ( ) , e l t h re a d a ct u a l a d q u ie re e l m o n it o r d e l
o b je t o Re e n t ra n t . Ah o ra , a ( ) lla m a a b ( ) y co m o t a m b ié n e s t á s in cro n iza d o e l
t h re a d t a m b ié n in t e n t a a d q u irir e l m o n it o r d e n u e vo . Co m o Ja va s o p o rt a lo s
m o n it o re s re - e n t ra n t e s , e s t o s i fu n cio n a . El t h re a d a ct u a l p u e d e a d q u irir d e n u e vo
e l m o n it o r d e l o b je t o Re e n t ra n t y s e e je cu t a n lo s d o s m é t o s o a ( ) y b ( ) , co m o
e vid e n cia la s a lid a d e l p ro g ra m a :
Estoy aquí, en b()
Estoy aquí, en a()
En s is t e m a s q u e n o s o p o rt a n m o n it o re s re - e n t ra n t e s , e s t a s e cu e n cia d e lla m a d a s a
m é t o d o s ca u s a ría u n p u n t o m u e rt o .

Oz it o
Los Métodos notify() y wait()
Lo s m é t o d o s g e t ( ) y p u t ( ) d e l o b je t o Cu b b yHo le h a ce n u s o d e lo s m é t o d o s n o t ify ( ) y w a it ( ) p a ra
co o rd in a r la o b t e n ció n y p u e s t a d e va lo re s d e n t ro d e Cu b b yHo le . Lo s m é t o d o s n o t ify ( ) y w a it ( )
s o n m ie m b ro s d e la cla s e ja va . la n g . Ob je ct .

N o t a : Lo s m é t o d o s n o t ify ( ) y w a it ( ) p u e d e n s e r in vo ca d o s s ó lo d e s d e d e n t ro d e u n m é t o d o
s in cro n iza d o o d e n t ro d e u n b lo q u e o u n a s e n t e n cia s in cro n iza d a .

In ve s t ig u e m o s e l u s o d e l m é t o d o n o t ify ( ) e n Cu b b yHo le m ira n d o e l m é t o d o g e t ( ) .

El método notify()
El m é t o d o g e t ( ) lla m a a l m é t o d o n o t ify ( ) co m o lo ú lt im o q u e h a ce ( ju n t o re t o rn a r) . El
m é t o d o n o t ify ( ) e lig e u n t h re a d q u e e s t á e s p e ra n d o e l m o n it o r p o s e id o p o r e l t h re a d
a ct u a l y lo d e s p ie rt a . No rm a lm e n t e , e l t h re a d q u e e s p e ra ca p t u ra rá e l m o n it o r y
p ro ce d e rá .
El ca s o d e l e je m p lo Pro d u ct o r/ Co n s u m id o r, e l t h re a d Co n s u m id o r lla m a a l m é t o d o g e t ( ) ,
p o r lo q u e e l m é t o d o Co n s u m id o r p o s e e e l m o n it o r d e Cu b b yHo le d u ra n t e la e je cu ció n d e l
m é t o d o g e t ( ) . Al fin a l d e l m é t o d o g e t ( ) , la lla m a d a a l m é t o d o n o t ify ( ) d e s p ie rt a a l
t h re a d Pro d u ct o r q u e o b t ie n e e l m o n it o r d e Cu b b yHo le y p ro ce d e .
public synchronized int get() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) {
}
}
available = false;
notify(); // lo notifica al Productor
return contents;
}
S i e xis t e n va rio s t h re a d s e s p e ra n d o p o r u n m o n it o r, e l s is t e m a d e e je cu ció n Ja va e lig e
u n o d e e s o s t h re a d s , s in n in g ú n co m p ro m is o n i g a ra n t ía s o b re e l t h re a d q u e s e rá e lig id o .
El m é t o d o p u t ( ) t ra b a ja d e u n fo rm a s im ila r a g e t ( ) , d e s p e rt a n t o a l t h re a d co n s u m id o r
q u e e s t á e s p e ra n d o q u e e l Pro d u ct o r lib e re e l m o n it o r.
La cla s e Ob je ct t ie n e o t ro m é t o d o - - n o t ify All( ) - - q u e d e s p ie rt a t o d o s lo t h re a d s q u e
e s t á n e s p e ra n d o a l m is m o m o n it o r. En e s t a S it u a ció n , lo s t h re a d s d e s p e rt a d o s co m p it e n
p o r e l m o n it o r. Un o d e e llo s o b t ie n e e l m o n it o r y lo s o t ro s vu e lve n a e s p e ra r.

El método wait()
El m é t o d o w a it ( ) h a ce q u e e l t h re a d a ct u a l e s p e re ( p o s ib le m e n t e p a ra s ie m p re ) h a s t a
q u e o t ro t h re a d s e lo n o t ifiq u e o a q u e ca m b ie u n co n d ició n . S e u t iliza e l m é t o d o w a it ( )
e n co n ju n ció n co n e l m é t o d o n o t ify ( ) p a ra co o rd in a r la a ct ivid a d d e va rio s t h re a d s q u e
u t iliza n lo s m is m o s re cu rs o s .
El m é t o d o g e t ( ) co n t ie n e u n a s e n t e n cia w h ile q u e h a ce u n b u cle h a s t a q u e a v a ila b le s e
co n vie rt e e n t ru e . S i a v a ila b le e s fa ls e - - e l Pro d u ct o r t o d a vía n o h a p ro d u cid o u n n u e vo
n ú m e ro y e l co n s u m id o r d e b e e s p e ra r - - e l m é t o d o g e t ( ) lla m a a w a it ( ) .
El b u cle w h ile co n t ie n e la lla m a d a a w a it ( ) . El m é t o d o w a it ( ) e s p e ra in d e fin id a m e n t e
h a s t a q u e lle g u e u n a n o t ifica ció n d e l t h re a d Pro d u ct o r. Cu a n d o e l m é t o d o p u t ( ) lla m a a
n o t ify ( ) , e l Co n s u m id o r d e s p ie rt a d e l e s t a d o d e e s p e ra y co n t in ú a co n e l b u cle .
Pre s u m ib le m e n t e , e l Pro d u ct o r ya h a g e n e ra d o u n n u e vo n ú m e ro y e l m é t o d o g e t ( ) ca e
a l fin a l d e l b u cle y p ro ce d e . S i e l Pro d u ct o r n o h a g e n e ra d o u n n u e vo n ú m e ro , g e t ( )
vu e lve a l p rin cip io d e l b u cle y co n t in u a e s p e a n d o h a s t a q u e e l Pro d u ct o r g e n e re u n n u e vo
n ú m e ro y lla m e a n o t ify ( ) .
public synchronized int get() {
while (available == false) {
try {
wait(); // espera una llamada a notify() desde el Productor
} catch (InterruptedException e) {
}
}
available = false;
notify();
return contents;
}
El m é t o d o p u t ( ) t ra b a ja d e u n fo rm a s im ila r, e s p e ra n d o a q u e e l t h re a d Co n s u m id o r
co n s u m a e l va lo r a ct u a l a n t e s d e p e rm it ir q u e e l Pro d u ct o r g e n e re u n o n u e vo .
Ju n t o a la ve rs ió n u t iliza d a e n e l e je m p lo d e Pro d u ct o r/ Co n s u m id o r, q u e e s p e ra
in d e fin id a m e n t e u n a n o t ifica ció n , la cla s e Ob je ct co n t ie n e o t ra s d o s ve rs io n e s d e l m é t o d o
w a it ( ) :
w a it ( lo n g t im e o u t )
Es p e ra u n a n o t ifica ció n o h a s t a q u e h a ya p a s a d o e l t ie m p o d e e s p e ra - - t im e o u t s e
m id e e n m ilis e g u n d o s .
w a it ( lo n g t im e o u t , in t n a n o s )
Es p e ra u n a n o t ifica ció n o h a s t a q u e h a ya n p a s a d o t im e o u t m ilis e g u n d o s m a s n a n o s
na nose gundos.

Los Monitores y los Métodos notify() y wait()


Ha b ra s o b s e rva d o u n p ro b le m a p o t e n cia l e n lo s m é t o d o s p u t ( ) y g e t ( ) d e Cu b b yHo le . Al
p rin cip io d e l m é t o d o g e t ( ) , s i e l va lo r d e Cu b b yHo le n o e s t á d is p o n ib le ( e s t o e s , e l
Pro d u ct o r n o h a g e n e ra d o u n n u e vo n ú m e ro d e s d e la ú lt im a ve z q u e e l Co n s u m id o r lo
co n s u m ió ) , lu e g o e l Co n s u m id o r e s p e ra a q u e e l Pro d u ct o r p o n g a u n n u e vo n ú m e ro e n
Cu b b yHo le . Aq u í e s t á la cu e s t ió n - - ¿ có m o p u e d e e l Pro d u ct o r p o n e r u n n u e vo va lo r
d e n t ro d e Cu b b yHo le s i e l Co n s u m id o r t ie n e e l m o n it o r? ( El Co n s u m id o r p o s e e e l m o n it o r
d e Cu b b yHo le p o rq u e e s t á d e n t ro d e l m é t o d o g e t ( ) q u e e s t á s in cro n iza d o ) .
S im ila rm e n t e , a l p rin cip io d e l m é t o d o p u t ( ) , s i t o d a vía n o s e h a co n s u m id o e l va lo r, e l
Pro d u ct o r e s p e ra a q u e e l Co n s u m id o r co n s u m a e l va lo r d e l Cu b b yHo le . Y d e n u e vo
lle g a m o s a la cu e s t ió n - - ¿ Có m o p u e d e e l co n s u m id o r o b t e n e r e l va lo r d e Cu b b yHo le , s i e l
Pro d u ct o r p o s e e e l m o n it o r? ( El p ro d u ct o r p o s e e e l m o n it o r d e Cu b b yHo le p o rq u e e s t á
d e n t ro d e n t ro d e l m é t o d o p u t ( ) q u e e s t á s in cro n iza d o ) .
Bie n , lo s d is e ñ a d o re s d e l le n g u a je Ja va t a m b ié n p e n s a ro n e n e s t o . Cu a n d o e l t h re a d
e n t ra e n e l m é t o d o w a it ( ) , lo q u e s u ce d e a l p rin cip io d e lo s m é t o d o s p u t ( ) y g e t , e l
m o n it o r e s lib e ra d o a u t o m á t ica m e n t e , y cu a n d o e l t h re a d s a le d e l m é t o d o w a it ( ) , s e
a d q u ie re d e n u e vo e l m o n it o r. Es t o le d a u n a o p o rt u n id a d a l o b je t o q u e e s t á e s p e ra n d o
d e a d q u irir e l m o n it o r y, d e p e n d ie n d o , d e q u ié n e s t á e s p e ra n d o , co n s u m e e l va lo r d e
Cu b b yHo le o p ro d u ce u n n u e vo va lo r p a ra e l Cu b b yHo le .
Oz it o
Cambios en el JDK 1.1:
Que afectan a los Threads de Control
Lo s Ap p le t s d e Ord e n a c ió n
Lo s a p p le t s d e o rd e a n ció n u t iliza n m é t o d o s d e l AWT ca d u ca d o s . Pu e d e s
ve r Ca m b io s e n e l JDK 1 . 1 : Ap p le t d e Ord e n a ció n .
El Ap p le t d e l Re lo j
El e je m p lo d e l Re lo j u t iliza m é t o d o s ca d u ca d o s d e la cla s e Da t e . Pu e d e s
ve r Ca m b io s e n e l JDK 1 . 1 : El Ap p le t d e l Re lo j.
La c a rre a d e Th re a d s
El e je m p lo Ra ce Ap p le r u t iliza m é t o d o s ca d u ca d o s d e l AWT. Pu e d e s ve r
Ca m b io s e n e l JDK 1 . 1 : Ca rre ra d e Ap p le t s .
Gru p o s d e Th re a d s
S e h a a ñ a d id o u n m é t o d o a la cla s e s Th re a d Gro u p :
Allo w Th re a d S u s p e n s io n . Pu e d e s ve r Ca m b io s e n e l JDK 1 . 1 : La cla s e
Th re a d Gro u p .

Oz it o
Los Canales de Entrada y Salida
Mu ch o s p ro g ra m a s Ja va n e ce s it a n le e r o e s crib ir d a t o s .

D e fin ic ió n : Un s t re a m ( o ca n a l) e s u n flu jo s e cu e n cia l d e ca ra ct e re s .

Un p ro g ra m a p u e d e le e r la e n t ra d a d e s d e u n a fu e n t e d e d a t o s le ye n d o u n a
s e cu e n cia d e ca ra ct e s d e s d e u n ca n a l a g re g a d o a la fu e n t e . Un p ro g ra m a p u e d e
p ro d u cir u n a s a lid a e s crib ie n d o u n a s e cu e n cia d e ca ra ct e re s e n u n ca n a l a g re g a d o
a l d e s t in o . El e n t o rn o d e d e s a rro llo d e Ja va in clu ye u n p a q u e t e , ja va . io , q u e
co n t ie n e u n ju e g o d e ca n a le s d e e n t ra d a y s a lid a q u e lo s p ro g ra m a s p u e d e n u t iliza r
p a ra le e r y e s crib ir d a t o s . La s cla s e s In p u t S t re a m y Ou t p u t S t re a m d e l p a q u e t e
ja va . io s o n s u p e rcla s e s a b s t ra ct a s q u e d e fin e n e l co m p o rt a m ie n t o d e lo s ca n a le s
d e I/ O s e cu e n cia le s d e Ja va . ja va . io t a m b ié n in clu ye m u ch a s s u b cla s e s d e
Im p u t S t re a m y Ot p u t S t re a m q u e im p le m e n t a n t ip o s e s p e cifico s d e ca n a le s d e I/ O.
Es t a le cció n e xp lica q u e h a ce ca d a u n a d e la s cla s e s d e l p a q u e t e ja va . io , có m o
d e cid ir cu a l u t iliza r, có m o u t iliza rla s , y có m o s u b cla s ifica rla s p a ra e s crib ir s u s
p ro p ia s cla s e s d e ca n a le s .
Ya q u e e s t a le cció n n o t ie n e u n e je m p lo p a ra ca d a t ip o d e ca n a l d e I/ O d is p o n ib le
e n e l p a q u e t e ja va . io , p ro p o rcio n a m u ch o s e je m p lo s p rá ct ico s d e có m o u t iliza r la s
cla s e s m á s p o p u la re s d e e s t e p a q u e t e .

Co n s id e ra c io n e s d e S e g u rid a d : La e n t ra d a y s a lid a e n e l s is t e m a lo ca l d e
fich e ro s e s t á s u je t a a la a p ro b a ció n d e l co n t ro la d o r a ct u a l d e s e g u rid a d . Lo s
p ro g ra m a s d e e je m p lo co n t e n id o s e n e s t a s le ccio n e s s o n a p lica cio n e s s o lit a ria s ,
q u e p o r d e fe ct o , n o t ie n e n co n t ro la d o r d e s e g u rid a d . S i in t e n t a s e je cu t a r e s t e
có d ig o e n a p p le t s p o d ría n o fu n cio n a r, d e p e n d ie n d o d e l n a ve g a d o r e n q u e s e e s t é
e je cu t a n d o . Pu e d e ve r En t e n d e r la s Ca p a cid a d e s y Re s t riccio n e s d e lo s Ap p le t s
p a ra o b t e n e r in fo rm a ció n s o b re la s re s t riccio n e s d e s e g u rid a d e n lo s a p p le t s .

Oz it o
Primer Encuentro con la I/O en Java
S i h a s e s t a d o u t iliza n d o lo s ca n a le s d e e n t ra d a y s a lid a e s t a n d a rd , e n t o n ce s h a s
u t iliza d o , q u izá s s in s a b e rlo , lo s ca n a le s d e I/ O d e l p a q u e t e ja va . io .
Es t e p ro g ra m a d e e je m p lo u t iliza S y s t e m . o u t . p rin t ln ( ) p a ra im p rim ir e l t e xt o "Ho la
Mu n d o !" e n la p a n t a lla .
class HelloWorldApp {
public static void main (String[] args) {
System.out.println("Hola Mundo!");
}
}
S y s t e m . o u t s e re fie re a u n ca n a l d e s a lid a m a n e ja d o p o r la cla s e S ys t e m q u e
im p le m e n t a e l ca n a l d e s a lid a e s t a n d a rd . S y s t e m . o u t e s u n e je m p la r d e la cla s e
Prin t S t re a m d e fin id a e n e l p a q u e t e ja va . io . La cla s e Prin t S t re a m e s u n Ou t p u t S t re a m
m u y s e n cillo d e u t iliza r. S im p le m e n t e lla m a a u n o d e s u s m é t o d o s p rin t ( ) , p rin t ln ( ) ,
o w rit e ( ) p a ra e s crib ir va rio s t ip o s d e d a t o s e n e l ca n a l.
Prin t S t re a m p e rt e n e ce a l co n ju n t o d e ca n a le s co n o cid o s co m o ca n a le s filt ra d o s q u e s e
cu b re n m á s a d e la n t e e n e s t a le cció n .
S im ila rm e n t e , e s t e p ro g ra m a d e e je m p lo e s t á e s t ru ct u ra d o u t iliza n d o
S y s t e m . in . re a d ( ) p a ra le e r lo s ca ra ct e re s t e cle a d o s p o r e l u s u a rio .
class Count {
public static void main(String[] args)
throws java.io.IOException
{
int count = 0;

while (System.in.read() != -1)


count++;
System.out.println("La entrada tiene " + count + " caracteres.");
}
}
S y s t e m . in s e re fie re a u n ca n a l d e e n t ra d a m a n e ja d o p o r la cla s e S ys t e m q u e
im p le m e n t a e l ca n a l d e e n t ra d a e s t a n d a rd . S y s t e m . in e s u n o b je t o In p u t S t re a m .
In p u t S t re a m e s u n a cla s e a b s t ra ct a d e fin id a e n e l p a q u e t e ja va . io q u e d e fin e e l
co m p o rt a m ie n t o d e lo s ca n a le s s e cu e n cia le s d e e n t ra d a d e Ja va . To d o s lo s ca n a le s d e
e n t ra d a d e fin id o s e n e l p a q u e t e ja va . io s o n s u b cla s e s d e In p u t S t re a m . In p u t S t re a m
d e fin e u n it e rfa ce d e p ro g ra m a ció n p a ra lo s ca n a le s d e e n t ra d a q u e in clu ye m é t o d o s
p a ra le e r d a t o s d e s d e e l ca n a l, m a rca r u n a p o s ició n d e n t ro d e l ca n a l, s a lt a r a u n a
m a rca , y ce rra r e l ca n a l.
Co m o h a s vis t o , ya e s t á s fa m ilia riza d o co n a lg u n o s ca n a le s d e I/ O d e l p a q u e t e ja va . io .
El re s t o d e e s t a le cció n in t ro d u ce lo s ca n a le s d e l p a q u e t e ja va . io ( in clu ye n d o lo s
ca n a le s m e n cio n a d o s e n e s t a p á g in a : Prin t S t re a m , Ou t p u t S t re a m e In p u t S t re a m ) y
m u e s t ra có m o u t iliza rlo s .
Oz it o
Introducción a los Canales de I/O
El p a q u e t e ja va . io co n t ie n e d o s cla s e s , In p u t S t re a m y Ou t p u t S t re a m , d e la s q u e
d e riva n la m a yo ría d e la s cla s e s d e e s t e p a q u e t e .
La cla s e In p u t S t re a m e s u n a s u p e rcla s e a b s t ra ct a q u e p ro p o rcio n a u n in t e rfa ce d e
p ro g ra m a ció n m ín im o y u n a im p le m e n t a ció n p a rcia l d e l ca n a l d e e n t ra d a . La cla s e
In p u t S t re a m d e fin e m é t o d o s p a ra le e r b yt e s o a rra ys d e b yt e s , m a rca r p o s icio n e s
e n e l ca n a l, s a lt a r b yt e s d e la e n t ra d a , co n o ce r e l n ú m e ro d e b yt e s d is p o n ib le s
p a ra s e r le id o s , y re s e t e a r la p o s ició n a ct u a l d e n t ro d e l ca n a l. Un ca n a l d e e n t ra d a
s e a b re a u t o m á t ica m e n t e cu a n d o s e cre a . S e p u e d e ce rra r u n ca n a l e xp licit a m e n t e
co n e l m é t o d o c lo s e ( ) , o p u e d e d e ja rs e q u e s e cie rre im p licit a m e n t e cu a n d o s e
re co le ct a la b a s u ra , lo q u e o cu rre cu a n d o e l o b je t o d e ja d e re fe re n cia rs e .
La cla s e Ou t p u t S t re a m e s u n a s u p e rcla s e a b s t ra ct a q u e p ro p o rcio n a u n in t e rfa ce
d e p ro g ra m a ció n m ín im o y u n a im p le m e n t a ció n p a rcia l d e lo s ca n a le s d e s a lid a . Un
ca n a l d e s a lid a s e a b re a u t o m á t ica m e n t e cu a n d o s e cre a . S e p u e d e ce rra r u n ca n a l
e xp licit a m e n t e co n e l m é t o d o c lo s e ( ) , o s e p u e d e d e ja r q u e s e cie rre
im p licit a m e n t e cu a n d o s e re co le ct a la b a s u ra , lo q u e o cu rre cu a n d o e l o b je t o d e ja
d e re fe re n cia rs e .
El p a q u e t e ja va . io co n t ie n e m u ch a s s u b cla s e s d e In p u t S t re a m y Ou t p u t S t re a m q u e
im p le m e n t a n fu n cio n e s e s p e cifica s d e e n t ra d a y s a lid a . Po r e je m p o ,
File In p u t S t re a m y File Ou t p u t S t re a m s o n ca n a le s d e d e e n t ra d a y s a lid a q u e o p e ra n
co n fich e ro s e n e l s is t e m a d e fich e ro s n a t ivo .

Canales Simples de I/O


Lo s ig u ie n t e e s u n a in t ro d u cció n a la s cla s e s n o a b s t ra ct a s q u e
d e s cie n d e n d ire ct a m e n t e d e s d e In p u t S t re a m y Ou t p u t S t re a m :
File I n p u t S t re a m y File Ou t p u t S t re a m
Le e n o e s crib e n d a t o s e n u n fich e ro d e l s is t e m a d e fich e ro s n a t ivo .
P ip e d I n p u t S t re a m y P ip e d Ou t p u t S t re a m
Im p le m e n t a n lo s co m p o n e n t e s d e e n t ra d a y s a lid a d e u n a t u b e ría .
La s t u b e ría s s e u t iliza n p a ra ca n a liza r la s a lid a d e u n p ro g ra m a
h a cia la e n t ra d a d e o t ro . Un Pip e d In p u t S t re a m d e b e s e r co n e ct a d o
a u n Pip e d Ou t p u t S t re a m y u n Pip e d Ou t p u t S t re a m d e b e s e r
co n e ct a d o a u n Pip e d In p u t S t re a m .
By t e Arra y I n p u t S t re a m y By t e Arra y Ou t p u t S t re a m
Le e n o e s crib e n d a t o s e n u n a rra y d e la m e m o ria .
S e q u e n c e I n p u t S t re a m
Co n ca t e n a va rio s ca n a le s d e e n t ra d a d e n t ro d e u n s ó lo ca n a l d e
e n t ra d a .
S t rin g Bu ffe rI n p u t S t re a m
Pe rm it e a lo s p ro g ra m a s le e r d e s d e u n S t rin g Bu ffe r co m o s i fu e ra
u n ca n a l d e e n t ra d a .

Canales Filtrados
Filt e rIn p u t S t re a m y Filt e rOu t p u t S t re a m s o n s u b cla s e s d e In p u t S t re a m y
Ou t p u t S t re a m , re s p e ct iva m e n t e , y t a m b ié n s o n cla s e s a b s t ra ct a s . Es t a s
cla s e s d e fin e n e l in t e rfa ce p a ra lo s ca n a le s filt ra d o s q u e p ro ce s a n lo s
d a t o s q u e e s t á n s ie n d o le id o o e s crit o s . Po r e je m p lo , lo s ca n a le s filt ra d o s
Bu ffe re d In p u t S t re a m y Bu ffe re d Ou t p u t S t re a m a lm a ce n a n d a t o s m ie n t ra s
lo s le e n o e s crib e n p a ra a u m e n t a r s u ve lo cid a d .
D a t a I n p u t S t re a m y D a t a Ou t p u t S t re a m
Le e o e s crib e d a t o s p rim it ivo s d e Ja va e n u n m á q u in a in d e p e n d ie n t e
d e l fo rm a t o .
Bu ffe re d I n p u t S t re a m y Bu ffe re d Ou t p u t S t re a m
Alm a ce n a d a t o s m ie n t ra s lo s le e o e s crib e p a ra re d u cir e l n ú m e ro
d e a cce s o s re q u e rid o s a la fu e n t e o rig in a l. Lo s ca n a le s co n b u ffe r
s o n m á s e ficie n t e s q u e lo s ca n a le s s im ila re s s in b u ffe r.
Lin e N u m b e rI n p u t S t re a m
Tie n e e n cu e n t a lo s n ú m e ro s d e lín e a m ie n t ra s le e .
P u s h b a c k I n p u t S t re a m
Un ca n a l d e e n t ra d a co n u n b u ffe r d e u n b yt e h a cia a t rá s . Alg u n a s
ve ce s cu a n d o s e le e n b yt e s d e s d e u n ca n a l e s ú t il ch e q u e a r e l
s ig u ie n t e ca ra ct e r p a ra p o d e r d e cir lo q u e h a ce r lu e g o . S i s e
ch e q u e a u n ca rá ct e r d e l ca n a l, s e n e ce s it a rá vo lve r a p o n e rlo e n s u
s it io p a ra q u e p u e d a s e r le id o y p ro ce s a d o n o rm a lm e n t e .
P rin t S t re a m
Un ca n a l d e s a lid a co n lo s m é t o d o s d e im p re s ió n co n ve n ie n t e s .

Y el Resto...
Ad e m á s d e la cla s e s s t re a m s , e l p a q u e t e ja va . io co n t ie n e e s t a s o t ra s
cla s e s :
File
Re p re s e n t a u n fich e ro e n e l s is t e m a d e fich e ro s n a t ivo . S e p u e d e
cre a r u n o b je t o File p a ra u n fich e ro e n e l s is t e m a d e fich e ro s n a t ivo
y lu e g o p e d irle a l o b je t o la in fo rm a ció n q u e s e n e ce s it e s o b re e l
fich e ro ( co m o s u p a t h co m p le t o ) .
File D e s c rip t o r
Re p re s e n t a u n m a n e ja d o r d e fich e ro ( o d e s crip t o r) p a ra a b rir u n
fich e ro o u n a co n e xió n .
Ra n d o m Ac c e s s File
Re p re s e n t a u n fich e ro d e a cce s o a le a t o rio .
S t re a m To k e n iz e r
Divid e e l co n t e n id o d e u n ca n a l e n To ke n ( p a rt e s ) . Lo s To ke n s s o n
la u n id a d m á s p e q u e ñ a re co n o cid a p o r e l a lg o rit m o d e a n a lis is d e
t e xt o ( co m o s o n p a la b ra s , s ím b o lo s , e t c. . . ) . Un Ob je t o
S t re a m To ke n ize p u e d e s e r u t iliza d o p a ra a n a liza r cu a lq u ie r fich e ro
d e t e xt o . Po r e je m p lo , p o d ría s u t iliza rlo p a ra d ivid ir u n fich e ro
fu e n t e d e Ja va e n n o m b re s d e va ria b le s , e t c. . o u n fich e ro HTML e n
e t iq u e t a s d e HTML.
Y fin a lm e n t e e l p a q u e t e ja va . io d e fin e t re s in t e rfa ce s :
D a t a I n p u t y D a t a Ou t p u t
Es t o s d o s in t e rfa ce s d e s crib e n ca n a le s q u e p u e d e n le e r o e s crib ir
d a t o s d e t ip o s p rim it ivo s d e Ja va e n m á q u in a s in d e p e n d ie n t e s d e l
fo rm a t o . Da t a In p u t S t re a m , Da t a Ou t p u t S t re a m , y Ra n d o m Acce s s File
im p le m e n t a n e s t o s in t e rfa ce s .
File n a m e Filt e r
El m é t o d o lis t ( ) d e la cla s e File u t iliza u n o b je t o File n a m e Filt e r p a ra
d e t e rm in a r lo s fich e ro s a lis t a r e n u n d ire ct o rio . Es t e in t e rfa ce
a ce p t a fich e ro s b a s á n d o s e e n s u s n o m b re s . S e p o d ría u t iliza r
File Na m e Filt e r p a ra im p le m e n t a r u n s e n cilla e xp re s ió n d e b u s q u e d a
a l e s t io d e lo s co m o d in e s co m o fich e ro . * , e t c. . .

Oz it o
Utilizar Canales para Implementar Tuberías
El p a q u e t e ja va . io co n t ie n e d o s cla s e s , Pip e d In p u t S t re a m y Pip e d Ou t p u t S t re a m ,
q u e im p le m e n t a n lo s co m p o n e n t e s d e e n t ra d a y s a lid a p a ra u n a t u b e ría . La s
t u b e ría s s e u t iliza n p a ra ca n a liza r la s a lid a d e u n p ro g ra m a ( o u n t h re a d ) h a cia la
e n t ra d a d e o t ro .
Lo s ca n a le s d e e n t ra d a y s a lid a p a ra t u b e ría s s o n co n ve n ie n t e s p a ra m é t o d o s q u e
p ro d u ce n u n a s a lid a p a ra s e r u t iliza co m o e n t ra d a d e o t ro m é t o d o . Po r e je m p lo ,
s u p o n g a m o s q u e e s t a m o s ; e s crib ie n d o u n a cla s e q u e im p le m e n t a va ria s u t ilid a d e s
d e t e xt o , co m o la o rd e n a ció n y la in ve rs ió n d e l t e xt o . S e ria b o n it o q u e la s a lid a d e
u n o d e e s o s m é t o d o s p u d ie ra u t iliza rs e co m o la e n t ra d a d e o t ro . As í p o d ría m o s
co n ca t e n a r u n a s e rie d e e s o s m é t o d o s p a ra re a liza r a lg u n a fu n ció n . La t u b e ría
u t iliza d a a q u í u t iliza lo s m é t o d o s re ve rs e , s o rt y re ve rs e s o b re u n a lis t a d e p a la b ra s
p a ra o rd e n a rla d e fo rm a rít m ica :
S in lo s ca n a le s d e t u b e ría s , t e n d ría m o s q u e cre a r u n fich e ro t e m p o ra l e n t re ca d a
u n o d e lo s p a s o s . Ech e m o s u n vis t a zo a l p ro g ra m a q u e im p le m e n t a lo s m é t o d o s
re ve rs e y s o rt d e s crit o s a rrib a u t iliza n d o lo s ca n a le s d e t u b e ría s , y lu e g o u t iliza
e s t a s m é t o d o s p a ra m o s t ra r la t u b e ría a n t e rio r p a ra g e n e ra r u n a lis t a d e p a la b ra s
rít m ica s .
Prim e ro , la cla s e Rh ym in g Wo rd s co n t ie n e t re s m é t o d o s : m a in ( ) , re v e rs e ( ) , y
s o rt ( ) . El m é t o d o m a in ( ) p ro p o rcio n a e l có d ig o p a ra e l p ro g ra m a p rin cip a l, e l cu a l
a b re u n fich e ro d e e n t ra d a , u t iliza lo s o t ro s d o s m é t o d o s p a ra in ve rt ir, o rd e n a r y
vo lve r a in ve rt ir la s p a la b ra s d e l fich e ro d e e n t ra d a , y e s crib e la s a lid a e n e l ca n a l
d e s a lid a e s t a n d a rd .
re v e rs e ( ) y s o rt ( ) e s t á n d is e ñ a d o s p a ra s e r u t iliza d o s e n u n a t u b e ría . Es t o s d o s
m é t o d o s le e n d a t o s d e s d e u n In p u t S t re a m , lo s p ro ce s a n ( in virt ie n d o la s ca d e n a s u
o rd e n a n d o la s ) , y p ro d u ce n u n Pip e d In p u t S t re a m a d e cu a d o p a ra q u e o t ro m é t o d o
p u e d a le e rlo . Ech e m o s u n vis t a zo e n m á s d e t a lle a l m é t o d o re v e rs e ( ) ; s o rt e s
m u y s im ila r a l a n t e rio r, p o r e s o n o m e re ce la p e n a e xp lica rlo .
public static InputStream reverse(InputStream source) {
PipedOutputStream pos = null;
PipedInputStream pis = null;

try {
DataInputStream dis = new DataInputStream(source);
String input;

pos = new PipedOutputStream();


pis = new PipedInputStream(pos);
PrintStream ps = new PrintStream(pos);

new WriteReversedThread(ps, dis).start();


} catch (Exception e) {
System.out.println("RhymingWords reverse: " + e);
}
return pis;
}
El m é t o d o re v e rs e ( ) t o m a u n In p u t S t re a m lla m a d o s o u rc e q u e co n t ie n e la lis t a
d e ca d e n a s a in ve rt ir. re v e rs e ( ) p ro ye ct a u n Da t a In p u t S t re a m s o b re e l
In p u t S t re a m s o u rc e p a ra q u e p u e d a u t iliza r e l m é t o d o re a d Lin e ( ) d e
Da t a In p u t S t re a m p a ra le e r u n a a u n a la s lín e a s d e l fich e ro . ( Da t a In p u t S t re a m e s
u n ca n a l filt ra d o q u e d e b e s e r a ñ a d id o a u n In p u t S t re a m ( o p ro ye ct a d o s o b re )
cu yo s d a t o s s e d e b e n filt ra r m ie n t ra s s o n le id o s . Tra b a ja r co n Ca n a le s Filt ra d o s
e xp lica m á s co s a s s o b re e s t o . )
Lu e g o re v e rs e ( ) cre a u n Pip e d Ou t p u t S t re a m y le co n e ct a u n Pip e d In p u t S t re a m .
Re cu e rd a q u e u n Pip e d Ou t p u t S t re a m d e b e e s t a r co n e ct a d o a u n Pip e d In p u t S t re a m .
De s p u é s , re v e rs e ( ) p ro ye ct a u n Prin t S t re a m s o b re e l Pip e d Ou t p u t S t re a m p a ra
q u e p u e d a u t iliza r e l m é t o d o p rin t ln ( ) d e Prin t S t re a m p a ra e s crib ir la s ca d e n a s e n
e l Pip e d Ou t p u t S t re a m .
Ah o ra re v e rs e ( ) cre a u n o b je t o t h re a d Writ e Re ve rs e d Th re a d , q u e cu e lg a d e d o s
ca n a le s - - e l Prin t S t re a m a ñ a d id o a Pip e d Ou t p u t S t re a m y e l Da t a In p u t S t re a m
a ñ a d id o a s o u rc e - - y lo a rra n ca . El o b je t o Writ e Re ve rs e d Th re a d le e la s p a la b ra s
d e s d e e l Da t a In p u t S t re a m , la s in vie rt e y e s crib e la s a lid a e n e l Prin t S t re a m ( p o r lo
t a n t o , e s crib e la s a lid a e n u n a t u b e ría ) . El o b je t o t h re a d p e rm it e q u e ca d a fin a l d e
la t u b e ría s e e je cu t e in d e p e n d ie n t e m e n t e y e vit a q u e e l m é t o d o m a in ( ) s e b lo q u e e
s i u n a d e la s t u b e ría s s e b lo q u e a m ie n t ra s e s p e ra a q u e s e co m p le t e u n a lla m a d a a
I/ O.
Aq u í t ie n e s e l m é t o d o ru n d e Writ e Re ve rs e d Th re a d :
public void run() {
if (ps != null && dis != null) {
try {
String input;
while ((input = dis.readLine()) != null) {
ps.println(reverseIt(input));
ps.flush();
}
ps.close();
} catch (IOException e) {
System.out.println("WriteReversedThread run: " + e);
}
}
}
Co m o e l Pip e d Ou t p u t S t re a m e s t á co n e ct a d o a l Pip e d In p u t S t re a m , t o d o s lo s d a t o s
e s crit o s e n e l Pip e d Ou t p u t S t re a m ca e n d e n t ro d e l Pip e d In p u t S t re a m . Lo s d a t o s
p u e d e n s e r le id o s d e s d e Pip e d In p u t S t re a m p o r cu a lq u ie r o t ro p ro g ra m a o t h re a d .
re v e rs e ( ) d e vu e lve e l Pip e d In p u t S t re a m p a ra q u e lo u t ilice e l p ro g ra m a lla m a d o r.
El m é t o d o s o rt ( ) s ig u e e l s ig u ie n t e p a t ró n :
● Ab re u n ca n a l d e s a lid a d e t u b e ría .

● Co n e ct a u n ca n a l d e e n t ra d a d e t u b e ría a l ca n a l d e e n t ra d a .

● Ut iliza u n o b je t o S o rt Th re a d , p a ra le e r la e n t ra d a d e la t u b e ría y e s crib irla e n


e l ca n a l d e s a lid a , q u e e s e l ca n a l d e e n t ra d a p a ra a lg ú n o t ro .
● Cu e lg a e l ca n a l d e s a lid a , a h o ra lle n o , h a cia a lg ú n o t ro p a ra q u e lo le a .

La s lla m a d a s a lo s m é t o d o s re v e rs e ( ) y s o rt ( ) p u e d e n s it u a rs e e n ca s ca d a p a ra
q u e la s a lid a d e u n m é t o d o p u e d a s e r la e n t ra d a d e l s ig u ie n t e m é t o d o . De h e ch o ,
e l m é t o d o m a in ( ) lo h a ce . Re a liza lla m a d a s e n ca s a ca d a a re v e rs e ( ) , s o rt ( ) , y
lu e g o a re v e rs e ( ) p a ra g e n e ra r u n a lis t a d e p a la b ra s rít m ica s :
InputStream rhymedWords = reverse(sort(reverse(words)));
Cu a n d o e je cu t e s Rh ym in g Wo rd s co n e s t e fich e ro d e t e xt o ve rá s la s ig u ie n t e s a lid a :
Java
interface
image
language
communicate
integrate
native
string
network
stream
program
application
animation
exception
primer
container
user
graphics
threads
tools
class
bolts
nuts
object
applet
environment
development
argument
component
input
output
anatomy
security
S i m ira s d e t e n id a m e n t e p u e d e s ve r q u e la s p a la b ra s rít m ica s co m o e n v iro n m e n t ,
d e v e lo p m e n t , a rg u m e n t , y co m p o n e n t e s t á n a g ru p a d a s ju n t a s .

Oz it o
Utilizar Canales para Leer y Escribir Ficheros
Lo s ca n a le s d e Fich e ro s s o n q u izá s lo s ca n a le s m á s fá cile s d e e n t e n d e r. La s cla s e s
File In p u t S t re a m y File Ou t p u t S t re a m re p re s e n t a n u n a ca n a l d e e n t ra d a ( o s a lid a )
s o b re u n fich e ro q u e re s id e e n e l s is t e m a d e fich e ro s n a t ivo . S e p u e d e cre a r u n
ca n a l d e fich e ro d e s d e u n n o m b re d e fich e ro , u n o b je t o File o u n o b je t o
File De s crip t o r. Ut iliza lo s ca n a le s d e fich e ro s p a ra le e r o e s crib ir d a t o s d e u n fich e ro
d e l s is t e m a d e fich e ro s .
Es t e p e q u e ñ o e je m p lo u t iliza lo s ca n a le s d e fich e ro s p a ra co p ia r e l co n t e n id o d e u n
fich e ro e n o t ro :
import java.io.*;

class FileStreamsTest {
public static void main(String[] args) {
try {
File inputFile = new File("farrago.txt");
File outputFile = new File("outagain.txt");

FileInputStream fis = new FileInputStream(inputFile);


FileOutputStream fos = new FileOutputStream(outputFile);
int c;

while ((c = fis.read()) != -1) {


fos.write(c);
}

fis.close();
fos.close();
} catch (FileNotFoundException e) {
System.err.println("FileStreamsTest: " + e);
} catch (IOException e) {
System.err.println("FileStreamsTest: " + e);
}
}
}
Aq u í t ie n e e l co n t e n id o d e l fich e ro d e e n t ra d a fa rra g o . t xt :
So she went into the garden to cut a cabbage-leaf, to
make an apple-pie; and at the same time a great
she-bear, coming up the street, pops its head into the
shop. 'What! no soap?' So he died, and she very
imprudently married the barber; and there were
present the Picninnies, and the Joblillies, and the
Garyalies, and the grand Panjandrum himself, with the
little round button at top, and they all fell to playing
the game of catch as catch can, till the gun powder ran
out at the heels of their boots.

Samuel Foote 1720-1777


Es t e p ro g ra m a cre a u n File In p u t S t re a m d e s d e u n o b je t o File co n e s t e có d ig o :
File inputFile = new File("farrago.txt");
FileInputStream fis = new FileInputStream(inputFile);
Ob s e rva e l u s o d e l o b je t o File in p u t File e n e l co n s t ru ct o r. in p u t File re p re s e n t a e l
fich e ro lla m a d o fa rra g o . t x t , d e l s is t e m a d e fich e ro s n a t ivo . Es t e p ro g ra m a s ó lo
u t iliza in p u t File p a ra cre a r u n File In p u t S t re a m s o b re fa rra g o . t x t . S in e m b a rg o , e l
p ro g ra m a p o d ría u t iliza r in p u t File p a ra o b t e n e r in fo rm a ció n s o b re fa rra g o . t x t
co m o s u p a t h co m p le t o , p o r e je m p lo .

Oz it o
Utilizar los Canales para Leer o Escribir Posiciones
de Memoria
S e u t iliza Byt e Arra yIn p u t S t re a m y Byt e Arra yOu t p u t S t re a m p a ra e s crib ir d a t o s d e 8
b it s . S e p u e d e n cre a r e s t o s ca n a le s s o b re u n a rra y d e b yt e s e xis t e n t e y lu e g o s e
p u e d e n u t iliza r lo s m é t o d o s re a d ( ) y w rit e ( ) p a ra le e r y e s crib ir d a t o s e n e l a rra y
d e m e m o ria .
S e u t iliza S t rin g Bu ffe rI n p u t S t re a m p a ra le e r d a t o s d e s d e u n S t rin g Bu ffe r. S e
p u e d e cre a r u n S t rin g Bu ffe rI n p u t S t re a m s o b re u n o b je t o S t rin g Bu ffe r
e xis t e n t e y lu e g o u t iliza r e l m é t o d o re a d ( ) p a ra le e r d e s d e S t rin g Bu ffe r co m o s i
re s id ie ra e n m e m o ria . Es t a ca n a l e s s im ila r a By t e Arra y I n p u t S t re a m q u e le e
d a t o s d e 8 b it s d e s d e u n a rra y e n la m e m o ria , p e ro S t rin g Bu ffe rI n p u t S t re a m le e
d a t o s d e 1 6 b it s e n fo rm a t o Un ico d e d e s d e u n b u ffe r d e s t rin g e n la m e m o ria . El
p a q u e t e ja va . io n o t ie n e n in g ú n ca n a l d e s a lid a co m p a ñ e ro d e
S t rin g Bu ffe rI n p u t S t re a m - - e n s u lu g a r p u e d e u t iliza r d ire ct a m e n t e
S t rin g Bu ffe r.

Oz it o
Utilizar Canales para Concatenar Ficheros
El ca n a l S e q u e n ce In p u t S t re a m cre a u n s ó lo ca n a l d e e n t ra d a p a ra va ria s fu e n t e s .
Es t e p ro g ra m a d e e je m p lo , Co n ca t e n a t e , u t iliza S e q u e n ce In p u t S t re a m p a ra
im p le m e n t a r u n a u t ilid a d d e co n ca t e n a ció n q u e u n e fich e ro s s e cu e n cia lm e n t e , e n e l
o rd e n e n q u e s e h a n lis t a d o e n la lín e a d e co m a n d o s .
Es t a e s la cla s e co n t ro la d o ra d e la u t ilid a d Co n ca t e n a t e :
import java.io.*;

class Concatenate {
public static void main(String[] args) {
ListOfFiles mylist = new ListOfFiles(args);

try {
SequenceInputStream s = new SequenceInputStream(mylist);
int c;

while ((c = s.read()) != -1) {


System.out.write(c);
}

s.close();
} catch (IOException e) {
System.err.println("Concatenate: " + e);
}
}
}
Lo p rim e ro q u e h a ce e s t a cla s e e s cre a r u n o b je t o Lis t OfFile s lla m a d o m y lis t q u e
e s in icia liza d o d e s d e lo s a rg u m e n t o s d e la lín e a d e co m a n d o s in t ro d u cid o s p o r e l
u s u a rio . Lo s a rg u m e n t o s d e la lín e a d e co m a n d o s s o n u n a lis t a d e fich e ro s p a ra s e r
co n ca t e n d o s . m y lis t e s u t iliza d a p a ra in icia liza r e l S e q u e n ce In p u t S t re a m e l cu a l
u t iliza m y lis t p a ra o b t e n e r u n n u e vo In p u t S t re a m p a ra ca d a fich e ro lis t a d o p o r e l
u s u a rio . Lis t OfFile s . ja va
import java.util.*;
import java.io.*;

class ListOfFiles implements Enumeration {

String[] listOfFiles;
int current = 0;

ListOfFiles(String[] listOfFiles) {
this.listOfFiles = listOfFiles;
}

public boolean hasMoreElements() {


if (current < listOfFiles.length)
return true;
else
return false;
}

public Object nextElement() {


InputStream is = null;

if (!hasMoreElements())
throw new NoSuchElementException("No more files.");
else {
try {
String nextElement = listOfFiles[current];
current++;
is = new FileInputStream(nextElement);
} catch (FileNotFoundException e) {
System.out.println("ListOfFiles: " + e);
}
}
return is;
}
}
Lis t OfFile s im p le m e n t a e l in t e rfa ce En u m e ra t io n . Ve rá s có m o e s t o e n t ra e n ju e g o
cu a n d o p a s e m o s p o r e l re s t o d e l p ro g ra m a .
De s p u é s d e q u e e l m é t o d o m a in ( ) cre e e l S e q u e n ce In p u t S t re a m , lo le e u n b yt e
ca d a ve z. Cu a n d o e l S e q u e n ce In p u t S t re a m n e ce s it e u n In p u t S t re a m p a ra la n u e va
fu e n t e ( co m o p a ra e l p rim e r b yt e le id o o cu a n d o s e a lca n ce e l fin a l d e l ca n a l d e
e n t ra d a a ct u a l) , lla m a a n e x t Ele m e n t ( ) e n e l o b je t o En u m e ra t io n p a ra o b t e n e r e l
n u e vo In p u t S t re a m . Lis t OfFile s cre a o b je t o s File In p u t S t re a m p e re zo s a m e n t e , lo
q u e s ig n ifica q u e s i S e q u e n ce In p u t S t re a m lla m a a n e x t Ele m e n t ( ) , Lis t OfFile s a b re
u n File In p u t S t re a m co n e l s ig u ie n t e fich e ro d e la lis t a y d e vu e lve e l ca n a l. Cu a n d o
e l Lis t OfFile s a lca n za e l fin a l d e lo s fich e ro s ( n o h a y m á s e le m e n t o s ) ,
n e x t Ele m e n t ( ) d e vu e lve n u lo , y la lla m a d a a l m é t o d o re a d ( ) d e
S e q u e n ce In p u t S t re a m d e vu e lve - 1 p a ra in d ica r e l fin a l d e la e n t ra d a .
La co n ca t e n a ció n s ip le m e n t e co p ia t o d o s lo s d a t o s le id o s d e s d e
S e q u e n ce In p u t S t re a m e n la s a lid a e s t a n d a rd .
P ru e b a e s t o : in t e n t a co n ca t e n a r lo s fich e ro s fa rra g o . t xt y wo rd s . t xt q u e h a n s id o
u t iliza d o s co m o fich e ro s d e e n t ra d a e n e s t a le cció n .
Oz it o
Trabajar con Canales Filtrados
S e p u e d e a ñ a d ir u n ca n a l filt ra d o a o t ro ca n a l p a ra filt ra r lo s d a t o s q u e s e s e e s t á n
le ye n d o o e s crib ie n d o e n e l ca n a l o rig in a l. El p a q u e t e ja va . io co n t ie n e e s t o s ca n a le s
filt ra d o s q u e s o n s u b cla s e s d e Filt e rIn p u t S t re a m o d e Filt e rOu t p u t S t re a m :
● Da t a In p u t S t re a m y Da t a Ou t p u t S t re a m

● Bu ffe re d In p u t S t re a m y Bu ffe re d Ou t p u t S t re a m

● Lin e Nu m b e rIn p u t S t re a m

● Pu s h b a ckIn p u t S t re a m

● Prin t S t re a m ( e s t e e s u n ca n a l d e s a lid a )

Es t a s e cció n m u e s t ra có m o u t iliza r lo s ca n a le s filt ra d o s a t ra vé s d e u n e je m p lo q u e


u t iliza Da t a In p u t S t re a m y Da t a Ou t p u t S t re a m . Ad e m á s , e s t a s e cció n m u e s t ra có m o
e s crib ir n u e s t ro s p ro p io s ca n a le s filt ra d o s .

Utilizar Canales Filtrados


Pa ra u t iliza r u n ca n a l filt ra d o d e e n t ra d a ( o s a lid a ) , s e a ñ a d e e l ca n a l
filt ra d o a o t ro ca n a l d e e n t ra d a ( o s a lid a ) . S e p u e d e a ñ a d ir u n ca n a l
filt ra d o a o t ro ca n a l cu a n d o s e cre a . Po r e je m p lo , s e p u e d e a ñ a d ir u n
Da t a In p u t S t re a m a l ca n a l d e e n t ra d a e s t a n d a rd d e la s ig u ie n t e fo rm a :
DataInputStream dis = new DataInputStream(System.in.read());
String input;

while ((input = dis.readLine()) != null) {


. . . // Hacer algo interesante aquí
}
Po d ría s h a ce r e s t o p a ra p o d e r u t iliza r lo s m é t o d o s m á s co n ve n ie n t e s
re a d XXX( ) , co m o re a d Lin e ( ) , im p le m e n t a d o p o r Da t a In p u t S t re a m .

Utilizar DataInputStream y DataOutputStream


Es t a p á g in a p ro p o rcio n a u n a e xp lica ció n d e u n e je m p lo d e u t iliza ció n d e
Da t a In p u t S t re a m y Da t a Ou t p u t S t re a m , d o s ca n a le s filt ra d o s q u e p u e d e n
le e r y e s crib ir d a t o s d e t ip o s p rim it ivo s d e Ja va .

Escribir Nuestros Propios Canales Filtrados


La m a yo ría d e lo s p ro g ra m a d o re s e n cu e n t ra n la n e ce s id a d d e
im p le m e n t a r s u s p ro p io s ca n a le s q u e filt re n o p ro ce s e n lo s d a t o s q u e s e
e s t á n le ye n d o o e s crib ie n d o d e s d e u n ca n a l. Alg u n a s ve ce s e l
p ro ce s a m ie n t o e s in d e p e n d ie n t e d e l fo rm a d o d e lo s d a t o s , co m o u n
co n t a d o r d e lo s ít e m s d e u n a ca d e n a , y o t ra s ve ce s e l p ro ce s a m ie n t o
e s t á re la cio n a d o d ire ct a m e n t e co n lo s p ro p io s d a t o s o e l fo rm a t o d e lo s
d a t o s , co m o le e r o e s crib ir lo s d a t o s co n t e n id o s e n fila s y co lu m n a s .
Fre cu e n t e m e n t e , e s t o s p ro g ra m a d o re s s u b cla s ifica n Filt e rOu t p u t S t re a m
y File In p u t S t re a m p a ra co n s e g u ir s u s o b je t ivo s .

Oz it o
Utilizar DataInputStream y DataOutputStream
Es t a p á g in a m u e s t ra có m o u t iliza r la s cla s e s Da t a In p u t S t re a m y Da t a Ou t p u t S t re a m d e l
p a q u e t e ja va . io . Ut iliza u n e je m p lo , Da t a IOTe s t , q u e le e y e s crib e d a t o s t a b u la d o s ( fa ct u ra n d o
p ro d u ct o s Ja va ) . Lo s d a t o s t a b u la d o s e s t á n fo rm a t e a d o s e n co lu m n a s , d o n d e ca d a co lu m n a
e s t á s e p a ra d a d e la s ig u ie n t e p o r u n Ta b . La s co lu m n a s co n t ie n e n lo s p re cio s d e ve n t a , e l
n ú m e ro d e u n id a d e s p e d id a s , y u n a d e s crip ció n d e l p ro d u ct o , d e e s t a fo rm a :
19.99 12 Java T-shirt
9.99 8 Java Mug
Da t a Ou t p u t S t re a m , a l ig u a l q u e o t ro s ca n a le s d e s a lid a filt ra d o s , d e b e s e r a ñ a d id o a a lg ú n
Ou t p u t S t re a m . En e s t e ca s o , s e a ñ a d e a u n File Ou t p u t S t re a m q u e s e h a s e le ccio n a d o p a ra
e s crib ir e n u n fich e ro lla m a d o in v o ic e 1 . t x t .
DataOutputStream dos = new DataOutputStream(
new FileOutputStream("invoice1.txt"));
Lu e g o , Da t a IOTe s t u t iliza e l m é t o d o e s p e cia liza d o w rit e XXX( ) d e Da t a Ou t p u t S t re a m q u e
e s crib e lo s d a t o s d e la fa ct u ra ( q u e e s t á n co n t e n id o s d e n t ro d e a rra ys e n e l p ro g ra m a ) d e
a cu e rd o co n e l t ip o d e d a t o q u e s e e s t á e s crib ie n d o :
for (int i = 0; i < prices.length; i ++) {
dos.writeDouble(prices[i]);
dos.writeChar('\t');
dos.writeInt(units[i]);
dos.writeChar('\t');
dos.writeChars(descs[i]);
dos.writeChar('\n');
}
dos.close();
Ob s e rva q u e e s t e có d ig o cie rra e l ca n a l d e s a lid a cu a n d o t e rm in a .
Lu e g o , Da t a IOTe s t a b re u n Da t a In p u t S t re a m co n e l fich e ro q u e a ca b a d e e s crib ir:
DataInputStream dis = new DataInputStream(
new FileInputStream("invoice1.txt"));
Da t a In p u t S t re a m , t a m b ié n d e b e s e r a ñ a d id o a a lg ú n o t ro In p u t S t re a m . En e s t e ca s o , s e h a
a ñ a d id o a u n File In p u t S t re a m s e le ccio n a d o p a ra le e r e l fich e o q u e s e a ca b a d e e s crib ir
- - in v o ic e 1 . t x t . Da t a IOTe s t le e d e n u e vo lo s d a t o s u t iliza n d o lo s m é t o d o s e s p e cia liza d o s
re a d XXX( ) d e Da t a In p u t S t re a m .
try {
while (true) {
price = dis.readDouble();
dis.readChar(); // Elimina el tab
unit = dis.readInt();
dis.readChar(); // Elimina el tab
desc = dis.readLine();
System.out.println("Ha pedido " + unit + " unidades de " + desc + " a" +
price);
total = total + unit * price;
}
} catch (EOFException e) {
}
System.out.println("Para un TOTAL de: $" + total);
dis.close();
Cu a n d o s e h a n le id o t o d o s lo s d a t o s , Da t a IOTe s t m u e s t ra u n a s e n t e n cia q u e s u m a riza e l
p e d id o y ca n t id a d t o t a l, y cie rra e l ca n a l.
Ob s e rva e l b u cle q u e u t iliza Da t a IOTe s t p a ra le e r lo s d a t o s d e s d e e l Da t a In p u t S t re a m .
No rm a lm e n t e , p a ra la le ct u ra ve rá s u n b u cle co m o e s t e :
while ((input = dis.readLine()) != null) {
. . .
}
El m é t o d o re a d Lin e ( ) d e vu e le u n va lo r, n u ll, q u e in d ica q u e s e h a a lca n za d o e l fin a l d e l
fich e ro . Mu ch o s d e lo s m é t o d o s re a d XXX( ) d e Da t a In p u t S t re a m n o p u e d e n h a ce r e s t o p o rq u e
cu a lq u ie r va lo r d e vu e lt o p a ra in d ica r e l fin a l d e l fich e ro t a m b ié n p o d ría s e r in t e rp re t a d o co m o
u n va lo r le g it im o le íd o d e s d e e l ca n a l. Po r e je m p lo , s u p o n g a m o s q u e h a s u t iliza d o - 1 p a ra
in d ica r e l fin a l d e l fich e ro . Bie n , n o p u e d e s h a ce rlo , p o rq u e - 1 e s u n va lo r le g it im o q u e p u e d e
s e r le id o d e s d e la e n t ra d a d e l ca n a l u t iliza n d o re a d D o u b le ( ) , re a d I n t ( ) , o cu a lq u ie ra d e lo s
o t ro s m é t o d o s q u e le e n n ú m e ro s . En t o n ce s lo s m é t o d o s re a d XXX( ) d e Da t a In p u t S t re a m
la n za n u n a EOFExce p cit io n . Cu a n d o o cu rre u n a EOFExce p t io n e l b u cle w h ile ( t ru e ) t e rm in a .
Cu a n d o s e e je cu t e e l p ro g ra m a Da t a Io Te s t ve rá s la s ig u ie n t e s a lid a :
Ha pedido 12 unidades de Camiseta Java a $19.99
Ha pedido 8 unidades de Mug Java a $9.99
Ha pedido 13 unidades de Muñechos Duke a $15.99
He pedido 29 unidades de Pin Java a $3.99
Para un TOTAL de: $892.88

Oz it o
Escribir Nuestros Propios Canales Filtrados
Lo s ig u ie n t e e s u n a lis t a d e p a s o s a s e g u ir cu a n d o s e e s crib a n ca n a le s d e I/ O filt ra d o s p ro p io s :
● Cre a r u n a s u b cla s e d e Filt e rIn p u t S t re a m y Filt e rOu t p u t S t re a m . Lo s ca n a le s d e e n t ra d a y s a lid a
vie n e n n o rm a lm e n t e e n p a re ja s , e n t o n ce s p o d ría m o s t e n e r q u e cre a r d o s ve rs io n e s d e lo s ca n a le s
filt ra d o s u n a d e e n t ra d a y o t ra d e s a lid a .
● S o b re e s crib ir lo s m é t o d o s re a d ( ) y w rit e ( ) .

● S o b re e s crib ir t o d o s lo s m é t o d o s q u e p u d ie ra n e ce s it a r.

● As e g u ra rs e d e q u e lo s ca n a le s d e e n t ra d a y s a lid a t ra b a ja n co n ju n t a m e n t e .

Es t a p á g in a le m u e s t ra có m o im p le m e n t a r s u s p ro p io s ca n a le s filt ra d o s a t ra vé s d e u n e je m p lo q u e
im p le t a n u n p a r d e ca n a le s d e e n t ra d a y s a lid a .
Lo s d o s ca n a le s u t iliza n u n a cla s e Ch e cks u m m p a ra ca lcu la r la s u m a d e lo s d a t o s e s crit o s o le id o s e n u n
ca n a l. La s u m a p u e d e s e r u t iliza p a ra d e t e rm in a r s i lo s d a t o s le id o s p o r la e n t ra d a co rre s p o n d e n co n lo s
e s crit o s e n la s a lid a .
Es t e p ro g ra m a lo co m p o n e n cu a t ro cla s e s y u n in t e rfa ce :
● La s s u b cla s e s p a ra lo s ca n a le s filt ra d o s d e e n t ra d a y s a lid a - - Ch e cke d Ou t p u t S t re a m y
Ch e cke d In p u t S t re a m .
● El in t e rfa ce Ch e ks u m y la cla s e Ad le r3 2 ca lcu la n la s u m a d e lo s ca n a le s .

● La cla s e Ch e cke d IOCla s s d e fin e e l m é t o d o p rin cip a l d e l p ro g ra m a .

La Clase CheckedOutputStream
La cla s e Ch e cke d Ou t p u t S t re a m e s u n a s u b cla s e d e Filt e rOu t p u t S t re a m q u e ca lcu la la s u m a d e
lo s d a t o s q u e s e e s t á n e s crib ie n d o e n u n ca n a l. Cu a n d o s e cre e u n Ch e cke d Ou t p u t S t re a m s e
d e b e u t iliza r s u ú n ico co n s t ru ct o r:
public CheckedOutputStream(OutputStream out, Checksum cksum) {
super(out);
this.cksum = cksum;
}
Es t e co n s t ru ct o r t o m a d o s a rg u m e n t o s : u n Ou t p u t S t re a m y u n Ch e ks u m . El a rg u m e n t o
Ou t p u t S t re a m e s e l ca n a l d e s a lid a q u e Ch e cke d Ou t p u t S t re a m d e b e ría filt ra r. El o b je t o
Ch e cks u m e s u n o b je t o q u e p u e d e ca lcu la r u n a s u m a . Ch e cke p Ou t p u t S t re a m s e in icia liza a s í
m is m o lla m a n d o a l co n s t ru ct o r d e s u s u p e rcla s e e in icia liza u n a va ria b le p riva d a , c k s u m , co n
e l o b je t o Ch e cks u m . El Ch e cke d Ou t p u t S t re a m u t iliza c k s u m q u e a ct u a liza la s u m a e n e l
m o m e n t o e n q u e s e e s t á n e s crib ie n d o lo s d a t o s e n e l ca n a l.
Ch e cke d Ou t p u t S t re a m n e ce s it a s o b re e s crib ir lo s m é t o d o s w rit e ( ) d e Filt e rOu t p u t S t re a m p a ra
q u e ca d a ve z q u e s e lla m e a u n m é t o d o w rit e ( ) la s u m a s e a ct u a lice . Filt e rOu t p u t S t re a m
d e fin e t re s ve rs io n e s d e l m é t o d o w rit e ( ) :
1 . writ e ( in t i)
2 . writ e ( b yt e [ ] b )
3 . writ e ( b yt e [ ] b , in t o ffs e t , in t le n g t h )
Ch e cke d Ou t p u t S t re a m s o b re e s crib e lo s t re s m é t o d o s :
public void write(int b) throws IOException {
out.write(b);
cksum.update(b);
}

public void write(byte[] b) throws IOException {


out.write(b, 0, b.length);
cksum.update(b, 0, b.length);
}
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
cksum.update(b, off, len);
}
La im p le m e n t a ció n d e e s t o s t re s m é t o d o s w rit e ( ) e s s e n cilla : e s crib e n lo s d a t o s e n e l ca n a l d e
s a lid a a l q u e e s t e ca n a l filt ra d o h a s id o a ñ a d id o , y lu e g o a ct u a liza n la s u m a .

La Clase CheckedInputStream
La cla s e Ch e cke d In p u t S t re a m e s m u y s im ila r a la cla s e Ch e cke d Ou t p u t S t re a m .
Ch e cke d In p u t S t re a m e s u n a s u b cla s e d e Filt e rIn p u t S t re a m q u e ca lcu la la s u m a d e lo s d a t o s
q u e e s t á n s ie n d o le id o s d e s d e u n ca n a l. Cu a n d o s e cre e u n Ch e cke d In p u t S t re a m , d e b e u t iliza r
s u ú n ico co n s t ru ct o r:
public CheckedInputStream(InputStream in, Checksum cksum) {
super(in);
this.cksum = cksum;
}
Es t e co n s t ru ct o r e s s im ila r a l co n s t ru ct o r d e Ch e cke d Ou t p u t S t re a m .
Al ig u a l q u e Ch e cke d Ou t p u t S t re a m s e n e ce s it a rá s o b re e s crib ir lo s m é t o d o s w it e ( ) d e
Filt e rOu t p u t S t re a m , Ch e cke d In p u t S t re a m n e ce s it a s o b re e s crib ir lo s m é t o d o s re a d ( ) d e
Filt e rIn p u t S t re a m , p a ra q u e ca d a ve z q u e s e lla m e a u n m é t o d o re a d ( ) s e a ct u a lice la s u m a .
Filt e rIn p u t S t re a m t a m b ié n d e fin e t re s ve rs io n e s d e l m é t o d o re a d ( ) y Ch e cke d In p u t S t re a m lo s
s o b re e s crib e :
public int read() throws IOException {
int b = in.read();
if (b != -1) {
cksum.update(b);
}
return b;
}

public int read(byte[] b) throws IOException {


int len;
len = in.read(b, 0, b.length);
if (len != -1) {
cksum.update(b, 0, b.length);
}
return len;
}

public int read(byte[] b, int off, int len) throws IOException {


len = in.read(b, off, len);
if (len != -1) {
cksum.update(b, off, len);
}
return len;
}
La im p le m e n t a ció n d e e s t o s t re s m é t o d o s re a d ( ) e s s e n cilla : le e n lo s d a t o s d e l ca n a l d e
e n t ra d a a l q u e e s t e ; ca n a l filt ra d o h a s id o a ñ a d id o , y lu e g o s i s e h a le id o a lg ú n d a t o , a ct u a liza n
la s u m a .

El Interface Checksum y la Clase Adler32


El in t e rfa ce Ch e cks u m d e fin e cu a t ro m é t o d o s p a ra s u m a r o b je t o s , e s t o s m é t o d o s re s e t e a n ,
a ct u a liza n y d e vu e lve e l va lo r d e la s u m a . S e p o d ría e s crib ir u n a cla s e Ch e cks u m q u e ca lcu le la
s u m a d e u n t ip o d e d a t o e s p e cífico co m o la s u m a d e CRC- 3 2 . Ob s e rva q u e la h e re n cia e n la
s u m a e s la n o ció n d e e s t a d o . El o b je t o ch e cks u m n o s ó lo ca lcu la u n a s u m a d e u n a fo rm a . En s u
lu g a r, la s u m a e s a ct u a liza d a ca d a ve z q u e s e le e o e s crib e in fo rm a ció n e n e l ca n a l s o b re e l q u e
e s t e o b je t o e s t á ca lcu la n d o la s u m a . S i q u ie re s re u t iliza r u n o b je t o Ch e cks u m , d e b e s
re s e t e a rlo .
Pa ra e s t e e je m p lo , im p le m e n t a m o s e l o b je t o ch e cks u m Ad le r3 2 , q u e e s ca s i u n a ve rs ió n d e u n
o b je t o ch e cks u m CRC- · p e ro q u e p u e d e s e r ca lcu la d o m u ch o m á s rá p id a m e n t e .

Un Programa Principal para Probarlo


La ú lt im a cla s e d e e s t e e je m p lo , Ch e cke d IOTe s t , co n t ie n e e l m é t o d o m a in ( ) p a ra e l p ro g ra m a :
import java.io.*;

class CheckedIOTest {
public static void main(String[] args) {

Adler32 inChecker = new Adler32();


Adler32 outChecker = new Adler32();
CheckedInputStream cis = null;
CheckedOutputStream cos = null;

try {
cis = new CheckedInputStream(new FileInputStream("farrago.txt"),
inChecker);
cos = new CheckedOutputStream(new FileOutputStream("outagain.txt"),
outChecker);
} catch (FileNotFoundException e) {
System.err.println("CheckedIOTest: " + e);
System.exit(-1);
} catch (IOException e) {
System.err.println("CheckedIOTest: " + e);
System.exit(-1);
}

try {
int c;

while ((c = cis.read()) != -1) {


cos.write(c);
}

System.out.println("Suma del Canal de Entrada: " + inChecker.getValue());


System.out.println("Suma del Canal de Salida:: " + outChecker.getValue());

cis.close();
cos.close();
} catch (IOException e) {
System.err.println("CheckedIOTest: " + e);
}
}
}
El m é t o d o m a in ( ) cre a d o s o b je t o s ch e cks u m Ad le r3 2 , u n o p a ra Ch e cke d Ou t p u t S t re a m y o t ro
p a ra Ch e cke d In p u t S t re a m . El e je m p lo re q u ie re d o s o b je t o s ch e cks u m p o rq u e s e a ct u a liza n
d u ra n t e la s lla m a d a s a re a d ( ) y w rit e ( ) y e s t a s lla m a d a s o cu rre n d e fo rm a co n cu rre n t e .
Lu e g o , m a in ( ) a b re u n Ch e cke d In p u t S t re a m s o b re u n p e q u e ñ o fich e ro d e t e xt o fa rra g o . t xt , y
u n Ch e cke d Ou t p u t S t re a m s o b re u n fich e ro d e s a lid a lla m a d o o u t a g a in . t x t ( q u e n o e xis t irá
h a s t a q u e s e e je cu t e e l p ro g ra m a p o r p rim e ra ve z) .
El m é t o d o m a in ( ) le e e l t e xt o d e s d e Ch e cke d In p u t S t re a m y lo co p ia e n Ce cke d Ou t p u t S t re a m .
Lo s m é t o d o s re a d ( ) y w rit e ( ) u t iliza r e l o b je t o ch e cks u m Ad le r3 2 p a ra ca lcu la r la s u m a
d u ra n t e la le ct u ra y e s crit u ra . De s p u é s d e q u e s e h a ya le id o co m p le t a m e n t e e l fich e ro d e
e n t ra d a ( y co n s e cu e n t e m e n t e , s e h a ya t e rm in a d o d e e s crib ir e l fich e ro d e s a lid a ) , e l p ro g ra m a
im p rim e la s u m a d e lo s d o s ca n a le s ( q u e d e b e ría n co rre s p o n d e r) y lu e g o cie rra lo s d o s
ca n a le s .
Cu a n d o s e e je cu t e Ch e cke d IOTe s t d e b e ría s ve r e s t a s a lid a :
Suma del Canal de Entrada: 736868089
Suma del sanal de Salida: 736868089

Filtrar Ficheros de Acceso Aleatorio


Lo s ca n a le s filt ra d o s d e l p a q u e t e ja va . io d e s cie n d e n d e In p u t S t re a m o Ou t p u t S t re a m q u e
im p le m e n t a n lo s fich e ro s d e a cce s o s e cu e n cia l. En t o n ce s , s i s e s u b cla s ifica Filt e rIn p u t S t re a m o
Filt e rOu t p u t S t re a m lo s ca n a le s filt ra d o s t a m b ié n s e rá n fich e ro s d e a cce s o s e cu e n cia l. Es crib ir
filt ro s p a ra fich e ro s d e a cce s o a le a t o rio m á s a d e la n t e e s e s t á le cció n le m u e s t ra có m o
re - e s crib ir e s t e e je m p lo p a ra q u e t ra b a je e n u n Ra n d o m Acce s s File a s í co m o co n u n
Da t a In p u t S t re a m o u n Da t a Ou t p u t S t re a m .

Oz it o
Trabajar con Ficheros de Acceso Aleatorio
Lo s ca n a le s d e e n t ra d a y s a lid a q u e h a s a p re n d id o h a s t a a h o ra e n e s t a le cció n h a n
s id o ca n a le s d e a cce s o s e cu e n cia l - - ca n a le s cu yo co n t e n id o d e b e s e r le id o o
e s crit o s e cu e n cia lm e n t e . Es t o e s in cre ib le m e n t e ú t il, lo s fich e ro s d e a cce s o
s e cu e n cia l s o n co n s e cu e n cia d e u n m e d io s e cu e n cia l có m o u n a cin t a m a g n é t ica .
Po r o t ro la d o , lo s fich e ro s d e a cce s o a le a t o rio , p e rm it e n u n a cce s o n o s e cu e n cia l, o
a le a t o rio a l co n t e n id o d e u n fich e ro .
Ve a m o s p o r q u é p o d ría m o s n e ce s it a r fich e ro s d e a cce s o a le a t o rio . Co n s id e re m o s e l
fo rm a t o d e a rch ivo co n o cid o co m o "zip ". Lo s a rch ivo s Zip co n t ie n e n fich e ro s q u e
n o rm a lm e n t e e s t á n co m p rim id o s p a ra a h o rra r e s p a cio . Es t o s a rch ivo s t a m b ié n
co n t ie n e n u n a "e n t ra d a d e d ire ct o rio " q u e in d ica d o n d e co m ie n za n lo s d is t in t o s
fich e ro s co n t e n id o s d e n t ro d e l a rch ib o Zip :
Ah o ra s u p o n g a m o s q u e q u e re m o s e xt ra e r u n fich e ro e s p e cífico d e u n a rch ivo Zip .
S i u t iliza ra m o s u n ca n a l d e a cce s o s e cu e n cia l, t e n d ría q u e h a ce r lo s ig u ie n t e :
● Ab rir e l a rch ivo Zip .

● Bu s ca r a t ra vé s d e l a rch ivo Zip h a s t a q u e s e lo ca lice e l fich e ro q u e q u ie re


e xt ra e r.
● Ext ra e r e l Fich e ro .

● Ce ra r e l a rch ivo Zip .

Co m o m ín im o , u t iliza n d o e s t e a rg u m e n t o , h a b re m o s t e n id o q u e le e r m e d io a rch ivo


Zip a n t e s d e e n co n t ra r e l fich e ro q u e q u ie re e xt ra e r. S e p u e d e e xt ra e r e l m is m o
fich e ro d e u n a rch ivo Zip d e u n a fo rm a m á s e ficie n t e u t iliza n d o la ca ra ct e rís t ica d e
b ú s q u e d a d e u n fich e ro d e a cce s o a le a t o rio :
● Ab rir e l a rch vivo Zip .

● Bu s ca r e n la e n t ra d a d e d ire ct o rio y lo ca liza r la e n t ra d a p a ra e l fich e ro q u e


q u ie re e xt ra e r.
● Bu s ca r ( h a cia a t rá s ) d e n t ro d e l a rch ivo Zip h a s t a la p o s ició n d e l fich e ro a
e xt ra e r.
● Ext ra e r e l fich e ro .

● Ce rra r e l a rch ivo Zip .

Es t e a lg o rit m o e s m u ch o m á s e ficie n t e p o rq u e s ó lo le e la e n t ra d a d e d ire ct o rio y e l


fich e ro q u e s e q u ie re e xt ra e r.
La cla s e Ra n d o m Acce s s File d e l p a q u e t e ja va . io im p le m e n t a u n fich e ro d e a cce s o
a le a t o rio .

Utilizar Ficheros de Acceso Aleatorio


Al co n t ra rio q u e la s cla s e s d e ca n a le s d e I/ O d e ja va . io ,
Ra n d o m Acce s s File s e u t iliza t a n t o p a ra le e r co m o p a ra e s crib ir fich e ro s .
S e p u e d e cre a r e l Ra n d o m Acce s s File co n d ife re n t e s a rg u m e n t o s
d e p e n d ie n d o d e lo q u e s e in t e n t e h a ce r, le e r o e s crib ir.

Escribir Filtros para Ficheros de Acceso Aleatorio


Ra n d o m Acce s s File e s t á d e a lg u n a fo rm a d e s co n e ct a d o d e lo s ca n a le s d e
I/ O d e ja va . io - - n o d e s cie n d e d e la s cla s e s In p u t S t re a m o
Ou t p u t S t re a m . Es t o t ie n e a lg u n a d e s ve n t a ja e n q u e n o s e p u e d e n a p lica r
lo s m is m o s filt ro s a Ra n d o m Acce s s File s co m o s e p u e d e h a ce r co n lo s
o t ro s ca n a le s . S in e m b a rg o , Ra n d o m Acce s s File im p le m e n t a lo s in t e rfa ce s
Da t a In p u t y Da t a Ou t p u t , p o r lo q u e s e p o d ría d e h e ch o d is e ñ a r u n filt ro
q u e t ra b a ja n d o co n Da t a In p u t o Da t a Ou t p u t p o d ría t ra b a ja r ( d e a lg u n a
fo rm a ) co n fich e ro s d e a cce s o s e cu e n cia l ( lo s ú n ico s q u e im p le m e n t a n
Da t a In p u t o Da t a Ou t p u t ) co m o co n cu a lq u ie r Ra n d o m Acce s s File .

Oz it o
Utilizar Ficheros de Acceso Aleatorio
La cla s e Ra n d o m Acce s s File im p le m e n t a lo s in t e rfa ce s Da t a In p u t y Da t a Ou t p u t y
p o r lo t a n t o p u e d e u t iliza rs e t a n t o p a ra le e r co m o p a ra e s crib ir. Ra n d o m Acce s s File
e s s im ila r a File In p u t S t re a m y File Ou t p u t S t re a m e n q u e s e e s p e cifica u n fich e ro d e l
s is t e m a d e fich e ro s n a t ivo p a ra a b rirlo cu a n d o s e cre a . S e p u e d e h a ce r e s t o co n u n
n o m b re d e fich e ro o u n o b je t o File . Cu a n d o s e cre a u n Ra n d o m Acce s s File , s e d e b e
in d ica r s i s ó lo s e va a le e r e l fich e ro o t a m b ié n s e va a e s crib ir e n é l. La s ig u ie n t e
lín e a d e có d ig o ja va cre a u n Ra n d o m Acce s s File p a ra le e r e l fich e ro lla m a d o
fa rra g o . t x t :
new RandomAccessFile("farrago.txt", "r");
Y e s t a o t ra a b re e l m is m o fich e ro p a ra le e r y e s crib ir:
new RandomAccessFile("farrago.txt", "rw");
De s p u é s d e h a b e r a b ie rt o e l fich e ro , s e p u e d e n u t iliza r lo s m é t o d o s co m u n e s
re a d XXX( ) o w rit e XXX( ) p a ra re a liza r la I/ O s o b re e l fich e ro .
Ra n d o m Acce s s File s o p o rt a la n o ció n d e p u n t e ro d e fich e ro . El p u n t e ro d e fich e ro
in d ica la p o s ició n a ct u a l d e n t ro d e l fich e ro . Cu a n d o e l fich e ro s e cre a p o r p rim e ra
ve z, e l p u n t e ro d e fich e ro e s ce ro , in d ica n d o e l p rin cip io d e l fich e ro . La s lla m a d a s a
lo s m é t o d o s re a d XXX( ) y w rit e XXX( ) a ju s t a n e l p u n t e ro d e fich e ro e l n ú m e ro d e
b yt e s le id o s o e s crit o s .
Ad e m á s d e lo s m é t o d o s n o rm a le s d e I/ O q u e m u e ve n im p lícit a m e n t e e l p u n t e ro d e
fich e ro cu a n d o o cu rre u n a o p e a ció n , Ra n d o m Acce s s File co n t ie n e t re s m é t o d o s q u e
m a n ip u la n e xp licit a m e n t e e l p u n t e ro d e fich e ro .
s k ip By t e s ( )
Mu e ve e l p u n t e ro d e fich e ro h a cia a d e la n t e e l n ú m e ro d e b yt e s e s p e cifica d o .
s e e k( )
Po s icio n a e l p u n t e ro d e fich e ro ju s t o e n e l b yt e e s p e cifica d o .
g e t File P o in t e r( )
De vu e lve la p o s ició n a ct u a l d e l p u n t e ro d e fich e ro .

Oz it o
Escribir Filtros para Ficheros de Acceso Aleatorio
Re e s crib a m o s e l e je m p lo d e Es crib ir n u e s t ro s p ro p io s Ca n a le s Filt ra d o s p a ra q u e t ra b a je co n u n
Ra n d o m Acce s s File . Co m o Ra n d o m Acce s s File im p le m e n t a lo s in t e rfa ce s Da t a In p u t y Da t a Ou t p u t , u n
b e n e ficio la t e ra l e s q u e lo s ca n a le s filt ra d o s t a m b ié n t ra b a ja n co n o t ro s ca n a le s Da t a In p u t y Da t a Ou t p u t
in clu ye n d o a lg u n o s ca n a le s d e a cce s o s e cu e n cia l ( co m o Da t a In p u t S t re a m y Da t a Ou t p u t S t re a m ) .
El e je m p lo Ch e cke d IOTe s t d e Es crib ir n u e s t ro s p ro p io s Ca n a le s Filt ra d o s im p le m e n t a d o s ca n a le s
filt ra d o s Ch e cke d In p u t S t re a m y Ch e cke d Ou t p u t S t re a m , q u e ca lcu la n la s u m a d e lo s d a t o s le id o s o
e s crit o s e n u n ca n a l.
En e l n u e vo e je m p lo , Ch e cke d Da t a Ou t p u t s e h a re e s crit o Ch e cke d Ou t p u t S t re a m - - ca lcu la la s u m a d e lo s
d a t o s e s crit o s e n e l ca n a l - - p e ro o p e ra s o b re o b je t o s Da t a Ou t p u t e n ve z d e s o b re o b je t o s
Ou t p u t S t re a m . De fo rm a s im ila r, Ch e cke d Da t a In p u t m o d ifica Ch e cke d In p u t S t re a m p a ra q u e a h o ra
t ra b a je s o b re o b je t o s Da t a In p u t e n ve z d e h a ce rlo s o b re o b je t o s In p u t S t re a m .

CheckedDataOutput contra CheckedOutputStream

Ech e m o s u n vis t a zo a la s d ife re n cia s e n t re Ch e cke d Da t a Ou t p u t y Ch e cke d Ou t p u t S t re a m .


La p rim e ra d ife re n cia e s q u e Ch e cke d Da t a Ou t p u t n o d e s cie n d e d e Filt e rOu t p u t S t re a m . En s u
lu g a r, im p le m e n t a e l in t e rfa ce Da t Ou t p u t .
public class CheckedDataOutput implements DataOutput

N o t a : Pa ra in t e n t a r m a n t e n e r e l e je m p lo lo m á s s e n cillo p o s ib le , la cla s e Ch e cke d Da t a Ou t p u t


re a lm e n t e n o e s t á d e cla ra d a p a ra im p le m e n t a r e l in t e rfa ce Da t a In p u t . Es t o e s a s í p o rq u e e s t e
in t e rfa ce im p le m e n t a d e m a s ia d o s m é t o d o s . S in e m b a rg o , la cla s e Ch e cke d Da t a Ou t p u t co m o
e s t á im p le m e n t a d a e n e l e je m p lo , s i q u e im p le m e n t a va rio s m é t o d o s d e Da t a In p u t p a ra
ilu s t ra r có m o d e b e ría n t ra b a ja r.

Lu e g o , Ch e cke d Da t a Ou t p u t d e cla ra u n a va ria b le p riva d a p a ra co n t e n e r e l o b je t o Da t a Ou t p u t .


private DataOutput out;
Es t e e s e l o b je t o d o n d e s e e s crib ira n lo s d a t o s .
El co n s t ru ct o r d e Ch e cke d Da t a Ou t p u t s e d ife re n cia d e l d e Ch e cke d Ou t p u t S t re a m e n q u e e l
p rim e ro cre a u n o b je t o Da t a Ou t p u t e n ve z d e u n Ou t p u t S t re a m .
public CheckedDataOutput(DataOutput out, Checksum cksum) {
this.cksum = cksum;
this.out = out;
}
Ob s e rva q u e e s t e co n s t ru ct o r n o lla m a a s u p e r( o u t ) co m o lo h a cia e l co n s t ru ct o r d e
Ch e cke d Ou t p u t S t re a m . Es t o e s a s í p o rq u e Ch e cke d Da t a Ou t p u t d e s cie n d e d e la cla s e Ob je ct
e n ve z d e u n a cla s e s t re a m .
Es t a s h a n s id o la s ú n ica s m o d ifica cio n e s h e ch a s e n Ch e cke d Ou t p u t S t re a m p a ra cre a r u n filt ro
q u e t ra b a je co n o b je t o s Da t a Ou t p u t .

CheckedDataInput contra CheckedInputStream


Ch e cke d Da t a In p u t re q u ie re lo s m is m o s ca m b io s q u e Ch e cke d Da t a Ou p u t :
● Ch e cke d Da t a In p u t n o d e s cie n d e d e Filt e rIn p u t S t re a m p e ro im p le m e n t a e l in t e rfa ce
Da t a In p u t e n s u lu g a r.

N o t a : Pa ra in t e n t a r m a n t e n e r e l e je m p lo lo m á s s e n cillo p o s ib le , la cla s e
Ch e cke d Da t a In p u t re a lm e n t e n o e s t á d e cla ra d a p a ra im p le m e n t a r e l in t e rfa ce Da t a In p u t .
Es t o e s a s í p o rq u e e s t e in t e rfa ce im p le m e n t a d e m a s ia d o s m é t o d o s . S in e m b a rg o , la cla s e
Ch e cke d Da t a In p u t co m o e s t á im p le m e n t a d a e n e l e je m p lo , s i q u e im p le m e n t a va rio s
m é t o d o s d e Da t a In p u t p a ra ilu s t ra r có m o d e b e ría n t ra b a ja r.

● Ch e cke d Da t a In p u t d e cla re u n a va ria b le p riva d a p a ra co n t e n e r u n o b je t o Da t a In p u t .


● El co n s t ru ct o r d e Ch e cke d Da t a In p u t re q u ie re u n o b je t o Da t a In p u t e n ve z d e u n
In p u t S t re a m .
Ad e m á s d e e s t o s ca m b io s t a m b ié n s e h a n ca m b ia d o lo s m é t o d o s re a d ( ) .
Ch e cke d In p u t S t re a m d e l e je m p lo o rig in a l im p le m e n t a d o s m é t o d o s re a d ( ) , u n o p a ra le e r u n
s ó lo b yt e y o t ro p a ra le e r u n a rra y d e b yt e s . El in t e rfa ce Da t a In p u t t ie n e m é t o d o s q u e
im p le m e n t a n la m is m a fu n cio n a lid a d , p e ro t ie n e n d ife re n t e s n o m b re s y d ife re n t e s firm a d e
m é t o d o . As í lo s m é t o d o s re a d ( ) d e la cla s e Ch e cke d Da t a In p u t t ie n e n n u e vo s n o m b re s y
firm a s d e m é t o d o :
public byte readByte() throws IOException {
byte b = in.readByte();
cksum.update(b);
return b;
}

public void readFully(byte[] b) throws IOException {


in.readFully(b, 0, b.length);
cksum.update(b, 0, b.length);
}

public void readFully(byte[] b, int off, int len) throws IOException {


in.readFully(b, off, len);
cksum.update(b, off, len);
}

Los Programas Principales


Fin a lm e n t e , e s t e e je m p lo t ie n e d o s p ro g ra m a s p rin cip a le s p a ra p ro b a r lo s n u e vo s filt ro s :
Ch e cke d DITe s t , q u e e je cu t a lo s filt ro s e n fich e ro s d e a cce s o s e cu e n cia l ( o b je t o s
Da t a In p u t S t re a m a n d Da t a Ou t p u t S t re a m o b je ct s ) , y Ch e cke d RAFTe s t , q u e e je cu t a lo s filt ro s
e n fich e ro s d e a cce s o a le a t o rio ( Ra n d o m Acce s s File s ) .
Es t o s d o s p ro g ra m a s p rin cip a le s s e d ife re n cia n s ó lo e n e l t ip o d e o b je t o q u e a b re lo s filt ro s d e
s u m a . Ch e cke d DITe s t cre a u n Da t a In p u t S t re a m y u n Da t a Ou t p u t S t re a m y u t iliza e l filt ro
s u m a d o r s o b re e llo s . co m o e s t o :
cis = new CheckedDataInput(new DataInputStream(
new FileInputStream("farrago.txt")), inChecker);
cos = new CheckedDataOutput(new DataOutputStream(
new FileOutputStream("outagain.txt")), outChecker);
Ch e cke d RAFTe s t cre a cre a d o s Ra n d o m Acce s s File s , u n o p a ra le e r y o t ro p a ra e s crib ir, y u t iliza
e l filt ro s u m a d o r s o b re e llo s :
cis = new CheckedDataInput(new RandomAccessFile("farrago.txt", "r"), inChecker);
cos = new CheckedDataOutput(new RandomAccessFile("outagain.txt", "rw"), outChecker);
Cu a n d o s e e je cu t e cu a lq u ie ra d e e s t o s p ro g ra m a s d e b e ría ve r la s ig u ie n t e s a lid a :
Suma del canal de Entrada: 736868089
Suma del canal de Salida: 736868089

Oz it o
Cambios en el JDK 1.1:
Que afectan a los Steams de I/O
El p a q u e t e ja v a . io h a s id o a m p lia d o co n s t re a m s d e ca ra ct e re s . q u e s o n co m o
s t re a m d e b yt e s p e ro q u e co n t ie n e n ca ra ct e re s Un ico d e d e 1 6 - b it s , e n ve z d e
vyt e s d e 8 - b it s . Lo s s t re a m s d e ca rá ct e re s h a ce n s e n cillo e s crib ir p ro g ra m a s q u e
n o s e a n d e p e n d ie n t e s d e u n a co d ifica ció n e s p e cífica d e ca ra ct e re s . y p o r lo t a n t o
s o n s e n cillo s d e in t e rn a cio n a liza r. Ca s i t o d a la fu n cio n a lid a d e xis t e n t e e n lo s
s t re a m s d e b yt e s t a m b ié n e s t á d is p o n ib le e n lo s s t re a m s d e ca ra ct e re s . S t e a m s
de I/ O
La m a yo ría d e lo s p ro g ra m a d o re s q u e u t ilice n JDK 1 . 1 d e b e n u t iliza r e l
n u e vo s t re a m d e ca ra ct e re s p a ra h a ce r I/ O. Pu e d e s ve r Ca m b io s e n e l
JDK 1 . 1 : El Pa q u e t e ja va . io .
Tu p rim e r e n c u e n t ro c o n la I / O e n Ja v a
En e l JDK 1 . 1 . la s a lid a d e p ro g ra m a s d e t e xt o d e b e n e s crib irs e m e d ia n t e
u n Prin t Writ e r. Ca m b io s e n e l JDK 1 . 1 : S a lid a d e Pro g ra m a s d e Te xt o .
I n t ro d u c c ió n a lo s S t re a m s d e I / O
S e h a n a ñ a d id o n u e va s cla s e s a l p a q u e t e ja v a . io p a ra s o p o rt a r la
le ct u ra - e s crit u ra d e ca ra ct e re s Un ico d e d e 1 6 - b it s . Pu e d e s ve r Ca m b io s
e n e l JDK 1 . 1 : El Pa q u e t e ja va . io .
Ut iliz a r S t re a m s p a ra Le e r y Es c rib ir Fic h e ro s
La m a yo ría d e lo s p ro g ra m a d o re s d e l JDK 1 . 1 d e b e ría n u t iliza r la s
n u e va s cla s e s File Re a d e r y File W rit e r. Pu e d e s ve r Ca m b io s e n e l JDK
1 . 1 : I/ O d e Fich e ro s .
Ut iliz a r S t re a m s p a ra Le e r y Es c rib ir P o s ic io n e s d e Me m o ria
La m a yo ría d e lo s p ro g ra m a d o re s d e l JDK 1 . 1 d e b e ría n u t iliza r la s
n u e va s cla s e s d e s t re a m s d e ca ra ct e re s . Pu e d e s ve r Ca m b io s e n e l JDK
1 . 1 : I/ O d e Me m o ria .
Ut iliz a r S t re a m s p a ra Co n c a t e n a r Fic h e ro s
El JDK 1 . 1 n o p ro p o rcio n a u n a a lt e rn a t iva d e s t re a m d e ca ra ct e re s p a ra
e l s t re a m d e b yt e s S e q u e n c e I n p u t S t re a m .
Tra b a ja r c o n Fic h e ro s Filt ra d o s
La m a yo ría d e lo s p ro g ra m a d o re s d e l JDK 1 . 1 d e b e ría n u t iliza r la s
n u e va s cla s e s d e s t re a m s d e ca ra ct e re s . Pu e d e s ve r Ca m b io s e n e l JDK
1 . 1 : S t re a m s Filt ra d o s .
Ut iliz a r D a t a I n p u t S t re a m y D a t a Ou t p u t S t re a m
El m é t o d o D a t a I n p u t S t re a m . re a d Lin e h a ca d u ca d o . Pu e d e s ve r
Ca m b io s e n e l JDK 1 . 1 : Da t a I/ O.
Es c rib ir t u s p ro p io s S t re a m s Filt ra d o s
Co m o e l e je m p lo Ch e ckS u m u t iliza Byt e s , n o d e b e ría s e r m o d ifica d o p a ra
u t iliza r la s n u e va s cla s e s d e s t re a m s d e ca ra ct e re s .
Es c rib ir Filt ro s p a ra Fic h e ro s d e Ac c e s o Ale a t o rio
Co m o e l e je m p lo Ch e ckS u m u t iliza Byt e s , n o d e b e ría s e r m o d ifica d o p a ra
u t iliza r la s n u e va s cla s e s d e s t re a m s d e ca ra ct e re s .

Oz it o
El Applet "Hola Mundo"
S ig u ie n d o lo s p a s o s d e e s t a p á g in a , p o d ré m o s cre a r y u t iliza r u n a p p le t .

Crear un Fichero Fuente Java


Cre a m o s u n fich e ro lla m a d o Ho la Mu n d o . ja v a co n e l có d ig o Ja va d e l
s ig u ie n t e lis t a d o :
import java.applet.Applet;
import java.awt.Graphics;

public class HelloWorld extends Applet {


public void paint(Graphics g) {
g.drawString("HolaMundo!", 50, 25);
}
}

Compilar el Fichero Fuente


Co m p ila r u n Fic h e ro Fu e n t e Ja v a Ut iliz a n d o e l JD K: D e t a lle s
Es p e c ífic o s d e la P la t a fo rm a :
UN I X:
ja va c Ho la Mu n d o . ja va
D OS s h e ll ( W in d o w s 9 5 / N T) :
ja va c Ho la Mu n d o . ja va
Ma c OS :
Lle va e l ico n o d e l fich e ro Ho la Mu n d o . ja va a l ico n o d e l Co m p ila d o r d e
Ja va .
S i la co m p ila ció n t ie n e é xit o , e l co m p ila d o r cre a u n fich e ro lla m a d o
Ho la m u n d o . c la s s .
S i la co m p ila ció n fa lla , a s e g u ra t e d e q u e h a s t e cle a d o y lla m a d o a l
p ro g ra m a e xa ct a m e n t e co m o s e m o s t ró a rrib a .

Crear un Fichero HTML que incluya el Applet


Cre e u n fich e ro lla m a d o Ho la . h t m l e n e l m is m o d ire ct o rio q u e co n t ie n e
Ho la Mu n d o . c la s s . Es t e fich e ro HTML d e b e co n t e n e r e l s ig u ie n t e t e xt o :
<HTML>
<HEAD>
<TITLE> A Programa Sencillo </TITLE>
</HEAD>
<BODY>

Aquí está la salida de mi programa:


<APPLET CODE="HolaMundo.class" WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>

Cargar el Fichero HTML


Ca rg a e l fich e ro HTML e n u n a a p lica ció n q u e p u e d a e je cu t a r a p p le t s . Es t a
a p lica ció n p o d ría s e r u n n a ve g a d o r co m p a t ib le co n Ja va u o t ro p ro g ra m a
q u e p e rm it e vis u a liza r a p p le t s , co m o e l Ap p le t Vie we r d e l JDK. Pa ra
ca rg a r e l fich e ro HTML, n o rm a lm e n t e s ó lo s e n e ce s it a d e cirle a la
a p lica ció n la URL d e l fich e ro HTML q u e s e h a cre a d o . Po r e je m p lo ,
p o d ría m o s in t ro d u cir a lg o co m o e s t o e n e l ca m p o d e lo ca liza ció n d e s u
n a ve g a d o r:
file:/paginas/web/HTML/Hola.html
Un a ve z q u e h a s co m p le t a d o e s t o s p a s o s co n é xit o , p o d rá s ve r a lg o
co m o e s t o e n la ve n t a n a d e l n a ve g a d o r:
Aq u í t ie n e s la s a lid a d e l p ro g ra m a :

Oz it o
La Anatomía de un Applet Java
Ah o ra q u e h a s vis t o u n a p p le t Ja va , p ro b a b le m e n t e q u e rrá s s a b e r co m o t ra b a ja .
Re cu e rd a q u e u n a p p le t Ja v a e s u n p ro g ra m a q u e s e a d h ie re a u n a s e rie d e
co n ve n cio n e s q u e le p e rm it e n e je cu t a rs e d e n t ro d e n a ve g a d o re s co m p a t ib le s co n
Ja va .
Aq u í t ie n e s e l có d ig o p a ra e l a p p le t "Ho la Mu n d o ".
import java.applet.Applet;
import java.awt.Graphics;

public class HolaMundo extends Applet {


public void paint(Graphics g) {
g.drawString("Hola Mundo!", 50, 25);
}
}

Importar Clases y Paquetes


El có d ig o a n t e rio r e m p ie za co n d o s s e n t e n cia s im p o rt . Me d ia n t e la
im p o rt a ció n d e cla s e s o p a q u e t e s , u n a cla s e p u e d e re fe rirs e m á s
fá cilm e n t e a o t ra s cla s e s e n o t ro s p a q u e t e s . En e l le n g u a je Ja va , lo s
p a q u e t e s s e u t iliza n p a ra a g ru p a r cla s e s d e fo rm a s im ila r a co m o la s
lib re ria s C a g ru p a n fu n cio n e s .

Definir una Subclase Applet


Ca d a a p p le t d e b e d e fin ir u n a s u b cla s e d e la cla s e Ap p le t . En e l Ap p le t
"Ho la Mu n d o ", e s t a s u b cla s e s e lla m a Ho la Mu n d o . Lo s a p p le t s h e re d a n
ca s i t o d a s u fu n cio n a lid a d d e la cla s e Ap p le t , d e s d e la co m u n ica ció n co n
e l n a ve g a d o r h a s t a la p o s ib ilid a d d e p re s e n t a r u n in t e rfa ce g rá fico d e
u s u a rio ( GUI) .

Implementar Métodos Applet


El a p lle t Ho la Mu n d o s ó lo im p le m e n t a u n m é t o d o , e l m é t o d o p a in t ( ) .
Ca d a a p p le t d e b e im p le m e n t a r, a l m e n o s , u n o d e lo s s ig u ie n t e s
m é t o d o s : in it ( ) , s t a rt ( ) , o p a in t ( ) . Al co n t ra rio q u e la s a p lica cio n e s
Ja va , lo s a p p le t n o n e ce s it a n im p le m e n t a r e l m é t o d o m a in ( ) .

Ejecutar un Applet
Lo s a p p le t s e s t á n d ie ñ a d o s p a ra in clu irlo s e n p á g in a s HTML. Ut iliza n d o la
e t iq u e t a < APPLET> , s e p u e d e e s p e cifia r ( co m o m ín im o ) la lo ca liza ció n d e
la s u b cla s e Ap p le t y la s d im e n s io n e s d e la ve n t a n a d e l a p p le t . Cu a n d o e l
n a ve g a d o r co m p a t ib le co n Ja va e n cu e n t ra la e t iq u e t a < APPLET> , re s e rva
u n e s p a cio e n la p a n t a lla p a ra e l a p p le t , ca rg a la s u b cla s e Ap p le t d e n t ro
d e l o rd e n a d o r d o n d e s e e s t á e je cu t a n d o e l n a ve g a d o r y cre a u n e je m p la r
d e la s u b cla s e Ap p le t . Lu e g o e l n a ve g a d o r lla m a a lo s m é t o d o s in it ( ) y
s t a rt ( ) d e l a p p le t , y é s t e e m p ie za s u e je cu ció n .

Oz it o
Importar Clases y Paquetes
La s d o s p rim e ra s lín e a s d e l s ig u ie n t e lis t a d o im p o rt a n d o s cla s e s u t iliza d a s e n e l
a p p le t : Ap p le t y Gra p h ics .
import java.applet.Applet;
import java.awt.Graphics;

public class HolaMundo extends Applet {


public void paint(Graphics g) {
g.drawString("Hola Mundo!", 50, 25);
}
}
S i s e e lim in a n la s d o s p rim e ra s lín e a s , e l a p p le t t o d a vía s e co m p ila y s e e je cu t a ,
p e ro s ó lo s i s e ca m b ia e l re s t o d e l có d ig o d e la s ig u ie n t e fo rm a :
public class HolaMundo extends java.applet.Applet {
public void paint(java.awt.Graphics g) {
g.drawString("Hola Mundo!", 50, 25);
}
}
Co m o p u e d e s ve r, la im p o rt a ció n d e la s cla s e s Ap p le t y Gra p h ics le p e rm it e a l
p ro g ra m a re fe rirs e a e lla s s in p re fijo s . Lo s p re fijo s ja v a . a p p le t . y ja v a . a w t . le
d ice n a l co m p ila d o r lo s p a q u e t e s e n lo s q u e d e b e ría b u s ca r la s cla s e s Ap p le t y
Gra p h ics . Lo s d o s p a q u e t e s , ja va . a p p le t y ja va . a wt s o n p a rt e d e l co ra zó n d e l API
d e Ja va - - API co n e l q u e ca d a p ro g ra m a Ja va p u e d e co n t a r d e n t ro d e l e n t o rn o
Ja va .
El p a q u e t e ja va . a p p le t co n t ie n e cla s e s q u e s o n e s e n cia le s p a ra lo s a p p le s Ja va . El
p a q u e t e ja va . a wt co n t ie n e la s cla s e s m á s u t iliza d a s e n la h e rra m ie n t a d e Ve n t a n a s
Ab s t a ra ct a s ( AWT) q u e p ro p o rcio n a e l in t e rfa ce g rá fico d e u s u a rio ( GUI) d e Ja va .
Ad e m á s d e im p o rt a r cla s e s in d ivid u a le s , t a m b ié n s e p u e d e im p o rt a r p a q u e t e s
co m p le t o s . Aq u í t ie n e s u n e je m p lo :
import java.applet.*;
import java.awt.*;

public class HolaMundo extends Applet {


public void paint(Graphics g) {
g.drawString("Hola Mundo!", 50, 25);
}
}
En e l le n g u a je Ja va , ca d a cla s e e s u n p a q u e t e . S i e l có d ig o fu e n t e d e u n a cla s e n o
t ie n e a l p rin cip io la s e n t e n cia p a c k a g e d e cla ra n d o e l p a q u e t e e n e l q u e s e
e n cu e n t ra la cla s e , la cla s e e s t á e n t o n ce s e n e l p a q u e t e p o r d e fe ct o . Ca s i t o d a s la s
cla s e s d e e je m p lo u t iliza d a s e n e s t e t u t o ria l s e e n cu e n t ra n e n e l p a q u e t e p o r
d e fe ct o .
De n t ro d e u n p a q u e t e , t o d a s la s cla s e s s e p u e d e n re fe rir u n a s a o t ra s s in p re fijo s .
Po r e je m p lo , la cla s e Co m p o n e n t d e ja va . a wt s e re fie re a la cla s e Gra p h ics d e
ja va . a wt s in p re fijo s , s in im p o rt a r la cla s e Gra p h ics .

Oz it o
Definir una Subclase Applet
La p rim e ra lín e a e n n e g rit a d e l s ig u ie n t e lis t a d o e m p ie za u n b lo q u e q u e d e fin e la
cla s e Ho la Mu n d o .
import java.applet.Applet;
import java.awt.Graphics;

public class HolaMundo extends Applet {


public void paint(Graphics g) {
g.drawString("Hola Mundo!", 50, 25);
}
}
La p a la b ra cla ve e x t e n d s in d ica q u e Ho la Mu n d o e s u n a s u b cla s e d e la cla s e cu yo
n o m b re vie n e a co n t in u a ció n : Ap p le t .
De la cla s e Ap p le t , lo s a p p le t s h e re d a n u n g ra n ca n t id a d d e fu n cio n a lid a d e s . Qu izá s
la m á s im p o rt a n t e e s la h a b ilid a d d e re s p o n d e r a la s p e t icio n e s d e l n a ve g a d o r. Po r
e je m p lo , cu a n d o u n n a ve g a d o r co m p a t ib le co n Ja va ca rg a u n a p á g in a q u e co n t ie n e
u n a p p le t , e l n a ve g a d o r e n vía u n a p e t ició n a l a p p le t , p a ra q u e é s t e s e in icia lice y
e m p ie ce s u e je cu ció n . Ap re n d e rá m á s s o b re lo q u e p ro p o rcio n a la cla s e Ap p le t e n
la le cció n : De s crip ció n d e u n Ap p le t

Un a p p le t n o e s t á re s t rin g id o a d e fin ir s ó lo u n a cla s e . Ju n t o co n la n e ce s a ria


s u b cla s e Ap p le t , u n a p p le t p u e d e d e fin ir cla s e s d e u s u a rio a d icio n a le s . Cu a n d o u n
a p p le t in t e n t a e je cu t a r u n a cla s e , la a p lia ció n b u s ca la cla s e e n e l o rd e n a d o r lo ca l.
S i la cla s e n o e s t á d is p o n ib le lo ca lm e n t e , la ca rg a d e s d e la p o s ició n d o n d e fu e ra
o rig in a ria la s u b cla s e Ap p le t .

Oz it o
Implementar Métodos en un Applet
La s lín e a s e n n e g rit a d e l s ig u ie n t e lis t a d o im p le m e n t a n e l m é t o d o p a in t ( ) .
import java.applet.Applet;
import java.awt.Graphics;

public class HolaMundo extends Applet {


public void paint(Graphics g) {
g.drawString("Hola Mundo!", 50, 25);
}
}
To d o s lo s a p p le t s d e b e n im p le m e n t a r u n o o m á s d e e s t o s m é t o d o s : in it ( ) ,
s t a rt ( ) , o p a in t ( ) . Ap re n d e rá m á s s o b re e s t o s m é t o d o s e n la le cció n De s crip ció n
d e u n Ap p le t
Ju n t o co n lo s m é t o d o s in it ( ) , s t a rt ( ) , y p a in t ( ) , u n a p p le t p u e d e im p le m e n t a r
d o s m é t o d o s m á s q u e e l n a ve g a d o r p u e d e lla m a r cu a n d o o cu rre u n e ve n t o
p rin cip a l ( co m o s a lir d e la p á g in a d e l a p p le t ) : s t o p ( ) y d e s t ro y ( ) . Lo s a p p le t s
p u e d e n im p le m e n t a r cu a lq u ie r n ú m e ro d e m é t o d o s , a s í co m o m é t o d o s d e l clie n t e y
m é t o d o s q u e s o b re e s crib e n lo s m é t o d o s im p le m e n t a d o s p o r la s u p e rcla s e .
Vo lvie n d o a l có d ig o a n t e rio r, e l o b je t o Gra p h ics p a s a d o d e n t ro d e l m é t o d o p a in t ( )
re p re s e n t a e l co n t e xt o d e d ib u jo e n la p a n t a lla d e l a p p le t . El p rim e r a rg u m e n t o d e l
m é t o d o d ra w S t rin g ( ) e s la ca d e n a q u e s e m u e s t ra e n la p a n t a lla . El s e g u n d o
a rg u m e n t o s o n la s p o s icio n e s ( x, y) d e la e s q u in a in fe rio r izq u ie rd a d e l t e xt o e n la
p a n t a lla . Es t e a p p le t m u e s t ra la ca d e n a "Ho la Mu n d o " e n la p o s ició n ( 5 0 , 2 5 ) . La s
co o rd e n a d a s d e la ve n t a n a d e l a p p le t e m p ie za n e n ( 0 , 0 ) , q u e e s la e s q u in a
s u p e rio r izq u ie rd a d e la ve n t a n a d e l a p p le t .
Ap re n d e rá s m á s s o b re e l d ib u jo e n la p a n t a lla e n la p á g in a : Cre a r u n In t e rfa ce d e
Us u a rio

Oz it o
Ejecutar un Applet
La s lín e a s e n n e g rit a e n e l s ig u ie n t e lis t a d o co m p re n d e n la e t iq u e t a < APPLET> q u e
in clu ye e l a p p le t "Ho la Wo rld " e n u n a p á g in a HTML.
<HTML>
<HEAD>
<TITLE> Un Programa Sencillo </TITLE>
</HEAD>
<BODY>

Aquí está la salida de mi programa:


<APPLET code="HolaMundo.class" WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>
La e t iq u e t a < APPLET> e s p e cifica q u e e l n a ve g a d o r d e b e ca rg a r la cla s e s u yo
có d ig o co m p ila d o e s t á e n e l fich e ro lla m a d o Ho la Mu n d o . c la s s . El n a ve g a d o r
b u s ca e s t e fich e ro e n e l m is m o d ire ct o rio d e l d o cu m e n t o HTML q u e co n t ie n e la
e t iq u e t a .
Cu a n d o u n n a ve g a d o r e n cu e n t ra e l fich e ro d e la cla s e , la ca rg a a t ra vé s d e la re d ,
s i e s n e ce s a rio , h a s t a e l o rd e n a d o r d o n d e s e e s t á e je cu t a n d o e l n a ve g a d o r. El
n a ve g a d o r cre a u n e je m p la r d e la cla s e . S i s e in clu ye u n a p p le t d o s ve ce s e n u n a
p á g in a , e l n a ve g a d o r ca rg a la cla s e u n a s ó la ve z y cre a d o s e je m p la re s d e la cla s e .
Lo s a t rib u t o s WIDTH y HEIGHT s o n ig u a le s q u e lo s d e la e t iq u e t a < IMG> :
Es p e cifica n e l t a m a ó e n p ixe ls d e l á re a d e la p a n t a lla re s e rva d o p a ra e l a p p le t .
Mu ch o s n a ve g a d o re s n o p e rm it e n q u e e l a p p le t m o d ifiq u e s u t a m a ñ o m á s a llá d e
e s t e á re a , Po r e je m p lo , ca d a b it q u e d ib u ja e l a p p le t "Ho la Mu n d o " e n s u m é t o d o
p a in t ( ) o cu rre d e n t ro d e u n á re a d e p a n t a lla d e 1 5 0 x2 5 - p ixe ls q u e re s e rva la
e t iq u e t a < APPLET> .
Pa ra o b t e n e r m á s in fo rm a ció n s o b re la e t iq u e t a < APPLET> , p u e d e ve r Añ a d ir u n
Ap p le t a u n a Pá g in a HTML

Oz it o
Descripción de un Applet
Ca d a a p p le t e s t á im p le m e n t a d o m e d ia n t e u n a s u b cla s e d e la cla s e Ap p le t . La
s ig u ie n t e fig u ra m u e s t ra la s h e re n cia s d e la cla s e Ap p le t . Es t a s h e re n cia s
d e t e rm in a n m u ch o d e lo q u e u n a p p le t p u e d e h a ce r y co m o lo h a ce , co m o ve rá s e n
la s s ig u ie n t e s p á g in a s .
java.lang.Object
|
+----java.awt.Component
|
+----java.awt.Container
|
+----java.awt.Panel
|
+----java.applet.Applet

Un Applet Sencillo
Lo d e a b a jo e s e l có d ig o fu e n t e d e u n Ap p le t lla m a d o S im p le . Es t e a p p le t
m u e s t ra u n a ca d e n a d e s crip t iva d o n d e s e e n cu e n t ra e l m a yo r e ve n t o e n
s u vid a , cu a n d o e l u s u a rio vis it e p o r p rim e ra ve z la p á g in a d e l a p p le t .
La s p á g in a s q u e s ig u e n u t iliza n e l a p p le t S im p le y co n s t ru ye n s o b re é l
p a ra ilu s t ra r co n ce p t o s q u e s o n co m u n e s a m u ch o s Ap p le t s .
import java.applet.Applet;
import java.awt.Graphics;

public class Simple extends Applet {


StringBuffer buffer;
public void init() {
buffer = new StringBuffer();
addItem("inicializando... ");
}

public void start() {


addItem("arrancando... ");
}

public void stop() {


addItem("parando... ");
}

public void destroy() {


addItem("preparando para descargar...");
}
void addItem(String newWord) {
System.out.println(newWord);
buffer.append(newWord);
repaint();
}

public void paint(Graphics g) {


//Dibuja un Rectangulo alrededor del area del Applet.
g.drawRect(0, 0, size().width - 1, size().height - 1);

//Dibuja la cadena actual dentro del Rectangulo.


g.drawString(buffer.toString(), 5, 15);
}
}

El Ciclo de Vida de un Applet


S e p u e d e u t iliza r e l a p p le t S im p le p a ra a p re n d e r s o b re lo s e ve n t o s e n
ca d a u n a d e la s vid a s d e u n a p p le t .

Métodos para Milestones


La cla s e Ap p le t p ro p o rcio n a u n a zo n a d e t ra b a jo p a ra la e je cu ció n d e l
a p p le t , d e fin ie n d o m é t o d o s q u e e l s is t e m a lla m a cu a n d o o cu rre u n
m ile s t o n e - - El m a yo r e ve n t o e n e l ciclo d e vid a d e u n a p p le t - - . La
m a yo ría d e lo s a p p le t s p a s a n p o r e n cim a d e e s t o s m é t o d o s p a ra
re s p o n d e r a p ro p ia d a m e n t e a l m ile s t o n e .

Métodos para dibujar y para manejar eventos


Lo s Ap p le t s h e re d a n lo s Mé t o d o s d e d ib u jo y d e m a n e jo d e e ve n t o s d e la
cla s e co m p o n e n t e AWT. ( AWT s ig n ifica Ab s t ra ct Win d o win g To o lkit ; lo s
a p p le t s y la s a p lica cio n e s u t iliza n s u s cla s e s p a ra p ro d u cir In t e rfa ce s d e
u s u a rio . ) Dib u ja r s e re fie re a a lg o re la cio n a d o co n la re p re s e n t a ció n d e u n
a p p le t e n la p a n t a lla - - d ib u ja r im á g e n e s , p re s e n t a r co m p o n e n t e s d e u n
in t e rfa ce co m o b o t o n e s , o u t iliza r g rá fico s ru d im e n t a rio s . Ma n e jo d e
Ev e n t o s s e re fie re a la d e t e cció n y p ro ce s a m ie n t o d e la s e t ra d a s d e l
u s u a rio co m o p u ls a cio n e s d e l Ra t ó n o d e l t e cla d o , a s í co m o o t ro s
e ve n t o s a b s t ra ct o s co m o s a lva r fich e ro s o ce rra r ve n t a n a s .

Métodos para añadir Componentes UI


Lo s Ap p le t s d e s cie n d e n d e la cla s e co n t e n d o ra AWT. Es t o s ig n fica q u e
e s t á n d is e ñ a d o s p a ra co n t e n e r Co m p o n e n t e s - - Ob je t o s d e u n in t e rfa ce
d e u s u a rio co m o b o t o n e s , e t iq u e t a s , lis t a s d e p le g a b le s y b a rra s d e
d e s p la za m ie n t o . Al ig u a l q u e o t ro s co n t e n e d o re s lo s a p p le t s t ie n e n
m a n e ja d o re s p a ra co n t ro la r e l p o s icio n a m ie n t o d e lo s Co m p o n e n t e s .

Tareas en un Applet
Co m o h a s a p re n d id o e n Ta re a s d e Co n t ro l, u n a t a re a - - co n o cid a t a m b ie n
co m o u n co n t e x t o d e e je cu ció n o u n p ro ce s o lig e ro - - e s u n s e n cillo flu jo
d e co n t ro l s e cu e n cia l d e n t ro d e u n p ro ce s o . In clu s o e l a p p le t m á s s e n cillo
s e e je cu t a e n m u lt ip le s t a re a s , a u n q u e n o s ie m p re e s o b vio . Mu ch o s
a p p le t s cre a n y u t iliza n s u s p ro p ia s t a re a s , p o r e s o la s re a liza n
co rre ct a m e n t e s in a fe ct a r e l re n d im ie n t o d e la a p lica ció n d o n d e s e
e n cu e n t ra n o d e o t ro s a p p le t s .

Qué puede y qué no puede hacer un Applet


Po r ra zo n e s d e s e g u rid a d , u n a p p le t q u e s e h a ca rg a d o a t ra vé d e la Re d
t ie n e m u ch a s re s t riccio n e s . Un a d e e lla s e s q u e n o rm a lm e n t e n o p u e d e
le e r o e s crib ir fich e ro s e n e l o rd e n a d o r d o n d e s e e s t á e je cu t a n d o . Ot ra e s
q u e u n a p p le t n o p u e d e h a ce r co n e xio n e s a t ra vé s d e la re d e xce p t o
h a cia e l Ho s t d e l q u e h a ve n id o . A p e s a r d e e s t a s re s t riccio n e s lo s
a p p le t s p u e d e n h a ce r a lg u n a s co s a s q u e n o s e e s p e ra n . Po r e je m p lo , u n
a p p le t p u e d e lla m a r a lo s m é t o d o s p ú b lico s d e o t ro a p p le t q u e e s t é e n la
m is m a p á g n a .

Añadir un Applet a una página HTML


Un a ve z q u e h a s e s crit o u n a p p le t , n e ce s it a s a ñ a d irlo a u n a p á g in a HTML
p a ra q u e p u e d a e je cu t a rs e .

Oz it o
El Ciclo de Vida de un Applet
Lo q u e ve s a q u í e s e l re s u lt a d o d e l a p p le t S im p le .

Cargando el Applet
Arrib a p u e d e s ve r "in icia liza n d o . . . a rra n ca n d o . . . ", co m o e l re s u lt a d o d e
q u e e l a p p le t e s t á s ie n d o ca rg a d o . Cu a n d o u n a p p le t s e ca rg a , a q u í e s t á
lo q u e s u ce d e :
1 . S e cre a u n e je m p la r d e la cla s e d e l Ap p le t ( u n a s u b cla s e Ap p le t ) .
2 . El Ap p le t s e in ic ia liz a a s i m is m o .
3 . El Ap p le t e m p ie z a s u e je cu ció n .

Abandonando y Volviendo a la Página que contiene el Applet


Cu a n d o e l u s u a rio a b a n d o n a la p á g in a - - p o r e je m p lo , p a ra ir a o t ra
p á g in a - - e l a p p le t t ie n e la o p ció n d e p a ra rs e . Cu a n d o e l u s u a rio re t o rn a
a la p á g in a , e l a p p le t p u e d e e m p e z a r d e n u e vo s u e je cu ció n . La m is m a
s e cu e n cia o cu rre cu a n d o e l u s u a rio m in im iza y m a xim iza la ve n t a n a q u e
co n t ie n e e l a p p le t .
P ru e b a e s t o :Ab a n d o n a y lu e g o vu e lve a e s t a p á g in a . Ve ra s q u e s e
a ñ a d e "p a ra n d o . . . " a la s a lid a d e l a p p le t , p o rq u e e l a p p le t t ie n e la o p ció n
d e p a ra rs e a s i m is m o . Ta m b ié n ve ra s "a rra n ca n d o . . . ", cu a n d o e l a p p le t
e m p ie ce a e je cu t a rs e d e n u e vo .
N o t a d e l N a v e g a d o r: S i e s t á s u t iliza n d o e l Ne t s ca p e Na vig a t o r 2 . 0 o
2 . 0 1 , p o d ría o b s e rva r q u e e l a p p le t s e in icia liza m á s d e u n a ve z.
Es p e cifica m e n t e , e l n a ve g a d o r le p id e a l a p p le t q u e s e in icia lice d e n u e vo
cu a n d o e l u s u a rio re t o rn a a la p á g in a d e l a p p le t s ig u ie n d o u n e n la ce . El
n a ve g a d o r NO s e lo p e d irá cu a n d o e l u s u a rio re t o rn e a la p á g in a
u t iliza n d o e l b o t ó n Ba ck. Lo ú lt im o e s e l co m p o rt a m ie n t o e s p e ra d o .
P ru e b a e s t o : Min im iza e s t a ve n t a n a y lu e g o a b re la d e n u e vo . Mu ch o s
s is t e m a s d e ve n t a n a s p ro p o rcio n a n u n b o t ó n e n la b a rra d e t ít u lo p a ra
h a ce r e s t o . De b e ría ve r "p a ra n d o . . . " y "a rra ca n d o . . . "e n la s a lid a d e l
a p p le t .

Recargar el Applet
Alg u n o s n a ve g a d o re s le p e rm it e n a l u s u a rio re ca rg a r lo s a p p le t s , q u e
co n s is t e e n d e s ca rg a r e l a p p le t y lu e g o ca rg a rlo o t ra ve z. An t e s d e
d e s ca rg a r e l a p p le t , e s t e t ie n e la o p ció n d e p a ra rs e e l m is m o y lu e g o
re a liza r u n lim p ia d o fin a l, p a ra q u e e l a p p le t p u e d a lib e ra r lo s re cu rs o s
q u e h a t o m a d o . De s p u é s d e e s t o , e l a p p le t s e d e s ca rg a y s e ca rg a d e
n u e vo s , co m o s e d e s crib e e n Ca rg a r e l a p p le t .

N o t a d e l N a v e g a d o r:El Ne t s ca p e Na vig a t o r 2 . 0 a lg u n a s ve ce s
re ca rg a rá e l a p p le t s i s e p u ls a S h ift m ie n t ra s h a ce click e n e l b o t ó n d e
Re lo a d . S i e s t o fa lla , p u e d e in t e n t a r va cia r lo s ca ch e s d e m e m o ria y
d is co d e l Ne t s ca p e ( d e s d e e l d iá lo g o Op t io n s / Ne t wo rk Pre fe re n ce s ) y
re ca rg a r o t ra ve z.

Saliendo del Navegador


Cu a n d o e l u s u a rio s a le o a b a n d o n a e l Na ve g a d o r ( o la a p lica ció n q u e
m u e s t re e l a p p le t ) , e l a p p le t t ie n e la o p ció n d e p a ra rs e a s i m is m o y
h a ce r u n a lim p ie z a fin a l a n t e s d e s a lir d e l n a ve g a d o r.

Sumario
Un a p p le t p u e d e re a cio n a r a lo s p rin cip a le s e ve n t o s d e la s ig u ie n t e
fo rm a :
● Pu e d e in ic ia liz a rs e a s i m is m o .

● Pu e d e e m p e z a r s u e je cu ció n .

● Pu e d e p a ra r la e je cu ció n .

● Pu e d e re a liza r u n a lim p ie z a fin a l, p a ra p re p a ra r la d e s ca rg a .

La p á g in a s ig u ie n t e d e s crib e lo s cu a t ro s m é t o d o s d e l a p p le t q u e
co rre s p o n d e n co n e s t o s cu a t ro t ip o s d e re a ccio n e s .

Oz it o
Métodos de Applets
public class Simple extends Applet {
. . .
public void init() { . . . }
public void start() { . . . }
public void stop() { . . . }
public void destroy() { . . . }
. . .
}
El Ap p le t S im p le , co m o cu a lq u ie r o t ro , e s u n a s u b cla s e d e la cla s e Ap p le t . La cla s e
S im p le s o b re e s crib e cu a t ro m é t o d o s d e la cla s e Ap p le t p a ra p o d e r re s p o n d e r a lo s
p rin cip a le s e ve n t o s :
in it ( )
Pa ra in ic ia liz a r e l a p p le t ca d a ve z q u e s e ca rg a .
s t a rt ( )
Pa ra in ic ia r la e je cu ció n d e l a p p le t , u n a ve z ca rg a d o e l a p p le t o cu a n d o e l
u s u a rio vu e lve a vis it a r la p á g in a q u e co n t ie n e e l a p p le t .
s to p( )
Pa ra p a ra r la e je cu ció n d e l a p p le t , cu a n d o e l u s u a rio a b a n d o n a la p á g in a o
s a le d e l n a ve g a d o r.
d e s t ro y ( )
Re a liza u n a lim p ie z a fin a l p a ra p re p a ra r la d e s ca rg a .
No t o d o s lo s a p p le t s n e ce s it a n re e s crib ir e s t o s m é t o d o s . Alg u n o s a p p le t s m u y
s e n cillo s n o s o b re e s crib e n n in g u n o d e e llo s , p o r e je m p lo e l "Ap p le t Ho la Mu n d o " n o
s o b re e s crib e n in g u n o d e e s t o s m é t o d o s , ya q u e n o h a ce n a d a e xce p t o d ib u ja rs e a
s i m is m o . El Ap p le t "Ho la Mu n d o " s ó lo m u e s t ra u n a ca d e n a u n a ve z, u t iliza n d o s u
m é t o d o p a in t ( ) . ( El m é t o d o p a in t ( ) s e d e s crib e e n la p á g in a s ig u ie n t e . ) S in
e m b a rg o , la m a yo ría d e lo s a p p le t s , h a ce n m u ch o m á s .
El m é t o d o in it ( ) s e u t iliza p a ra u n a in icia liza ció n d e u n a s o la ve z, q u e n o t a rd a
m u ch o t ie m p o . En g e n e ra l, e l m é t o d o in it ( ) d e b e ría co n t e n e r e l có d ig o q u e s e
p o n d ría n o rm a lm e n t e e n u n co n s t ru ct o r. La ra zó n p o r la q u e n o rm a lm e n t e lo s
a p p le t s n o t ie n e n co n s t ru ct o re s e s p o rq u e u n a p p le t n o t ie n e g a ra n t iza d o u n
e n t o rn o co m p le t o h a s t a q u e s e lla m a a s u m é t o d o in it ( ) . Po r e je m p lo , e l m é t o d o
p a ra ca rg a r im á g e n e s e n u n a p p le t s im p le m e n t e n o fu n cio n a d e n t ro d e l co n s t ru ct o r
d e u n a p p le t . Po r o t ro la d o , e l m é t o d o in it ( ) , e s u n b u e n lu g a r p a ra lla m a r a lo s
m é t o d o s p a ra ca rg a r im á g e n e s , ya q u e e s t o s m é t o d o s re t o rn a n rá p id a m e n t e .
N o t a d e l N a v e g a d o r: Ne t s ca p e Na vig a t o r 2 . 0 a n d 2 . 0 . 1 a lg u n a s ve ce s lla m a n a l
m é t o d o in it ( ) m á s d e u n a ve z d e s p u e s d e h a b e r ca rg a d o e l a p p le t . Pu e d e s ve r la
p a g in a a n t e rio r p a ra m a s d e t a lle s .
To d o s lo s a p p le t s q u e h a ce n a lg o d e s p u e s d e la in icia liza cio n ( e xce p t o la re s p u e s t a
a u n a a ccio n d e l u s u a rio ) d e b e n s o b re e s crib ir e l m e t o d o s t a rt ( ) . Es t e m é t o d o
re a liza e l t ra b a jo d e l a p p le t o ( d ich o d e o t ra fo rm a ) a rra n ca u n a o m a s t a re a s p a ra
re a liza r e l t ra b a jo . Ap re n d e rá m a s s o b re la s t a re a s m a s a d e la n t e e n e s t a ru t a , e n
Ta re a s e n u n Ap p le t . Ap re n d e rá m a s s o b re e l m a n e jo d e e ve n t o s e n re p re s e n t a ció n
d e l u s u a rio e n la p á g in a s ig u ie n t e .

La m a yo ría d e lo s a p p le t s q u e s o b re e s crib e n e l m é t o d o s t a rt ( ) t a m b ie n d e b e ria n


s o b re e s crib ir e l m é t o d o s t o p ( ) . Es t e m é t o d o d e b e ria p a ra r la e je cu cio n d e l a p p le t ,
p a ra q u e n o g a s t e re cu rs o s d e l s is t e m a cu a n d o e l u s u a rio n o e s t a vie n d o la p á g in a
d e l a p p le t . Po r e je m p lo , u n a p p le t q u e m u e s t ra a n im a cio n e s d e b e p a ra r d e
m o s t ra rla s cu a n d o e l u s u a rio n o e s t a m ira n d o .
La m a yo ría d e lo s a p p le t s n o n e ce s it a n s o b re e s crib it e l m é t o d o d e s t ro y ( ) , p o rq u e
s u m é t o d o s t o p ( ) ( a l q u e s e lla m a a n t e s d e l m é t o d o d e s t ro y ( ) ) h a ce t o d o lo
n e ce s a rio p a ra d e t e n e r la e je cu cio n d e l a p p le t . S in e m b a rg o , e l m é t o d o d e s t ro y ( )
e s t a d is p o n ib le p a ra lo s a p p le t s q u e n e ce s it a n lib e ra r re cu rs o s a d icio n a le s .
Lo s m é t o d o s in it ( ) , s t a rt ( ) , s t o p ( ) , y d e s t ro y ( ) s e u t iliza n m u y fre cu e n t e m e n t e
e n e s t e t u t o ria l.

Oz it o
Métodos para Dibujar y Manejar Eventos
class Simple extends Applet {
. . .
public void paint(Graphics g) { . . . }
. . .
}
El a p p le t S im p le d e fin e s u a p a rie n cia e n la p a n t a lla s o b re e s crib ie n d o e l m é t o d o
p a in t ( ) . El m é t o d o p a in t ( ) e s u n o d e lo s d o s m é t o d o s d e p a n t a lla q u e lo s a p p le t s
p u e d e n s o b re e s crib ir:
p a in t ( )
El m é t o d o d e d ib u jo b á s ico . Mu ch o s a p p le t s im p le m e n t a n e l m é t o d o p a in t ( )
p a ra m o s t ra r la re p re s e n t a ció n d e u n a p p le t d e n t ro d e la p á g in a d e l
n a ve g a d o r.
upda te ( )
Un m é t o d o q u e s e p u e d e u t iliza r ju n t o e n e l m é t o d o p a in t ( ) p a ra a u m e n t a r e l
re n d im ie n t o d e lo s g rá fico s .
Lo s Ap p le t s h e re d a n s u s m é t o d o s p a in t ( ) y u p d a t e ( ) d e la cla s e Ap p le t , y e s t a lo
h e re d a d e la cla s e Co m p o n e n t AWT ( Ab s t ra ct Win d o w To o lkit ) .
De la cla s e Co m p o n e n t , lo s a p p le t s h e re d a n u n g ru p o d e m é t o d o s p a ra e l m a n e jo
d e e ve n t o s . La cla s e Co m p o n e n t d e fin e va rio s m é t o d o s ( co m o s o n a c t io n ( ) y
m o u s e D o w n ( ) ) p a ra m e n e ja r e ve n t o s p a rt icla re s , y u n o q u e ca p t u ra t o d o s lo s
e ve n t o s , h a n d le Ev e n t ( ) .
Pa ra re a ccio n a r a u n e ve n t o , u n a p p le t d e b e s o b re e s crib ir e l m é t o d o e s p e cia liza d o
a p ro p ia d o o e l m é t o d o h a n d le Ev e n t ( ) . Po r e je m p lo , a ñ a d ie n d o e l s ig u ie n t e có d ig o
a l a p p le t S im p le a p p le t h a ce q u e é s t e re s p o n d a a lo s clicks d e ra t ó n .

import java.awt.Event;
. . .
public boolean mouseDown(Event event, int x, int y) {
addItem("click!... ");
return true;
}
Lo q u e s e ve a b a jo e s e l re s u lt a d o d e l a p p le t . Cu a n d o s e h a ce click d e n t ro d e s u
re ct á n g u lo , m u e s t ra la p a la b ra "click!. . . ".

Oz it o
Métodos para añadir componentes UI
El có d ig o d e vis u a liza ció n d e l a p p le t S im p le ( im p le m e n t a d o p o r s u m é t o d o p a in t ( ) )
e s d e fe ct u o s o : n o s o p o rt a d e s p la za m ie n t o . Un a ve z q u e e l t e xt o m o s t ra d o a lca n za
e l fin a l d e l re ct á n g u lo , n o s e p u e d e ve r e l re s t o d e l t e xt o .
La s o lu ció n m a s s im p le p a ra e s t e p ro b le m a e s u t iliza r u n co m p o n e n t e d e u n
In t e rfa ce d e Us u a rio p re - fa b rica d o ( UI) q u e t e n g a u n co m p o rt a m ie n t o co rre ct o .
N o t a :Es t a p á g in a g lo s a s o b re m u ch o s d e t a lle s . Pa ra a p re n d e r re a lm e n t e a u t iliza r
lo s co m p o n e n t e d e UI p u e d e s ve r Cre a r u n In t e rfa ce d e Us u a rio

Componentes del UI Pre-Fabricado


El AWT s u m in is t ra lo s s ig u ie n t e s co m p o n e n t e s ( la cla s e q u e im p le m e n t a
ca d a co m p o n e n t e s e lis t a e n t re p a re n t e s is ) :
● Bo t o n e s ( ja va . a wt . Bu t t o n )

● Ch e ckb o xe s ( ja va . a wt . Ch e ckb o x)

● Ca m p o s d e Te xt o d e u n a lin e a ( ja va . a wt . Te xt Fie ld )

● Are a s d e Ed icio n y vis u a liza cio n d e t e xt o ( ja va . a wt . Te xt Are a )

● Et iq u e t a s ( ja va . a wt . La b e l)

● Lis t a s ( ja va . a wt . Lis t )

● Lis t a s d e s p le g a b le s ( ja va . a wt . Ch o ice )

● Ba rra s d e De s p la za m ie n t o ( ja va . a wt . S cro llb a r)

● Are a s d e Dib u jo ( ja va . a wt . Ca n va s )

● Me n ú s ( ja va . a wt . Me n u , ja va . a wt . Me n u It e m ,
ja va . a wt . Ch e ckb o xMe n u It e m )
● Co n t e n e d o re s ( ja va . a wt . Pa n e l, ja va . a wt . Win d o w y s u s s u b cla s e s )

Métodos para utilizar Componentes UI en Applets


Co m o la cla s e Ap p le t h e re d a d e s d e la cla s e Co n t a in e r d e AWT, e s m u y
fa cil a ñ a d ir co m p o n e n t e s a u n a p p le t y u t iliza r m a n e ja d o re s d e
d is t rib u ció n p a ra co n t ro la r la p o s ició n d e lo s co m p o n e n t e s e n la p a n t a lla .
Aq u i t ie n e a lg u n o s d e lo s m é t o d o s Co n t a in e r q u e p u e d e u t iliza r u n
a p p le t :
add( )
Añ a d e e l co m p o n e n t e e s p e cifica d o .
re m o v e ( )
Elim in a e l co m p o n e n t e e s p e cifica d o .
s e t La y o u t ( )
Act iva e l m a n e ja d o r d e Dis t rib u cio n .

Añadir un Campo de Texto no Editable al applet Simple


Pa ra h a ce r q u e e l a p p le t S im p le u t ilice u n ca m p o d e t e xt o n o e d it a b le
co n d e s p la za m ie n t o , u t iliza re m o s la cla s e Te xt Fie ld . Aq u i t ie n e s e l có d ig o
fu e n t e re vis a d o . Lo s ca m b io s s e m u e s t ra n m a s a b a jo :
//Ya no se necesita importar java.awt.Graphics
//porque el applet no implemnta el método paint().
. . .
import java.awt.TextField;

public class ScrollingSimple extends Applet {

//En vez de utilizar un StringBuffer, usa un TextField:


TextField field;
public void init() {
//Crea el campo de texto y lo hace no editable.
field = new TextField();
field.setEditable(false);

//Activa el manejador de distriución para que el campo de


//texto sea lo más ancho posible.
setLayout(new java.awt.GridLayout(1,0));

//Añade el campo de texto al applet.


add(field);

validate();

addItem("initializing... ");
}

. . .
void addItem(String newWord) {
//Esto se utiliza para añadir el string al StringBuffer;
//ahora se añade al campo de texto TextField.
String t = field.getText();
System.out.println(newWord);
field.setText(t + newWord);
repaint();
}

//El método paint() method ya no se necesita,


//porque TextField se redibuja a sí mismo automáticamente.
El m é t o d o re vis a d o d e in it ( ) cre a u n ca m p o d e t e xt o n o e d it a b le ( u n
e je m p la r d e Te xt Fie ld ) . S e a ct iva e l m a n e ja d o r d e d is t rib u ció n p a ra q u e
h a g a e l ca m p o d e t e xt o t a n a n ch o co m o s e a p o s ib le ( co n o ce rá m á s a l
d e t a lle e l m a n e ja d o r d e s t rib u ció n e n Dis t rib u ye n d o co m p o n e n t e s co n u n
Co n t e n e d o r) y lu e g o s e a ñ a d e e l ca m p o d e t e xt o a l a p p le t .

De s p u e s d e t o d o e s t o , e l m é t o d o in it ( ) lla m a a l m é t o d o v a lid a t e ( ) ( q u e
e l a p p le t a h e re d a d o d e la cla s e Co m p o n e n t ) . S e d e b e lla m a r a
v a lid a t e ( ) ca d a ve z q u e s e a ñ a d a u n o o m a s co m p o n e n t e s a u n a p p le t
e s u n a b u e n a p rá ct ica q u e a s e g u ra q u e lo s co m p o n e n t e s s e d ib u ja n a s i
m is m o s e n la p a n t a lla . S i q u ie re s a h o n d a r e n la s ra zo n e s d e p o rq u e
t ra b a ja e l m e t o d o v a lid a t e ( ) , le a De t a lle s d e la Arq u it e ct u ra d e
Co m p o n e n t

Lo q u e ve a b a jo e s e l re s u lt a d o d e l Ap p le t m o d ifica d o .

Oz it o
Threads en Applets
N o t a : Es t a p á g in a a s u m e q u e ya s a b e s q u é s o n lo s t h re a d s . S i n o e s a s í, p u e d e s
le e r ¿ Qu é s o n lo s t h re a d s ? a n t e s d e le e r e s t a p á g in a .

Ca d a a p p le t p u e d e e je cu t a r m ú lt ip le s t h re a d s . A lo s m é t o d o s d e d ib u jo d e u n
Ap p le t ( p a in t ( ) y u p d a t e ( ) ) s e le s lla m a s ie m p re d e s d e lo s t h re a d s d e d ib u jo y
m a n e jo d e e ve n t o s d e l AWT. La s lla m a d a s a la s t h re a d s m á s im p o rt a n t e d e lo s
m é t o d o s - - in it ( ) , s t a rt ( ) , s t o p ( ) , y d e s t ro y ( ) - - d e p e n d e n d e la a p lica ció n q u e
e s t é e je cu t a n d o e l a p p le t . Pe ro la a p lica ció n s ie m p re la s lla m a d e s d e lo s t h re a d s d e
d ib u jo y m a n e jo d e e ve n t o s d e l AWT.
Mu ch o s n a ve g a d o re s , co m o e l Ne t s ca p e Na vig a t o r 2 . 0 p a ra S o la ris , a s ig n a n u n
t h re a d p a ra ca d a u n o d e lo s a p lle t s d e u n a p á g in a , u t iliza n d o e s t e t h re a d p a ra
lla m a r a lo s m é t o d o s m á s im p o rt a n t e s d e l a p p le t . Alg u n o s n a ve g a d o re s a s ig n a n u n
g ru p o d e t h re a d s p a ra ca d a a p p le t , a s í e s fá cil e lim in a r t o d a s lo s t h re a d s q u e
p e rt e n ce n a u n a p p le t p a rt icu la r. En cu a lq u ie r ca s o , p u e d e s e s t a r s e g u ro q u e ca d a
u n a d e lo s t h re a d s d e lo s m é t o d o s m á s im p o rt a n t e s d e cu a lq u ie r a p p le t p e rt e n ce a l
m is m o g ru p o d e t h re a d s .
Ab a jo t ie n e s d o s a p p le t s Prin t Th re a d . Prin t Th re a d e s u n a ve rs ió n m o d ifica d a d e l
a p p le t S im p le q u e im p rim e lo s t h re a d s lla m a d o s p o r s u s m é t o d o s in it ( ) , s t a rt ( ) ,
s t o p ( ) , d e s t ro y ( ) , y u p d a t e ( ) . Aq u í t ie n e s e l có d ig o p a ra e l e je m p lo in co m p le t o ,
y p a ra e l e je m p lo m á s in t e re s a n t e . Co m o e s n o rm a l, p a ra ve r lo s m é t o d o s d e
s a lid a co m o e s d e s t ro y ( ) q u e s e lla m a d u ra n t e la d e s ca rg a n e ce s it a rá ve r la s a lid a
s t a n d a rd .
En t o n ce s ¿ Po r q u é n e ce s it a u n a p p le t cre a r y u t iliza r s u s p ro p io s t h re a d s ? Im a g in a
u n a p p le t q u e re a liza a lg u n a in icia liza ció n q u e co n s u m e m u ch o t ie m p o - - co m o la
ca rg a d e im á g e n e s , p o r e je m p lo - - e n s u m é t o d o in it ( ) . El t h re a d q u e lla m ó a
in it ( ) n o p u e d e h a ce r n a d a h a s t a in it ( ) re t o rn e . En a lg u n o s n a ve g a d o re s , e s t o
p o d ría s ig n ifica r q u e e l n a ve g a d o r n o p o d ría m o s t ra r e l a p p le t o n a d a h a s t a q u e e l
a p p le t s e h u b ie ra in icia liza d o a s i m is m o . En t o n ce s s i e l a p p le t e s t á a l p rin cip io d e
la p á g in a , p o r e je m p lo , n o s e ve rá n a d a e n la p á g in a h a s t a q u e e l a p p le t h a ya
t e rm in a d o s u in icia liza ció n .
In clu s o e n lo s n a ve g a d o re s q u e cre a n u n t h re a d s e p a ra d o p a ra ca d a a p p le t , t ie n e
s e n t id o in t ro d u cir lo s t h re a d s q u e co n s u m e n m a s t ie m p o e n t h re a d s cre a d a s p o r e l
a p p le t , p a ra q u e e l a p p le t p u e d a re a liza r o t ro s t h re a d s m ie n t ra s e s p e ra a q u e s e
t e rm in e n lo s t h re a d s q u e co n s u m e n m á s t ie m p o .
Re g la d e l P u lg a r: S i u n a p p le t re a liza t ra b a jo s q u e co n s u m e n m u ch o t ie m p o ,
d e b e rá cre a r y u t iliza r s u s p ro p io s t h re a d s p a ra re a liza r e s o s t ra b a jo s .

Oz it o
Ejemplos de Threads en Applets
Es t a p á g in a e xp lica d o s e je m p lo s d e la u t iliza ció n d e t h re a d s e n u n a p p le t . El p rim e r
a p p le t , An im a t o rAp p le t , m u e s t ra co m o u t iliza r u n t h re a d p a ra re a liza r u n a t a re a
re p e t it iva . El a p p le t An im a t o rAp p le t vie n e d e la p á g in a Cre a r u n Bu cle d e An im a ció n .
El s e g u n d o a p p le t d e e s t a p á g in a , S o u n d Exa m p le , m u e s t ra co m o u t iliza r t h re a d s p a ra
t a re a s d e in ica iliza ció n d e u n a s ó la ve z. El a p p le t S o u n d Exa m p le s e e n cu e n t ra e n la
p á g in a Eje cu t a r S o n id o s .
Es t a p á g in a n o e xp lica e l có d ig o b á s ico d e lo s t h re a d s . Pa ra a p re n d e r a lg o m á s a ce rca
d e la im p le m e n t a ció n d e lo s t h re a d s e n Ja va , p u e d e s re fe rirt e a t h re a d s d e Co n t ro l

Utilizar un thread para Realizar Tareas Repetitivas.


No rm a lm e n t e , u n a p p le t q u e re a liza la m is m a t a re a u n a y o t ra ve z d e b e ría
t e n e r u n t h re a d co n u n b lu cle w h ile ( o d o . . . w h ile ) q u e re a lice la t a re a . Un
e je m p lo t íp ico e s u n a p p le t q u e re a liza u n a a n im a ció n t e m p o riza d a , co m o u n
vis u a liza d o r d e p e lícu la s o u n ju e g o . Un a p p le t d e a n im a ció n n e ce s it a u n
t h re a d q u e le p id a re d ib u ja rs e a in t e rva lo s re g u la re s .
No rm a lm e n t e lo s a p p le t s cre a n lo s t h re a d s p a ra la s t a re a s re p e t it iva s e n e l
m é t o d o s t a rt ( ) . Cre a r e l t h re a d a q u í h a ce m u y fá cil q u e e l a p p le t p u e d a
p a ra r e l t h re a d cu a n d o e l u s u a rio a b a n d o n e la p á g in a . To d o lo q u e s e t ie n e
q u e h a ce r e s im p le m e n t a r e l m é t o d o s t o p ( ) p a ra q u e é l d e t e n g a e l t h re a d
d e l a p p le t . Cu a n d o e l u s u a rio re t o rn e a la p á g in a d e l a p p le t , s e lla m a d e
n u e vo a l m é t o d o s t a rt ( ) , y e l a p p le t p u e d e cre a r d e n u e vo e l t h re a d p a ra
re a liza r la t a re a re p e t it iva .
Lo q u e p u e d e s ve r m á s a b a jo e s la im p le m e n t a ció n d e lo s m é t o d o s s t a rt ( )
y s t o p ( ) e n la cla s e An im a t o rAp p le t . ( Aq u í t ie n e s t o d o e l có d ig o fu e n t e d e l
a p p le t . )
public void start() {
if (frozen) {
//No hace Nada. El usuario ha pedido que se pare la animación
} else {
//Empezar la animación!
if (animatorThread == null) {
animatorThread = new Thread(this);
}
animatorThread.start();
}
}

public void stop() {


animatorThread = null;
}
La p a la b ra t h is e n n e w Th re a d ( t h is ) in d ica q u e e l a p p le t p ro p o rcio n a e l
cu e rp o d e l t h re a d . Y h a ce e s t o im p le m e n t a d o e l in t e rfa ce ja va . la n g
Ru n n a b le , q u e re q u ie re q u e e l a p p le t p ro p o rcio n e u n m é t o d o ru n ( ) q u e
fo rm e e l cu e rp o d e l t h re a d . Exp lica re m o s e l m é t o d o ru n ( ) d e
An im a t o rAp p le t u n p o co m á s a d e la n t e .
En e l a p p le t An im a t o rAp p le t , e l n a ve g a d o r n o e s e l ú n ico q u e lla m a a lo s
m é t o d o s s t a rt ( ) y s t o p ( ) . El a p p le t s e lla m a a s í m is m o cu a n d o e l u s u a rio
p u ls a co n e l ra t ó n d e n t ro d e l á re a d e l a p p le t p a ra in d ica r q u e la a n im a ció n
d e b e t e rm in a r. El a p p le t u t iliza u n e je m p la r d e la va ria b le fro z e n p a ra
s e g u ir la p is t a d e cu a n d o e l u s u a rio p id e q u e s e p a re la a n im a ció n .
Ha b rá s p o d id o o b s e rva r q u e n o a p a re ce e n n in g ú n s it io n in g u n a lla m a d a a l
m é t o d o s t o p ( ) e n la cla s e An im a t o rAp p le t . Es t o e s a s í p o rq u e lla m a r a l
m é t o d o s t o p ( ) e s co m o s i q u is ie ra m e t e rle e l t h re a d a g o lp e s p o r la ca b e za .
Es u n a m a n e ra d rá s t ica d e co n s e g u ir q u e e l a p p le t d e je lo q u e e s t a b a
h a cie n d o . En s u lu g a r, s e p u e d e e s crib ir e l m é t o d o ru n ( ) d e fo rm a q u e e l
t h re a d s a lg a d e u n a fo rm a a d e cu a d a y e d u ca d a cu a n d o s e le g o lp e e e n e l
h o m b ro . Es t e g o lp e cit o e n e l h o m b ro vie n e a s e r co m o p o n e r a n u ll u n
e je m p la r d e la va ria b le d e l t ip o Th re a d .
En An im a t o rAp p le t , e s t e e je m p la r d e la va ria b le s e lla m a a n im a t o rTh re a d .
El m é t o d o s t a rt ( ) lo a ct iva p a ra re fe rirs e a o b je t o Th re a d re cie n t e m e n t e
cre a d o . Cu a n d o e l u s u a rio n e ce s it e d e s t ru ir e l t h re a d , p o n e
a n im a t o rTh re a d a n u ll. Es t o n o e lim in a e l t h re a d re a liza n d o u n a
re co le cció n d e b a s u ra - - n o p u e d e h a b e r re co le cció n d e b a s u ra m ie n t ra s e s t e
e je cu t a b le - - p e ro co m o a l in icio d e l b u cle , e l t h re a d co m p ru e b a e va lo r d e
a n im a t o rTh re a d , y co n t in ú a o a b a n d o n a d e p e n d ie n d o d e e s t e va lo r. Aq u í
t ie n e u n có d ig o re ve la d o r:
public void run() {
. . .
while (Thread.currentThread() == animatorThread) {
...//Muestra un marco de la aplicación.
}
}
S i a n im a t o rTh re a d s e re fie re a l m is m o t h re a d q u e e l q u e e s t á re a lm e n t e
e n e je cu ció n e l t h re a d co n t in u a e je cu t a n d o s e . S i p o r e l co n t ra rio ,
a n im a t o rTh re a d e s n u ll, e l t h re a d s e t e rm in a y s a le . S i a n im a t o rTh re a d
s e re fie re a o t ro t h re a d , e n t o n ce s s e h a a lca n za d o u n a co n d ició n d e
co m p e t ició n : s e h a lla m a d o d e m a s ia d o p ro n t o a s t a rt ( ) , a n t e s d e lla m a r a
s t o p ( ) ( o e s t e t h re a d a t a rd a d o d e m a s ia d o e n s u b u cle ) q u e s t a rt ( ) h a
cre a d o o t ro t h re a d a n t e s d e q u e e s t e t h re a d h a ya a lca n za d o e l in icio d e l
b u cle w h ile . De b id o a la co n d ició n d e co m p e t ició n e s t e t h re a d d e b e ría s a lir.
Pa ra o b t e n e r m á s in d o rm a ció s o b re An im a t o rAp p le t , p u e d e s ir a : Cre a r u n
Bu cle d e An im a ció n .
Usar un thread para realizar Inicializaciones de una Vez
S i s u a p p le t n e ce s it a re a liza r a lg u n a in cia liza ció n q u e t a rd e u n p o co , s e
d e b e ría co n s id e ra r e l m o d o d e re a liza r e s a in icia liza ció n e n u n t h re a d . Po r
e je m p lo , a lg o q u e re q u ie ra u n t ra b a jo d e co n e xió n a la re d g e n e ra lm e n t e
d e b e ría h a ce rs e e n u n t h re a d e n s e g u n d o p la n o ( b a ckg ro u n d ) .
Afo rt u n a d a m e n t e , la ca rg a d e im á g e n e s GIF y JPEG s e h a ce
a u t o m á t ica m e n t e e n b ra ckg ro u n d ( u t iliza n d o t h re a d s d e lo s q u e n o t ie n e s
q u e p re o cu p a rs e ) .
De s a fo rt u n a d a m e n t e la ca rg a d e s o n id o , n o e s t á g a ra n t iza d o q u e s e h a g a
e n s e g u n d o p la n o . En la s im p le m e n t a cio n e s a ct u a le s lo s m é t o d o s d e a p p le t
g e t Au d io Clip n o re t o rn a n h a s t a q u e s e h a n ca rg a d o lo s d a t o s d e a u d io .
Co m o re s u lt a d o , s i s e q u ie re p re ca rg a r lo s s o n id o s , p o d ría cre a r u n a o m á s
t a re a s p a ra h a ce r e s t o .
Ut iliza r u n t h re a d p a ra re a liza r u n a t a re a d e in icia liza ció n e n u n a p p le t e s
u n a va ria ció n d e l t íp ico e s ce n a ro p ro d u ct o r/ co n s u m id o r. El t h re a d q u e
re a liza la t a re a e s e l p ro d u ct o r, y e l a p p le t e l co n s u m id o r. S in cro n iza r
t h re a d s e xp lica co m o u t iliza r lo s t h re a d s d e Ja va e n u n e s ce n a rio
p ro d u ct o r/ co n s u m id o r.
El a p p le t S o u n d Exa m p le s e a d h ie re a l m o d e lo p re s e n t a d o e n S in cro n iza r
t h re a d s . Co m o e l e je m p lo a n t e rio r, e l a p p le t s e ca ra ct e riza p o r t re s cla s s e s :
● El p ro d u ct o r S o u n d Lo a d e r, u n a s u b cla s e Th re a d .

● El co n s u m id o r: S o u n d Exa m p le , u n a s u b cla s e Ap p le t . Al co n t ra rio q u e e l


co n s u m id o r e n e l e je m p lo d e s in cro n iza ció n d e t a re a s , S o u n d Exa m lp le
n o e s u n Th re a d ; in clu s o t a m p o co im p le m e n t a e l in t e rfa ce e je cu t a b le .
S in e m b a rg o , a l m e n o s , d o s t h re a d s lla m a n a lo s e je m p la re s d e lo s
m é t o d o s d e S o u n d Exa m p le d e p e n d ie n d o d e la a p lica ció n q u e e je cu t e e l
a p p le t .
● El a lm a ce n a je d e l Ob je t o : S o u n d Lis t , Un a s u b cla s e Ha s h t a b le . Al
co n t ra rio q u e e n e l e je m p lo d e S in cro n iza r Ta re a s S o u n d Lis t p u e d e
d e vo lve r va lo re s n u lo s s i lo s d a t o s d e l s o n id o n o s e h a n a lm a ce n a d o
t o d a via . Es t o t ie n e s e n t id o p o rq u e n e ce s it a e s t a r d is p o n ib le p a ra
re a ccio n a r in m e d ia t a m e n t e a u n a p e t ició n d e l u s u a rio d e q u e e je cu t e e l
s o n id o , in clu s o s i e l s o n id o n o s e h a ca rg a d o t o d a via .
Pa ra m á s in fo rm a ció n s o b re e l S o u n d Exa m p le , p u e d e s ir a Eje cu t a r S o n id o s

Oz it o
Qué puede y qué no puede hacer un Applet
Es t a p á g in a o fre ce u n a a m p lia p e rs p e ct iva t a n t o d e la s re s t riccio n e s d e lo s a p p le t s ,
co m o d e la s ca ra ct e ris t ica s e s p e cia le s q u e e s t o s t ie n e n . Po d rá s e n co n t ra r m á s
d e t a lle s e n la le cció n : En t e n d e r la s Ca p a cid a d e s y la s Re s t riccio n e s d e lo s Ap p le t s .

Rescticciones de Seguridad
Ca d a n a ve g a d o r im p le m e n t a u n o s co n t ro la d o re s d e s e g u rid a d p a ra
p re ve n ir q u e lo s a p p le t s n o h a g a n n in g ú n d a ñ o . Es t a s e cció n d e s crib e lo s
co n t ro la d o re s d e S e g u rid a d q u e p o s e e n lo s n a ve g a d o re s a ct u a le s . S in
e m b a rg o , la im p le m e n t a ció n d e co n t ro la d o re s d e s e g u rid a d e s d ife re n t e
d e u n n a ve g a d o r a o t ro . Lo s co n t ro la d o re s d e S e g u rid a d t a m b ié n e s t á n
s u je t o s a ca m b io s . Po r e je m p lo , s i e l n a ve g a d o r e s t á d e s a rro lla d o p a ra
t ra b a ja r s o lo e n e n t o rn o s fia b le s , e n t o n ce s s u s co n t ro la d o re s d e
s e g u rid a d s e rá n m u ch o m á s flo jo s q u e lo s d e s crit o s e n e s t a p á g in a .
Lo s Na ve g a d o re s a ct u a le s im p o n e n la s s ig u ie n t e s re s t riccio n e s a lo s
a p p le t s q u e s e ca rg a n a t ra vé s d e la Re d :
● Un a p p le t n o p u e d e ca rg a r lib re ría s n i d e fin ir m é t o d o s n a t ivo s .

● No p u e d e le e r n i e s crib ir fich e ro s e n e l Ho s t e n e l q u e s e e s t á
e je cu t a n d o .
● No p u e d e re a liza r co n e xio n e s e n la Re d , e xce p t o co n e l Ho s t d e l q u e
fu e ca rg a d o .
● No p u e d e a rra n ca r n in g ú n p ro g ra m a e n e l Ho s t d o n d e s e e s t á
e je cu a n d o .
● No p u e d e le e r cie rt a s p ro p ie d a d e s d e l s is t e m a .

● La s ve n t a n a s q u e p ro p o rcio n a n lo s a p p le t s t ie n e n u n a s p e ct o
d ife re n t e a la s d e cu a lq u ie r a p lica ció n .
Ca d a Na ve g a d o r t ie n e u n o b je t o S e cu rit yMa n a g e r q u e im p le m e n t a s u s
co n t ro la d o re s d e s e g u rid a d . Cu a n d o e l o b je t o S e cu rit yMa n a g e r d e t e ct a
u n a vio a lció n , la n za u n a S e cu rit yExce p t io n ( Exce p ció n d e s e g u rid a d ) . S u
a p p le t p u e d e ca p t u ra r e s t a S e cu rit yExce p t io n y re a ccio n a r d e l m o d o
a p ro p ia d o .

Capacidades de los Applets


El p a q u e t e ja va . a p p le t p ro p o rcio n a u n a API q u e co n t ie n e a lg u n a s
ca p a cid a d e s d e lo s a p p le t s q u e la s a p lica cio n e s n o t ie n e n . Po r e je m p lo ,
lo s a p p le t s p u e d e n e je cu t a r s o n id o s , q u e o t ro p ro g ra m a s n o p u e d e n
t o d a via .
Aq u í t ie n e s a lg u n a s co s a s q u e p u e d e n h a ce r lo s a p p le t s y q u e n o s e
e s p e ra n :
● Lo s Ap p le t s p u e d e n h a ce r co n e xio n e s a l h o s t d e l q u e fu e ro n
ca rg a d o s .
● Lo s Ap p le t s q u e s e e je cu t a n d e n t ro d e u n n a ve g a d o r We b p u e d e n
h a ce r q u e s e m u e s t re n p á g in a s HTML d e u n a fo rm a m u y s e n cilla .
● Lo s Ap p le t s p u e d e n in vo ca r m é t o d o s p ú b lico s d e o t ro s Ap p le t s q u e
s e e n cu e n t re n e n la m is m a p á g in a .
● Lo s Ap p le t s q u e s e h a n ca rg a d o d e s d e u n d ire ct o rio lo ca l ( d e s d e u n
d ire ct o rio e n e l CLAS S PATH d e l u s u a rio ) n o t ie n e n n in g u n a
re s t ricció n co m o lo s a p p le t s ca rg a d o s a t ra vé s d e la Re d .
● Au n q u e la m a yo ría d e lo s a p p le t s p a ra n s u e je cu ció n cu a n d o e l
u s u a rio a b a n d o n a la p á g in a , n o t ie n e n p o rq u e h a ce rlo .

Oz it o
Añadir un Applet a una Página HTML
Un a ve z q u e s e h a e s crit o e l có d ig o p a ra u n a p p le t , s e q u e rrá e je cu t a rlo p a ra p ro b a rlo . Pa ra
ve r e l a p p le t e n u n n a ve g a d o r o e n e l Ap p le t Vie we r d e l JDK, e s n e ce s a rio a ñ a d ir e l a p p le t a
u n a p á g in a HTML, u s a n d o la e t iq u e t a < APPLET> . De s p u é s s e d e b e e s p e cifica r la URL d e la
p á g in a HTML e n u n n a ve g a d o r o e n e l Ap p le t Vie we r.
N o t a : Alg u n o s n a ve g a d o re s n o s o p o rt a n fa cilm e n t e la re ca rg a g a ra n t iza d a d e a p p le t s . Po r
e s t a ra zó n , t ie n e m u ch o s e n t id o p ro b a r lo s a p p le t s e n e l Ap p le t Vie we r h a s t a q u e h a ya
a lca n za d o e l p u n t o e n q u e s e n e ce s it e p ro b a rlo e n u n n a ve g a d o r.
Es t a p á g in a e xp lica t o d o lo q u e d e b e s s a b e r p a ra u t iliza r la e t iq u e t a < APPLET> . Em p ie za
u t iliza n d o la fo rm a m á s s im p le d e la e t iq u e t a , y lu e g o e xp lica a lg u n a s d e s u s a d icio n e s m á s
co m u n e s a la fo rm a s im p le - - e l a t rib u t o CODEBAS E, la e t iq u e t a < PARAM> , y e l có d ig o
a lt e rn a t ivo HTML.

El etiqueta <APPLET> más sencilla posible.


Aq u í t ie n e la fo rm a m á s s im p le d e la e t iq u e t a < APPLET> :
<APPLET CODE=SubclaseApplet.class WIDTH=anchura HEIGHT=altura>
</APPLET>
La e t iq u e t a q u e s e ve a rrib a le in d ica a l n a ve g a d o r o vis u a liza d o r d e a p p le t s q u e
ca rg e e l a p p le t cu ya s u b cla s e Ap p le t , lla m a d a S u b cla s e Ap p le t , s e e n cu e n t ra e n e l
fich e ro . cla s s s it u a d o e n e l m is m o d ire ct o rio q u e e l d o cu m e n t o HTML q u e co n t ie n e
la e t iq u e t a . La e t iq u e t a a n t e rio r t a m b ié n e s p e cifica la a lt u ra y la a n ch u ra e n p ixe ls
d e la ve n t a n a d e l a p p le t .
Cu a n d o u n n a ve g a d o r e n cu e n t ra e s t a e t iq u e t a , re s e rva u n á re a d e la p a n t a lla co n
la s d im e n s io n e s e s p e cifica d a s co n wid t h y h e ig h t , ca rg a lo s b yt e co d e s d e la
s u b cla s e Ap p le t e s p e cifica d a , cre a u n e je m p la r d e la s u b cla s e , y lu e g o lla m a a lo s
m é t o d o s in it ( ) y s t a rt ( ) d e l e je m p la r.

Escpecificar el Directorio del Applet con CODEBASE


Aq u í t ie n e s u n a e t iq u e t a a p p le t u n p o co m á s co m p le ja . S e le h a a ñ a d id o e l a t rib u t o
CODEBAS E p a ra d e cirle a l n a ve g a d o r e n q u e d ire ct o rio s e e n cu e n t ra n lo s b yt e co d e s
d e la s u b cla s e Ap p le t .
<APPLET CODE=SubclaseApplet.class CODEBASE=unaURL
WIDTH=anchura HEIGHT=altura>
</APPLET>
Ha cie n d o la u n a URL co m o u n a d ire cció n o b s o lu t a , s e p u e d e h a ce r q u e u n
d o cu m e n t o ca rg a d o d e s d e u n s e rvid o r HTTP: / e je cu t e u n a p p le t q u e s e e n cu e n t ra
e n o t ro s e rvid o r. S i u n a URL e s u n a URL re la t iva , e n t o n ce s s e rá in t e p re t a d a e n
re la ció n a la p o s ició n d e l d o cu m e n t o HTML.
Po r e je m p lo , a q u í t ie n e la e t iq u e t a < APPLET> q u e in clu ye e l a p p le t S im p le e n El
Ciclo d e Vid a d e u n Ap p le t :
<applet code=Simple.class width=500 height=20>
</applet>
Especificar Parámetros con la etiqueta <PARAM>
Alg u n o s a p p le t s le p e rm it e n a l u s u a rio va ria r la co n fig u ra ció n d e l a p p le t u t iliza n d o
p a rá m e t ro s . Po r e je m p lo , Ap p le t Bu t t o n ( u n a p p le t u t iliza d o e n e s t e t u t o ria l p a ra
p ro p o rcio n a r u n b o t ó n q u e m u e s t ra u n a ve n t a n a ) le p e rm it e a l u s u a rio s e le ccio n a r
e l t e xt o d e l b o t ó n e s p e cifica n d o u n va lo r e n e l p a rá m e t ro lla m a d o BUTTONTEXT.
Ap re n d e rá s co m o e s crib ir có d ig o p a ra p ro p o rcio n a r p a rá m e t ro s e n De fin ir y Ut iliza r
p a rá m e t ro s e n u n Ap p le t .
Aq u í t ie n e s u n e je m p lo d e l fo rm a t o d e la e t iq u e t a < PARAM> . Ob s e rva q u e la
e t iq u e t a < PARAM> d e b e a p a re ce r e n t re la s e t iq u e t a s < APPLET> y < / APPLET> p a ra
q u e t e n g a e fe ct o e n e l a p p le t .
<APPLET CODE=SubclaseApplet.class WIDTH=anchura HEIGHT=altura>
<PARAM NAME=parámetro1 VALUE=Valor>
<PARAM NAME=parámetro2 VALUE=otroValor>
</APPLET>
Aq u í t ie n e s u n e je m p lo d e l u s o d e la e t iq u e t a < PARAM> .
<applet code=AppletButton.class width=350 height=60>
<param name=windowType value=BorderWindow>
<param name=windowText value="BorderLayout">
<param name=buttonText value="Pulse aquí para ver BorderLayout en acción">
. . .
</applet>

Especificar el Texto a mostrar en los Navegadores que no soportan Java


Ha b rá s n o t a d o lo s p u n t o s ( ". . . ") e n e l e je m p lo a n t e rio r. ¿ Qu é h a d e ja d o fu e ra e l
e je m p lo ? Có d ig o HTML a lt e rn a t ivo - - có d ig o HTML in t e rp re t a d o s o lo p o r lo
n a ve g a d o re s q u e n o e n t ie n d e n la e t iq u e t a < APPLET> .
S i la p á g in a q u e co n t ie n e u n a p p le t p u d ie ra s e r vis t a p o r p e rs o n a s q u e n o t ie n e n
n a ve g a d o re s co m p a t ib le s co n Ja va , s e d e b e p ro p o rcio n a r có d ig o a lt e rn a t ivo HTML
p a ra q u e la p á g in a p u e d a t e n e r s e n t id o . El có d ig o a lt e rn a t ivo HTML e s cu a lq u ie r
t e xt o e n t re la s e t iq u e t a s < APPLET> y < / APPLET> , e xce p t o la s e t iq u e t a s < PARAM> .
Lo s n a ve g a d o re s co m p a t ib le s co n Ja va ig n o ra n e l có d ig o HTML a lt e n a t ivo .
Aq u í t ie n e s e l có d ig o HTML co m p le t o p a ra e l e je m p lo a n t e rio r d e Ap p le t Bu t t o n :
<applet code=AppletButton.class width=350 height=60>
<param name=windowType value=BorderWindow>
<param name=windowText value="BorderLayout">
<param name=buttonText value="Pulse aquí para ver BorderLayout en acción">
<blockquote>
<hr>
Su navegador no puede ejecutar Applets Java,
<hr>
</blockquote>
</applet>
Un n a ve g a d o r q u e n o e n t ie n d a la e t iq u e t a < APPLET> ig n o ra t o d o lo q u e h a y h a s t a
la e t iq u e t a < b lo ckq u o t e > . Un n a ve g a d o r q u e e n t ie n d a la e t iq u e t a < APPLET> ig n o ra
t o d o lo q u e h a y e n t re la s e t iq u e t a s < b lo ckq u o t e > y < / b lo ckq u o t e > .
Oz it o
Sumario: Applets
Es t a le cció n o fre ce m u ch a in fo rm a ció n - - ca s i t o d o lo q u e s e n e ce s it a s a b e r p a ra
e s crib ir a p p le t s Ja va . Es t a p á g in a s u m a riza t o d o lo q u e s e h a a p re n d id o , a ñ a d ie n d o
u n p o co m á s d e in fo rm a ció n p a ra a yu d a rt e a e n t e n d e r e l cu a d ro co m p le t o .
Lo p rim e ro q u e s e a p re n d ió p a ra e s crib ir u n a p p le t e s q u e s e d e b e cre a r u n a
s u b cla s e d e la cla s e ja va . a p p le t . En e s t a s u b cla s e , s e d e b e im p le m e n t a r a l m e n o s
u n o d e lo s s ig u ie n t e s m é t o d o s : in it ( ) , s t a rt ( ) , y p a in t ( ) . Lo s m é t o d o s in it ( ) y
s t a rt ( ) , ju n t o co n s t o p ( ) y d e s t ro y ( ) , s o n lo s lla m a d o s e ve n t o s m á s im p o rt a n t e s
( m ile s t o n e s ) q u e o cu rre n e n e l ciclo d e vid a d e u n a p p le t . S e lla m a a l m é t o d o
p a in t ( ) cu a n d o e l a p p le t n e ce s it a d ib u ja rs e e n la p a n t a lla .
La cla s e Ap p le t d e s cie n d e d e la cla s e AWT Pa n e l, q u e d e s cie n d e a s u ve z d e la
cla s e AWT Co n t a in e r, q u e d e s cie n d e a s u ve z d e la cla s e AWT Co m p o n e n t . De la
cla s e Co m p o n e n t , u n a p p le t h e re d a la s ca p a cid a d e s d e d ib u ja r y m a n e ja r e ve n t o s .
De la cla s e Co n t a in e r, u n a p p le t h e re d a la ca p a cid a d d e a ñ a d ir o t ro s co m p o n e n t e s
y d e t e n e r u n m a n e ja d o r d e d is t rib u ció n p a ra co n t ro la r s u t a m a ñ o y p o s ició n . De la
cla s e Pa n e l, u n a p p le t h e re d a m u ch o , in clu ye n d o la ca p a cid a d d e re s p o n d e r a lo s
p rin cip a le s e ve n t o s e n e l ciclo d e vid a , co m o s o n la ca rg a y la d e s ca rg a .
Lo s a p p le t s s e in clu ye n e n p á g in a s HTML u t iliza n d o la e t iq u e t a < APPLET> . Cu a n d o
u n u s u a rio vis it a u n a p á g in a q u e co n t ie n e u n a p p le t , a q u í t ie n e s lo q u e s u ce d e :
1 . El n a ve g a d o r e n cu e n t ra e l fich e ro . cla s s q u e co n t ie n e la s u b cla s e Ap p le t . La
p o s ició n d e l fich e ro . cla s s ( q u e co n t ie n e lo s b yt e co d e s Ja va ) s e e s p e cifica co n
lo s a t rib u t o s CODE y CODEBAS E d e la e t iq u e t a < APPLET> .
2 . El n a ve g a d o r t ra e lo s b yt e co d e s a t ra vé s d e la re d a l o rd e n a d o r d e l u s u a rio .
3 . El n a ve g a d o r cre a u n e je m p la r d e la s u b cla s e Ap p le t . Cu a n d o n o s re fe rim o s a
u n a p p le t , n o rm a lm e n t e n o s re fe rim o s a e s t e e je m p la r.
4 . El n a ve g a d o r la m a a l m é t o d o in it ( ) d e l a p p le t . Es t e m é t o d o re a liza u n a
n e ce s a ria in icia liza ció n .
5 . El n a ve g a d o r lla m a a l m é t o d o s t a rt ( ) d e l a p p le t . Es t e m é t o d o n o rm a lm e n t e
a rra n ca u n t h re a d p a ra re a liza r la s t a re a s d e l a p p le t .
Lo p rin cip a l e n u n a p p le t e s la s u b cla s e Ap p le t , cla s e co n t ro la d o ra , p e ro lo s a p p le t s
t a m b ié n p u e d e n u t iliza r o t ra s cla s e s . Es t a s o t ra s cla s e s p u e d e n s e r p ro p ia s d e l
n a ve g a d o r, p o rp o rcio n a d a s co m o p a rt e d e l e n t o rn o Ja va o cla s e s d e l u s u a rio
s u m in is t ra d a s p o r t i. Cu a n d o u n a p p le t in t e n t a e je cu t a r u n a cla s e p o r p rim e ra ve z,
e l n a ve g a d o r in t e n t a e n co n t ra rla e n e l h o s t d o n d e s e e s t á e je cu t a n d o e l n a ve g a d o r.
S i n o p u e d e e n co n t ra rla a llí, la b u s ca e n e l m is m o lu g a r d e d o n d e ca rg ó la s u b cla s e
Ap p le t d e l a p p le t . Cu a n d o e l n a ve g a d o r e n cu e n t ra la cla s e , ca rg a s u s b yt e co d e s ( a
t ra vé s d e la Re d , s i e s n e ce s a rio ) y co n t in u a la e je cu ció n d e l a p p le t .
Ca rg a r có d ig o e je cu t a b le a t ra vé s d e la re d e s u n rie s g o d e s e g u rid a d . Pa ra lo s
a p p le t s Ja va , a lg u n o s d e e s t o s rie s g o s s e re d u ce n , p o rq u e e l le n g u a je Ja va e s t á
d is e ñ a d o p a ra s e r s e g u ro - - p o r e je m p lo , n o p e rm it e p u n t e ro s a p o s icio n e s d e
m e m o ria . Ad e m á s , lo s n a ve g a d o re s co m p a t ib le s co n Ja va p ro p o rcio n a n s e g u rid a d
im p o n ie n d o a lg u n a s re s t riccio n e s . Es t a s re s t riccio n e s in clu ye n n o p e rm it ir a lo s
a p p le t s la ca rg a d e có d ig o e s crit o e n o t ro le n g u a je q u e n o s e a Ja va , y t a m p o co
p e rm it e n le e r o e s crib ir fich e ro s e n e l h o s t d o n d e s e e s t á e je cu t a n d o e l n a ve g a d o r.

Oz it o
Crear un Interface Gráfico de Usuario
Ca s i t o d o s lo s a p p le t s t ie n e n u n in t e rfa ce g rá fico d e u s u a rio ( GUI) . Es t a p á g in a
e xp lica u n o s p o co s p ro b le m a s q u e s o n p a rt icu la re s d e lo s GUI d e lo s a p p le t s .
Un Ap p le t e s t á e n u n P a n e l.
Co m o Ap p le t e s u n a s u b cla s e d e la cla s e Pa n e l d e l AWT, lo s a p p le t s p u e d e n
co n t e n e r o t ro s Co m p o n e n t e s , a l ig u a l q u e p u e d e h a ce rlo la cla s e Pa n e l. Lo s
Ap p le t s h e re d a n e l co n t ro la d o r d e d is t rib u ció n p o r d e fe ct o d e la cla s e Pa n e l:
Flo wLa yo u t . Al ig u a l q u e la cla s e Pa n e l ( y p o r lo t a n t o la cla s e Co m p o n e n t s ) ,
la cla s e Ap p le t p a rt icip a e n h e re n cia d e d ib u jo y e ve n t o s d e l AWT.
Lo s Ap p le t s a p a re c e n e n u n a v e n t a n a y a e x is t e n t e d e l n a v e g a d o r.
Es t o t ie n e d o s im p lica cio n e s .
Prim e ro , a l co n t ra rio q u e la s a p lica cio n e s b a s a d a s e n GUI, lo s a p p le t s n o
t ie n e n q u e cre a r u n a ve n t a n p a ra m o s t ra rs e . Pu e d e n h a ce rlo s i t ie n e n u n a
b u e n a ra zó n , p e ro n o rm a lm e n t e s ó lo s e m u e s t ra n e n la ve n t a n a d e l
n a ve g a d o r.
S e g u n d o , d e p e n d ie n d o d e la im p le m e n t a ció n d e l n a ve g a d o r, lo s co m p o n e n t e s
d e s u s a p p le t s p o d ría n n o s e r m o s t ra d o s a m e n o s q u e e l a p p le t lla m e a l
m é t o d o v a lid a t e ( ) d e s p u é s d e h a b e r a ñ a d id o co m p o n e n t e s .
Afo rt u n a d a m e n t e , lla m a r a v a lid a t e ( ) n o h a ce n in g ú n d a ñ o .
El c o lo r d e fo n d o d e l a p p le t p o d ría n o c o in c id ir c o n e l c o lo r d e la p á g in a .
Po r d e fe ct o , lo s a p p le t s t ie n e n u n co lo r d e fo n d o Gris b rilla n t e . S in e m b a rg o ,
la s p á g in a s HTML, p u e d e n t e n e r o t ro s co lo re s d e fo n d o y p u e d e n u t iliza r
d ib u jo s d e fo n d o . S i e l d is e ñ o d e l a p p le t y d e la p á g in a n o s o n cu id a d o s o s , s i
e l a p p le t t ie n e d ife t e n t e co lo r d e fo n d o p u e d e h a ce r q u e s o b re s a lg a s o b re la
p á g in a , o p u e d e ca u s a r u n p a rp a d e o n o t a b le cu a n d o s e d ib u je e l a p p le t . Un a
s o lu ció n e s d e fin ir u n p a rá m e t ro d e l a p p le t q u e e s p e cifiq u e e l co lo r d e l fo n d o .
La s u b cla s e Ap p le t p u e d e u t iliza r e l m é t o d o s e t Ba c k g ro u n d ( ) d e Co m p o n e n t
p a ra s e le ccio n a r e l co lo r d e l fo n d o co n u n co lo r e s p e cifica d o p o r e l u s u a rio .
Ut iliza n d o e l p a rá m e t ro d e l co lo r d e fo n d o e l a p p le t , e l d is e ñ a d o r d e la p á g in a
p u e d e e le g ir e l co lo r d e fo n d o d e l a p p le t q u e s e a a p ro p ia d o p a ra e l co lo r d e la
p á g in a . Ap re n d e rá s m á s s o b re lo s p a rá m e t ro s e n la le cció n De fin ir y Ut iliza r
Pa rá m e t ro s e n u n Ap p le t .
Ca d a Ap p le t t ie n e u n t a m a ñ o p re d e t e rm ia n d o e s p e c ific a d o p o r e l u s u a rio .
Co m o la e t iq u e t a < APPLET> re q u ie re q u e s e e s p e cifiq u e n la a lt u ra y a n ch u ra
d e l a p p le t , y có m o e l n a ve g a d o r n o p e rm it e n e ce s a ria m e n t e q u e e l a p p le t s e
re d im e n s io n e a s í m is m o , lo s a p p le t s d e b e n t ra b a ja r co n u n a ca n t id a d d e
e s p a cio q u e p o d ría n o s e r la id e a l. In clu s o s i e l e s p a cio e s id e a l p a ra u n a
p la t a fo rm a , la s p a rt e s e s p e cifica s p a ra u n a p la t a fo rm a d e u n a p p le t ( co m o lo s
b o t o n e s ) p o d ría n re q u e rir u n a m a yo r ca n t id a d d e e s p a cio e n o t ra p la t a fo rm a .
S e p u e d e co m p e n s a r e s t o re co m e n d a n d o q u e la s p á g in a s q u e in clu ye n s u s
a p p le t s e s p e cifiq u e n u n p o co m á s d e e s p a cio d e l q u e p o d ría s e r n e ce s a rio , y
m e d ia n t e la u t ilzia ció n d e d is t rib u cio n e s fle xib le s co m o la s d e l AWT - - q u e
p ro p o rcio n a la s cla s e s Grid Ba g La yo u t y Bo rd e rLa yo u t p a ra a d a p t a r e l e s p a cio
e xt ra .
Lo s Ap p le t s c a rg a n im á g e n e s u t iliz a n d o e l m é t o d o g e t I m a g e ( ) d e la c la s e
Ap p le t .
La cla s e Ap p le t p ro p o rcio n a u n fo rm a co n ve n ie n t e d e g e t I m a g e ( ) q u e le
p e rm it e e s p e cifica r u n a URL b a s e co m o u n a rg u m e n t o , s e g u id o p o r u n
s e g u n d o a rg u m e n t o q u e e s p e cifica la p o s ició n d e l fich e ro d e im a g e n , re la t ivo
a la URL b a s e . Lo m é t o d o s g e t Co d e Ba s e ( ) y g e t D o c u m e n t Ba s e ( ) d e la
cla s e Ap p le t p ro p o rcio n a n la d ire cció n URL b a s e q u e ca s i t o d o s lo s a p p le t s
u t iliza n . La s im á g e n e s q u e s ie m p re n e ce s it a u n a p p le t , o n e ce s it a
re la cio n a rla s co n u n b a cku p , n o rm a lm e n t e s e e s p e cifica n re la t iva s a la
d ire cció n d e d o n d e fu e ca rg a d o e l a p p le t ( in d ica d a e n la e t iq u e t a co d e b a s e ) .
La s im á g e n e s e s p e cifica d a s p o r e l u s u a rio d e l a p p le t ( n o rm a lm e n t e co m o
p a rá m e t ro s e n e l fich e ro HTML) s o n n o rm a lm e n t e re la t iva s a la d ire cció n d e la
p á g in a q u e in clu ye a l a p p le t ( e l d o cu m e n t b a s e ) .
La s c la s e s Ap p le t ( y t o d o s lo s fic h e ro s d e d a t o s q u e e s t a s u t iliz a n ) s o n
c a rg a d o s a t ra v é s d e la re d , lo q u e p u e d e s e r b a s t a n t e le n t o .
Lo s Ap p le t s p u e d e n h a ce r m u ch a s co s a s p a ra re d u cir e l t ie m p o d e a rra n q u e .
La s u b cla s e Ap p le t p u e d e s e r u n a cla s e p e q u e ñ a q u e m u e s t re in m e d ia t a m e n t e
u n m e n s a je d e e s t a d o . Y, s i a lg u n a s d e la s cla s e s d e l a p p le t o lo s d a t o s n o s e
u t iliza n p o r e l m o m e n t o , e l a p p le t p u e d e p re ca rg a r la s cla s e s o lo s d a t o s e n
u n t h re a d e n s e g u n d o p la n o .
Po r e je m p lo , e l m é t o d o s t a rt ( ) d e la cla s e Ap p le t Bu t t o n la n za u n t h re a d q u e
o b t ie n e e l o b je t o Cla s s p a ra la ve n t a n a e n la q u e s e va a m o s t ra r e l b o t ó n . El
p ro p ó s it o p rin cip a l d e l a p p le t p a ra h a ce r e s t o e s a s e g u ra rs e d e q u e e l n o m b re
d e la cla s e e s vá lid o . Un b e n e ficio a ñ a d id o e s q u e o b t e n e r e l o b je t o Cla s s
fu e rza a q u e s e ca rg u e e l fich e ro d e la cla s e a n t e s d e e je m p la riza rla . Cu a n d o e l
u s u a rio p id e q u e s e cre e u n a ve n t a n a , e l a p p le t e je m p la riza la la s e Win d o ws
m u ch o m á s rá p id o q u e s i e l a p p le t t o d a vía t u vie ra q u e ca rg a r e l fich e ro d e la
cla s e .

Oz it o
Ejecutar Sonidos en Applets
En e l p a q u e t e ja va . a p p le t , la cla s e Ap p le t y e l in t e rfa ce Au d iClip p ro p o rcio n a n u n in t e fa ce b á s ico p a ra
e je cu t a r s o n id o s . Act u a lm e n t e , e l API d e Ja va s o p o rt a u n s ó lo fo rm a t o d e s o n id o : 8 b it , 8 0 0 0 h z, u n
ca n a l, e n fich e ro s "a u " d e S u n . S e p u e d e n cre a r e s t o s fich e ro s e n u n a e s t a ció n S u n u t iliza n d o la
a p lica ció n a u d io t o o l. S e p u e d e co n ve rt ir fich e ro s d e s d e o t ro s fo rm a t o s d e s o n id o u t iliza n d o u n p ro g ra m a
d e co n ve rs ió n d e fo rm a t o s d e s o n id o s .

Métodos Relacionados con el Sonido


Ab a jo t ie n e s lo s m é t o d o s p a ra Ap p le t s re la cio n a d o s co n e l s o n id o . El fo rm a t o d e d o s
a rg u m e n t o s d e ca d a m é t o d o t o m a u n a d ire cció n URL b a s e ( g e n e ra lm e n t e d e vu e lt a p o r
g e t D o c u m e n t Ba s e ( ) o g e t b Ba s e ( ) ) y la p o s ició n d e l fich e ro d e s o n id o re la t iva a la URL b a s e .
S e d e b e ría u t iliza r la d ire cció n b a s e p a ra s o n id o s q u e e s t á n in t e g ra d o s e n e l a p p le t . La
d ire cció n d e l d o cu m e n t o b a s e s e u t iliza g e n e ra lm e n t e p a ra s o n id o s e s p e cifica d o s p o r e l u s u a rio
d e l a p p le t a t ra vé s d e lo s p a rá m e t ro s d e l a p p le t .
g e t Au d io Clip ( URL) , g e t Au d io Clip ( URL, S t rin g )
De vu e lve n u n o b je t o q u e im p le m e n t a e l in t e rfa ce Au d io Clip .
p la y ( URL) , p la y ( URL, S t rin g )
Eje cu t a n e l Au d iClip co rre s p o n d ie n t e a la URL e s p e cifica d a .
El In t e rfa ce Au d io Clip d e fin e lo s s ig u ie n t e s m é t o d o s :
lo o p ( )
Em p ie za la e je cu ció n d e l Clip re p e t id a m e n t e .
p la y ( )
Eje cu t a e l clip u n a ve z.
s to p( )
Pa ra e l Clip . Tra b a ja co n e l m é t o d o lo o p ( ) y e l m é t o d o p la y( ) .

Un Ejemplo
Aq u í t ie n e u n a p p le t lla m a d o s o u n d Exa m p le q u e ilu s t ra u n a s p o ca s co s a s s o b re e l s o n id o .
Ob s e rva q u e , p a ra p ro p ó s it o s d e in s t ru ccio n e s , e l a p p le t a ñ a d e 1 0 s e g u n d o s a l t ie m p o d e ca rg a
d e ca d a s o n id o . S i e l fich e ro d e s ó n id o fu e ra m a yo r o la co n e xió n d e l u s u a iro fu e ra m á s le n t a
q u e la n u e s t ra , e s t e re t a rd o p o d ría s e r re a lis t a .
El a p p le t S o u n d Exa m p le p ro p o rcio n a u n a a rq u it e ct u ra p a ra la ca rg a y e je cu ció n d e m ú lt ip le s
s o n id o s e n u n a p p le t . Po r e s t a ra zó n , e s m á s co m p le jo d e lo n e ce s a rio . Exe n cia lm e n t e , lo s
có d ig o s d e ca rg a y e je cu ció n d e l s o n id o s e p a re ce n a e s t o :
AudioClip onceClip, loopClip;
onceClip = applet.getAudioClip(getcodeBase(), "bark.au");
loopClip = applet.getAudioClip(getcodeBase(), "train.au");
onceClip.play(); //Lo ejecuta una vez..
loopClip.loop(); //Empieza el bucle de sonido.
loopClip.stop(); //Para el bucle de sonido.
Co m o n o h a y n a d a m á s m o le s t o q u e u n a p p le t q u e co n t in u e h a cie n d o ru id o d e s p u é s d e h a b e r
a b a n d o n a d o la p á g in a , e l a p p le t S o u n d Exa m p le p a ra d e e je cu t a r e l b u cle d e s o n id o co n t in u o
cu a n d o e l u s u a rio a b a n d o n a la p á g in a y e m p ie za d e n u e vo cu a n d o e l u s u a rio vu e lve a e lla .
Ha ce e s t o m e d ia n t e la im p le m e n t a ció n d e s u s m é t o d o s s t o p ( ) y s t a rt ( ) d e la s ig u ie n t e fo rm a :
public void stop() {
//Si el sonido de una vez fuera largo, lo parariamos aquí.
//looping es un ejemplar de una variable booleana que esta inicializada a false.
//Se pone a true cuando se pulsa el botón de "Start sound loop" y se pone a false
//cuando se pulsa los botones de "Stop sound loop" o "Reload sounds".
if (looping) {
loopClip.stop(); //Para el bucle de sonido.
}
}

public void start() {


if (looping) {
loopClip.loop(); //Reinicia el bucle de sonido.
}
}
El a p p le t S o u n d Exa m p le co n s t ru ye t re s cla s e s :
● Un a s u b cla s e d e Ap p le t , S o u n d Exa m p le , q u e co n t ro la la e je cu ció n d e l a p p le t .

● Un a s u b cla s e d e Ha s h t a b le , S o u n d Lis t , q u e co n t ie n e lo s Au d io Clip s . Es t o e s d e m a s ia d o


p a ra e s t e a p le t , p e ro s i u s t e d e s crib ie ra u n a a p p le t q u e u t iliza rá m u ch o s fich e ro s d e
s o n id o s , u n a cla s e co m o e s t a le s e ría m u y ú t il.
● Un a s u b cla s e d e Th re a d , S o u n d Lo a d e r, ca d a e je m p la r d e la cu a l ca rg a u n Au d io Clip e n
s e g u n d o p la n o . Du ra n t e la in icia liza ció n d e l a p p le t , é s t e p re ca rg a ca d a s o n id o m e d ia n t e la
cre a cció n d e u n S o u n d Lo a d e r p a ra é l.
La ca rg a d e s o n id o s e n t h re a d s d e s e g u n d o p la n o ( co n S o u n d Lo a d e r) a u m e n t a e l re n d im ie n t o
p e rcib id o m e d ia n t e la re d u cció n d e l t ie m p o q u e e l u s u a rio t ie n e q u e e s p e ra r p a ra p o d e r
in t e ra ct u a r co n e l a p p le t . S e h a ce a s í p a ra re d u cir e l t ie m p o g a s t a d o p o r e l m é t o d o in it ( ) . S i s e
lla m a s im p le m e n t e a g e t Au d iClip ( ) e n e l m é t o d o in it ( ) d e l a p p le t , t a rd a rá b a s t a n t e a n t e s d e
q u e g e t Au d io Clip re t o rn e , lo q u e s ig n ifica q u e e l a p p le t n o p u e d e re a liza r o t ra s s e n t e n cia s d e
s u m é t o d o in it ( ) , y q u e n o s e lla m a rá a l m é t o d o s t a rt ( ) d e l a p p le t . ( Pa ra e s t e a p p le t e n
p a rt icu la r, u n re t a rd o e n la lla m a d a a l m é t o d o s t a rt ( ) n o t ie n e im p o rt a n cia ) .
Ot ra ve n t a ja d e la ca rg a d e s o n id o s u t iliza n d o t h re a d s e n s e g u n d o p la n o e s q u e p e rm it e q u e e l
u s u a rio re s p o n d a a p ro p ia d a ( e in m e d ia t a m e n t e ) a u n a e n t ra d a d e l u s u a rio , q u e n o rm a le m e n t e
cu a s a ría la e je cu ció n d e u n s o n id o , in clu s o s i e l s o n id o n o s e h a ca rg a d o t o d a vía . Po r e je m p lo ,
s i s im p le m e n t e s e u t iliza e l m é t o d o p la y ( ) d e Ap p le t , la p rim e ra ve z q u e e l u s u a rio h a g a a lg o
p a ra q u e s e e je cu t e u n s o n id o p a rt icu la r, e l d ib u jo d e l a p p le t y e l m a n e jo d e e ve n t o s q u e d a ra n
co n g e la d o s m ie n t ra s s e ca rg a e l s o n id o . En ve z d e e s t o , é s t e a p p le t d e t e ct a q u e e l s o n id o n o
h a s id o ca rg a d o t o d a vía y re s p o n d e d e fo rm a a p ro p ia d a .
Es t e e je m p lo s e e xp lica co n m á s d e t a lle e n Th re a d s e n Ap p le t s : Eje m p lo s .

Oz it o
Definir y Utilizar Parámetros en un Applet
Lo s p a rá m e t ro s s o n a lo s a p p le t s lo q u e lo s a rg u m e n t o s d e la lín e a d e co m a n d o s a
la s a p lica cio n e s . Pe rm it e n a l u s u a rio p e rs o n a liza r la o p e ra ció n d e l a p p le t . Me d ia n t e
la d e fin ició n d e p a rá m e t ro s , s e p u e d e in cre m e n t a r la fle xib ilid a d d e lo s a p p le t s ,
m a rca n d o e l t ra b a jo d e s u s a p p le t s e n m ú lt ip le s s it u a cio n e s s in t e n e r q u e
e s crib irlo s d e n u e vo n i re co m p ila rlo s .
La s p á g in a s s ig u ie n t e s e xp lica n lo s p a rá m e t ro s d e lo s a p p le t s d e s d e e l p u n t o d e l
p ro g ra m a d o r. Pa ra a p re n d e r lo s p a rá m e t ro s d e s d e e l p u n t o d e vis t a d e l u s u a rio
p u e d e ve r: Es p e cifica r Pa rá m e t ro s co n la Et iq u e t a < PARAM> .

Decidir los Parámetros a Soportar


Cu a n d o s e im p le m e n t a n p a rá m e t ro s s e d e b e rá re s p o n d e n a cu a t ro
p re g u n t a s :
● ¿ Qu é d e b e ría p e rm it irs e le co n fig u ra r a l u s u a rio d e u n a p p le t ?

● ¿ Có m o d e b e ría n lla m a rs e lo s p a rá m e t ro s ?

● ¿ Qu é cla s e s d e va lo re s d e b e ría n co n t e n e r lo s p a rá m e t ro s ?

● ¿ Cú a l d e b e ría s e r e l va lo r p o r d e fe ct o d e ca d a p a rá m e t ro ?

Escribir Código para Soportar Parámetros


Lo s Ap p le t s o b t ie n e n lo s va lo re s d e lo s p a rá m e t ro s d e fin id o s p o r e l
u s u a rio lla m a n d o a l m é t o d o g e t P a ra m e t e r( ) d e la cla s e Ap p le t .

Dar Información sobre los Parámetros


Me d ia n t e la im p le m e n t a ció n d e l m é t o d o g e t P a ra m e t e rI n fo ( ) , lo s
a p p le t s p ro p o rcio n a n in fo rm a ció n s o b re q u e n a ve g a d o re s s e p u e d e n
u t iliza r p a ra a yu d a r a l u s u a rio a s e le ccio n a r lo s p a rá m e t ro s .

Oz it o
Decidir los Parámetros a Soportar
Es t a p á g in a t e g u ia a t ra vé s d e la s cu a t ro p re g u n t a s q u e d e b e ría s re s p o n d e r cu a n d o
im p le m e n t e s p a rá m e t ro s :
● ¿ Qu é d e b e ría p e rm it irs e le co n fig u ra r a l u s u a rio d e u n a p p le t ?

● ¿ Có m o d e b e ría n lla m a rs e lo s p a rá m e t ro s ?
● ¿ Qu é cla s e s d e va lo re s d e b e ría n co n t e n e r lo s p a rá m e t ro s ?
● ¿ Cú a l d e b e ría s e r e l va lo r p o r d e fe ct o d e ca d a p a rá m e t ro ?
Te rm in a co n u n a e xp lica ció n s o b re la d e fin ició n d e p a rá m e t ro s co n u n a cla s e d e e je m p lo
lla m a d a Ap p le t Bu t t o n .

¿Qué debería permitirsele configurar al usuario de un applet?


Lo s p a rá m e t ro s q u e u n a p p le t d e b e ría n s o p o rt a r d e p e n d e n d e lo q u e h a g a s u
a p p le t , y d e la fle xib ilid a d q u e q u ie ra s q u e t e n g a . Lo s a p p le t s q u e m u e s t ra n
im á g e n e s p o d ría n t e n e r p a rá m e t ro s p a ra e s p e cifica r la p o s ició n d e la s im á g e n e s .
De fo rm a s im ila r, lo s a p p le t s q u e e je cu t a n s o n id o s p o d ría n t e n e r p a rá m e t ro s p a ra
e s p e cifica r lo s s o n id o s .
Ju n t o co n lo s p a rá m e t ro s q u e e s p e cifica n lo ca liza cio n e s d e re cu rs o s ( co m o
im á g e n e s o fich e ro s d e s o n id o ) , a lg u n a s ve ce s lo s a p p le t s p ro p o rcio n a n
p a rá m e t ro s p a ra e s p e cifica r d e t a lle s d e la a p a rie n cia u o p e ra ció n d e l a p p le t . Po r
e je m p lo , u n a p p le t d e a n im a ció n p o d ría p e rm it ir q u e e l u s u a rio e s p e cifica ra e l
n ú m e ro d e im á g e n e s p o r s e g u n d o . O u n a p p le t p o d ría p e rm it ir q u e e l u s u a rio
ca m b ie lo s t e xt o s m o s t ra d o s p o r e l a p p le t . To d o e s p o s ib le .

¿Cómo deberían llamarse los parámetros?


Un a ve z q u e h a s d e cid io lo s p a rá m e t ro s s o p o rt a d o s p o r e l a p p le t , n e ce s it a d is e ñ a r
s u s n o m b re s . Aq u í t ie n e s a lg u n o s n o m b re s t íp ico s d e p a rá m e t ro s :
S OURCE o S RC
Pa ra u n fich e ro d e d a t o s co m o u n fich e ro d e im á g e n e s .
XXXS OURCE ( p o r e je m p lo , IMAGES OURCE)
Ut iliza d o e n lo s a p p le t s q u e p e rm it e n a l u s u a rio u t iliza r m á s d e u n t ip o d e
fich e ro s d e d a t o s .
XXXS
Pa ra u n p a rá m e t ro t o m a d o d e u n a lis t a d e XXXs ( d o n d e XXX p o d ría s e r
IMAGE, d e n u e vo ) .
NAME
Ut iliza d o s o lo p a ra u n n o m b re d e a p p le t . Lo s n o m b re s d e a p p le t s s e u t iliza n
p a ra la co m u n ica ció n co n o t ro s a p p le t s , co m o s e d e s crib e e n En via r Me n s a je s
a Ot ro s Ap p le t s e n la Mis m a Pá g in a .
Qu e e l n o m b re s e a cla ro y co n cis o e s m á s im p o rt a n t e q u e s u lo n g it u d .
N o t a : Au n q u e e s t e t u t o ria l n o rm a lm e n t e s e re fie re a lo s n o m b re s d e p a rá m e t ro s
u t iliza n d o MAYÚS CULAS , é s t o s n o s o n s e n s ib le s a l ca s o . Po r e je m p lo ,
IMAGES OURCE e im a g e S o u rce s e re fie re n a l m is m o p a rá m e t ro .
Po r o t ro la d o , lo s v a lo re s d e lo s p a rá m e t ro s s i s o n s e n s ib le s a l ca s o , a m e n o s q u e
s e lo s in t e rp re t e d e o t ra fo rm a ( co m o u t iliza n d o e l m é t o d o t o Lo w e rCa s e ( ) d e la
cla s e S t rin g a n t e s d e in t e rp re t a r e l va lo r d e l p a rá m e t ro ) .

¿Qué clases de valores deberían contener los parámetros?


To d o s lo s va lo re s d e p a rá m e t ro s s o n ca d e n a s . Ta n t o s i e l u s u a rio p o n e co m illa s o
n o a ld e re d o r d e l va lo r d e l p a rá m e t ro , e l va lo r e s p a s a d o a l a p p le t co m o u n a
ca d e n a . S in e m b a rg o , u n a p p le t p u e d e in t e rp re t a r la s ca d e n a s d e m u ch a s fo rm a s .
Lo s a p p le t s in t e rp re t a n n o rm a lm e n t e u n va lo r d e u n p a rá m e t ro co m o u n o d e lo s
s ig u ie n t e s t ip o s :
● Un a d ire cció n URL

● Un e n t e ro

● Un n ú m e ro e n co m a flo t a n t e

● Un va lo r b o o le a n d o - - t ip ica m e n t e "t ru e "/ "fa ls e "

● Un a ca d e n a - - p o r e je m p lo , la ca d e n a u t iliza d a p a ra e l t ít u lo d e u n a ve n t a n a .

● Un a lis t a d e cu a lq u ie ra d e lo s t ip o s a n t e rio re s

¿Cúal debería ser el valor por defecto de cada parámetro?


Lo s a p p le t s d e b e ría n in t e n t a r p ro p o rcio n a r va lo re s ú t ile s p o r d e fe ct o p a ra ca d a
p a rá m e t ro , p a ra q u e e l a p p le t s e e je cu t e in clu s o s i e l u s u a rio n o h a e s p e cifica d o
n in g ú n p a rá m e t ro o lo s h a e s p e cifica d o in co rre ct a m e n t e . Po r e je m p lo , u n a p p le t
d e a n im a ció n d e b e ría p ro p o rcio n a r u n n ú m e ro a d e cu a d o d e im á g e n e s p o r
s e g u n d o . De e s t a fo rm a , s i e l u s u a rio n o e s p e cifica u n p a rá m e t ro re le va n t e , e l
a p p le t t ra b a ja rá d e fo rm a co rre ct a .

Un Ejemplo: AppletButton
A t ra vé s d e e s t e t u t o ria l, lo s a p p le t s q u e n e ce s it a n m o s t ra r ve n t a n a s u t iliza n la
cla s e Ap p le t Bu t t o n q u e e s a lt a m e n t e co n fig u ra b le . El GUI d e Ap p le t Bu t t o n e s
s e n cillo , co n s is t e e n u n b o t ó n y u n a e t iq u e t a q u e m u e s t ra e l e s t a d o . Cu a n d o e l
u s u a rio p u ls a s o b re e l b o t ó n , e l a p p le t m u e s t ra u n a ve n t a n a .
La cla s e Ap p le t Bu t t o n e s t a n fle xib le p o rq u e d e fin e p a rá m e t ro s p a ra p e rm it ir q u e
u s u a rio e s p e cifiq u e cu a lq u ie ra d e lo s s ig u ie n t e s :
● El t ip o d e la ve n t a n a a m o s t ra r.

● El Tít u lo d e la ve n t a n a .

● La a lt u ra d e la ve n t a n a .

● La a n ch u ra d e ve n t a n a .

● La e t iq u e t a d e l b o t ó n q u e m u e s t ra la ve n t a n a .

Un a e t iq u e t a < APPLET> t íp ica p a ra Ap p le t Bu t t o n s e p a re ce ría a e s t o :


<APPLET CODE=AppletButton.class CODEBASE=clases WIDTH=350 HEIGHT=60>
<PARAM NAME=windowClass VALUE=BorderWindow>
<PARAM NAME=windowTitle VALUE="BorderLayout">
<PARAM NAME=buttonText VALUE="Pulse aquí para ver BorderLayout en acción">
</APPLET>
Cu a n d o e l u s u a rio n o e s p e cifica u n va lo r p a ra u n p a rá m e t ro , Ap p le t Bu t t o n u t iliza n
u n va lo r p o r d e fe ct o ra zo n a b le . Po r e je m p lo , s i e l u s u a rio n o e s p e cifica e l t ít u lo d e
la ve n t a n a , Ap p le t Bu t t o n u t iliza e l t ip o d e la ve n t a n a co m o t ít u lo .
La p á g in a s ig u ie n t e m u e s t ra e l có d ig o q u e u t iliza Ap p le t Bu t t o n p a ra o b t e n e r lo s
va lo re s d e s u s p a rá m e t ro s .

Oz it o
Escribir el Código para Soportar Parámetros
Lo s a p p le t s u t iliza n e l m é t o d o g e t P a ra m e t e r( ) d e la cla s e Ap p le t s p a ra o b t e n e r lo s
va lo re s e s p e cifica d o s p o r e l u s u a rio p a ra s u s p a rá m e t ro s . Es t e m é t o d o e s t á d e fin id o d e
la s ig u ie n t e fo rm a :
public String getParameter(String name)
S u a p p le t p o d ría n e ce s it a r co n ve rt ir la ca d e n a d e vu e lt a p o r g e t P a ra m e t e r( ) e n o t ro
fo rm a t o , co m o u n e n t e ro . El p a q u e t a ja va . la n g p ro p o rcio n a cla s e s co m o In t e g e r q u e s e
p u e d e u t iliza r p a ra la co n ve rs ió n d e la s ca d e n a s e n t ip o s p rim it ivo s . Aq u í t ie n e s u n
e je m p lo d e la cla s e Ap p le t b u t t o n p a ra co n ve rt ir e l va lo r d e u n p a rá m e t ro e n u n a
ca d e n a :
int requestedWidth = 0;
. . .
String windowWidthString = getParameter("WINDOWWIDTH");
if (windowWidthString != null) {
try {
requestedWidth = Integer.parseInt(windowWidthString);
} catch (NumberFormatException e) {
//Utiliza la anchura por defecto.
}
}
Ob s e rva q u e s i e l u s u a rio n o e s p e cifica e l va lo r p a ra e l p a rá m e t ro WINDOWWDTH, e l
u t iliza e l va lo r p o r d e fe ct o d e 0 , lo q u e e l a p p le t in t e rp re t a co m o "u t iliza e l t a m a ñ o
n a t u ra l d e la ve n t a n a ". Es im p o rt a n t e q u e s e s u m in is t re n va lo re s p o r d e fe ct o d o n d e s e a
p o s ib le .

Un ejemplo: AppletButton
Ab a jo t ie n e s e l có d ig o d e Ap p le t Bu t t o n q u e o b t ie n e lo s p a rá m e t ro s d e l a p p le t .
Pa ra m á s in fo rm a ció n s o b re Ap p le t b u t t o n p u e d e s ve r la p á g in a a n t e rio r.
String windowClass;
String buttonText;
String windowTitle;
int requestedWidth = 0;
int requestedHeight = 0;
. . .
public void init() {
windowClass = getParameter("WINDOWCLASS");
if (windowClass == null) {
windowClass = "TestWindow";
}

buttonText = getParameter("BUTTONTEXT");
if (buttonText == null) {
buttonText = "Pulse aquí para ver una ventana " + windowClass;
}
windowTitle = getParameter("WINDOWTITLE");
if (windowTitle == null) {
windowTitle = windowClass;
}

String windowWidthString = getParameter("WINDOWWIDTH");


if (windowWidthString != null) {
try {
requestedWidth = Integer.parseInt(windowWidthString);
} catch (NumberFormatException e) {
//Utiliza la anchura por defecto.
}
}

String windowHeightString = getParameter("WINDOWHEIGHT");


if (windowHeightString != null) {
try {
requestedHeight = Integer.parseInt(windowHeightString);
} catch (NumberFormatException e) {
//Utiliza la altura por defecto.
}
}

Oz it o
Dar Información sobre los Parámetros
Ah o ra q u e h e m o s p ro p o rcio n a d o a l u s u a rio u n o s p a rá m e t ro s p re cio s o s , n e ce s it a m e s
a yu d a rle a s e le ccio n a r lo s va lo re s d e lo s p a rá m e t ro s co rre ct a m e n t e . Po r s u p u e s t o , la
d o cu m e n t a ció n d e u n a p p le t d e b e ría d e s crib ir ca d a p a rá m e t ro y u n e je m p lo a l u s u a rio y
a co n s e ja rle s o b re s u s e le cció n . Po r lo t a n t o , n u e s t ro t ra b a jo n o t e rm in a a q u í. De b e ría m o s
im p le m e n t a r e l m é t o d o g e t P a ra m e t e rI n fo ( ) p a ra q u e d e vu e lva in fo rm a ció n s o b re lo s
p a rá m e t ro s d e l a p p le t . Lo s n a ve g a d o re s p u e d e n u t iliza r e s t a in fo rm a ció n p a ra a yu d a r a l
u s u a rio a s e le ccio n a r lo s va lo re s d e lo s p a rá m e t ro s d e l a p p le t .
Aq u í t ie n e s u n e je m p lo d e im p le m e n t a ció n d e l m é t o d o g e t P a ra m e t e rI n fo ( ) . Es t e e je m p lo
e s d e l a p p le t An im a t o r, q u e e s m a ra villo s a m e n t e fle xib le ya q u e p ro p o rcio n a 1 3 p a rá m e t ro s
p a ra q u e e l u s u a rio p u e d a p e rs o n a liza r s u a n im a ció n .
public String[][] getParameterInfo() {
String[][] info = {
// Parameter Name Kind of Value Description
{"imagesource", "URL", "a directory"},
{"startup", "URL", "displayed at startup"},
{"background", "URL", "displayed as background"},
{"startimage", "int", "start index"},
{"endimage", "int", "end index"},
{"namepattern", "URL", "used to generate indexed names"},
{"pause", "int", "milliseconds"},
{"pauses", "ints", "milliseconds"},
{"repeat", "boolean", "repeat or not"},
{"positions", "coordinates", "path"},
{"soundsource", "URL", "audio directory"},
{"soundtrack", "URL", "background music"},
{"sounds", "URLs", "audio samples"},
};
return info;
}
Co m o p u e d e s ve r, e l m é t o d o g e t P a ra m e t e rI n fo ( ) d e b e d e vo lve r u n a rra y d e
t re s - ca d e n a s . En ca d a a rra y d e t re s ca d e n a s , la p rim e ra ca d e n a e s e l n o m b re d e l
p a rá m e t ro . La s e g u n d a ca d e n a le a co n s e ja a l u s u a rio s o b re e l t ip o d e va lo r g e n e ra l q u e e l
a p p le t n e ce s it a p a ra e s e p a rá m e t ro . La t e rce ra ca d e n a d e s crib e e l s ig n ifica d o d e e s e
p a rá m e t ro .

Oz it o
Leer las Propiedades del Sistema
Pa ra e n co n t ra r in fo rm a ció n s o b re e l e n t o rn o d e t ra b a jo a ct u a l lo s a p p le t s p u e d e n
le e r la s p ro p ie d a d e s d e l s is t e m a . La s p ro p ie d a d e s d e l s is t e m a s o n p a re ja s d e
cla ve / va lo r q u e co n t ie n e n in fo rm a ció n co m o e l s is t e m a o p e ra t ivo b a jo e l q u e s e
e s t á e je cu t a n d o e l a p p le t . La s p ro p ie d a d e s d e l s is t e m a s e cu b rie ro n e n m á s d e t a lle
e n la p á g in a Pro p ie d a d e s d e l S is t e m a .

Lo s a p p le t s p u e d e n le e r s ó lo a lg u n a s p ro p ie d a d e s d e l s is t e m a . Es t a p á g in a lis t a la s
p ro p ie d a d e s d e l s is t e m a q u e e l Ne t s ca p e Na vig a t o r 2 . 0 y e l Ap p le t Vie we r p e rm it e n
le e r a lo s a p p le t s , s e g u id a p o r la lis t a d e p ro p ie d a d e s q u e lo s a p p le t s n o p u e d e n
le e r.

Propiedades del Sistema que Pueden Leer los Applets


Lo s a p p le t s p u e d e n le e r la s s ig u ie n t e s p ro p ie d a d e s d e l s is t e m a :
Cla v e S ig n ific a d o
"file . s e p a ra t o r" S e p a ra d o r d e Fcih e ro s ( e . g . , "/ ")
"ja va . cla s s . ve rs io n " Nú m e ro d e Ve rs ió n d e la Cla s e Ja va
"ja va . ve n d o r" Ca d e n a Es p e cifica d e l Ve n d e d o r Ja va
"ja va . ve n d o r. u rl" URL d e l ve n d e d o r Ja va
"ja va . ve rs io n " Nú m e ro d e ve rs ió n d e Ja va
"lin e . s e p a ra t o r" S e p a ra d o r d e Lín e a s
"o s . a rch " Arq u it e ct u ra d e l S is t e m a Op e ra t ivo
"o s . n a m e " No m b re d e l S is t e m a Op e ra t ivo
"p a t h . s e p a ra t o r" S e p a ra d o r d e Pa t h ( e . g . , ": ")
Pa ra le e r la s p ro p ie d a d e s d e l s is t e m a d e n t ro d e u n a p p le t , s e p u e d e
u t iliza r e l m é t o d o g e t P ro p e rt y ( ) d e la cla s e S ys t e m . Po r e je m p lo :
String s = System.getProperty("os.name");

Propiedades del Sistema Prohibidas


Po r ra zo n e s d e s e g u rid a d , n o e xis t e n n a ve g a d o re s o vis u a liza d o re s d e
a p p le t s q u e p e rm it a n a lo s a p p le t s le e r la s s ig u ie n t e s p ro p ie d a d e s d e l
s is t e m a .
Cla v e S ig n ific a d o
"ja va . cla s s . p a t h " Dire ct o rio d e Cla s e s Ja va
Dire ct o rio d e in s t a la ció n d e
"ja va . h o m e "
Ja va
"u s e r. d ir" Dire ct o rio d e t ra b a jo a ct u a l
"u s e r. h o m e " Dire ct o rio p rin cip a l d e l u s u a rio
"u s e r. n a m e " No m b re d e Cu e n t a d e l u s u a rio

Oz it o
Mostrar Cadenas Cortas de Estado
To d o s lo s vis u a liza d o re s d e a p p le t s - - d e s d e e l Ap p le r Vie we r h a s t a e l Ne s t ca p e
Va vig a t o r - - p e rm it e n q u e lo s a p p le t s m u e s t re n ca d e n a s co rt a s d e e s t a d o . En
im p le m e n t a cio n e s a ct u a le s , la s ca d e n a s a p a re ce n e n la lín e a d e e s t a d o e n la p a rt e
in fe rio r d e la ve n t a n a d e l vis u a liza d o r. En lo s n a ve g a d o re s , t o d o s lo s a p p le t s d e la
m is m a p á g in a , a s í co m o e l p ro p io n a ve g a d o r co m p a rt e n la m is m a lín e a d e e s t a d o .
Nu n ca s e d e b e ría p o n e r in fo rm a ció n cru cia l e n la lín e a d e e s t a d o . S i m u ch o s
u s u a rio s n e ce s it a ra n le e r la in fo rm a ció n , s e d e b e ría m o s t ra r e n e l á re a d e l a p p le t .
S i s ó lo u n o s p o co s y s o fis t ica d o s u s u a rio s n e ce s it a n e s a in fo rm a ció n ,
co n s id e ra re m o s e l m o s t ra r la in fo m a ció n e n la s a lid a e s t a n d a rd ( p u e d e s ve r la
p á g in a s ig u ie n t e ) .

La lín e a d e e s t a d o n o e s n o rm a lm e n t e m u y p ro m in e n t e y p u e d e s e r s o b re e s crit a
p o r o t ro s a p p le t s o p o r e l n a ve g a d o r. Po r e s t a s ra zo n e s , e s m e jo r u t iliza rla p a ra
in fo rm a ció n t ra n s it o ria . Po r e je m p lo , u n a p p le t q u e ca rg a m u ch o s fich e ro s d e
im á g e n e s p o d ría m o s t ra r e l n o m b re d e la im a g e n q u e e s t á ca rg a n d o e n e s e
m om e nto.
Lo s a p p le t s p u e d e n m o s t ra r lín e a s d e e s t a d o co n e l m é t o d o s h o w S t a t u s ( ) . Aq u í
t ie n e s u n e je m p lo d e s u u t iliza ció n :
showStatus("MyApplet: Cargando el Fichero de Imagen " + file);

Oz it o
Mostrar diagnósticos en los Canales de Salida y
Error Estandards
Mo s t ra r d ia g n ó s t ico s e n la s a lid a e s t a n d a rd p u e d e s e r u n a h e rra m ie n t a
im p re s cin d ib le cu a n d o s e e s t á d e p u ra n d o a p p le t s . Ot ro m o m e n t o e n e l q u e s e
p o d rá n ve r m e n a je s e n la s a lid a e s t a n d a rd e s cu a n d o o cu rre u n a e xce p ció n n o
ca p t u ra d a e n u n a p p le t . Lo s a p p le t s t a m b ié n t ie n e n la o p ció n d e u t iliza r e l ca n a l d e
e rro r e s t a n d a rd .
Do n d e e s t á n e xa ct a m e n t e lo s ca n a le s d e s a lid a y e rro r e s t a n d a rd va ria ,
d e p e n d ie n d o d e có m o e s t á im p le m e n t a d o e l vis u a liza d o r d e a p p le t s , la p la t a fo rm a
e n la q u e s e e s t é e je cu t a n d o , y ( a lg u n a s ve ce s ) có m o s e h a la n za d o e l n a ve g a d o r
o e l vis u a liza d o r d e a p p le t s . Cu a n d o s e la n za e l Ap p le t Vie we r d e s d e u n a ve n t a n a
d e l S h e ll d e UNIX, p o r e je m p lo , la s ca d e n a s m o s t ra d a s e n lo s ca n a le s d e s a lid a y
e rro r e s t a n d a rd s a p a re ce n e n e s a ve n t a n a d e l s h e ll, a m e n o s q u e s e re d ire ccio n e la
s a lid a . Cu a n d o s e la n za e l Ap p le t Vie we r d e s d e u n m e n ú d e XWin d o ws , la s a lid a y
e l e rro r e s t a n d a rd va n a la ve n t a n a d e la co n s o la . Po r o t ro la d o , Ne t s ca p e
Na vig a t o r 2 . 0 s ie m p re m u e s t ra lo s ca n a le s d e s a lid a y d e e rro r e s t a n d a rd s e n la
Co n s o la Ja va , q u e e s t á d is p o n ib le d e s d e e l m e n ú Op t io n s .
Lo s a p p le t s m u e s t ra n u n ca n a l d e s a lid a e s t a n d a rd u t iliza n d o
S y s t e m . o u t . p rin t ( S t r in g ) y S y s t e m . o u t . p rin t ln ( S t r in g ) .
Mo s t ra r e l ca n a l d e l e rro r e s t a n d a rd e s s im ila r; s ó lo s e d e b e e s p e cifica r
S y s t e m . e rr e n ve z d e S y s t e m . o u t . Aq u í t ie n e s u n e je m p lo u t iliza n d o la s a lid a
e s t a n d a rd :
//Donde se declaren las variables de ejemplar:
boolean DEBUG = true;
. . .
//Después, cuando queramos imprimir algún estado:
if (DEBUG) {
System.out.println("Called someMethod(" + x + "," + y + ")");
}
N o t a : Mo s t ra r lo s ca n a le s d e s a lid a y d e e rro r e s t a n d a rd e s re la t iva m e n t e le n t o . S i
s e t ie n e n p ro b le m a s re la cio n a d o s co n e l t ie m p o , im p rim ir m e n s a je s e n a lg u n o d e
e s t o s ca n a le s p o d ría n o s e r ú t il.

Oz it o
Comunicarse con Otros Programas
Un a p p le t p u e d e co m u n ica rs e co n o t ro s p ro g ra m a s d e t re s fo rm a s :
● In vo ca n d o lo s m é t o d o s p ú b lico s d e o t ro s a p p le t s d e la m is m a p á g in a ( s u je t o s
a la s re s t riccio n e s d e s e g u rid a d ) .
● Ut iliza n d o e l API d e fin id o e n e l p a q u e t e ja va . a p p le t , q u e p e rm it e la s
co m u n ica cio n e s d e u n a fo rm a lim it a d a co n e l n a ve g a d o r o e l vis u a liza d o r d e
a p p le t s q u e lo co n t ie n e .
● Ut iliza n d o e l API d e l p a q u e t e ja va . n e t p a ra co m u n ica rs e a t ra vé s d e la re d co n
o t ro s p ro g ra m a s . Lo s o t ro s p ro g ra m a s d e b e n e s t á r e je cu t a n d o s e e n e l h o s t d e
d o n d e s e t ra jo e l a p p le t o rig in a lm e n t e .
Es t a s le ccio n e s e xp lica n y m u e s t ra n e je m p lo s d e e s t a s t re s cla s e s d e co m u n ica ció n
d e a p p le t s .

Enviar Mensajes a otros Applets en la Misma Página


Ut iliza n d o lo s m é t o d o s g e t Ap p le t ( ) y g e t Ap p le t s ( ) d e l Ap p le t Co n t e xt
u n a p p le t s p u e d e o b t e n e r o b je t o s d e la cla s e Ap p le t d e o t ro s a p p le t s q u e
s e e s t á n e je cu t a n d o e n la m is m a p á g in a . Un a ve z q u e u n a p p le t t ie n e u n
o b je t o Ap p le t d e o t ro a p p le t p u e d e e n via rle m e n s a je s .

Comunicarse con el Navegador


Va rio s m é t o d o s d e Ap p le t y Ap p le t Co n t e xt p ro p o rcio n a n co m u n ica ció n
lim it a d a e n t re e l a p p le t y e l n a ve g a d o r o e l vis u a liza d o r e n e l q u e s e e s t á
e je cu t a n d o . Lo s m á s in t e re s a n t e s s o n p ro b a b le m e n t e lo s m é t o d o s
s h o w D o c u m e n t ( ) d e Ap p le t Co n t e xt , q u e le p e rm it e a l a p p le t d e cirle a l
n a ve g a d o r q u e URL d e b e m o s t ra r.

Trabajar con Aplicaciones en el Lado del Servidor


Lo s a p p le t s p u e d e n u t iliza r la s ca ra ct e ris t ca s d e la Re d co m o lo h a ría
cu a lq u ie r p ro g ra m a Ja va , co n la re s t ricció n d e q u e t o d a s la s
co m u n ica cio n e s d e b e n s e r co n e l h o s t q u e e s e l h o s t a ct u a l p a ra e l a p p le t
b a ja d o . Es t a s e cció n p re s e n t a u n a ve rs ió n d e u n a p p le t d e Tra b a ja r co n
Da t a g ra m a Clie n t e y S e rvid o r.

Ta m b ié n e n e s t a s e cció n h a y u n e je m p lo d e có m o u t iliza r u n a a p lica ció n


e n e l la d o d e l s e rvid o r p a ra e vit a r la s re s t riccio n e s d e s e g u rid a d d e lo s
a p p le t s . En e s t e e je m p lo , lo s a p p le t s o rig in a rio s d e l m is m o h o s t p e ro q u e
s e e s t á n e je cu t a n d o e n d ife re n t e s m á q u in a p u e d e n co m u n ica rs e
u t iliza n d o u n a a p lica ció n d e l la d o d e l s e rvid o r co m o in t e rm e d ia rio .
Oz it o
Enviar Mensajes a otros Applets en la misma Página
Lo s a p p le t s p u e d e n e n co n t ra r o t ro s a p p le t s y e n via rle s m e n s a je s , co n la s ig u ie n t e s re s t riccio n e s d e
s e g u rid a d :
● Lo s a p p le t s d e b e n e je cu t a rs e e n la m is m a p á g in a , e n la m is m a ve n t a n a d e l n a ve g a d o r.

● Mu ch o s vis u a liza d o re s d e a p p le t s re q u ie re n q u e lo s a p p le t s s e a n o rig in a le s d e l m is m o s e rvid o r.

Un a p p le t p u e d e e n co n t ra r o t ro a p p le t b u s cá n d o lo p o r s u n o m n b re ( u t iliza n d o e l m é t o d o g e t Ap p le t ( ) d e
Ap p le t Co n t e xt ) o b u s ca n d o t o d o s lo s a p p le t s d e la p á g in a ( u t iliza n d o e l m é t o d o g e t Ap p le t ( ) d e
Ap p le t Co n t e xt ) . Am b o s m é t o d o s , s i t ie n e n é xit o , le d a n a l lla m a d o r u n o o m á s o b je t o s Ap p le t . Un a ve z
q u e e l lla m a d o r h a e n co n t ra d o u n o b je t o Ap p le t , e l lla m a d o r p u e d e lla m a r a lo s m é t o d o s d e l o b je t o .

Encontrar un Applet por el nombre: el método getApplet()


Po r d e fe ct o , u n a p p le t n o t ie n e n o m b re . Pa ra q u e u n a p p le t t e n g a n o m b re d e b e e s p e cifica rs e
u n o e n e l có d ig o HTML q u e s e a ñ a d e a la p á g in a d e l a p p le t . S e p u e d e e s p e cifica r u n n o m b re
p a ra u n a p p le t d e d o s fo rm a s d ife re n t e s :
● Me d ia n t e la e s p e cifica ció n d e u n a t rib u t o NAME d e n t ro d e la e t iq u e t a < APPLET> d e l
a p p le t . Po r e je m p lo :
<applet codebase=clases/ code=Sender.class width=450 height=200 name="buddy">
. . .
</applet>
● Me d ia n t e la e s p e cifica ció n d e u n p a rá m e t ro NAME co n u n a e t iq u e t a < PARAM> . Po r
e je m p lo :
<applet codebase=clases/ code=Receiver.class width=450 height=35>
<param name="name" value="old pal">
. . .
</applet>
N o t a d e l N a v e g a d o r: La s ve rs io n e s 2 . 0 y 2 . 1 d e l Ne t s ca p e Na vig a t o r n o p e rm it e n q u e lo s
n o m b re s t e n g a n le t ra s m a yú s cu la s . Es p e cífica m e n t e , e l m é t o d o g e t Ap p le t ( ) ( e l m é t o d o q u e
b u s ca u n a p p le t p o r s u n o m b re ) p a re ce co n ve rt ir e l n o m b re e s p e cifica d o a m in ú s cu la s a n t e s d e
co m e n za r la b ú s q u e d a d e l a p p le t .
Ab a jo t ie n e s d o s a p p le t s q u e ilu s t ra n la b ú s q u e d a p o r e l n o m b re . El p rim e ro , Re m it e n t e , b u s ca
a l s e g u n d o , Re ce p t o r. Cu a n d o e l Re m it e n t e e n cu e n t ra a l Re ce p t o r, le e n via u n m e n s a je
lla m a n d o a u n o d e lo s m é t o d o s d e l Re ce p t o r ( p a s a n d o e l n o m b re d e l Re m it e n t e co m o u n
a rg u m e n t o ) . El Re ce p t o r re a ccio n a a la lla m a d a d e e s t e m é t o d o ca m b ia n d o la ca d e n a s it u a d a a
la izq u ie rd a p o r "Re ce ive d m e s s a g e fro m s e n d e r- n a m e !".
I n t e n t a Es t o : Pu ls e e l b o t ó n S e n d m e s s a g e e n e l a p p le t s u p e rio r ( Re m it e n t e ) . Ap a re ce rá
a lg u n a in fo rm a ció n d e e s t a d o e n la ve n t a n a d e l Re m it e n t e , y e l Re ce p t o r co n firm a rá ( co n s u
p ro p ia ca d e n a d e e s t a d o ) q u e h a re cib id o e l m e n s a je . De s p u é s d e h a b e r le id o e l m e n s a je d e l
Re ce p t o r, p u ls a e l b o t ó n Cle a r d e l Re ce p t o r p a ra re s e t e a rlo .
I n t e n t a Es t o : En e l ca m p o d e l t e xt o d e l Re m it e n t e lla m a d o "Re ce ive r n a m e : ", t e cle a b u d d y y
p u ls a Re t u rn . Co m o "b u d d y" e s e l n o m b re d e l p ro p io Re m it e n t e , e n co n t ra rá u n a p p le t lla m a d o
b u d d y p e ro n o le e n via rá u n m e n s a je , ya q u e n o e s u n e je m p la r d e Re ce p t o r.
Aq u í t ie n e e l p ro g ra m a Re m it e n t e Co m p le t o . El có d ig o e s u t iliza p a ra b u s ca r y co m u n ica rs e co n
e l Re ce p t o r lis t a d o m á s a b a jo . El có d ig o q u e s e p u e d e u t iliza r s in ca m b ia rlo s e e n cu e n t ra e n
n e g rit a .
Applet receiver = null;
String receiverName = nameField.getText(); //Obtiene el nombre por el que
buscar.
receiver = getAppletContext().getApplet(receiverName);
El Re m it e n t e s e a s e g u ra d e q u e s e h a e n co n t ra d o u n Re ce p t o r y q u e e s u n e je m p la r d e la cla s e
co rre ct a ( Re ce ive r) . S i t o d o va b ie n , e l Re m it e n t e e n via u n m e n s a je a l re ce p t o r. ( Aq u í t ie n e e l
p ro g ra m a d e l Re ce p t o r. )
if (receiver != null) {
//Utiliza el ejemplar del operador para asegurarse de que el applet
//que hemos encontrado un objeto Receiver
if (!(receiver instanceof Receiver)) {
status.appendText("Found applet named "
+ receiverName + ", "
+ "but it's not a Receiver object.\n");
} else {
status.appendText("Found applet named "
+ receiverName + ".\n"
+ " Sending message to it.\n");
//Fuerza el tipo del Receptor a un objeto Receiver
//(en vez de sólo un objeto applet) para que el compilador
//nos permita llamar a un método del Receiver.
((Receiver)receiver).processRequestFrom(myName);
}
} . . .
De s d e e l p u n t o d e vis t a d e u n a p p le t , s u n o m b re e s a lm a ce n a d o e n u n p a rá m e t ro lla m a d o
NAME. S e p u e d e o b t e n e r e l va lo r d e l p a rá m e t ro u t iliza n d o e l m é t o d o g e t P a ra m e t e r( ) d e la
cla s e Ap p le t . Po r e je m p lo , e l Re m it e n t e o b t ie n e s u p ro p io n o m b re co n e l s ig u ie n t e có d ig o :
myName = getParameter("NAME");
Pa ra m á s in fo rm a ció n d e la u t iliza ció n d e g e t P a ra m e t e r( ) , p u e d e s ir a Es crib ir e l Có d ig o p a ra
S o p o rt a r Pa rá m e t ro s .
Lo s a p p le t s d e e je m p lo d e e s t a p á g in a re a liza n u n a co m u n ica ció n e n u n s ó lo s e n t id o - - d e s d e e l
Re m it e n t e a l Re ce p t o r. S i s e q u ie re q u e e l Re ce p t o r t a m b ié n p u e d a e n via r m e n s a je s a l
Re m it e n t e , lo ú n ico q u e s e t ie n e q u e h a ce r e s d a rle a l Re m it e n t e u n a re fe re n cia d e s í m is m o
( t h is ) a l re ce p t o r. Po r e je m p lo :
((Receiver)receiver).startCommunicating(this);

Encontrar Todos los Applets de una Página: El método getApplets()


El m é t o d o g e t Ap p le t s ( ) d e vu e lve u n a lis t a ( u n a En u m e ra ció n , p a ra s e r p re cis o ) d e t o d o s lo s
a p p le t s q u e h a y e n la p á g in a .
Po r ra zo n e s d e s e g u rid a d , la m a yo ría d e lo s n a ve g a d o re s y vis u a liza d o re s d e a p p le t s
im p le m e n t a n g e t Ap p le t s ( ) p a ra q u e s o lo d e vu e lva a q u e llo s a p p le t s o rig in a rio s d e l m is m o
s e rvid o r q u e e l a p p le t q u e lla m ó a g e t Ap p le t s ( ) . Aq u í t ie n e s u n a s im p le lis t a d e t o d o s lo s
a p p le t s q u e p u e d e s e n co n t ra r e n e s t a p á g in a :
Ab a jo t ie n e s la s p a rt e s re le va n t e s d e l m é t o d o q u e lla m a a g e t Ap p le t s ( ) . ( Aq u í t ie n e s e l
p ro g ra m a co m p le t o . )
public void printApplets() {
//Una enumeración que contiene todos los applets de esta página (incluyendo este)
//a los que podemos enviar mensajes.
Enumeration e = getAppletContext().getApplets();
. . .
while (e.hasMoreElements()) {
Applet applet = (Applet)e.nextElement();
String info = ((Applet)applet).getAppletInfo();
if (info != null) {
textArea.appendText("- " + info + "\n");
} else {
textArea.appendText("- " + applet.getClass().getName() + "\n");
}
}
. . .
}

Oz it o
Comunicarse con el Navegador
Mu ch o s d e lo s m é t o d o s d e Ap p le t y Ap p le t Co n t e xt e n vu e lve n a lg u n a p e q u e ñ a co m u n ica ció n co n
e l n a ve g a d o r o e l vis u a liza d o r d e a p p le t s . Po r e je m p lo , lo s m é t o d o s g e t D o c u m e n t Ba s e ( ) y
g e t b Ba s e ( ) d e la cla s e Ap p le t o b t ie n e n in fo rm a ció n d e l n a ve g a d o r o e l vis u a liza d o r d e a p p le t
s o b re e l a p p le t y la p á g in a HTML d e la q u e é s t e vie n e . El m é t o d o s h o w S t a t u s ( ) d e la cla s e
Ap p le t le d ice a l n a ve g a d o r o vis u a liza d o r q u e m u e s t re u n m e n s a je d e e s t a d o . El m é t o d o
g e t P a ra m e t e rI n fo ( ) p u e d e d a rle a l n e ve g a d o r u n a lis t a co n lo s p a rá m e t ro s q u e e n t ie n d e e l
a p p le t . Y p o r s u p u e s t o , e l n a ve g a d o r o e l vis u a liza d o r p u e d e n lla m a r a lo s m é t o d o in it ( ) ,
s t a rt ( ) , s t o p ( ) , y d e s t ro y ( ) d e l a p p le t p a ra in fo rm a le s o b re lo s ca m b io s d e s u e s t a d o .
Ta m b ié n s o n in t e re s a n t e s lo s m é t o d o s s h o w D o c u m e n t d e Ap p le t Co n t e xt . Co n e s t o s m é t o d o s ,
u n a p p le t p u e d e co n t ro la r la d ire cció n URL q u e m o s t ra rá e l n a ve g a d o r, y e n q u e ve n t a n a d e l
n a ve g a d o r. ( Po r s u p u e s t o , e l Ap p le t Vie we r ig n o ra e s t o s m é t o d o s , ya q u e n o e s u n n a ve g a d o r
d e We b ) . Aq u í t ie n e s d o s fo rm a s d e s h o w D o c u m e n t ( ) :
public void showDocument(java.net.URL url)
public void showDocument(java.net.URL url, String targetWindow)
La fo rm a d e u n s ó lo a rg u m e n t o d e s h o w D o c u m e n t ( ) s ó lo le d ice a l n a ve g a d o r q u e m u e s t re la
URL e s p e cifica d a , s in e s p e cifica r la ve n t a n a e n la q u e s e m o s t ra rá e l d o cu m e n t o .
La fo rm a d e d o s a rg u m e n t o s d e s h o w D o c u m e n t ( ) le p e rm it e e s p e cifa r la ve n t a n a o m a rco
HTML s e m o s t ra rá e l d o cu m e n t o . El s e g u n d o a rg u m e n t o d e b e s e r u n o d e lo s va lo re s m o s t ra d o s
a b a jo .
N o t a d e Te rm in o lo g ía : En e s t á e xp lica ció n , m a rco n o s e re fie re a u n m a rco d e l AWT s in o a u n
m a rco HTML d e n t ro d e u n a ve n t a n a d e n n a ve g a d o r.
"_ b la n k "
Mu e s t ra e l d o cu m e n t o e n u n a n u e va ve n t a n a s in n o m b re .
"w in d o w N a m e "
Mu e s t ra e l d o cu m e n t o e n u n a ve n t a n a lla m a d a w in d o w Na m e . Es t a ve n t a n a s e cre a rá s i e s
n e ce s a rio .
"_ s e lf"
Mu e s t ra e l d o cu m e n t o e n la ve n t a n a y m a rco q u e co n t ie n e e l a p p le t .
"_ p a re n t "
Mu e s t ra e l d o cu m e n t o e n la ve n t a n a d e l a p p le t e n e l m a rco p a d re d e l m a rco d e l a p p le t . S i
e l m a rco d e l a p p le t n o t ie n e p a d re , e s t o t ie n e e l m is m o e fe ct o q u e "_ s e lf".
"_ t o p "
Mu e s t ra e l d o cu m e n t o e n la ve n t a n a d e l a p p le r p e ro e n e l m a rch o d e m á s a lt o n ive l. S i e l
m a rco d e l a p p le t t ie n e e l n ive l m á s a lt o , e s t o a ct ú a ig u a l q u e "_ s e lf".
Ab a jo h a y u n a p p le t q u e t e p e rm it e p ro b a r ca d a o p ció n d e la s d o s fo rm a s d e
s h o w D o c u m e n t ( ) . Tra e u n a ve n t a n a q u e le p e rm it e t e cle a r u n a URL y e le g ir u n a d e la s
o p cio n e s d e s h o w D o c u m e n t ( ) . Cu a n d o p u ls e s la t e cla re t u rn o e l b o t ó n S h o w d o c u m e n t , e l
a p p le t lla m a a l m é t o d o s h o w D o c u m e n t ( ) .
Ab a jo t ie n e s e l có d ig o d e l a p p le t q u e lla m a a s h o w D o c u m e n t ( ) . ( Aq u í t ie n e s e l p ro g ra m a
co m p le t o )
...//En una subclase de Applet:
urlWindow = new URLWindow(getAppletContext());
. . .
class URLWindow extends Frame {
. . .
public URLWindow(AppletContext appletContext) {
. . .
this.appletContext = appletContext;
. . .
}
. . .
public boolean action(Event event, Object o) {
. . .
String urlString = /* Cadena introducida por el usuario */;
URL url = null;
try {
url = new URL(urlString);
} catch (MalformedURLException e) {
...//Informa al usuario y retorna...
}

if (url != null) {
if (/* el usuario no quiere especificar una ventana */) {
appletContext.showDocument(url);
} else {
appletContext.showDocument(url, /* user-specified window */);
}
}
. . .

Oz it o
Trabajar con una aplicación del Lado del Servidor
Lo s a p p le t s , a l ig u a l q u e o t ro s p ro g ra m a s Ja va , p u e d e n u t iliza r e l API d e fin id o e n e l
p a q u e t e ja va . n e t p a ra co m u n ica rs e a t ra vé s d e la re d . La ú n ica d ife re n cia e s q u e ,
p o r ra zo n e s d e s e g u rid a d , e l ú n ico s e rvid o r co n e l q u e s e p u e d e co m u n ica r u n
a p p le t e s e l s e rvid o r d e s d e e l q u e vin o .
Es fá cil e n co n t ra r e l s e rvid o r d e l q u e vin o u n a p p le t . S ó lo s e d e b e u t iliza r e l m é t o d o
g e t Co d e Ba s e ( ) d e l Ap p le t y e l m é t o d o g e t Ho s t ( ) d e ja va , n e t . URL, d e e s t a
fo rm a :
String host = getCodeBase().getHost();
S i s e e s p e cifica u n n o m b re d e s e rvid o r in clu s o s ó lo lig e ra m e n t e d ife re n t e d e l
e s p e cifica d o p o r e l u s u a rio d e l a p p le t , s e co rre e l rie s g o d e q u e e l m a n e ja d o r d e
s e g u rid a d co rt e la co m u n ica ció n in clu s o s i lo s d o s n o m b re e s p e cifica n e l m is m o
s e rvid o r. Ut iliza n d o e l có d ig o a n t e rio r ( e n ve z d e t e cle a r e l n o m b re d e l s e rvid o r) s e
a s e g u ra q u e e l a p p le t u t iliza e l n o m b re d e s e rvid o r co rre ct o .
Un a ve z q u e s e t ie n e e l n o m b re co rre ct o , s e p u e d e u t iliza r t o d o e l có d ig o d e re d
q u e e s t á d o cu m e n t a d o e n Re d d e Clie n t e y S e g u rid a d .

Oz it o
Restricciones de Seguridad
Un o d e lo s o b je t ivo s p rin cip a le s d e l e n t o rn o Ja va e s h a ce r q u e lo s u s u a rio s d e
n a ve g a d o re s s e s ie n t a n s e g u ro s cu a n d o e je cu t a n cu a lq u ie r a p p le t . Pa ra co n s e g u ir
e s t e o b je t ivo , h e m o s e m p e za d o co n s e rva d o re s , re s t rin g ie n d o la s ca p a cid a d e s ,
q u izá s m á s n e ce s a ria s . Cu a n d o p a s e e l t ie m p o lo s a p p le t s p ro b a b le m e n t e t e n d rá n
m á s y m á s ca p a cid a d e s .
Es t a p á g in a cu e n t a la s re s t riccio n e s d e s e g u rid a d a ct u a le s e n lo s a p p le t s , d e s d e e l
p u n t o d e vis t a d e l có m o a fe ct a e l d is e ñ o d e a p p le t s .
Ca d a vis u a liza d o r d e Ap p le t s t ie n e u n o b je t o S e cu rit yMa n a g e r q u e co m p ru e b a la s
vio la cio n e s d e s e g u rid a d d e u n a p p le t . Cu a n d o e l S e cu rit yMa n a g e r d e t e ct a u n a
vio la ció n , cre a y la n za u n o b je t o S e cu rit yExce p t io n . Ge n e ra lm e n t e , e l co n s t ru ct o r
d e la S e cu rit yExce p t io n im p rim e u n m e n s a je d e a vis o e n la s a lid a e s t a n d a rd . Un
a p p le t p u e d e ca p t u ra r e s a e xce p ció n y re a ccio n a r d e fo rm a a p ro p ia d a , co m o
t ra n q u iliza r a l u s u a iro y s a lt a n d o a u n a fo rm a "s e g u ra " ( p e ro m e n o s id e a l) p a ra
re a liza r la t a re a ,
Alg u n o s vis u a liza d o re s d e a p p le t s s e t ra g a n a lg u n a s S e cu rit yExce p t io n , p a ra q u e e l
a p p le t n u n ca p u e d a ca p t u ra rla s . Po r e je m p lo , la im p le m e n t a ció n d e lo s m é t o d o s
g e t Ap p le t ( ) y g e t Ap p le t s ( ) d e l Ap p le t Co n t e xt d e l Ap p le t Vie we r d e l JDK
s im p le m e n t e ca p t u ra n e ig n o ra n cu a lq u ie r S e cu rit yExce p t io n . El u s u a rio p u e d e ve r
u n m e n s a je d e e rro r e n la s a lid a e s t a n d a rd , p e ro a l m e n o s e l a p p le t o b t ie n e u n
re s u lt a d o vá lid o d e s d e lo s m é t o d o s . Es t o t ie n e a lg ú n s e n t id o , ya q u e g e t Ap p le t s ( )
d e b e ría p o d e r d e vo lve r cu a lq u ie r a p p le t vá lid o q u e e n co n t ra ra , in clu s o s i e n cu e n t ra
u n o n o vá lid o . ( El Ap p le t Vie we r co n s id e ra q u e u n a p p le t e s vá lid o s i s e h a ca rg a d o
d e s d e e l m is m o h o s t q u e e l a p p le t q u e lla m o a g e t Ap p le t s ( ) . )
Pa ra a p re n d e r m á s s o b re lo s co n t ro la d o re s d e s e g u ria d y la s cla s e s d e vio la cio n e s
d e s e g u rid a d q u e p u e d e n co m p ro b a r, p u e d e s ve r In t ro d u cció n a lo s Ma n e ja d o re s
d e S e g u rid a d .

Có m o s e m e n cio n a e n la le cció n a n t e rio r, lo s vis u a liza d o re s d e a p p le t s e xis t e n t e s


( in clu ye n d o lo s n a ve g a d o re s d e la We b co m o Ne t s ca p e Na vig a t o r 2 . 0 ) im p o n e n la s
s ig u ie n t e s re s t riccio n e s :
Lo s Ap p le t s n o p u e d e n c a rg a r lib re ría s n i d e fin ir m é t o d o s n a t iv o s .
Lo s a p p le t s s ó lo p u e d e n u t iliza r s u p ro p io có d ig o Ja va y e l API Ja va q u e le
p ro p o rcio n a e l vis u a liza d o r. Co m o m ín im o , ca d a vis u a liza d o r d e a p p le t s d e b e
p ro p o rcio n a r a cce s o a l API d e fin id o e n lo s p a q u e t e s ja va . * .
Un a p p le t n o p u e d e le e r o e s c rib ir fic h e ro s d e fo rm a o rd in a ria e n e l h o s t
d o n d e s e e s t á e je c u t a n d o
El Ap p le t Vie we r d e l JDK p e rm it e a lg u n a s e xce p cio n e s e s p e cifica d a s p o r e l
u s u a rio a e s a re g la , p e ro Ne s t ca p e Na vig a t o r 2 . 0 n o lo p e rm it e . Lo s a p p le t s
e n cu a lq u ie r vis u a liza d o r p u e d e n le e r fich e ro s e s p e cifica d o s co n u n a d ire cció n
URL co m p le t a , e n ve z p o r u n n o m b re d e fich e ro . Un a t a jo p a ra n o t e n e r q u e
e s crib ir fich e ro s e s h a ce r q u e e l a p p le t e n víe lo s d a t o s a u n a a p lica ció n e n e l
s e rvid o r d e d o n d e e l e s o rig in a l. Es t a a p lica ció n p u e d e e s crib ir fich e ro s d e
d a t o s e n s u p ro p io s e rvid o r. Pu e d e s ve r Tra b a ja r co n u n a Ap lica cio n d e l La d o
d e l S e rvid o r p a ra ve r m á s e je m p lo s .
Un a p p le t n o p u e d e h a c e c o n e x io n e s d e re d e x c e p t o c o n e l h o s t d e l q u e e l
a p p le t e s o rig in a l
El a t a jo p a ra e s t a re s t ricció n e s h a ce r q u e e l a p p le t t ra b a je co n u n a a p lica ció n
e n e l h o s t d e l q u e vin o . La a p lica ció n p u d e h a ce r co n e xio n e s a cu a lq u ie r lu g a r
d e la re d .
Un a p p le t n o p u e d e a rra n c a r n in g ú n p ro g ra m a e n e l h o s t d o n d e s e e s t á
e je c u t a n d o
De n u e vo , e l a p p le t p u e d e t ra b a ja r co n u n a a p lica ció n e n e l la d o d e l s e rvid o r
e n s u lu g a r.
Un a p p le t n o p u e d e le e r t o d a s la s p ro p ie d a d e s d e l s is t e m a .
Pu e d e s ve r Le e r la s Pro p ie d a d e s d e l S is t e m a p a ra o b t e n e r m á s in fo rm a ció n .
La s v e n t a n a s q u e g e n e ra u n a a p p le t s o n d is t in t a s a la s v e n t a n a s q u e
g e n e ra u n a a p lic a c ió n .
La s ve n t a n a s d e a p p le t t ie n e a lg ú n t e xt o d e a vis o y u n a b a rra co lo re a d a o u n a
im a g e n . Es t o a yu d a a l u s u a rio a d is t in g u ir la s ve n t a n a s d e lo s a p p le t s d e la s
ve n t a n a s d e la s a p lica cio n e s ve rd a d e ra s .

Oz it o
Capacidades de los Applets
La p á g in a a n t e rio r t e p o d ría h a b e r h e ch o s e n t ir q u e lo s a p p le t s s o n s ó lo
a p lica cio n e s m u t ila d a s . No e s cie rt o ! Ju n t o co n la ca ra ct e ris ca o b via d e q u e lo s
a p p le t s s e p u e d e n ca rg a r a t ra vé s d e la re d , lo s a p p le t s t ie n e m á s ca p a cid a d e s d e
la s q u e p o d ría s im a g in a r. Tie n e n a cce s o a l API d e t o d o s lo s p a q u e t e s ja va . * ( s u je t o
a la s re s t riccio n e s d e s g u rid a d ) a d e m á s t ie n e n a lg u n a s ca p a cid a d e s q u e la
a p lica cio n e s n o t ie n e n .

Capacidades que las Aplicaciones no tienen


Lo s a p p le t s t ie n e n ca p a cid a d e s e xt ra s p o rq u e e s t á n s o p o rt a d o s p o r e l
có d ig o d e la a p lica ció n d o n d e s e e s t á n e je cu t a n d o . Lo s a p p le t s t ie n e
a cce s o a e s t e s o p o rt e a t ra vé s e l p a q u e t e ja va . a p p le t , q u e co n t ie n e la
cla s e Ap p le t y lo s in t e rfa ce s Ap p le t Co n t e xt , Ap p le t S t u b , y Au d io Clip .
Aq u í t ie n e s a lg u n a s ca p a cid a d e s d e lo s a p p le t s q u e la s a p lica cio n e s n o
t ie n e n :
Lo s a p p le t s p u e d e n e je c u t a r s o n id o s .
Pu e d e s ve r Eje cu t a r S o n id o s p a ra m á s in fo rm a ció n .
Lo s Ap p le t s q u e s e e je c u t a n d e n t ro d e u n N a v e g a d o r p u e d e n
h a c e r fá c ilm e n t e q u e s e r v is u a lic e n d o c u m e n t o s HTML.
Es t o e s t á s o p o rt a d o p o r lo s m é t o d o s s h o w D o c u m e n t ( ) d e
Ap p le t Co n t e xt . Pu e d e s ve r Co m u n ica rs e co n e l Na ve g a d o r p a ra
o b t e n e r m á s in fo rm a ció n .
Lo s Ap p le t s p u e d e n in v o c a r a lo s m é t o d o s p ú b lic o s d e o t ro s
a p p le t s d e la m is m a p á g in a
Pu e d e s ve r En via r Me n s a je s a Ot ro s Ap p le t s e n la Mis m a Pá g in a
p a ra m á s in fo rm a ció n .

Más Capacidades de los Applets


Ju n t o co n la s ca p a cid a d e s a n t e rio re s lo s a p p le t s t ie n e n o t ra s q u e p o d ría s
n o e s p e ra r:
Lo s a p p le t s c a rg a d o s d e s d e u n d ire c t o rio d e l s is t e m a lo c a l d e
fic h e ro s ( d e s d e u n d ire c t o rio e n e l CLAS S P ATH d e l u s u a rio ) n o
t ie n e n n in g u n a d e la s re s t ric c io n e s q u e t ie n e n lo s a p p le t s
c a rg a d o s a t ra v é s d e la re d .
Es t o e s p o rq u e lo s a p p le t s q u e e s t á n e n e l CLAS S PATH d e l u s u a rio
s e co n vie rt e n e n p a rt e d e la a p lica ció n cu a n d o s o n ca rg a d o s .
Au n q u e la m a y o ría d e lo s a p p le t s d e t ie n e n s u e je c u c ió n u n a v e z
q u e s e h a s a lid o d e la p á g in a , n o t ie n e n p o r q u é h a c e rlo .
La m a yo ría d e lo s a p p le t s , p a ra s e r e d u ca d o s , im p le m e n t a n e l
m é t o d o s t o p ( ) ( s i e s n e ce s a rio ) p a ra p a ra r cu a lq u ie r p ro ce s o
cu a n d o e l u s u a rio a b a n d o n a la p á g in a . S in e m b a rg o , a lg u n a s ve ce s ,
e s m e jo r q u e co n t in u e la e je cu ció n d e l a p p le t . Po r e je m p lo , s i e l
u s u a rio le d ice a l a p p le t q u e re a lice u n cá lcu lo co m p le jo , e l u s u a rio
p o d ría q u e re r e l cá lcu lo co n t in u a s e . ( Au n q u e e l u s u a rio d e b e ró a
p o d e r e s p e cifica r s i q u ie re q u e e l a p p le t co n t in u e o n o ) . Ot ro
e je m p lo , s i u n a p p le t p u d ie ra s e r ú t il d u ra n t e va ria s p á g in a s ,
d e b re ría u t iliza r u n a ve n t a n a p a ra s u in t e rfa ce ( y n o o cu lt a r la
ve n t a n a e n s u m é t o d o s t o p ( ) ) . El u s u a rio p u e d e ce rra r la ve n t a n a
cu a n d o ya n o la n e ce s it e .

Oz it o
Antes de Exportar un Applet
Sto p!
An t e s d e p e rm it ir q u e e l m u n d o e n t e ro co n o zca t u a p p le t , a s e g u ra t e d e re s p o n d e r
s i a t o d a s la s s ig u ie n t e s cu e s t io n e s :
1 . ¿ Ha s e lim in a d o o d e s a c t iv a d o t o d a s la s s a lid a s d e d e p u ra d o ?
La s s a lid a s d e d e p u ra d o ( cre a d a s g e n e ra lm e n t e co n
S y s t e m . o u t . p rin t ln ( ) ) , s o n ú t ile s p a ra t i p e ro g e n e ra lm e n t e
co n fu n d e n o m o le s t a n a lo s u s u a rio s . S i in t e n t a s d a rle
re a lim e n t a ció n t e xt u a l a l u s u a rio , in t e n t a h a ce rlo d e n t ro d e l á re a
d e l a p p le t o e n e l á re a d e e s t a d o e n la p a rt e in fe rio r d e la ve n t a n a .
La in fo rm a ció n s o b re có m o u t iliza r e l á e ra d e e s t a d o p u e d e s
e n co n t ra rla e n Mo s t ra r Ca d e n a s Co rt a s d e Es t a d o .
2 . ¿ El a p p le t d e t ie n e s u e je c u c ió n c u a n d o s a le d e la p a n t a lla ?
La m a yo ría d e lo s a p p le t s n o d e b e ría n u t iliza r re cu rs o s d e la CPU
cu a n d o e l n a ve g a d o r e s t á m in im iza d o o m o s t ra n d o u n a p á g in a q u e
n o co n t ie n e u n a p p le t . S i e l có d ig o d e l a p p le t n o la n za
e xp lícit a m e n t e n in g ú n t h re a d , e n t o n ce s e s t á co rre ct o .
S i e l a p p le t la n za a lg ú n t h re a d , e n t o n ce s a m e n o s q u e t e n g a s u n a
e xcu s a REALMENTE BUENA p a ra n o h a ce rlo , d e b e ra s im p le m e n t a r e l
m é t o d o s t o p ( ) p a ra q u e s e p a re n y s e d e s t ru ya n ( m e d ia n t e s u
s e le cció n a n u ll) lo s t h re a d s q u e h a s la n za d o . Pa ra ve r u n e je m p lo
d e im p le m e n t a ció n d e l m é t o d o s t o p ( ) p u e d e s ir a Eje m p lo s d e
Th re a d s e n Ap p le t s .
3 . S i e l a p p le t h a c e a lg o q u e p u d ie ra re s u lt a r m o le s t o - - e je c u t a r s o n id o s
o a n im a c io n e s , p o r e je m p lo - - ¿ Le h a s p ro p o rc io n a d o a l u s u a rio
a lg u n a fo rm a d e p a ra r e l c o m p o rt a m ie n t o m o le s t o ?
S e a m a b le co n t u s u s u a rio s . Da le u n a o p o rt u n id a d a t u s u s u a rio s
p a ra q u e p a re n e l a p p le t s in t e n e r q u e a b a n d o n a r la p á g in a . En u n
a p p le t q u e d e o t ra fo rm a n o re s p o n d e a la s p u ls a cio n e s d e l ra t ó n ,
s e p u e d e h a ce r e s t o m e d ia n t e la im p le m e n t a ció n d e l m é t o d o
m o u s e D o w n ( ) p a ra q u e u n click d e l ra t ó n s u s p e n d a e l t h re a d
m o le s t o . Po r e je m p lo :
boolean frozen = false; //Una variable de ejemplar

public boolean mouseDown(Event e, int x, int y) {


if (frozen) {
frozen = false;
start();
} else {
frozen = true;
stop();
}
return true;
}

Oz it o
El Applet Finalizado Perfectamente
La p á g in a a n t e rio r lis t a a lg u n a s fo rm a s co n la s q u e s e p o d ría e vit a r q u e e l u s u a rio
d e t u s a p p le t s q u is ie ra n t o rt u ra rle . Es t á p á g in a cu e n t a a lg u n a s co s a s m á s p a ra
h a ce r q u e s e a n t a n p la ce n t e ro s co m o s e a p a s ib le .
Ha z t u s Ap p le t s t a n fle x ib le s c o m o s e a p o s ib le .
Pu e d e s d e fin ir p a rá m e t ro s q u e p e rm it a n q u e t u a p p le t s e a u t iliza d o e n u n a
g ra n va rie d a d d e s it u a cio n e s s in t e n e r q u e re - e s crib irlo . Pu e d e s ve r De fin ir y
Ut iliza r Pa rá m e t ro s e n u n Ap p le t p a ra o b t e n e r m á s in fo rm a ció n .
I m p le m e n t a e l m é t o d o g e t P a ra m e t e rI n fo ( )
Im p le m e n t a n d o e s t e m é t o d o p u e d e s h a ce r q u e t u a p p le t s e a m á s fá cil d e
p e rs o n a liza r e n e l fu t u ro . Act u a lm e n t e , n in g ú n n a ve g a d o r u t iliza r e s t e
m é t o d o . S in e m b a rg o , s e e s p e ra q u e p ro n t o lo s n a ve g a d o re s u t ilice n e s t e
m é t o d o p a ra a yu d a r a g e n e ra r u n GUI p a ra p e rm it ir q u e e l u s u a rio in t e ra ct u e
co n lo s p a rá m e t ro s . Pu e d e s ve r Da r In fo rm a ció n s o b re lo s Pa rá m e t ro s p a ra
m á s in fo rm a ció n s o b re la im p le m e n t a ció n d e l m é t o d o g e t P a ra m e t e rI n fo ( ) .
I m p le m e n t a e l m é t o d o g e t Ap p le t I n fo ( ) .
Es t e m é t o d o d e vu e lve u n a ca d e n a co rt a d e s crip t iva d e l a p p le t . Au n q u e lo s
n a ve g a d o re s a ct u a le s n o u t iliza n e s t e m é t o d o , s e e s p e ra q u e lo h a g a n e n u n
fu t u ro . Aq u í t ie n e s u n e je m p lo d e im p le m e n t a ció n d e g e t Ap p le t I n fo ( ) :
public String getAppletInfo() {
return "GetApplets by Kathy Walrath";
}

Oz it o
Problemas más Comunes con los Applets
(y sus Soluciones)
P ro b le m a : El Ap p le t Vie we r d ice q u e n o h a y e t iq u e t a a p p le t e n t u p á g in a HTML,
p e ro s i e xis t e :
● Co m p ru e b a s i h a s ce rra d o la e t iq u e t a a p p le t : < / APPLET> .

P ro b le m a : He re co m p ila d o m i a p p le t , p e ro m i vis u a liza d o r n o m u e s t ra la n u e va


ve rs ió n , in clu s o s i le d ig o q u e lo re ca rg u e .
● En m u ch o s vis u a liza d o re s ( in clu ye n d o lo s n a ve g a d o re s ) la re ca rg a d e a p p le t s
n o e s p o s ib le . Es t o e s p o r lo q u e s ó lo d e b e s u t iliza r e l Ap p le t Vie we r d e l JDK,
lla m á n d o lo ca d a q u e q u e ca m b ie s u n a p p le t .
● S i o b t ie n e s u n a ve rs ió n vie ja d e l a p p le t , s in im p o rt a r lo q u e h a g a , a s e g u ra t e
d e q u e n o t ie n e s u n a co p ia vie ja d e l a p p le t e n a lg ú n d ire ct o rio d e t u
CLAS S PATH. Pu e d e s ve r Co n t ro la n d o lo s Pa q u e t e s p a ra m á s in fo m a ció n s o b re
la va ria b le d e e n t o rn o CLAS S PATH.
P ro b le m a : El fo n d o g ris d e m i a p p le t h a ce q u e e s t e p a rp a d e e cu a n d o s e d ib u ja
s o b re u n a p á g in a co n u n co lo r d ife re n t e .
● Ne ce s it a s s e le ccio n a r e l co lo r d e fo n d o d e l a p p le t p a ra q u e t ra b a je b ie n co n e l
co lo r d e la p á g in a . Pu e d e s ve r Cre a r u n In t e rfa ce Grá fico d e Us u a rio ( GUI)
p a ra m á s d e t a lle s .
P ro b le m a : El m é t o d o g e t I m a g e d e l a p p le t n o fu n cio n a
● As e g u ra t e d e q u e h a s lla m a d o a g e t I m a g e d e s d e e l m é t o d o in it o d e s d e u n
m é t o d o lla m a d o d e s p u é s d e in it . El m é t o d o g e t I m a g e n o fu n cio n a cu a n d o e s
lla m a d o d e s d e u n co n s t ru ct o r.
P ro b le m a : a h o ra q u e h e co p ia d o m i fich e ro . cla s s d e l a p p le t e n m i s e rvid o r HTTP,
e l a p p le t n o fu n cio n a .
● ¿ Tu a p p le t h a d e fin id o m á s d e u n a cla s e ? S i lo h a h e ch o , a s e g u ra t e d e q u e
t o d o s lo s fich e ro s . cla s s ( Cla s s N a m e . c la s s ) d e t o d a s la s cla s e s e s t á n e n e l
s e rvid o r HTTP. In clu s o s i t o d a s la s cla s e s e s t á n d e fin id a s e n e l m is m o fich e ro
fu e n t e , e l co m p ila d o r p ro d u ce u n fich e ro . cla s s p a ra ca d a cla s e .
● ¿ Ha s co p ia d o t o d o s lo s fich e ro s d e d a t o s d e t u a p p le t - - fich e ro s d e im á g e n e s
o s o n id o s , p o r e je m p lo - - a l s e rvid o r?
● As e g u ra t e q u e t o d a s la s cla s e s d e l a p p le t y t o d o s lo s fich e ro s d e d a t o s p u e d e n
s e r le id o s p o r t o d o s ( co m p ru e b a lo s p e rm is o s ) .

Oz it o
Cambios del API que afectan a los Applets
Co n la a yu d a d e l a t rib u t o ARCHI VE, p u e d e s d e cirle a lo s n a ve g a d o re s q u e ca rg u e n
t u s a p p le t s d e s d e fich e ro s d e a rch ivo Ja va ( fich e ro s JAR) . Ut iliza r lo s fich e ro s JAR
p u e d e re d u cir s ig n ifica t iva m e n t e e l t ie m p o d e d e s ca rg a d e l Ap p le t y a yu d a rt e a
e vit a r a lg u n a s re s t riccio n e s d e s e g u rid a d in n e ce s a ria s .
Pu e d e s ve r Ca m b io s e n 1 . 1 : Arch ivo s JAR y lo s Ap p le t s .

Oz it o
Introducción al UI de Java
Es t a le cció n o fre ce u n a in t ro d u cció n a t o d o lo q u e le p ro p o rcio n a e l e n t o rn o Ja va
p a ra a yu d a rt e a cre a r u n in t e rfa ce d e u s u a rio ( UI) . UI e s u n t é rm in o q u e s e re fie re
a t o d o s lo s ca m in o s d e co m u n ica ció n e n t re u n p ro g ra m a y s u s u s u a rio s . UI n o e s
s ó lo lo q u e ve e l u s u a rio , t a m b ié n e s lo q u e e l u s u a rio o ye y s ie n t e . In clu s o la
ve lo cid a d co n la q u e u n p ro g ra m a in t e ra ct u a co n e l u s u a rio e s u n a p a rt e
im p o rt a n t e d e l UI d e l p ro g ra m a .
El e n t o rn o Ja va p ro p o rcio n a cla s e s p a ra la s s ig u ie n t e s fu n cio n a lid a d e s d e l UI:
P re s e n t a r u n UI g rá fic o ( GUI )
Es t e e l UI p re fe rid o p o r la m a yo ría d e lo s p ro g ra m a s Ja va . El re s t o d e e s t a
s e cció n s e co n ce n t ra s o b re e s t e p u n t o .
Eje c u t a r S o n id o s
Ju s t o a h o ra , lo s a p p le t s p u e d e n e je cu t a r s o n id o s , p e ro la s a p lica cio n e s n o
p u e d e n ( a l m e n o s d e u n a fo rm a p o rt a b le ) . Pu e d e s ve r Eje cu t a r S o n id o s p a ra
m á s in fo rm a ció n s o b re la e je cu ció n d e s o n id o s e n lo s a p p le t s .
Ob t e n e r in fo rm a c ió n d e c o n fig u ra c ió n
Lo s u s u a rio s p u e d e n co n fig u ra r la in fo rm a ció n d e l a p p le t u t iliza n d o
a rg u m e n t o s d e la lín e a d e co m a n d o s ( s ó lo la s a p lica cio n e s ) y p a rá m e t ro s
( s ó lo lo s a p p le t s ) . Pa ra m á s in fo rm a ció n s o b re lo s a rg u m e n t o s d e la lín e a d e
co m a n d o s , p u e d e ve r Arg u m e n t o s d e la Lín e a d e Co m a n d o s d e u n a
Ap lica ció n . Pa ra m á s in fo rm a ció n s o b re lo s p a rá m e t ro s , p u e d e ve r De fin ir y
Ut iliza r Pa rá m e t ro s e n u n Ap p le t .
Gra b a r la s p re fe re n c ia s d e l u s u a rio u t iliz a n d o p ro p ie d a d e s
Pa ra la in fo rm a ció n q u e la s a p lica cio n e s n e ce s it a n g u a rd a r cu a n d o n o s e e s t á n
e je cu t a n d o , p u e d e s u t iliza r la s p ro p ie d a d e s . No rm a lm e n t e lo s a p p le t s n o
p u e d e n e s crib ir p ro p ie d a d e s e n e l s is t e m a lo ca l d e fich e ro s , d e b id o a la s
re s t riccio n e s d e s e g u rid a d . Pa ra o b t e n e r m á s in fo rm a ció n s o b re la s
p ro p ie d a d e s p u e d e ve r Pro p ie d a d e s .
Ob t e n e r y m o s t ra r t e x t o u t iliz a n d o lo s c a n a le s d e e n t ra d a , s a lid a y e rro r
e s t a n d a rd s
Lo s ca n a le s d e e n t ra d a , s a lid a y e rro r e s t a n d a rd s o n u n fo rm a a l vie jo e s t ilo
d e p re s e n t a r u n in t e rfa ce d e u s u a rio . To d a vía e s ú t il p a ra p ro b a r y d e p u ra r
p ro g ra m a s , a s í co m o p a ra a lg u n a fu n cio n a lid a d n o d irig id a a l u s u a rio t íp ico .
Pu e d e s ve r Lo s Ca n a le s d e I/ O Es t a n d a rd p a ra o b t e n e r in fo rm a ció n s o b re la
u t iliza ció n d e lo s ca n a le s d e e n t ra d a , s a lid a y e rro r e s t a n d a rd s .
Lo s a p p le t s y la s a p lica cio n e s p re s e n t a n in fo rm a ció n a l u s u a rio y le in vit a n a
in t e ra cu a r u t iliza n d o u n GUI. La p a rt e d e l e n t o rn o Ja va lla m a d a He rra m ie n t a s d e
Ve n t a n a s Ab a s t ra ct a s ( Ab a s t ra ct Win d o ws To o lkit - AWT) co n t ie n e u n co m p le t o
co n ju n t o d e cla s e s p a ra e s crib ir p ro g ra m a s GUI. .
Componentes de AWT
El AWT p ro p o rcio n a m u ch o s co m p o n e n t e s GUI e s t a n d a rd s , co m o
b o t o n e s , lis t a s , m e n ú s y á re a s d e t e xt o . Ta m b ié n in clu ye co n t e n e d o re s
( co m o ve n t a n a s y b a rra s d e m e n ú ) y co m p o n e n t e s d e a lt o n ive l ( có m o
u n cu a d ro d e d iá lo g o p a ra a b rir y g u a rd a r fich e ro s ) .

Otras Clases AWT


Ot ra s cla s e s d e l AWT in clu ye n a q u e lla s q u e t ra b a ja n e n u n co n t e xt o
g rá fico ( in clu ye n d o la s o p e ra cio n e s d e d ib u jo b á s ico ) , im á g e n e s ,
e ve n t o s , fu e n t e s y co lo re s . Ot ro g ru p o im p o rt a n t e d e cla s e s d e l AWT s o n
lo s co n t ro la d o re s d e d is t rib u ció n o d is p o s ició n q u e co n t ro la n e l t a m a ñ o y
la p o s ició n d e lo s co m p o n e n t e s .

La Anatomía de un Programa Basado en GUI


El AWT p ro p o rcio n a u n m a rco d e t ra b a jo p a ra d ib u jo y m a n e jo d e
e ve n t o s . Ut iliza n d o u n p ro g ra m a e s p e cifica n d o la h e re n cia d e lo s
co n t e n e d o re s y lo s co m p o n e n t e s , e l AWT e n vía e ve n t o s ( co m o
p u ls a cio n e s d e l ra t ó n ) a l o b je t o a p ro p ia d o . La m is m a h e re n cia d e t e rm in a
có m o s e d ib u ja rá n a s í m is m o s lo s co n t e n e d o re s y lo s co m p o n e n t e s .

Oz it o
Componentes del AWT
El a p p le t d e e s t a p á g in a m u e s t ra lo s co m p o n e n t e s g rá fico s d e l GUI p ro p o rcio n a d o s
p o r e l AWT. Co n la e xce p ció n d e lo s m e n ú s , t o d a s lo s co m p o n e n t e s GUI s o n
im p le m e n t a d o s co n u n a s u b cla s e d e la cla s e Co m p o n e n t d e l AWT.

N o t a d e I m p le m e n t a c ió n : El a p p le t e s t á im p le m e n t a d o co m o u n b o t ó n q u e t ra e
u n a ve n t a n a q u e m u e s t ra lo s co m p o n e n t e s . La ve n t a n a e s n e ce s a ria p o rq u e e l
p ro g ra m a in clu ye u n m e n ú , y lo s m e n ú s s ó lo s e p u e d e n u t iliza r e n la s ve n t a n a s .
Pa ra lo s cu rio s o s , a q u í e s t á e l có d ig o fu e n t e d e la ve n t a n a q u e m u e s t ra lo s
co m p o n e n t e s . El p ro g ra m a t ie n e u n m é t o d o m a in ( ) p o r lo q u e s e p u e d e e je cu t a r
co m o u n a a p lica ció n . La cla s e Ap p le t Bu t t o n p ro p o rcio n a u n m a rco d e t ra b a jo e n e l
a p p le t p a ra la ve n t a n a . Ap p le t Bu t t o n e s u n a p p le t a lt a m e n t e co n fig u ra b le q u e s e
e xp licó e n la s s ig u ie n t e s p á g in a s : De cid ir lo s Pa rá m e t ro s a S o p o rt a r y Es crib ir e l
Có d ig o p a ra S o p o rt a r Pa rá m e t ro s .

Los controles básicos: botones, checkbox, choices, listas, menús y


campos de texto
La s cla s e s Bu t t o n , Ch e ckb o x, Ch o ice , Lis t , Me n u It e m s , y Te xt Fie ld
p ro p o rcio n a n lo s co n t ro le s b á s ico s . Es t a s s o n la s fo rm a s m á s co m u n e s
e n q u e e l u s u a rio d a in s t ru ccio n e s a l p ro g ra m a Ja va . Cu a n d o u n u s u a rio
a ct iva u n o d e e s t o s co n t ro le s - - p u ls a u n b o t ó n o p re s io n a la t e cla re t u rn
e n u n ca m p o d e t e xt o , p o r e je m p lo - - e n vía u n e ve n t o ( ACTION_ EVENT) .
Un o b je t o q u e co n t ie n e e l co n t ro l p u e d e re a ccio n a r a l e ve n t o
im p le m e n t a n d o e l m é t o d o a c t io n ( ) .

Otras formas de obtener entradas del usuario: Barras de


Desplazamiento y Áreas de Texto.
Cu a n d o lo s co n t ro le s b á s ico s n o s o n a p ro p ia d o s , p u e d e u t iliza r la s cla s e s
S cro llb a r y Te xt Are a p a ra o b t e n e r la e n t ra d a d e l u s u a rio . La cla s e
S cro llb a r s e u t iliza t a n t o p a ra d e s liza d o re s co m o p a ra b a rra s d e
d e s p la za m ie n t o . Pu e d e s ve r lo s d e s liza d o re s e n La An a t o m ía d e u n
Pro g ra m a Ba s a d o e n GUI. Pu e d e s ve r la s b a rra s d e d e s p la za m ie n t o e n
la s lis t a s y á re a s d e t e xt o e n e l a p p le t d e e s t á p á g in a .
La cla s e Te xt Are a s ó lo p ro p o rcio n a u n á re a e n la q u e m o s t ra r o p e rm it ir
e d it a r va ria s lín e a s d e t e xt o . Co m o p u e d e s ve r e n e l a p p le t d e e s t a
p á g in a , la s á re a s d e t e xt o in clu ye n a u t o m á t ica m e n t e b a rra s d e
d e s p la za m ie n t o .
Crear Componentes del Cliente: Lienzos
La cla s e Ca n va s p e rm it e e s crib ir co m p o n e n t e s p e rs o n a liza d o s . Co n la
s u b cla s e d e Ca n va s , s e p u e d e d ib u ja r u n g rá fico d e u s u a rio e n la
p a n t a lla - - e n u n p ro g ra m a d e d ib u jo , u n p ro ce s a d o r d e im á g e n e s o u n
ju e g o , p o r e je m p lo - - e im p le m e n t a r cu a lq u ie r cla s e d e m a n e jo d e
e ve n t o s .

Etiquetas
La cla s e La b e l s ó lo m u e s t ra u n a lín e a d e t e xt o n o e d it a b le p o r e l u s u a rio .

Contenedores: Ventanas y Paneles


El AWT p ro p o rcio n a d o s t ip o s d e co n t e n e d o re s , a m b o s s o n
im p le m e n t a d o s co m o s u b cla s e s d e Co n t a in e r ( q u e e s u n a s u b cla s e d e
Co m p o n e t ) . La s s u b cla s e s d e Win d o ws - - Dia lo g , File Dia lo g , y Fra m e - -
p ro p o rcio n a n ve n t a n a s p a ra co n t e n e r co m p o n e n t e s . La cla s e Fra m e cre a
ve n t a n a s n o rm a le s y co m p le t a m e n t e m a d u ra s , co m o o p o s ició n a la s
cre a d a s p o r la cla s e Dia lo g s , q u e s o n d e p e n d ie n t e s d e l m a rco y p u e d e n
s e r m o d a le s . Lo s Pa n e le s a g ru p a n lo s co m p o n e n t e s d e n t ro d e u n á re a d e
u n a ve n t a n a e xis t e n t e .
El p ro g ra m a d e e je m p lo a l p rin cip io d e e s t a s e cció n u t iliza u n Pa n e l p a ra
a g ru p a r la e t iq u e t a s y e l á re a d e t e xt o , o t ro Pa n e l p a ra a g ru p a rlo co n u n
lie n zo , y u n t e rce r p a n e l p a ra a g ru p a r e l ca m p o d e t e xt o , e l ch e ckb o x y
u n a lis t a d e o p cio n e s d e s p le g a b le . To d o s e s t o s p a n e le s e s t á n a g ru p a d o s
p o r u n o b je t o Fra m e , q u e re p re s e n t a la ve n t a n a e n la q u e e s t o s s e
m u e s t ra n . El Ma rco t a m b ié n co n t ie n e u n m e n ú y u n a lis t a .
Cu a n d o s e le ccio n e la o p ció n "File d ia lo g . . . " e n e l m e n ú , e l p ro g ra m a cre a
u n o b je t o File Dia lo g q u e e s u n cu a d ro d e d iá lo g o q u e p u e d e s e rvir p a ra
Ab rir o Gu a rd a r fich e ro s .
N o t a d e l N a v e g a d o r: Ne t s ca p e Na vig a t o r 2 . 0 n o im p le m e n t a la cla s e
File Dia lo g , ya q u e n o p e rm it e n u n ca le e r o e s crib ir fich e ro s e n e l s is t e m a
d e fich e ro s lo ca l. En ve z d e ve r e l cu a d ro d e d iá lo g o ve rá u n m e n s a je d e
e rro r e n la Co n s o la Ja va .

Sumario
Es t a p á g in a re p re s e n t a u n a vis ió n re lá m p a g o s o b re lo s co m p o n e n t e s d e l
AWT. Ca d a co m p o n e n t e m e n cio n a d o e n e s t a p á g in a s e d e s crib e co n m á s
d e t a lle e n Ut iliza r Co m p o n e n t e s , lo s Blo q u e s d e Co n s t ru cció n d e l GUI.
Oz it o
Otras Clases del AWT
El AWT co n t ie n e a lg o m á s q u e co m p o n e n t e s . Co n t ie n e u n a va rie d a d d e cla s e s
re la cio n a d a s co n e l d ib u jo y e l m a n e jo d e e ve n t o s . Es t a s e cció n e xp lica la s cla s e s
d e l AWT q u e e s t á n e n e l p a q u e t e ja va . a wt . El AWT co n t ie n e o t ro s d o s p a q u e t e s - -
ja va . a wt . im a g e y ja va . a wt . p e e r - - q u e la m a yo ría d e lo s p ro g ra m a s n o t e n d rá n q u e
u t iliza r.
Co m o h a s a p re n d id o e n la p á g in a a n t e rio r, lo s co m p o n e n t e s s e a g ru p a n d e n t ro d e
co n t e n e d o re s , Lo q u e la p á g in a a n t e rio r n o t e co n t ó e s q u e ca d a co n t e n e d o r u t iliza
u n co n t ro la d o r d e d is p o s ició n p a ra co n t ro la r e l t a m a ñ o y p o s ició n d e lo s
co m p o n e n t e s s o b re la p a n t a lla . El p a q u e t e ja va . a wt s u m in is t ra va ria s cla s e s d e
co n t ro la d o re s d e d is p o s ició n . Po d rá s a p re n d e r m á s s o b re lo s co n t ro la d o re s d e
d is p o s ició n e n la le cció n Dis t rib u ye n d o lo s Co m p o n e n t e s d e n t ro d e u n Co n t e n e d o r.

El p a q u e t e ja va . a wt s u m in is t ra va ria s cla s e s p a ra re p re s e n t a r t a m a ñ o s y fo rm a s .
Un e je m p lo e s la cla s e Dim e n s io n , q u e e s p e cifica e l t a m a ñ o d e u n á re a
re ct á n g u la r. Ot ra cla s e e s In s e t q u e n o rm a lm e n t e s e u t iliza p a ra e s p e cifica r cu a n t o
e s p a cio d e b e q u e d a r e n t re e l b o rd e d e u n co n t e n e d o r y e l á re a d e t ra b a jo d e l
p ro p io co n t e n e d o r. La s cla s e s d e fo rm a s in clu ye n Po in t , Re ct a n g le y Po lyg o n .
La cla s e Co lo r e s ú t il p a ra la re p re s e n t a ció n y m a n ip u la ció n d e co lo re s . De fin e
co n s t a n t e s p a ra lo s co lo re s m á s u t iliza d o s - - p o r e je m p lo , Co lo r. Bla c k .
Ge n e ra lm e n t e u t iliza co lo re s e n fo rm a t o RGB ( ro jo - ve rd e - a zu l) p e ro t a m b ié n
e n t ie n d e e l fo rm a t o HS B ( h u e - s a t u ra t io n - b rig h t n e s s ) .
La cla s e Im a g e p ro p o rcio n a u n a fo rm a d e re p re s e n t a r u n a im a g e n . Lo s a p p le t s
p u e d e n o b t e n e r o b je t o s Im a g e p a ra fo rm a t o s GIF y JEPG u t iliza n d o e l m é t o d o
g e t I m a g e ( ) d e la cla s e Ap p le t . La s a p lica cio n e s p u e d e n o b t e n e r im á g e n e s
u t iliza n d o o t ra cla s e : To o lkit . Es t a cla s e p ro p o rcio n a in in t e rfa ce in d e p e n d ie n t e d e
la p la t a fo rm a p a ra la im p le m e n t a ció n d e l AWT d e p e n d ie n t e d e la p la t a fo rm a .
Au n q u e n o s u e n e m u y e xp re s ivo , la m a yo ría d e lo s p ro g ra m a s n o t ra t a n
d ire ct a m e n t e co n o b je t o s To o lkit , e xce p t o p a ra o b t e n e r im á g e n e s . La s im á g e n e s s e
ca rg a n a s ín cro n a m e n t e - - s e p u e d e t e n e r u n o b je t o Im a g e vá lid o in clu s o s i lo s
d a t o s d e la im a g e n n o s e h a n ca rg a d o t o d a vía ( o in clu s o n o e xis t e n ) . Ut iliza n d o u n
o b je t o Me d ia Tra cke r, s e p u e d e s e g u ir la p is t a a l e s t a d o d e ca rg a d e u n a im a g e n .
Me d ia Tra cke r re a lm e n t e s ó lo t ra b a ja co n im á g e n e s , p e ro e ve n t u a lm e n t e p o d re m o s
h a ce r q u e t ra b a je co n o t ro s t ip o s d e m e d io s , co m o s o n id o s . Ut iliza r Im á g e n e s
cu e n t a t o d o s o b re e l t ra b a jo co n im á g e n e s .
Pa ra co n t ro la r e l a s p e ct o d e l t e xt o e n lo s p ro g ra m a s d e d ib u jo , s e p u e d e n u t iliza r
o b je t o s Fo n t y Fo n t Me t rics . La cla s e Fo n t p e rm it e o b t e n e r in fo rm a ció n b á s ica s o b re
la fu e n t e y cre a r o b je t o s p a ra re p re s e n t a r va ria s fu e n t e s . Co n u n o b je t o
Fo n t Me t rics , s e p u e d e o b t e n e r in fo rm a ció n d e t a lla d a s o b re la s ca ra ct e rís t ica s d e
t a m a ñ o d e u n a fu e n t e d e t e rm in a d a . S e p u e d e s e le ccio n a r la fu e n t e u t iliza d a p o r u n
co m p o n e n t e u t iliza n d o lo s m é t o d o s s e t Fo n t ( ) d e la s cla s e s Co m p o n e n t y
Gra p h ics . Tra b a ja r co n Te xt o cu e n t a t o d o s o b re la u t iliza ció n d e fu e n t e s .

Fin a lm e n t e , la s cla s e s Gra p h ics y Eve n t s o n cru cia le s p a ra e l d ib u jo y e l m a n e jo d e


e ve n t o s d e l s is t e m a e n e l a WT. Un o b je t o Gra p h ics re p re s e n t a u n co n t e xt o d e
d ib u jo - - s in u n o b je t o Gra p h ics , n in g ú n p ro g ra m a p u e d e d ib u ja r e n la p a n t a lla . Un
o b je t o Eve n t re p re s e n t a u n a a cció n d e l u s u a rio , co m o u n a p u ls a ció n d e l ra t ó n .
Ap re n d e rá s m á s s o b re lo s o b je t o s Gra p h ics y Eve n t m á s a d e la n t e e n e s t a s e cció n
d e in t ro d u cció n .

Oz it o
La Anatomía de un Programa Basado en el GUI
Es t a p á g in a y la q u e le s ig u e s o n p a rt e d e u n s e n cillo p ro g ra m a Ja va q u e t ie n e u n
UI g rá fico , y q u e e xp lica n :
● La cla s e s u t iliza d a s p o r e l p ro g ra m a .

● El á rb o l d e h e re n cia d e lo s Co m p o n e n t e s d e l Pro g ra m a

● Có m o s e d ib u ja n lo s p ro p io s Co m p o n e n t e s

● Có m o s e p ro p a g a n lo s e ve n t o s a t ra vé s d e l á rb o l d e h e re n cia .

El p ro g ra m a co n vie rt e m e d id a s e n t re e l s is t e m a m é t rico y e l s is t e m a a m e rica n o .


Pa ra lo s cu rio s o s , a q u í e s t á e l có d ig o fu e n t e . N o e s p e ra m o s q u e e n t ie n d a s
co m p le t a m e n t e e l có d ig o fu e n t e s in le e r e l re s t o d e e s t a le cció n y la s p á g in a s m á s
re le va n t e s e n la s le ccio n e s Ut iliza r Co m p o n e n t e s , lo s Blo q u e s d e Co n s t ru cció n d e l
GUI y Dis t rib u ir Co m p o n e n t e s d e n t ro d e u n Co n t e n e d o r.
Aq u í t ie n e s e l p ro g ra m a , e je cu t á n d o s e co m o u n a p p le t .

Las Clases del Programa de Ejemplo


El p ro g ra m a d e e je m p lo d e fin e t re s cla s e s y cre a e je m p la re s d e va ria s
cla s e s p ro p o rcio n a d a s p o r e l AWT. De fin e u n a s u b cla s e d e Ap p le t p a ra
p o d e r e je cu t a rs e co m o u n a p p le t . Cre a Co m p o n e n t e s p a ra p ro p o rcio n a r
u n co n t ro l b á s ico p a ra q u e e l u s u a rio p u e d a in t e ra ct u a r co n é l. Ut iliza n d o
Co n t a in e s y La yo u t Ma n a g e r a g ru p a lo s Co m p o n e n t e s .

El árbol de herencia de los componentes


Lo s co m p o n e n t e s d e l p ro g ra m a e s t á n o rd e n a d o s e n fo rm a d e á rb o l, co n
co n t e n e d o re s q u e d e fin e n la e s t ru ct u ra d e l á rb o l.

Dibujo
Lo s co m p o n e n t e s s e d ib u ja n d e s d e la p a rt e s u p e rio r d e l á rb o l - - la
ve n t a n a d e l p ro g ra m a - - h a s t a lo s co m p o n e n t e s s in co n t e n e d o r.

Manejo de Eventos
La s a ccio n e s d e l u s u a rio re s u lt a n e n e ve n t o s , q u e s o n p a s a d o s a t ra vé s
d e l á rb o l d e co m p o n e n t e s h a s t a q u e u n o b je t o re s p o n d a a l e ve n t o .

Oz it o
Las Clases del Programa de Ejemplo
El p ro g ra m a d e e je m p lo d e fin e d o s cla s e s q u e d e s cie n d e n d e la s cla s e s d e l AWT.
Ta m b ié n d e fin e u n a cla s e p a ra a lm a ce n a r d a t o s . S in e m b a rg o , la m a yo ría d e lo s
o b je t o s d e l p ro g ra m a s o n e je m p la re s d e la s cla s e s d e l AWT.
Es t a p á g in a re cu e n t a t o d o s lo s o b je t o s q u e s o n cre a d o s e n e l p ro g ra m a . No t e
p re o cu p e s - - n o e s p e ra m o s q u e lo e n t ie n d a s t o d o a ú n . S ó lo q u e re m o s e xp lica rt e la
cla s e d e o b je t o s q u e u n p ro g ra m a GUI p o d ría u t iliza r.

Las Clases definidas en el programa de ejemplo


El p ro g ra m a d e fin e d o s s u b cla s e s d e Pa n e l; Co n ve rt e r y Co n ve rs io n Pa n e l
y u n a cla s e s e n cilla lla m a d a Un it .
La cla s e Co n ve rt e r e s e l co ra zó n d e l p ro g ra m a d e e je m p lo . Co n t ie n e e l
m é t o d o m a in ( ) d e l p ro g ra m a ( q u e e s lla m a d o s i e l p ro g ra m a s e u t iliza
co m o u n a a p lica ció n ) , y a s í co m o e l có d ig o d e in icia liza ció n y d e
a rra n q u e , q u e e s lla m a d o p o r e l m é t o d o m a in ( ) o p o r la a p lica ció n q u e
ca rg a e l p ro g ra m a co m o u n a p p le t . La cla s e Co n ve rt e r re a lm e n t e
d e s cie n d e d e la cla s e Ap p le t ( q u e a s u ve z d e s cie n d e d e la cla s e Pa n e l)
e n lu g a r d e d e s ce n d e r d ire ct a m e n t e d e la cla s e Pa n e l. Es t o e s n e ce s a rio
p o rq u e t o d o s lo s a p p le t s d e b e n co n t e n e r u n a s u b cla s e d e Ap p le t . S in
e m b a rg o , co m o e l p ro g ra m a d e e je m p lo t a m b ié n s e p u e d e e je cu t a r co m o
u n a a p lica ció n , la cla s e Co n ve rt e r n o d e b e u t iliza r n in g u n a d e la s
fu n cio n a lid a d e s p ro p o rcio n a d a s p o r la cla s e Ap p le t . En o t ra s p a la b ra s , la
cla s e Co n ve rt e r d e b e im p le m e n t a rs e co m o s i d e s ce n d ie ra d e la cla s e
Pa n e l.
La cla s e Co n ve rs io n Pa n e l p ro p o rcio n a u n a fo rm a d e a g ru p a r t o d o s lo s
co n t ro le s q u e d e fin e n u n co n ju n t o p a rt icu la r d e d is t a n cia s . El p ro g ra m a
d e e je m p lo cre a d o s o b je t o s Co n ve rs io n Pa n e l, u n o p a ra la s m e d id a s e n
e l s is t e m a m é t rico y o t ro p a ra la s m e d id a s e n e l s is t e m a a m e rica n o .
La cla s e Un it p ro p o rcio n a o b je t o s q u e a g ru p a n u n a d e s crip ció n ( co m o
"Ce n t im e t ro s ") co n u n m u lt ip lica d o r q u e in d ica e l n ú m e ro d e u n id a d e s
p o r m e t ro ( 0 , 0 1 p o r e je m p lo ) .

Objetos del AWT en el Programa de Ejemplo


El p ro g ra m a d e e je m p lo u t iliza va rio s La yo u t Ma n a g e rs , Co n t a in e rs , y
Co m p o n e n t s p ro p o rcio n a d o s p o r e l p a q u e t e AWT. Ta m b ié n cre a d o s
o b je t o s In s e t s y d o s o b je t o s Grid Ba g Co n s t ra in t s .
El p ro g ra m a d e e je m p lo cre a t re s o b je t o s q u e co n fo rm a n e l in t e rfa ce
La yo u t m a n a g e r: u n Grid La yo u t y d o s Grid Ba g La yo u t . El Grid La yo u t
co n t ro la la d is p o s ició n d e lo s co m p o n e n t e s e n e l e je m p la r d e Co n ve rt e r.
Ca d a Co n ve rs io n Pa n e l u t iliza u n o b je t o Grid Ba g La yo u t p a ra m a n e ja r s u s
co m p o n e n t e s , y u n o b je t o Grid Ba g Co n s t ra in t s p a ra e s p e cifica r co m o
co lo ca r ca d a u n o d e lo s co m p o n e n t e s .
Ju n t o co n lo s o b je t o s Co n ve rt e r y Co n ve rs io n Pa n e l, e l p ro g ra m a cre a u n
co n t e n e d o r m á s . Es p p e cífica m e n t e , s i e l p ro g ra m a s e e je cu t a co m o u n a
a p lica ció n ( e n ve z d e co m o u n a p p le t ) , cre a u n o b je t o Fra m e ( u n a
ve n t a n a in d e p e n d ie n t e ) .
To d o s lo s co m p o n e n t e s q u e n o s o n co n t e n e d o re s e n e l p ro g ra m a
e je m p lo s o n cre a d o s p o r Co n ve rs io n Pa n e l. Ca d a Co n ve rs io n Pa n e l
co n t ie n e u n e je m p la r d e la s cla s e s La b e l, Ch o ice , Te xt Fie ld , y S cro llb a r
d e l AWT.
Ta n t o la cla s e Co n ve rt e r co m o la Co n ve rs io n Pa n e l cre a n e je m p la re s d e
In s e t s q u e e s p e cifica n e l e s p a cio q u e d e b e a p a re ce r e n t re s u s
re p re s e n t a cio n e s e n la p a n t a lla .

Oz it o
El Árbol de Componentes
El Pro g ra m a d e Eje m p lo t ie n e va rio s n ive le s d e h e re n cia e n e l á rb o l d e co m p o n n e t e s . El p a d re d e ca d a
n ive l e s u n co n t e n e d o r ( q u e d e s cie n d e d e Co m p o n e n t ) . Ab a jo t ie n e s u n a fig u ra d e la h e re n cia . >
un Frame
|
...
|
un Converter
|
----------------------------------
| |
un ConversionPanel (metricPanel) un ConversionPanel (usaPanel)
| |
------------------- -------------------
| | | | | |
un Label | un Choice un Label | un Choice
| |
-------------- ---------------
| | | |
un TextField un Scrollbar un TextField un Scrollbar

Explicación
En la p a rt e s u p e rio r d e la h e re n cia e s t a la ve n t a n a ( e je m p la r d e Fra m e ) q u e m u e s t ra e l
p ro g ra m a . Cu a n d o e l p ro g ra m a d e e je m p lo s e e je cu t a co m o u n a a p lica ció n , e l Ma rco s e cre a
d e n t ro d e l m é t o d o m a in ( ) . Cu a n d o e l e je m p lo s e e je cu t a co m o u n a p p le t d e n t ro d e u n
n a ve g a d o r, e l Ma rco e s la ve n t a n a d e l n a ve g a d o r.
De b a jo d e l Fra m e e s t a u n o b je t o Co n ve rt e r, q u e d e s cie n d e d e la cla s e Ap p le t y q u e e s u n
Co n t e n e d o r ( e s p e cifica m e n t e , u n Pa n e l) . De p e n d ie n d o e l vis u a liza d o r e n q u e s e e s t é
m o s t ra n d o e l a p p le t , p o d ría h a b e r u n o o m á s co n t e n e d o re s e n t re e l o b je t o Co n ve rt e r y e l
Fra m e d e la p a rt e s u p e rio r d e l á rb o l d e h e re n cia .
Dire ct a m e n t e d e b a jo d e l o b je t o Co n ve rt e r h a y d o s Co n ve rs io n Pa n e l. El s ig u ie n t e có d ig o lo s
p o n e d e b a jo d e l Co n ve rt e r, u t iliza n d o e l m é t o d o a d d ( ) . La cla s e Co n ve rt e r h e re d a e l m é t o d o
a d d ( ) d e la cla s e Co n t a in e r ( Co n ve rt e r d e s cie n d e d e la cla s e Ap p le t , q u e a s u ve z d e s cie n d e d e
la cla s e Pa n e l, q u e a s u ve z d e s cie n d e d e la cla s e Co n t a in e r) .
public class Converter extends Applet {
. . .
public void init() {
...//Crea metricPanel y usaPanel, que son dos ConversionPanels.
add(metricPanel);
add(usaPanel);
. . .
}
Ca d a Co n ve rs io n Pa n e l t ie n e cu a t ro h ijo s : u n La b e l, u n Te xt Fie ld , u n S cro llb a r, y u n Ch o ice .
Aq u í t ie n e s e l có d ig o p a ra a ñ a d ir e s t o s n iñ o s :
class ConversionPanel extends Panel {
. . .
ConversionPanel(Converter myController, String myTitle, Unit myUnits[]) {
. . .
//Añade la etiqueta. Muestra este título de panel, centado
Label label = new Label(myTitle, Label.CENTER);
...//Selecciona GridBagConstraints para este componente Component.
gridbag.setConstraints(label, c);
add(label);
//Añade el campo de texto. Inicialmente mustra "0" y necesita ser de al menos
//10 caracteres de ancho.
textField = new TextField("0", 10);
...//Selecciona GridBagConstraints para este Component.
gridbag.setConstraints(textField, c);
add(textField);

//Añade la lista desplegable (Choice).


unitChooser = new Choice();
...//Genera los items de la lista.
...//Selecciona GridBagConstraints para este Component.
gridbag.setConstraints(unitChooser, c);
add(unitChooser);

//Añade la barra deslizadora. Es horizontal, su valor inicial es 0.


//un click incrementa el valor 100 pixels, y tiene especificados los valores
//mínimo y máximo especificados por las variables del ejemplar min y max.
slider = new Scrollbar(Scrollbar.HORIZONTAL, 0, 100, min, max);
...//Selecciona GridBagConstraints para este Component.
gridbag.setConstraints(slider, c);
add(slider);
}
Grid Ba g Co n s t ra in t s e s u n o b je t o q u e le d ice a Grid Ba g La yo u t ( El co n t ro la d o r d e d is p o s ició n
p a ra ca d a Co n ve rs io n Pa n e l) co m o co lo ca r u n co m p o n e n t e p a rt icu la r. Grid Ba g La yo u t , ju n t o co n
lo s o t ro s co n t ro la d o re s d e d is p o s ició n d e l AWT s e e xp lica n e n Dis t rib u ir Co m p o n e n t e s d e n t ro d e
u n Co n t e n e d o r.

Sumario
La h e re n cia d e Co m p o n e n t e s d e l p ro g ra m a d e e je m p lo co n t ie n e o ch o co m p o n e n t e s q u e n o s o n
co n t e n e d o re s - - co m p o n e n t e s q u e re p re s e n t a n e l UI g rá fico d e l p ro g ra m a . Es t o s s o n la s
e t iq u e t a s , lo s ca m p o s d e t e xt o , la s e le ccio n e s y la s b a rra s d e d e s p la za m ie n t o q u e m u e s t ra e l
p ro g ra m a . Po d ría h a b e r co m p o n e n t e s a d icio n a le s co m o co n t ro le s d e ve n t a n a b a jo e l m a rco .
Es t e á rb o l d e co m p o n e n t e s t ie n e a l m e n o s cu a t ro co n t e n e d o re s - - u n Fra m e ( ve n t a n a ) , u n
Co n ve rt e r ( u n a cla s e clie n t e d e Pa n e l) , y d o s Co n ve rs io n Pa n e ls ( o t ro s d o s Pa n e le s d e l Clie n t e ) .
Ob s e rva q u e s i a ñ a d im o s u n a ve n t a n a - - p o r e je m p lo , u n Fra m e q u e co n t ie n e u n e je m p la r d e
Co n ve rt e r q u e m a n e je la co n ve rs ió n d e d is t a n cia s - - la n u e va ve n t a n a t e n d rá s u p ro p io á rb o l
d e h e re n cia , t o t a lm e n t e in d e p e n d ie n t e d e l á rb o l d e h e re n cia q u e p re s e n t a e s t a le cció n .

Oz it o
Dibujo de Componentes
Cu a n d o u n p ro g ra m a Ja va co n u n GUI n e ce s it a d ib u ja rs e a s í m is m o - - s i e s la
p rim e ra ve z, o p o rq u e s e h a vu e lt o vis ib le o p o rq u e n e ce s it a ca m b ia r s u a p a rie n cia
p a ra re fle ja r a lg o q u e h a s u ce d id o d e n t ro d e l p ro g ra m a - - e m p ie za co n e l
co m p o n e n t e m á s a lt o q u e n e ce s it a s e r re d ib u ja d o ( p o r e je m p lo , e l co m p o n e n t e
s u p e rio r e n e l á rb o l d e la h e re n cia ) y va b a ja n d o h a cia lo s co m p o n e n t e s in fe rio re s .
Es t o e s t á o rq u e s t ra d o p o r e l s is t e m a d e d ib u jo d e l AWT.
Aq u í t ie n e s , co m o re co rd a t o rio , e l á rb o l d e h e re n cia d e l p ro g ra m a co n ve rs o r:
un Frame
|
...
|
un Converter
|
----------------------------------
| |
un ConversionPanel (metricPanel) un ConversionPanel (usaPanel)
| |
------------------- -------------------
| | | | | |
un Label | un Choice un Label | un Choice
| |
-------------- ---------------
| | | |
un TextField un Scrollbar un TextField un Scrollbar
Aq u í t ie n e lo q u e s u ce d e cu a n d o la a p lica ció n Co n ve rt e r s e d ib u ja a s í m is m a :
1. Prim e ro s e d ib u ja e l Fra m e ( m a rco ) .
2. Lu e g o s e d ib u ja e l o b je t o Co n ve rt e r, d ib u ja n d o u n a ca ja a lre d e d o r d e s u á re a .
3. De s p u é s s e d ib u ja u n d e lo s d o s Co n ve rs io n Pa n e ls , d ib u ja n d o u n a ca ja
a lre d e d o r d e s u á re a .
N o t a : No s e p u e d e co n t a r co n e l o rd e n e n q u e s e va n a d ib u ja r d o s
co m p o n e n t e s co n e l m is m o n ive l. Po r e je m p lo , n o s e p u e d e co n t a r co n q u e e l
p a n e l m e t rico s e d ib u ja rá a n t e s q u e e l a m e rica n o . S im ila rm e n t e , t a m p o co s e
p u e d e d e p e n d e r d e l o rd e n d e d ib u jo d e d o s co m p o n e n t e s d e d ife re n t e s
n ive le s s i e l co m p o n e n t e in fe rio r n o e s t á co n t e n d id o e n e l co m p o n e n t e
s u p e rio r.
4 . Po r ú lt im o d ib u ja n lo s co n t e n id o s d e lo s Co n ve rs io n Pa n e l - - La b e l, Te xt Fie ld ,
S cro llb a r, y Ch o ice .
De e s t a fo rm a , ca d a co m p o n e n t e s e d ib u ja a s í m is m o a n t e s q u e lo s co m p o n e n t e s
q u e co n t ie n e . Es t o a s e g u ra q u e e l fo n d o d e u n Pa n e l, p o r e je m p lo , s ó lo s e a vis ib le
cu a n d o n o e s t á cu b ie rt o p o r n in g u n o d e s u s co m p o n e n t e s .
Cómo ocurre la petición de redibujado
Lo s p ro g ra m a s s ó lo p u e d e n d ib u ja rs e cu a n d o e l AWT le s d ice q u e lo
h a g a n . La ra zó n e s q u e ca d a o cu rre n cia d e q u e u n d ib u jo s e d ib u je a s í
m is m o d e b e e je cu t a rs e s in in t e rru p ció n . De o t ra fo rm a p o d ría n
p ro d u cirs e re s u lt a d o s im p re d e cib le s , co m o q u e u n b o t ó n s e d ib u ja rá s ó lo
p o r la m it a d , cu a n d o fu e ra in t e rru m p id o p o r u n a lg u n a a n im a ció n le n t a .
El AWT o rd e n a la s p e t icio n e s d e re d ib u ja d o m e d ia n t e s u e je cu ció n e n u n
t h re a d . Un co m p o n e n t e p u e d e u t iliza r e l m é t o d o re p a in t ( ) p a ra p e d ir
q u e s e a p ro g ra m a d o p a ra re d ib u ja rs e .
El AWT p id e q u e u n co m p o n e n t e s e re d ib u je lla m a n d o a l m é t o d o
u p d a t e ( ) d e l co m p o n e n t e . La im p le m e n t a ció n p o r d e fe ct o d e e s t e
m é t o d o s ó lo lim p ia e l fo n d o d e l co m p o n e n t e ( d ib u ja n d o u n re ct á n g u lo
s o b re e l á re a d e l co m p o n e n t e co n e l co lo r d e l fo n d o d e l p ro p io
co m p o n e n t e ) y lu e g o lla m a a l m é t o d o p a in t ( ) d e l co m p o n e n t e . La
im p le m e n t a ció n p o r d e fe ct o d e l m é t o d o p a in t ( ) n o h a ce n a d a .

El Objeto Graphics
El ú n ico a rg u m e n t o p a ra lo s m é t o d o s p a in t ( ) y u p d a t e ( ) e s u n o b je t o
Gra p h ics q u e re p re s e n t a e l co n t e xt o e n e l q u e e l co m p o n e n t e p u e d e
re a liza r s u d ib u jo . La cla s e Gra p h ics p ro p o rcio n a m é t o d o s p a ra lo
s ig u ie n t e :
● Dib u ja r y re lle n a r re ct á n g u lo s , a rco s , lín e a s , ó va lo s , p o líg o n o s ,
t e xt o e im á g e n e s .
● Ob t e n e r o s e le ccio n a r e l co lo r a ct u a l, la fu e n t e o e l á re a d e t ra b a jo .

● S e le ccio n a r e l m o d o d e d ib u jo .

Cómo dibujar
La fo rm a m á s s e n cilla d e q u e u n co m p o n e n t e p u e d a d ib u ja rs e e s p o n e r
có d ig o d e d ib u jo e n s u m é t o d o p a in t ( ) . Es t o s ig n ifica q u e cu a n d o e l
AWT h a ce u n a p e t ició n d e d ib u ja d o ( m e d ia n t e la lla m a d a a l m é t o d o
u p d a t e ( ) d e l co m p o n e n t e , q u e e s t á im p le m e n t a d o co m o s e d e s crib ió
a rrib a ) , s e lim p ia t o d o e l á re a d e l co m p o n e n t e y lu e g o s e lla m a a l
m é t o d o p a in t ( ) d e l m é t o d o . Pa ra p ro g ra m a s q u e n o s e re d ib u ja n a s í
m is m o s d e fo rm a fre cu e n t e , e l re n d im ie n t o d e e s t e e s q u e m a e s t á b ie n .
I m p o rt a n t e : Lo s m é t o d o s p a in t ( ) y u p d a t e ( ) d e b e n e je cu t a rs e m u y
rá p id a m e n t e ! De o t ra fo rm a , d e s t ru ira n e l re n d im ie n t o p e rcib id o d e l
p ro g ra m a . S i s e n e ce s it a re a liza r a lg u n a o p e ra ció n le n t a co m o re s u lt a d o
d e u n a p e t ició n d e d ib u ja d o , h á zlo a rra n ca n d o o t ro t h re a d ( o e n via n d o
u n a p e t ició n a o t ro t h re a d ) p a ra re a liza r la o p e ra ció n . Pa ra o b t e n e r
a yu d a s o b re la u t iliza ció n d e t h re a d s p u e d e s ve r Th re a d s d e Co n t ro l.
Ab a jo h a y u n e je m p lo d e im p le m e n t a ció n d e l m é t o d o p a in t ( ) . La s cla s e s
Co n ve rt e r y Co n ve rs io n Pa n e l d ib u ja n u n a ca ja a lre d e d o r d e s u á re a
u t iliza n d o e s t e có d ig o . Am b a s cla s e s t a m b ié n im p le m e n t a n u n m é t o d o
in s e t s ( ) q u e e s p e cifica e l á re a lib re a lre d e d o r d e l co n t e n id o d e lo s
p a n e le s . S i n o t u vie ra n e s t e m é t o d o , e l m é t o d o p a in t ( ) s o la p a ría lo s
lím it e s e xt e rn o s d e l p a n e l.
public void paint(Graphics g) {
Dimension d = size();
g.drawRect(0,0, d.width - 1, d.height - 1);
}
Lo s p ro g ra m a s q u e s e re d ib u ja n m u y fre cu e n t e m e n t e p u e d e n u t iliza r d o s
t é cn ica s p a ra a u m e n t a r s u re n d im ie n t o : im p le m e n t a r lo s d o s m é t o d o
u p d a t e ( ) y p a in t ( ) , y u t iliza r u n d o b le b u ffe r. Es t a s t é cn ca s s e e xp lica n
e n Elim in a r e l Pa rp a d e o .

Pa ra m á s in fo rm a ció n s o b re có m o d ib u ja r, p u e d e s ve r la le cció n Tra b a ja r


co n Grá fico s .

Oz it o
Manejo de Eventos
Cu a n d o e l u s u a rio a ct ú a s o b re u n co m p o n e n t e - - p u ls a n d o e l ra t ó n o la t e cla
Re t u rn , p o r e je m p lo - - s e cre a u n o b je t o Eve n t . El s is t e m a m a n e ja d o r d e e ve n t o s
d e l AWT p a s a e l Eve n t o a t ra vé s d e l á rb o l d e co m p o n e n t e s , d a n d o a ca d a
co m p o n e n t e u n a o p o rt u n id a d p a ra re a ccio n a r a n t e e l e ve n t o a n t e s d e q u e e l có d ig o
d e p e n d ie n t e d e la p la t a fo rm a q u e im p le m e n t a n t o d o s lo s co m p o n e n t e s lo p ro ce s e .
Ca d a m a n e ja d o r d e e ve n t o s d e u n co m p o n e n t e p u e d e re a ccio n a r a n t e u n e ve n t o
d e a lg u n a d e e s t a s fo rm a s :
● Ig n o ra n d o e l e ve n t o y p e rm it ie n d o q u e p a s e h a cia a rrib a e n e l á rb o l d e
co m p o n e n t e s . Es t o e s lo q u e h a ce la im p le m e n t a ció n p o r d e fe ct o d e la cla s e
Co m p o n e n t . Po r e je m p lo , co m o la cla s e Te xt Fie ld y s u s u p e rcla s e
Te xt Co m p o n e n t n o im p le m e n t a n m a n e ja d o re s d e e ve n t o s , lo s Ca m p o s d e
t e xt o o b t ie n e n la im p le m e n t a ció n p o r d e fe ct o d e la cla s e Co m p o n e n t . As í
cu a n d o u n Te xt Fie ld re cib e u n e ve n t o , lo ig n o ra y p e rm it e q u e s u co n t e n e d o r
lo m a n e je .
● Me d ia n t e la m o d ifica ció n d e l e je m p la r d e Eve n t a n t e s d e d e ja rlo s u b ir p o r e l
á rb o l d e co m p o n e n t e s . Po r e je m p lo , u n a s u b lca s e d e Te xt Fie ld q u e m u e s t ra
t o d a s la s le t ra s e n m a yú s cu la s p o d ría re a ccio n a r a n t e la p u ls a icó n d e u n a
le t ra m in ú s cu la ca m b ia n d o e l Eve n t p a ra q u e co n t u vie ra la ve rs ió n m a yú s cu la
d e la le t ra .
● Re a cio n a n d o d e a lg u n a o t ra fo rm a a n t e e l e ve n t o . Po r e je m p lo , u n a s u b lca s e
d e Te xt Fie ld ( o u n co n t e n e d o r d e Te xt Fie ld ) p o d ría n re a ccio n a r a n t e la
p u ls a ció n d e la t e cla Re t u rn lla m a n d o a u n m é t o d o q u e p ro ce s e e l co n t e n id o
d e l ca m p o .
● In t e rce p t a n d o e l e ve n t o , e vit a n d o u n p ro ce s a m ie n t o p o s t e rio r. Po r e je m p lo ,
u n ca rá ct e r n o vá lid o s e h a in t ro d u cid o e n u n ca m p o d e t e xt o , u n m a n e ja d o r
d e e ve n t o s p o d ría p a ra r e l e ve n t o re s u lt a n t e y e vit a r s u p ro p a g a ció n . Co m o
re s u lt a d o , la im p le m e n t a ció n d e p e n d ie n t e d e la p la t a fo rm a d e l ca m p o d e
t e xt o n u n ca ve ría e l e ve n t o .
De s d e e l p u n t o d e vis t a d e u n Co m p o n e n t e , e l s is t e m a d e m a n e jo d e e ve n t o s d e l
AWT e s co m o u n s is t e m a d e filt ra d o d e e ve n t o s . El có d ig o d e p e n d ie n t e d e la
p la t a fo rm a g e n e ra u n e ve n t o , p e ro lo s Co m p o n e n t e s t ie n e n u n a o p o rt u n id a d p a ra
m o d ifica r, re a ccio n a r o in t e rce p t a r e l e ve n t o a n t e s d e q u e e l có d ig o d e p e n d ie n t e d e
la p la t a fo rm a lo s p ro ce s e p o r co m p le t o .
N o t a : En la ve rs ió n a ct u a l, lo s e ve n t o s d e l ra t ó n s e e n vía n a lo s Co m p o n e n t e s
d e s p u é s d e q u e lo s h a ya p ro ce s a d o e l có d ig o d e p e n d ie n t e d e la p la t a fo rm a . Po r
e s o a u n q u e lo s Co m p o n e n t e s p u e d e n in t e rce p t a r t o d o s lo s e ve n t o s d e l t e cla d o ,
a ct u a lm e n t e n o p u e d e n in t e rce p t a r lo s e ve n t o s d e l ra t ó n .
Au n q u e e l AWT d e fin e u n a a m p lia va rie d a d d e t ip o s d e e ve n t o s , e l AWT n o ve t o d o
lo q u e o cu rre . De e s t e m o d o n o t o d a s la s a ccio n e s d e l u s u a rio s e co n vie rt e n e n
e ve n t o s . El AWT s ó lo p u e d e ve r a q u e llo s e ve n t o s q u e le d e ja ve r e l có d ig o
d e p e n d ie n t e d e la p la t a fo rm a . Po r e je m p lo , lo s ca m p o s d e t e xt o Mo t if n o e n vía n lo s
m o vim ie n t o s d e l ra t ó n a l AWT. Po r e s t a ra zó n , la s s u b cla s e s d e Te xt Fie ld y lo s
co n t e n e d o re s n o p u e d e n co n t a r co n o b t e n e r lo s e ve n t o s d e m o vim ie n t o d e l ra t ó n
- - e n S o la ris , a l m e n o s , n o h a y u n a fo rm a s e n cilla d e co n o ce r q u e e s e e ve n t o s e h a
p ro d u cid o , ya q u e n o re cib e n in g ú n e ve n t o cu a n d o s e m u e ve e l ra t ó n . S i s e q u ie re
a cce d e r a u n a m p lio ra n g o d e t ip o s d e e ve n t o s s e n e ce s it a rá im p le m e n t a r u n a
s u b cla s e d e Ca n va s , ya q u e la im p le m e n t a ció n d e p e n d ie n t e d e la p la t a fo rm a d e la
cla s e Ca n va s re e n via t o d o s lo s e ve n t o s .

El Objeto Event
Ca d a e ve n t o re s u lt a e n la cre a cció n d e u n o b je t o Eve n t . Un o b je t o Eve n t
in clu ye la s ig u ie n t e in fo rm a ció n :
● El t ip o d e l e ve n t o - - p o r e je m p lo , u n a p u ls a ció n d e t e cla o u n click
d e l ra t ó n , o u n e ve n t o m á s a b s t ra ct o co m o "a cció n " o ico n ifica ció n
d e u n a ve n t a n a .
● El o b je t o q u e fu e la "fu e n t e " d e l e ve n t o - - p o r e je m p lo , e l o b je t o
Bu t t o n co rre s p o n d ie n t e a l b o t ó n d e la p a n t a lla q u e p u ls ó e l u s u a rio ,
o e l o b je t o Te xt Fie ld e n e l q u e e l u s u a rio a ca b a d e t e cle a r a lg o .
● Un ca m p o in d ica n d o e l m o m e n t o e n q u e o cu rrió e l e ve n t o .

● La p o s ició n ( x, y) d o n d e o cu rrió e l e ve n t o . Es t a p o s ició n e s re la t iva


a l o rig e n d e l Co m p o n e n t e a cu yo m a n e ja d o r d e e ve n t o s s e p a s ó
e s t e e ve n t o .
● La t e cla q u e fu e p u ls a d a ( p a ra e ve n t o s d e t e cla d o ) .

● Un a rg u m e n t o a rb it ra rio ( co m o u n a ca d e n a m o s t ra d a e n e l
Co m p o n e n t e ) a s o cia d a co n e l e ve n t o .
● El e s t a d o d e la s t e cla s m o d ifica d o ra s , co m o S h ift o Co n t ro l, cu a n d o
o cu rrió e l e ve n t o .

Cómo implementar un Manejador de Eventos


La cla s e Co m p o n e n t d e fin e m u ch o s m é t o d o s m a n e ja d o re s d e e ve n t o s , y
s e p u e d e s o b re e s crib ir a lg u n o d e e llo s . Exce p t o e l m é t o d o u t iliza d o p a ra
t o d o s lo s p ro p ó s it o s h a n d le Ev e n t ( ) ) , ca d a m é t o d o m a n e ja d o r d e
e ve n t o s s ó lo p u e d e s e r u t ilzia ro p a ra u n t ip o d e e ve n t o p a rt icu la r.
Re co m e n d a m o s q u e s e e vit e e l m é t o d o m u lt i- p ro p ó s it o , s i e s p o s ib le , y
e n s u lu g a r s e s o b re e s crib a e l m é t o d o d e m a n e jo d e e ve n t o q u e e s t á
e s p e cifica d o p o r e l t ip o d e e ve n t o q u e s e n e ce s it a m a n e ja r. Es t a
a p ro xim a ció n t ie n d e a t e n e r m e n o r n ú m e ro d e e fe ct o s la t e ra le s
a d ve rs o s .
La cla s e Co m p o n e n t d e fin e lo s s ig u ie n t e s m é t o d o s p a ra re s p o n d e r a lo s
e ve n t o s ( e l t ip o d e e ve n t o m a n e ja d o s e lis t a d e s p u é s d e l n o m b re d e l
m é todo):
● a c t io n ( ) ( Eve n t . ACTION_ EVENT)

● m o u s e En t e r( ) ( Eve n t . MOUS E_ ENTER)

● m o u s e Ex it ( ) ( Eve n t . MOUS E_ EXIT)

● m o u s e Mo v e ( ) ( Eve n t . MOUS E_ MOVE)

● m o u s e D o w n ( ) ( Eve n t . MOUS E_ DOWN)

● m o u s e D ra g ( ) ( Eve n t . MOUS E_ DRAG)

● m o u s e Up ( ) ( Eve n t . MOUS E_ UP)

● k e y D o w n ( ) ( Eve n t . KEY_ PRES S o r Eve n t . KEY_ ACTION)

● k e y Up ( ) ( Eve n t . KEY_ RELEAS E o r Eve n t . KEY_ ACTION_ RELEAS E)

● g o t Fo c u s ( ) ( Eve n t . GOT_ FOCUS )

● lo s t Fo c u s ( ) ( Eve n t . LOS T_ FOCUS )

● h a n d le Ev e n t ( ) ( a ll e ve n t t yp e s )

Cu a n d o o cu rre u n e ve n t o , s e lla m a a l m é t o d o m a n e ja d o r d e e ve n t o q u e
co in cid e co n e l t ip o d e l e ve n t o . Es p e cifica m e n t e , e l Eve n t o s e p a s a
p rim e ro a l m é t o d o h a n d le Ev e n t ( ) , q u e ( e n la im p le m e n t a ció n p o r
d e fe ct o d e h a n d le Ev e n t ( ) ) lla m a a l m é t o d o a p ro p ia d o p o r e l t ip o d e
e ve n t o .
El m é t o d o a c t io n ( ) e s u n m é t o d o e s p e cia lis t a im p o rt a n t e e n e l m a n e jo
d e e ve n t o s . S ó lo lo s co m p o n e n t e s d e co n t ro l b á s ico s - - Bu t t o n ,
Ch e ckb o x, Ch o ice , Lis t , Me n u It e m , y Te xt Fie ld o b je ct s - - p ro d u ce n
e ve n t o s a ct io n . Ello s lo h a ce n cu a n d o e l u s u a rio in d ica d e a lg u n a fo rm a
q u e e l co n t ro l d e b e ría re a liza r a lg u n a a cció n . Po r e je m p lo , cu a n d o e l
u s u a rio p u ls a u n b o t ó n , s e g e n e ra u n e ve n t o a ct io n . Me d ia n t e la
im p le m e n t a ció n d e l m é t o d o a c t io n ( ) , s e p u e d e re a ccio n a r a la s a ccio n e s
s o b re lo s co n t ro le s s in p re o cu p a rs e p o r e l e ve n t o s d e b a jo n ive l, co m o la
p u ls a ció n d e t e cla o e l click d e l ra t ó n q u e ca u s ó la a cció n .
To d o s lo m é t o d o s m a n e ja d o re s d e e ve n t o s t ie n e n a l m e n o s u n
a rg u m e n t o ( e l o b je t o Eve n t ) y d e vu e lve n u n va lo r b o o le a n o . El va lo r d e
re t o rn o in d ica s i e l m é t o d o a m a n e ja d o co m p le t a m e n t e e l e ve n t o .
De vo lvie n d o fa ls e , e l m a n e ja d o r in d ica q u e s e d e b e co n t in u a r p a s a n d o
e l e ve n t o a t ra vé s d e l á rb o l d e co m p o n e n t e s . De vo lvie n d o t ru e , e l
m a n e ja d o r in d ica q u e e l e ve n t o n o d e b e s e g u ir p a s a n d o s e . El m é t o d o
h a n d le Ev e n t ( ) ca s i s ie m p re d e b e rá d e vo lve r s u p e r. h a n d le Ev e n t ( ) ,
p a ra a s e g u ra rs e q u e t o d o s lo s e ve n t o s s e a n p a s a d o s a l m é t o d o
m a n e ja d o r d e e ve n t o s a p ro p ia d o .
I m p o rt a n t e : Co m o lo s m é t o d o s d e d ib u jo , t o d o s lo s m é t o d o s
m a n e ja d o re s d e e ve n t o s d e b e n e je cu t a rs e rá p id a m e n t e ! De o t ra fo m ra ,
d e s t ru iría n e l re n d im ie n t o p e rcib id o d e l p ro g ra m a . S i s e n e ce s it a re a liza r
a lg u n a o p e ra ció n le n t a co m o re s u lt a d o d e u n e ve n t o , h á zlo a rra n ca n d o
o t ro t h re a d ( o e n viá n d o u n a p e t ició n a o t ro t h re a d ) p a ra q u e re a lice la
o p e ra ció n . Pu e d e s ve r Th re a d s d e Co n t ro l.

En e l p ro g ra m a d e e je m p lo , t o d o e l m a n e jo d e e ve n t o s lo re a liza n lo s
o b je t o s Co n ve rs io n Pa n e ls . Ut iliza n e l m é t o d o a c t io n ( ) p a ra ca p t u ra r lo s
e ve n t o s re s u lt a n t e s d e la s a ccio n e s d e l u s u a rio lo s ca m p o s d e t e xt o
( Te xt Fie ld ) , y la s lis t a s d e s p le g a b le s ( Ch o ice ) . Pa ra ca p t u ra r lo s e ve n t o s
re s u lt a n t e s d e la a cció n d e l u s u a rio s o b re la s b a rra s d e s liza n t e s
( S cro llb a r) , d e b e n u t iliza r e l m é t o d o h a n d le Ev e n t ( ) , ya q u e lo s
S cro llb a rs n o p ro d u ce n e l e ve n t o a ct io n y la cla s e Co m p o n e n t n o d e fin e
n in g ú n m é t o d o e s p e cífico p a ra lo s e ve n t o s d e lo s o b je t o s S cro lb a r.
Aq u í t ie n e s la im p le m t a ció n d e Co n ve rs io n Pa n e l p a ra lo s m é t o d o
a c t io n ( ) y h a n d le Ev e n t ( ) :
/** Responde a las acciones del usuario sobre los controles. */
public boolean action(Event e, Object arg) {
if (e.target instanceof TextField) {
setSliderValue(getValue());
controller.convert(this);
return true;
}
if (e.target instanceof Choice) {
controller.convert(this);
return true;
}
return false;
}

/** Responde a la barra deslizable. */


public boolean handleEvent(Event e) {
if (e.target instanceof Scrollbar) {
textField.setText(String.valueOf(slider.getValue()));
controller.convert(this);
}
return super.handleEvent(e);
}
Es t o s m é t o d o s s im p le m e n t e s e a s e g u ra n q u e la b a rra d e s liza n t e y e l
ca m p o d e t e xt o d e lo s Co n ve rs io n Pa n e l m u e s t re n e l m is m o va lo r, y le
p id e n a l o b je t o Co n ve rt e r q u e a ct u a lice e l o t ro Co n ve rs io n Pa n e l. El
m é t o d o a c t io n ( ) d e vu e lve t ru e s i h a m a n e ja d o e l e ve n t o . Es t o e vit a
q u e e l e ve n t o h a g a u n via je in n e ce s a rio a t ra vé s d e l á rb o l d e
co m p o n e n t e s . S i e l m é t o d o a c t io n ( ) n o p u e d e m a n e ja r e l e ve n t o ,
d e vu e lve fa ls e , p a ra q u e a lg ú n co m p o n e n t e s u p e rio r e n e l á rb o l d e
co m p o n e n t e s p u e d a e ch a rle u n vis t a zo a l e ve n t o . El m é t o d o
h a n d le Ev e n t ( ) s ie m p re d e vu e lve s u p e r. h a n d le Ev e n t ( ) p a ra q u e t o d o s
lo s e ve n t o s s e a n co m p le t a m e n t e n p ro ce s a d o s .
Un a N o t a s o b re e l Mé t o d o a c t io n ( ) : Lo s e ve n t o s Act io n s o n e ve n t o s
d e a lt o n ive l. S o n ca u s a d o s p o r u n o o m á s e ve n t o s d e b a jo n ive l co m o
u n a p u ls a ció n d e t e cla y d e ra t ó n . Po r e s t a ra zó n , e s co rre ct o d e vo lve r
t ru e p a ra p a ra r e l e ve n t o a ct ió n a n t e s d e q u e s ig a s u b ie n d o p o r e l á rb o l
d e co m p o n e n t e s d e s p u é s d e h a b e rlo m a n e ja d o - - e l có d ig o d e p e n d ie n t e
d e la p la t a fo rm a ya h a m a n e ja d o lo s e ve n t o s d e t e cla s o d e l ra t ó n q u e
h a la n za d o la a cció n , n o n e ce s it a ve r d e n u e vo e l e ve n t o a ct io n .
N o t a : S i h a n d le Ev e n t ( ) d e vo lvie ra t ru e o fa ls e ( e n lu g a r d e lla m a r a
la im p le m e n t a ció n d e s u s u p e rcla s e ) , e l m é t o d o a c t io n ( ) n u n ca s e ría
lla m a d o . Rie s g o s co m o e s t e s o n u n a p a rt e d e la ra zó n p o r la q u e h e m o s
a vis a d o p a ra q u e s e e vit e la u t iliza ció n d e l m é t o d o h a n d le Ev e n t ( ) a
m e n o s q u e s e a a b s o lu t a m e n t e n e ce s a rio .

El Foco del Teclado


Mu ch o s co m p o n e n t e s - - in clu s o q u e a q u e llo s q u e o p e ra n p rim o rd ia lm e n t e
co n e l ra t ó n , co m o lo s b o t o n e s - - p u e d e n o p e ra rs e co n e l t e cla d o . Pa ra
q u e t e n g a e fe ct o u n a p u s la ció n d e t e cla s o b re u n co m p o n e n t e , e s t e
co m p o n e n t e d e b e t e n e r e l fo co d e l t e cla d o .
En u n m o m e n t o d a d o , a l m e n o s u n a ve n t a n a y u n co m p o n e n t e d e e s a
ve n t a n a p u e d e n t e n e r e l fo co d e l t e cla d o . Có m o o b t ie n e n la s ve n t a n a s e l
fo co d e l t e cla d o d e p e n d e d e l s is t e m a . Pe ro u n a ve z q u e u n a ve n t a n a a
o b t e n id o e l fo co p u e d e u t iliza r e l m é t o d o re q u e s t Fo c u s ( ) p a ra p e d ir
q u e u n co m p o n e n t e o b t e n g a e l fo co .
Cu a n d o u n co m p o n e n t e o b t ie n e e l fo co s e lla m a a s u m é t o d o
g o t Fo c u s ( ) . Cu a n d o u n co m p o n e n t e p ie rd e e l fo co s e lla m a a s u m é t o d o
lo s t Fo c u s ( ) .

Oz it o
Utilizar los Componentes del AWT
La s ig u ie n t e fig u ra m u e s t ra e l á rb o l d e h e re n cia p a ra t o d a s la s cla s e s co m p o n e n t e s
d e l AWT.

Object
|
MenuComponent
|
+------------+
| |
MenuItem MenuBar
|
+-------+
| |
Menu MenuItem
Checkbox
Co m o m u e s t ra la fig u ra , t o d o s lo s co m p o n e n t e s , e xce p t o lo s co m p o n e n t e s
re la cio n a d o s co n lo s m e n ú s , d e s cie n d e n d e la cla s e Co m p o n e n t d e l a WT. A ca u s a
d e la s re s t riccio n e s d e la s d is t in t a s p la t a fo rm a s ( co m o la im p o s ib ilid a d d e
s e le ccio n a r e l co lo r d e fo n d o d e lo s m e n ú s ) , t o d o s lo s co m p o n e n t e s re la cio n a d o s
co n lo s m e n ú s s e h a n s a ca d o fu e ra d e la cla s e Co m p o n e n t . En s u lu g a r, lo s
co m p o n e n t e s d e m e n ú s d e s cie n d e n d e la cla s e Me n u Co m p o n e n t d e l AWT.

Reglas Generales para Utilizar Componentes


An t e s d e e m p e za r a u t iliza r co m p o n e n t e s , d e b e ría s co n o ce r q u é
p ro p o rcio n a la cla s e Co m p o n e n t y có m o p u e d e s p e rs o n a liza r lo s
co m p o n e n t e s .
Cómo utilizar ...
El s ig u ie n t e g ru p o d e p á g in a s e xp lica có m o u t iliza r lo s co m p o n e n t e s
p ro p o rcio n a d o s p o r e l AWT. Ca d a t ip o d e co m p o n e n t e t ie n e s u p ro p ia
p á g in a :
● Có m o u t iliza r Bo t o n e s

● Có m o u t iliza r Lie n zo s
● Có m o u t iliza r Ch e ckb o xe s
● Có m o u t iliza r Ch o ice s
● Có m o u t iliza r Ca ja s d e Diá lo g o
● Có m o u t iliza r Ma rco s
● Có m o u t iliza r Eq iq u e t a s
● Có m o u t iliza r Lis t a s
● Có m o u t iliza s Me n ú s
● Có m o u t iliza s Pa n e ls
● Có m o u t iliza r Ba rra s d e De s p la za m ie n t o
● Có m o u t iliza r Áre a s y Ca m p o s d e Te xt o

Oz it o
Reglas Generales para Utilizar Componentes
Es t a p á g in a t ie n e in fo rm a ció n g e n e ra l s o b re lo q u e t ie n e n e n co m ú n lo s
co m p o n e n t e s . Exp lica có m o a ñ a d ir co m p o n e n t e s a u n co n t e n e d o r. Cu e n t a la s
fu n cio n a lid a d e s q u e h e re d a n lo s co m p o n e n t e s d e la cla s e Co m p o n e n t . Ta m b ié n
cu e n t a có m o p u e d e ca m b ia r e l a s p e ct o y co m p o rt a m ie n t o d e lo s co m p o n e n t e s .

Cómo añadir Componentes a un Contenedor


Cu a n d o le a s e s t a le cció n , o b s e rva rá s có d ig o p a ra a ñ a d ir co m p o n e n t e s a
lo s co n t e n e d o re s . Es t o e s a s í p o rq u e p a ra q u e cu a lq u ie r o b je t o
Co m p o n e n t p u e d a d ib u ja rs e e n la p a n t a lla , e xce p t o u n a ve n t a n a ,
p rim e ro d e b e s a ñ a d irlo a u n o b je t o Co n t a in e r. Es t e Co n t e n e d o r e s a s u
ve z u n Co m p o n e n t e , y t a m b ié n d e b e s e r a ñ a d id o a o t ro Co n t e n e d o r. La s
Ve n t a n a s , co m o lo s Ma rco s y lo s Cu a d ro s d e Diá lo g o s s o n co n t e n d o re s
d e a lt o n ive l; y s o n lo s ú n ico s co m p o n e n t e s q u e n o s o n a ñ a d id o s a o t ro s
co n t e n d o re s .
La cla s e Co n t a in e r d e fin e t re s m é t o d o s p a ra a ñ a d ir co m p o n e n t e s : u n
m é t o d o a d d ( ) co n u n a rg u m e n t o y d o s m é t o d o s a d d ( ) co n d o s
a rg u m e n t o s . El q u e s e n e ce s it a rá u t iliza r d e p e n d e e l co n t ro la d o r d e
d is p o s ició n q u e e l co n t e n e d o r e s t á u t iliza n d o . Ap re n d e rá s t o d o s o b re lo s
co n t ro la d o re s d e d is p o s ició n m á s a d e la n t e e n e s t a le cció n . Ah o ra ,
e s t a m o s e n s e ñ a n d o lo s u ficie n t e p a ra q u e p u e d a s le e r lo s e xt ra ct o s d e
có d ig o d e e s t a le cció n .
El m é t o d o a d d ( ) co n u n a rg u m e n t o s ó lo re q u ie re q u e e s p e cifiq u e e l
co m p o n e n t e a a ñ a d ir. El p rim e r m é t o d o a d d ( ) co n d o s a rg u m e n t o s
p e rm it e a ñ a d ir u n a rg u m e n t o e s p e cifica n d o la p o s ició n e n la q u e d e b e ría
s e r a ñ a d id o e l co m p o n e n t e . El e n t e ro - 1 e s p e cifica q u e e l co n t e n e d o r
a ñ a d e e l co m p o n e n t e a l fin a l d e la lis t a d e co m p o n e n t e s ( a l ig u a l q u e lo
h a ce e l m é t o d o d e u n s ó lo a rg u m e n t o ) . Es t a fo rm a d e a d d ( ) co n d o s
a rg u m e n t o s n o s e u t iliza fre cu e n t e m e n t e , p o r e s o s i s e re fie re a l
"m é t o d o a d d ( ) co n d o s a rg u m e n t o s ", ca s i s ie m p re s e re fie re a l s e g u n d o
m é t o d o q u e s e d e s crib e e n e l s ig u ie n t e p á rra fo . To d o s lo s co n t ro la d o re s
d e d is p o s ició n Flo wLa yo u t , Grid La yo u t , y Grid Ba g La yo u t t ra b a ja n co n
e stos m é todos a d d ( ) .
El s e g u n d o m é t o d o a d d ( ) co n d o s a rg u m e n t o s e s p e cifica e l co m p o n e n t e
q u e s e va a a ñ a d ir. El p rim e r a rg u m e n t o e s u n a ca d e n a d e p e n d ie n t e d e l
co n t ro la d o r. Bo rd e rLa yo u t ( e l co n t ro la d o r d e d is p o s ició n p o r d e fe ct o p a ra
la s s u b cla s e s d e Win d o w) re q u ie re q u e s e e s p e cifiq u e "No rt h ", "S o u t h ",
"Ea s t ", "We s t ", o "Ce n t e r". Ca rd La yo u t s ó lo re q u ie re q u e s e e s p e cifiq u e
u n a ca d e n a q u e id e n t ifiq u e d e a lg u n a fo rm a e l co m p o n e n t e q u e e s t á
s ie n d o a ñ a d id o .
N o t a : Añ a d ir co m p o n e n t e s a u n co n t e n e d o r e lim in a e l co m p o n e n t e d e
o t ro co n t e n e d o r s i e s q u e e s t u vie ra . Po r e s t a ra zó n , n o s e p u e d e t e n e r
u n co m p o n e n t e e n d o s co n t e n e d o re s , in clu s o s i lo s d o s co n t e n e d o re s n o
s e m u e s t ra n n u n ca a l m is m o t ie m p o .

Qué proporciona la clase Component


To d o s lo s co m p o n e n t e s , e xce p t o lo s m e n ú s , e s t á n im p le m e n t a d o s co m o
s u b cla s e s d e la cla s e Co m p o n e n t . De e s t a cla s e h e re d a n u n a e n o rm e
ca n t id a d d e fu n cio n a lid a d e s . Po r a h o ra , ya d e b e ría s s a b e r q u e la cla s e
Co m p o n e n t p ro p o rcio n a lo b á s ico p a ra e l d ib u jo y e l m a n e jo d e e ve n t o s .
Aq u í t ie n e s u n a lis t a m á s co m p le t a s o b re la s fu n cio n a lid a d e s
p ro p o rcio n a d a s p o r la cla s e Co m p o n e n t :
S o p o rt e b á s ic o p a ra d ib u jo .
Co m p o n e n t p ro p o rcio n a lo s m é t o d o s p a in t ( ) , u p d a t e ( ) , y
re p a in t ( ) , q u e p e rm it e n a lo s co m p o n e n t e s d ib u ja rs e a s í m is m o s
e n la p a n t a lla . Pu e d e s ve r la p á g in a Dib u jo p a ra m á s in fo rm a ció n .
Ma n e jo d e Ev e n t o s .
Co m p o n e n t d e fin e e l m é t o d o h a n d le Ev e n t ( ) d e p ro p ó s it o g e n e ra l
y u n g ru p o d e m é t o d o s co m o a c t io n ( ) q u e m a n e ja t ip o s d e
e ve n t o s e s p e cifico s . Co m p o n e n t t a m b ié n t ie n e s o p o rt e p a ra e l fo co
d e l t e cla d o , q u e p e rm it e co n t ro la r lo s co m p o n e n t e s m e d ia n t e e l
t e cla d o . Pu e d e s ve r la p á g in a Ma n e jo d e Eve n t o s p a ra m á s
in fo rm a ció n .
Ap a rie n c ia d e l Co n t ro l: fu e n t e .
Co m p o n e n t p ro p o rcio n a m é t o d o s p a ra o b t e n e r y ca m b ia r la fu e n t e
a ct u a l, y o b t e n e r in fo rm a ció n s o b re e lla . Pu e d e s ve r la p á g in a
Tra b a ja n d o co n Te xt o p a ra m á s in fo rm a ció n .
Ap a rie n c ia d e l Co n t ro l: c o lo r.
Co m p o n e n t p ro p o rcio n a lo s s ig u ie n t e s m é t o d o s p a ra o b t e n e r y
ca m b ia r lo s co lo re s d e fo n d o y d e p rim e r p la n o :
s e t Fo re g ro u n d ( Co lo r) , g e t Fo re g ro u n d ( ) ,
s e t Ba c k g ro u n d ( Co lo r) , y g e t Ba c k g ro u n d ( ) . El co lo r d e p rim e r
p la n o e s e l u t iliza d o p o r t o d o e l t e xt o d e l co m p o n e t e , a s í co m o
cu a lq u ie r d ib u jo d e l clie n t e q u e re a lice e l co m p o n e n t e . El co lo r d e
fo n d o e s e l co lo r q u e h a y d e t rá s d e l t e xt o o lo s g rá fico s . Pa ra
a u m e n t a r e l re n d im ie n t o e l co lo r d e fo n d o d e b e ría co n t ra s t a r co n e l
co lo r d e p rim e r p la n o .
Ma n e jo d e I m á g e n e s .
Co m p o n e n t p ro p o rcio n a lo b á s ico p a ra m o s t ra r im á g e n e s . Ob s e rva
q u e la m a yo ría d e lo s co m p o n e n t e s n o p u e d e n co n t e n e r im á g e n e s ,
ya q u e s u a p a rie n cia e s t á im p le m e n t a d a e n có d ig o e s p e cifico d e la
p la t a fo rm a . S in e m b a rg o , lo s lie n zo s y la m a yo ría d e lo s
co n t e n e d o re s , p u e d e n m o s t ra r im á g e n e s . Pu e d e s ve r la p á g in a
Ut iliza r im á g e n e s p a ra m á s in fo rm a ció n s o b re e l t ra b a jo co n
im á g e n e s .
Ta m a ñ o y p o s ic ió n e n la p a n t a lla .
El t a m a ñ o y p o s ició n d e t o d o s lo s co m p o n e t e s ( e xce p t o p a ra la s
ve n t a n a s ) e s t á n s u je t o s a lo s ca p rich o s d e lo s co n t ro la d o re s d e
d is p o s ició n . S in e m b a rg o , t o d o s lo s co m p o n e n t e s t ie n e n a l m e n o s
u n a fo rm a d e d e cir s u t a m a ñ o , p e ro n o s u p o s ició n . Lo s m é t o d o s
p re fe rre d S iz e ( ) y m in im u m S iz e ( ) p e rm it e n a lo s co m p o n e n t e s
in fo rm a r a l co n t ro la d o r d e d is p o s ició n d e lo s t a m a ñ o s m ín im o y
p re fe rid o . La cla s e Co m p o n e n t t a m b ié n p ro p o rcio n a m é t o d o s p a ra
o b t e n e r o ca m b ia r ( s u je t o a la s u p e rvis ió n d e l co n t ro la d o r d e
d is p o s ició n ) e l t a m a ñ o y la p o s ició n a ct u a le s d e l co m p o n e n t e .

Cómo cambiar la apariencia y el comportamiento de los


Componentes.
La a p a rie n cia d e la m a yo ría d e lo s co m p o n e n t e s e s e s p e cífica d e la
p la t a fo rm a . Lo s b o t o n e s s o n d ife re n t e s e n u n s is t e m a Mo t if y e n u n
s is t e m a Ma cin t o s h , p o r e je m p lo .
No s e p u e d e ca m b ia r fá cilm e n t e la a p a rie n cia d e u n co m p o n e n t e e n
g ra n d e s ra s g o s . Pe ro s i p u e d e h a ce r ca m b io s m e n o re s , co m o la fu e n t e o
e l co lo r d e l fo n d o , u t iliza n d o lo s m é t o d o s y va ria b le s q u e a fe ct a n a la
a p a rie n cia p ro p o rcio n a d o s p o r u n a cla s e Co m p o n e n t y s u s s u b cla s e s . S in
e m b a rg o , n o s e p o d rá ca m b ia r co m p le t a m e n t e la a p a rie n cia d e u n
co m p o n e n t e in clu s o cre a n d o u n a n u e va s u b cla s e d e la cla s e Co m p o n e n t ,
ya q u e la m a yo ría d e la im p le m e n t a ció n d e l co m p o n e t e s e s p e cífica d e la
p la t a fo rm a s o b re e s crib e cu a lq u ie r d ib u jo q u e re a lice e l co m p o n e n t e . Pa ra
ca m b ia r la a p a rie n cia d e u n co m p o n e n t e , s e d e b e in p le m e n t a r u n a
s u b cla s e d e la cla s e Ca n va s q u e t e n g a e l a s p e ct o q u e s e q u ie ra p e ro e l
m is m o co m p o rt a m ie n t o q u e e l u s u a rio e s p e ra ría d e l co m p o n e n t e .
Au n q u e n o p u e d e ca m b ia r e n g ra n m e d id a e l a s p e ct o d e l co m p o n e n t e , s i
p u e d e ca m b ia r s u co m p o rt a m ie n t o . Po r e je m p lo , s i e n u n ca m p o d e t e xt o
s ó lo s o n vá lid o s lo s va lo re s n u m é rico s , p o d ría im p le m e n t a r u n a s u b cla s e
d e Te xt Fie ld q u e e xa m in e t o d o s lo s e ve n t o s d e l t e cla d o , in t e rce p t a n d o
lo s q u e n o s e a n vá lid o s . Es t o e s p o s ib le p o rq u e la im p le m e n t a ció n d e l
co m p o n e n t e in d e p e n d ie n t e d e la p la t a fo rm a o b t ie n e e l e ve n t o a n t e s d e
q u e lo h a g a la im p le m e n t a ció n d e p e n d ie n t e d e la p la t a fo rm a . Pu e d e s ve r
la p á g in a Ma n e jo d e Eve n t o s p a ra m á s d e t a lle s .

Oz it o
Cómo Utilizar la Clase Button
La cla s e Bu t t o n p ro p o rcio n a u n a im p le m e n t a ció n p o r d e fe ct o p a ra lo s b o t o n e s . Un
b o t ó n e s u n s e n cillo co n t ro l q u e g e n e ra u n e ve n t o Act io n cu a n d o e l u s u a rio lo
p u ls a .
La a p a rie n cia e n la p a n t a lla d e lo s b o t o n e s d e p e n d e d e la p la t a fo rm a e n q u e s e
e s t á e je cu t a n d o y s i e l b o t ó n e s t á d is p o n ib le o n o . S i s e q u ie re q u e lo s b o t o n e s
s e a n ig u a le s p a ra t o d a s la s p la t a fo rm a s o q u e t e n g a n u n a s p e ct o e s p e cia l, s e
d e b e ría cre a r u n a s u b cla s e d e Ca n va s p a ra im p le m e n t a r e s e a s p e ct o ; n o s e p u e d e
ca m b ia r e l a s p e ct o u t iliza n d o la cla s e Bu t t o n . La ú n ica fa ce t a d e la a p a rie n cia d e u n
b o t ó n q u e p u e d e ca m b ia r s in cre a r s u p ro p ia cla s e s o n la fu e n t e , e l t e xt o
m o s t ra d o , lo s co lo re s d e fo n d o y d e p rim e r p la n o , y ( h a b ilit a n d o o d e s h a b ilit a n d o e l
b o t ó n ) s i e l b o t ó n a p a re ce a ct iva d o o d e s a ct iva d o .
Ab a jo h a y u n a p p le t q u e m u e s t ra t re s b o t o n e s . Cu a n d o s e p u ls a e l b o t ó n izq u ie rd o ,
s e d e s a ct iva rá e l b o t ó n ce n t ra l ( y a s í m is m o , ya q u e a h o ra n o e s ú t il) y a ct iva e l
b o t ó n d e re ch o . Cu a n d o s e p u ls e e l b o t ó n d e re ch o , s e a ct iva rá e l b o t ó n ce n t a l y e l
b o t ó n izq u ie rd o y s e d e s a ct iva rá a s í m is m o .
Ab a jo t ie n e s e l có d ig o q u e cre a lo s t re s b o t o n e s y re a ccio n a a la s p u ls a cio n e s d e
lo s b o t o n e s . ( Aq u í t ie n e s e l p ro g ra m a co m p le t o . )
//en el código de inicialización:
b1 = new Button();
b1.setLabel("Disable middle button");

b2 = new Button("Middle button");

b3 = new Button("Enable middle button");


b3.disable();
. . .

public boolean action(Event e, Object arg) {


Object target = e.target;

if (target == b1) { //Han pulsado "Disable middle button"


b2.disable();
b1.disable();
b3.enable();
return true;
}
if (target == b3) { //Han pulsado "Enable middle button"
b2.enable();
b1.enable();
b3.disable();
return true;
}
return false;
}
El có d ig o a n t e rio r m u e s t ra có m o u t iliza r u n o d e lo s m é t o d o s m á s co m u n e s d e la
cla s e Bu t t o n . Ad e m á s , la cla s e Bu t t o n d e fin e u n m é t o d o g e t La b e l( ) , q u e le
p e rm it e e n co n t ra r e l t e xt o m o s t ra d o e n u n b o t ó n p a rt icu la r.

Oz it o
Cómo utilizar la Clase Canvas
La cla s e Ca n va s e xis t e p a ra t e n e r d e s ce n d ie n t e s . No h a ce n a d a p o r s í m is m a ; s ó lo
p ro p o rcio n a u n a fo rm a p a ra im p le m e t a r u n co m p o n e n t e p e rs o n a liza d o . Po r
e je m p lo , lo s Lie n zo s ( Ca n va s ) s o n ú t ile s p a ra á re a s d e d ib u jo p a ra im á g in e s y
g rá fico s d e l clie n t e , t a n t o s i s e d e s e a o n o m a n e ja r e ve n t o s q u e o cu rra n d e n t ro d e l
á re a d e p a n t a lla .
Lo s Ca n va s t a m b ié n s o n ú t ile s cu a n d o s e q u ie ra u n co n t ro l - - u n b o t ó n , p o r
e je m p lo - - q u e s e p a re zca a la im p le m e n t a ció n p o r d e fe ct o d e e s e co n t ro l. Co m o
n o s e p u e d e ca m b ia r la a p a rie n cia d e lo s co n t ro le s e s t a n d a rd s cre a n d o u n a
s u b cla s e d e la cla s e Co m p o n e n t co rre s p o n d ie n t e ( Bu t t o n , p o r e je m p lo ) , e n s u lu g a r
s e p u e d e cre a r u n a s u b cla s e d e Ca n va s q u e t e n g a e l co m p o rt a m ie n t o q u e s e q u ie ra
y e l m is m o co m p o rt a m ie n t o q u e la im p le m e n t a ció n p o r d e fe ct o d e l co n t ro l.
Cu a n d o s e im p le m e n t e u n a s u b cla s e d e Ca n va s , t e n cu id a d o a l im p le m e n t a r lo s
m é t o d o s m in im u m S iz e ( ) y p re fe rre d S iz e ( ) p a ra q u e re fle je n a d e cu a d a m e n t e e l
t a m a ñ o d e s u lie n zo . De o t ro m o d o , d e p e n d ie n d o d e l co n t ro la d o r d e d is p o s ició n
q u e u t ilice e l co n t e n e d o r d e s u Ca n va s , s u p o d ría t e rm in a r d e m a s ia d o p e q u e ñ o - -
q u izá s in vis ib le .
Aq u í t ie n e s u n a p p le t q u e u t iliza d o s e je m p la re s d e u n a s u b cla s e d e Ca n va s :
Im a g e Ca n va s .
Ab a jo t ie n e s e l có d ig o d e Im a g e Ca n va s . ( Po d rá s e n co n t ra rlo e n la fo rm a
e le ct ró n ica e n e l fich e ro Im a g e Ap p le t . ja va . ) Co m o lo s d a t o s d e la im a g e n s e ca rg a n
a s ín cro n a m e n t e , u n Im a g e Ca n va s n o co n o ce e l t a m a ñ o q u e d e b e ría t e n e r h a s t a
a lg ú n m o m e n t o d e s p u é s d e h a b e rs e cre a d o . Po r e s t a ra zó n , Im a g e Ca n va s u t iliza la
a n ch u ra y a lt u ra s u g e rid o s p o r s u cre a d o r h a s t a q u e e s t é d is p o n ib le e l d a t o d e s u
t a m a ñ o . Cu a n d o e l t a m a ñ o d e la im a g e n s e vu e lve d is p o n ib le , e l Im a g e Ca n va s
ca m b ia e l t a m a ñ o q u e d e vu e lve n s u s m é t o d o s p re fe rre d S iz e ( ) y
m in im u m S iz e ( ) , in t e n t a re d im e n s io n a rs e , y lu e g o p id e a l co n t e n e d o r d e m á s a lt o
n ive l q u e s e a ju s t e d e fo rm a a d e cu a d a a l n u e vo t a m a ñ o y q u e s e re d ib u je .
class ImageCanvas extends Canvas {
Container pappy;
Image image;
boolean trueSizeKnown = false;
Dimension minSize;
int w, h;

public ImageCanvas(Image image, Container parent,


int initialWidth, int initialHeight) {
if (image == null) {
System.err.println("Canvas got invalid image object!");
return;
}
this.image = image;
pappy = parent;

w = initialWidth;
h = initialHeight;

minSize = new Dimension(w,h);


}

public Dimension preferredSize() {


return minimumSize();
}

public synchronized Dimension minimumSize() {


return minSize;
}

public void paint (Graphics g) {


if (image != null) {
if (!trueSizeKnown) {
int imageWidth = image.getWidth(this);
int imageHeight = image.getHeight(this);

if ((imageWidth > 0) && (imageHeight > 0)) {


trueSizeKnown = true;

//Ooh... component-initiated resizing.


w = imageWidth;
h = imageHeight;
minSize = new Dimension(w,h);
resize(w, h);
pappy.layout();
pappy.repaint();
}
}

g.drawRect(0, 0, w - 1, h - 1);
g.drawImage(image, 0, 0, this);
}
}
}
Pa ra m á s in fo rm a ció n s o b re e l d ib u jo d e g rá fico s , p u e d e s ve r la le cció n Tra b a ja r
co n Grá fico s . Pa ra ve r u n e je m p lo d e im p le m e n t a ció n d e la cla s e Ca n va s q u e
d ib u ja g rá fico s d e l clie n t e y m a n e ja e ve n t o s , p u e d e s ve r e l có d ig o d e l a p p le t
Re ct a n g le De m o . Pu e d e s ve r Re ct a n g le De m o e n a cció n e n Dib u ja r Fo rm a s .

Oz it o
Cómo Utilizar la Clase Checkbox
La cla s e Ch e ckb o x p ro p o rcio n a ca ja s d e ch e q u e o - - b o t o n e s co n d o s e s t a d o s q u e p u e d e n
e s t a r "o n " o "o ff". ( Qu izá s p o d ría co n o ce r e s t e e le m e n t o UI co m o b o t ó n d e ra d io . )
Cu a n d o e l u s u a rio p u ls a u n b o t ó n d e ra d io , ca m b ia s u e s t a d o y g e n e ra u n e ve n t o Act io n .
Ot ra s fo rm a s d e p ro p o rcio n a r g ru p o s d e b o t o n e s d e ra d io q u e p u e d e n s e r s e le ccio n a d o s
s o n ch o ice s , lis t s , y m e n u s .

S i s e q u ie re u n g ru p o d e b o t o n e s d e ra d io e n e l q u e s ó lo u n o p u e d a e s t a r a ct iva d o ,
p u e d e a ñ a d ir u n o b je t o Ch e ckb o xGro u p p a ra vig ila r e l e s t a d o d e lo s b o t o n e s d e ra d io .
Ab a jo h a y u n a p p le t q u e t ie n e d o s co lu m n a s d e b o t o n e s d e ra d io . En la izq u ie rd a h a y
t re s b o t o n e s in d e p e n d ie n t e s . S e p u e d e n s e le ccio n a r lo s t re s b o t o n e s d e ra d io , s i s e
q u ie re . En la d e re ch a h a y t re s b o t o n e s d e ra d io q u e e s t á n co rrd in a d o s p o r u n o b je t o
Ch e ckb o xGro u p . Es t e o b je t o s e a s e g u ra d e q u e n o h a ya m á s d e u n b o t ó n d e ra d io
s e le ccio n a d o a l m is m o t ie m p o . Pa ra s e r e s p e cífico s , u n g ru p o d e b o t o n e s d e ra d io p u e d e
n o t e n e r n in g u n o s e le ccio n a d o , p e ro u n a ve z q u e e l u s u a rio s e le ccio n a u n b o t ó n , s ó lo
u n o d e e llo s p o d rá s e r s e le ccio n a d o e n a d e la n t e .
Aq u í t ie n e s e l p ro g ra m a co m p le t o . Ab a jo t ie n e s e l có d ig o q u e cre a lo s d o s g ru p o s d e
b o t o n e s d e ra d io . Ob s e rva q u e s ó lo e ls e g u n d o , e l g ru p o m u t u a m e n t e e xclu s ivo d e
b o t o n e s e s t á co n t ro la d o p o r u n Ch e ckb o xGro u p .
Panel p1, p2;
Checkbox cb1, cb2, cb3; //Estos son los botones de radio independientes.
Checkbox cb4, cb5, cb6; //Estos botones de radio son parte de un grupo.
CheckboxGroup cbg;

cb1 = new Checkbox(); //El estado por defecto es "off" (false).


cb1.setLabel("Checkbox 1");
cb2 = new Checkbox("Checkbox 2");
cb3 = new Checkbox("Checkbox 3");
cb3.setState(true); //Cambia el estado a"on" (true).
. . .
cbg = new CheckboxGroup();
cb4 = new Checkbox("Checkbox 4", cbg, false); //estado inicial: off (false)
cb5 = new Checkbox("Checkbox 5", cbg, false); //estado inicial: off
cb6 = new Checkbox("Checkbox 6", cbg, false); //estado inicial: off
Ju n t o co n lo s m é t o d o s d e la cla s e Ch e ckb o x m o s t ra d o s a rrib a , e s t a cla s e t ie n e d o s
m é t o d o s a d ico n a le s q u e p o d ría s q u e re r u t iliza r: g e t Ch e c k b o x Gro u p ( ) y
s e t Ch e c k b o x Gro u p ( ) . Ju n t o co n e l s e n cillo co n s t ru ct o r Ce ckb o xGro u p u t iliza d o e n e l
có d ig o d e e je m p lo , Ch e ckb o xGro u p t a m b ié n d e fin e lo s s ig u ie n t e s m é t o d o s :
g e t Cu rre n t ( ) y s e t Cu rre n t ( ) . Es t o s m é t o d o s o b t ie n e n y ca m b ia n ( re s p e ct iva m e n t e ) e l
b o t ó n d e ra d io s e le ccio n a d o a ct u a lm e n t e .

Oz it o
Cómo Utilizar la Clase Choice
La cla s e Ch o ice p ro p o rcio n a u n a lis t a d e o p cio n e s a l e s t ilo m e n ú , a la q u e s e
a cce d e p o r u n b o t ó n d is t in t ivo . Cu a n d o e l u s u a rio e lig e u n ít e m d e la lis t a , la cla s e
Ch o ice g e n e ra u n e ve n t o Act io n .
La cla s e Ch o ice e s ú t il cu a n d o s e n e ce s it a m o s t ra r u n n ú m e ro d e a lt e rn a t iva s a u n a
ca n t id a d d e e s p a cio lim it a d a , y e l u s u a rio n o n e ce s it a ve r t o d a s la s a lt e rn a t iva s a l
m is m o t ie m p o . Ot ro n o m b re p o r e l q u e s e p o d ría co n o ce r e s t e e le m e n t o UI e s lis t a
d e s p le g a b le . Ot ra s fo rm a s d e p ro p o rcio n a r m ú lt ip le s a lt e rn a t iva s s o n ch e ckb o xe s ,
lis t s , y m e n u s .

Ab a jo t ie n e s u n a p p le t q u e t ie n e u n a lis t a d e s p le g a b le y u n a e t iq u e t a . Cu a n d o e l
u s u a rio e le g ie u n ít e m d e la lis t a , la e t iq u e t a ca m b ia p a ra re fle ja r e l ít e m e le g id o .
Ob s e rva q u e e l ín d ice d e l p rim e r ít e m d e u n a lis t a d e s p le g a b le e s 0 .
Ab a jo t ie n e s e l có d ig o q u e cre a la lis t a d e s p le g a b le y m a n e ja lo s e ve n t o s . ( Aq u í
t ie n e s e l p ro g ra m a co m p le t o . ) Ob s e rva q u e e l s e g u n d o p a rá m e t ro d e l m é t o d o
a c t io n ( ) ( q u e e s e l m is m o q u e e . a rg ) , e s la ca d e n a d e l ít e m s e le ccio n a d o .
//...Donde se definen las variables de ejemplar:
Choice choice; //pop-up list of choices

//...Donde ocurre la inicialización:


choice = new Choice();
choice.addItem("ichi");
choice.addItem("ni");
choice.addItem("san");
choice.addItem("yon");
label = new Label();
setLabelText(choice.getSelectedIndex(), choice.getSelectedItem());

. . .

public boolean action(Event e, Object arg) {


if (e.target instanceof Choice) {
setLabelText(choice.getSelectedIndex(), (String)arg);
return true;
}
return false;
}
}
Ju n t o co n e l m é t o d o u t iliza d o a rrib a , la cla s e Ch o ice d e fin e o t ro s m é t o d o s ú t ile s :
in t c o u n t I t e m s ( )
De vu e lve e l n ú m e ro d e ít e m s d e la lis t a .
S t rin g g e t I t e m ( in t )
De vu e lve la ca d e n a m o s t ra d a p o r e l ít e m e n e l ín d ice e s p e cifica d o .
v o id s e le c t ( in t )
S e le ccio n a e l ít e m d e l ín d ice e s p e cifica d o .
v o id s e le c t ( S t rin g )
S e le ccio n a e l ít e m q u e e s t á m o s t ra n d o la ca d e n a e s p e cifica d a .

Oz it o
Cómo Utilizar la Clase Dialog
El AWT p ro p o rcio n a s o p o rt e p a ra cu a d ro s d e d iá lo g o - - ve n t a n a s q u e s o n
d e p e n d ie n t e s d e o t ra s ve n t a n a s - - co n la cla s e Dia lo g . És t a p ro p o rcio n a u n a
s u b cla s e m u y ú t il File Dia lo g q u e p ro p o rcio n a cu a d ro s d e d iá lo g o s p a ra a yu d a r a l
u s u a rio a a b rir y g u a rd a r fich e ro s .
Lo ú n ico q u e d is t in g u e a lo s cu a d ro s d e d iá lo g o d e la s ve n t a n a s n o rm a le s ( q u e s o n
im p le m e n t a d a s co n o b je t o s Fra m e ) e s q u e e l cu a d ro d e d iá lo g o d e p e n d e d e a lg u n a
o t ra ve n t a n a ( u n Fra m e ) . Cu a n d o e s t a o t ra ve n t a n a e s d e s t ru id a , t a m b ié n lo s o n
s u s cu a d ro s d e d iá lo g o d e p e n d ie n t e s . Cu a n d o e s t a o t ra ve n t a n a e s m in ia t u riza d a
s u s cu a d ro s d e d iá lo g o d e s a p a re ce n d e la p a n t a lla . Cu a n d o e s t a o t ra ve n t a n a
vu e lve a s u e s t a d o n o rm a l, s u s cu a d ro s d e d iá lo g o vu e lve n a a p a re ce r e n la
p a n t a lla . El AWT p ro p o rcio n a a u t o m á t ica m e n t e e s t e co m p o rt a m ie n t o .
Co m o n o e xis t e u n API a ct u a lm e n t e q u e p e rm it a a lo s Ap p le t s e n co n t ra r la ve n t a n a
e n la q u e s e e s t á n e je cu t a n d o , e s t o s g e n e ra lm e n t e n o p u e d e n u t iliza r cu a d ro s d e
d iá lo g o . La e xce p ció n s o n lo s a p p le t s q u e t ra e n s u s p ro p ia s ve n t a n a s ( Fra m e s ) q u e
p u e d e n t e n e r cu a d ro s d e d iá lo g o d e p e n d ie n t e s d e e s a s ve n t a n a s . Po r e s t a ra zó n , e l
s ig u ie n t e a p p le t co n s is t e e n u n b o t ó n q u e t ra e u n a ve n t a n a q u e m u e s t ra u n cu a d ro
d e d iá lo g o .
Lo s cu a d ro s d e d iá lo g o p u e d e n s e r m o d a le s . Lo s cu a d ro s d e d iá lo g o m o d a le s
re q u ie re n la a t e n ció n d e l u s u a rio , p a ra e vit a r q u e e l u s u a rio h a g a n a d a e n la
a p lica ció n d e l cu a d ro d e d iá lo g o h a s t a q u e s e h a ya fin a liza d o co n é l. Po r d e fe ct o ,
lo s cu a d ro s d e d iá lo g o n o s o n m o d a le s - - e l u s u a rio p u e d e m a n t e n e rlo s y s e g u ir
t ra b a ja n d o co n o t ra s ve n t a n a s d e la a p lica ció n .
Aq u í t ie n e s e l có d ig o p a ra la ve n t a n a q u e m u e s t ra e l a p p le t a n t e rio r. Es t e có d ig o
p u e d e s e r e je cu t a d o co m o u n a a p lica ció n s o lit a ria o , co n la a yu d a d e la cla s e
Ap p le t Bu t t o n , co m o u n a p p le t . Aq u í s ó lo e s t á e l có d ig o q u e im p le m e n t a e l o b je t o
Dia lo g :
class SimpleDialog extends Dialog {
TextField field;
DialogWindow parent;
Button setButton;

SimpleDialog(Frame dw, String title) {


super(dw, title, false);
parent = (DialogWindow)dw;

...//Crea y añade componentes, como un conjunto de botones.

//Initialize this dialog to its preferred size.


pack();
}
public boolean action(Event event, Object arg) {
if ( (event.target == setButton)
| (event.target instanceof TextField)) {
parent.setText(field.getText());
}
field.selectAll();
hide();
return true;
}
}
El m é t o d o p a c k ( ) e n e l co n s t ru ct o r d e S im p le Dia lo g e s u n m é t o d o d e fin id o p o r la
cla s e Win d o w. ( Re cu e rd e q u e d ia lo g e s u n a s u b cla s e d e Win d o w) . El m é t o d o
p a c k ( ) re d im e n s io n a la ve n t a n a p a ra q u e t o d o s s u s co n t e n id o s t e n g a n s u t a m a ñ o
p re fe rid o o m ín im o ( d e p e n d ie n d o d e l co n t ro la d o r d e d is p o s ició n d e la ve n t a n a ) . En
g e n e ra l, la u t iliza ció n d e p a c k ( ) e s p re fe rib le a lla m a r a l m é t o d o re s iz e ( ) d e u n a
ve n t a n a , ya q u e p a c k ( ) d e ja q u e ca rg u e e l co n t ro la d o r d e d is p o s ició n co n la
d e cis ió n d e l t a m a ñ o d e la ve n t a n a , y é s t e e s m u y b u e n o a ju s t a n d o la s
d e p e n d e n cia s d e la p la t a fo rm a y o t ro s fa ct o re s q u e a fe ct a n a l t a m a ñ o d e lo s
co m p o n e n t e s .
Aq u í t ie n e s e l có d ig o q u e m u e s t ra e l cu a d ro d e d iá lo g o :
if (dialog == null) {
dialog = new SimpleDialog(this, "A Simple Dialog");
}
dialog.show();
Ju n t o co n lo s m é t o d o s u t iliza d o s e n e l p rim e r fra g m e n t o d e có d ig o , la cla s e Dia lo g
p ro p o rcio n a lo s s ig u ie n t e s m é t o d o s :
D ia lo g ( Fra m e , b o o le a n )
Ig u a l q u e e l co n s t ru ct o r u t iliza d o a rrib a , p e ro n o s e le ccio n a e l t it u lo d e la
ve n t a n a d e l cu a d ro d e d iá lo g o .
b o o le a n is Mo d a l( )
De vu e lve t ru e s i e l cu a d ro d e d iá lo g o e s m o d a l.
S t rin g g e t Tit le ( ) , S t rin g s e t Tit le ( S t rin g )
Ob ie n e n o ca m b ia n ( re s p e ct iva m e n t e ) e l t ít u lo d e l cu a d ro d e d iá lo g o .
b o o le a n is Re s iz a b le ( ) , v o id s e t Re s iz a b le ( b o o le a n )
En cu e n t ra o s e le ccio n a ( re s p e ct iva m e n t e ) s i e l t a m a ñ o d e la ve n t a n a d e l
cu a d ro d e d iá lo g o p u e d e ca m b ia rs e .

Oz it o
Cómo Utilizar la Clase Frame
La cla s e Fra m e p ro p o rcio n a ve n t a n a s p a ra lo s a p p le t s y la s a p lica cio n e s . Ca d a a p lica ció n
n e ce s it a a l m e n o s u n Fra m e ( Ma rco ) . S i u n a a p lica ció n t ie n e u n a ve n t a n a q u e d e b e ría d e p e n d e r
d e o t ra ve n t a n a - - d e s a p a re cie n d o cu a n d o la o t ra ve n t a n a s e m in im iza , p o r e je m p lo - - d e b e ría
u t iliza r u n Cu a d ro d e Diá lo g o e n ve z d e u n Fra m e p a ra la ve n t a n a d e p e n d ie n t e .
De s a fo rt u n a d a m e n t e , lo s a p p le t s n o p u e d e u t iliza r ca ja s d e d iá lo g o p o r a h o ra , p o r e s o u t iliza n
Fra m e s e n s u lu g a r.
La s p á g in a s Có m o u t iliza r la Cla s e Me n u y Có m o Ut iliza r la Cla s e Dia lo g s o n d o s d e la s m u ch a s
d e e s t e t u t o ria l q u e u t iliza n u n Fra m e .
Ab a jo t ie n e s e l có d ig o q u e u t iliza la d e m o s t ra ció n d e Me n ú s p a ra cre a r s u ve n t a n a ( u n a
s u b cla s e d e Fra m e ) y m a n e ja rla e n ca s o d e q u e e l u s u a rio cie rre la ve n t a n a .
public class MenuWindow extends Frame {
boolean inAnApplet = true;
TextArea output;

public MenuWindow() {
...//Este constructor llama implícitamente al constructor sin argumentos
//de la clase Frame y añade los componentes de la ventana
}

public boolean handleEvent(Event event) {


if (event.id == Event.WINDOW_DESTROY) {
if (inAnApplet) {
dispose();
} else {
System.exit(0);
}
}
return super.handleEvent(event);
}

. . .

public static void main(String args[]) {


MenuWindow window = new MenuWindow();
window.inAnApplet = false;

window.setTitle("MenuWindow Application");
window.pack();
window.show();
}
}
El m é t o d o p a c k ( ) , q u e e s lla m a d o d e s d e e l m é t o d o m a in ( ) , e s t á d e fin id o p o r la cla s e
Win d o ws . Pu e d e s ve r Có m o Ut iliza r la Cla s e Dia lo g p a ra m á s in fo rm a ció n s o b re p a c k ( ) .

Ju n t o co n e l co n s t ru ct o r s in a rg u m e n t o s d e Fra m e u t iliza d o im p lícit a m e n t e p o r e l co n s t ru ct o r d e


Me n u Win d o w, la cla s e Fra m e t a m b ié n p ro p o rcio n a u n co n s t ru ct o r co n u n a rg u m e n t o . El
a rg u m e n t o e s u n S t rin g q u e e s p e cifica e l t ít u lo d e la ve n t a n a d e l Fra m e .
Ot ro s m é t o d o s in t e re s a n t e s p ro p o rcio n a d o s p o r la cla s e Fra m e s o n :
S t rin g g e t Tit le ( ) y v o id s e t Tit le ( S t rin g )
De vu e lve n o ca m b ia n ( re s p e ct iva m e n t e ) e l t it u lo d e la ve n t a n a .
I m a g e g e t I c o n I m a g e ( ) y v o id s e t I c o n I m a g e ( I m a g e )
De vu e lve n o ca m b ia n ( re s p e ct iva m e n t e ) la im a g e n m o s t ra d a cu a n d o s e m in im iza la
ve n t a n a .
Me n u Ba r g e t Me n u Ba r( ) y v o id s e t Me n u Ba r( Me n u Ba r)
De vu e lve n o s e le ccio n a n ( re s p e ct iva m e n t e ) la b a rra d e m e n ú s d e e s e Fra m e .
v o id re m o v e ( Me n u Co m p o n e n t )
Elim in a la b a rra d e m e n ú e s p e cifica d a d e l Fra m e .
b o o le a n is Re s iz a b le ( ) y v o id s e t Re s iz a b le ( b o o le a n )
De vu e lve n o s e le ccio n a n s i e l u s u a rio p u e d e ca m b ia r o n o e l t a m a ñ o d e la ve n t a n a .
in t g e t Cu rs o rTy p e ( ) y v o id s e t Cu rs o r( in t )
Ob t ie n e la im a g e n a ct u a l d e l cu rs o r o s e le ccio n a la im a g e n d e l cu rs o r. El cu rs o r d e b e s e r
e s p e cifica d o co m o u n o d e lo s t ip o s d e fin id o s e n la cla s e Fra m e . Lo s t ip o s p re d e fin id o s s o n
:
❍ Fra m e . DEFAULT_ CURS OR,

❍ Fra m e . CROS S HAIR_ CURS OR,

❍ Fra m e . HAND_ CURS OR,

❍ Fra m e . MOVE_ CURS OR,

❍ Fra m e . TEXT_ CURS OR,

❍ Fra m e . WAIT_ CURS OR,

❍ Fra m e . X_ RES IZE_ CURS OR, d o n d e X e s S W, S E, NW, NE, N, S , W, o E.

Oz it o
Cómo Utilizar la Clase Label
La cla s e La b e l p ro p o rcio n a u n a fo rm a s e n cilla d e co lo ca r u n t e xt o n o s e le ccio n a b le
e n e l GUI d e l p ro g ra m a . La s Et iq u e t a s ( La b e ls ) e s t á n a lin e a d a s a la izq u ie rd a d e s u
á re a d e d ib u jo , p o r d e fe ct o . S e p u e d e e s p e cifica r q u e s e ce n t re n o s e a lin e e n a la
d e re ch a e s p e cifica n d o La b e l. CENTER o La b e l. RIGHT e n s u co n s t ru ct o r o e n e l
m é t o d o s e t Alig n m e n t ( ) . Co m o co n t o d o s lo s Co m p o n e n t e s , t a m b ié n s e p u e d e
e s p e cifica r e l co lo r y la fu e n t e d e la e t iq u e t a . Pa ra m á s in fo rm a ció n s o b re e l t ra b a jo
co n fu e n t e s , p u e d e ve r Ob t e n e r In fo rm a ció n s o b re la Fu e n t e : Fo n t Me t rics .

La s e t iq u e t a s s e u t iliza n e n t o d o s lo s e je m p lo s d e e s t e t u t o ria l. Po r e je m p lo e l
a p p le t d e Có m o Ut iliza r la Cla s e Ch o ice , u t iliza u n a e t iq u e t a q u e m u e s t ra
in fo rm a ció n s o b re e l ít e m q u e e s t á a ct u a lm e n t e s e le ccio n a d o .
Aq u í t ie n e s u n a p p le t q u e m u e s t ra la a lin e a ció n d e la s e t iq u e t a s :
El a p p le t cre a t re s e t iq u e t a s , ca d a u n a co n u n a a lin e a ció n d ife re n t e . S i e l á re a d e
d is p la y d e ca d a e t iq u e t a fu e ra ig u a l a la a n ch u ra d e l t e xt o d e la e t iq u e t a , n o s e
ve ría n in g u n a d ife re n cia e n la a lin e a ció n d e la s e t iq u e t a s . El t e xt o d e ca d a e t iq u e t a
s ó lo s e m o s t ra rá e n e l e s p a cio d is p o n ib le . S in e m b a rg o , e s t e a p p le t h a ce q u e ca d a
e t iq u e t a s e a t a n a n ch a co m o e l a p p le t , q u e e s m a yo r q u e cu a lq u ie ra d e la s
e t iq u e t a s . Co m o re s u lt a d o , p u e d e ve r u n a p o s ició n h o rizo n t a l d ife re n t e e n e l d ib u jo
d e l t e xt o d e la s t re s e t iq u e t a s . Aq u í t ie n e s e l p ro g ra m a co m p le t o .

Ab a jo t ie n e s e l có d ig o q u e u t iliza e l a p p le t p a ra cre a r la s e t iq u e t a s y s e le ccio n a r s u


a lin e a ció n . Pa ra p ró p o s it o s d e e n s e ñ a n za e s t e a p p le t u t iliza lo s t re s co n s t ru ct o re s
d e la cla s e La b e l.
Label label1 = new Label();
label1.setText("Right");
Label label2 = new Label("Center");
label2.setAlignment(Label.CENTER);
Label label3 = new Label("RIGHT", Label.RIGHT);

Oz it o
Cómo Utilizar la Clase List
La cla s e Lis t p ro p o rcio n a u n á re a d e s p le g a b le q u e co n t ie n e ít e m s s e le ccio n a b le s ( u n o
p o r lín e a ) . Ge n e ra lm e n t e , u n u s u a rio s e le ccio n a u n a o p ció n p u ls a n d o s o b re e lla , e
in d ica q u e u n a a cció n d e b e o cu rrir cu a n d o h a ce d o b le - click s o b re e lla o p u ls a la t e cla
Re t u rn . La s Lis t a s ( Lis t s ) p u e d e n p e rm it ir m ú lt ip le s s e le ccio n e s o s ó lo u n a s e le cció n a
la ve z. Ot ro s co m p o n e n t e s q u e p é rm it e n a l u s u a rio e le g ir e n t re va ria s o p cio n e s s o n
ch e ckb o x, ch o ice , y m e n u .
Ab a jo t ie n e s u n a p p le t q u e m u e s t ra d o s lis t a s , ju n t o co n u n á re a d e t e xt o q u e m u e s t ra
in fo rm a ció n s o b re lo s e ve n t o s . La lis t a s u p e rio r ( q u e s o n n ú m e ro s e n e s p a ñ o l) p e rm it e
m ú lt ip le s s e le ccio n e s . La in fe rio r ( q u e s o n n u m e ro s it a lia n o s ) s ó lo p e rm it e u n a
s e le cció n . Ob s e rva q u e e l p rim e r ít e m d e ca d a lis t a t ie n e ín d ice 0 .
Ab a jo t ie n e s e l có d ig o q u e cre a la s lis t a s y m a n e ja s u s e ve n t o s . ( Aq u í t ie n e s e l
p ro g ra m a co m p le t o . ) Ob s e rva q u e e l d a t o e . a rg p a ra lo s e n ve n t o s Act io n ( q u e e s
p a s a d o d e n t ro d e l m é t o d o a c t io n ( ) co m o s u s e g u n d o a rg u m e n t o ) e s e l n o m b re d e l
ít e m a ct iva d o , s im ila r a lo s a rg u m e n t o s p a ra lo s e ve n t o s Act io n d e o t ro s co m p o n e n t e s
co m o lo s b o t o n e s e in clu s o lo s m e n ú s . S in e m b a rg o , e l d a t o e . a rg p a ra lo s e ve n t o s q u e
n o s o n Act io n d e la lis t a e s e l ín d ice d e l ít e m s e le ccio n a d o .
...//Donde se declaren las variables de ejemplar:
TextArea output;
List spanish, italian;

...//Donde ocurra la inicialización:

//Primero construye la lista que permite seleciones múltiples.


spanish = new List(4, true); //el número 4 es visible al inicializar
spanish.addItem("uno");
spanish.addItem("dos");
spanish.addItem("tres");
spanish.addItem("cuatro");
spanish.addItem("cinco");
spanish.addItem("seis");
spanish.addItem("siete");

//Construye la segunda lista, que permite sólo una selección a la vez.


italian = new List(); //Por defecto ninguno es visible, sólo uno
seleccionable
italian.addItem("uno");
italian.addItem("due");
italian.addItem("tre");
italian.addItem("quattro");
italian.addItem("cinque");
italian.addItem("sei");
italian.addItem("sette");
. . .

public boolean action(Event e, Object arg) {


if (e.target instanceof List) {
String language = (e.target == spanish) ?
"Spanish" : "Italian";
output.appendText("Action event occurred on \""
+ (String)arg + "\" in "
+ language + ".\n");
}
return true;
}

public boolean handleEvent(Event e) {


if (e.target instanceof List) {
List list = (List)(e.target);
String language = (list == spanish) ?
"Spanish" : "Italian";
switch (e.id) {
case Event.LIST_SELECT:
int sIndex = ((Integer)e.arg).intValue();
output.appendText("Select event occurred on item #"
+ sIndex + " (\""
+ list.getItem(sIndex) + "\") in "
+ language + ".\n");
break;
case Event.LIST_DESELECT:
int dIndex = ((Integer)e.arg).intValue();
output.appendText("Deselect event occurred on item #"
+ dIndex + " (\""
+ list.getItem(dIndex) + "\") in "
+ language + ".\n");
}
}
return super.handleEvent(e);
}
Ju n t o co n lo s d o s co n s t ru ct o re s y lo s m é t o d o s a d d I t e m ( ) y g e t I t e m ( ) m o s t ra d o s
a rrib a , la cla s e Lis t p ro p o rcio n a lo s s ig u ie n t e s m é t o d o s :
in t c o u n t I t e m s ( )
De vu e lve e l n ú m e ro d e o p cio n e s d e la Lis t a .
S t rin g g e t I t e m ( in t )
De vu e lve la ca d e n a m o s t ra d a p o r la o p ció n d e l ín d ice e s p e cifica d o .
v o id a d d I t e m ( S t rin g , in t )
Añ a d e la o p ció n e s p e cifica d a e n e l ín d ice e s p e cifica d o .
v o id re p la c e I t e m ( S t rin g , in t )
Re e m p la za la o p ció n e l ín d ice e s p e cifica d o .
v o id c le a r( ) , v o id d e lI t e m ( in t ) , y v o id d e lI t e m s ( in t , in t )
Bo rra n u n a o m á s o p cio n e s d e la lis t a . El m é t o d o c le a r( ) va cía la lis t a . El m é t o d o
d e lI t e m ( ) b o rra la o p ció n e s p e cifica d a d e la lis t a . El m é t o d o d e lI t e m s ( ) b o rra
la s o p cio n e s q u e e xis t a n e n t re lo s ín d ice s e s p e cifica d o s ( a m b o s in clu id o s ) .
in t g e t S e le c t e d I n d e x ( )
De vu e lve e l ín d ice d e la o p ció n s e le ccio n a e n la lis t a . De vu e lve - 1 s i n o s e h a
s e le ccio n a d o n in g u n a o p ció n o s i s e h a s e le ccio n a d o m á s d e u n a .
in t [ ] g e t S e le c t e d I n d e x e s ( )
De vu e lve lo s ín d ice s d e la s o p cio n e s s e le ccio n a d a s .
S t rin g g e t S e le c t e d I t e m ( )
Ig u a l g e t S e le c t e d I n d e x ( ) , p e ro d e vu e lve e l s t rin g co n e l t e xt o d e la o p ció n e n
lu g a r d e s u ín d ice . De ve lve n u ll s i n o s e h a s e le ccio n a d o n in g u n a o p ció n o s i s e h a
s e le ccio n a d o m á s d e u n a .
S t rin g [ ] g e t S e le c t e d I t e m s ( )
Ig u a l g e t S e le c t e d I n d e x e s ( ) , p e ro d e vu e lve lo s s t rin g s co n e l t e xt o d e la s
o p cio n e s s e le ccio n a d a s e n lu g a r d e s u s ín d ice s .
v o id s e le c t ( in t ) , v o id d e s e le c t ( in t )
S e le ccio n a n o d e s e le ccio n a n la o p ció n co n e l ín d ice e s p e cifica d o .
b o o le a n is S e le c t e d ( in t )
De vu e lve t ru e s i la o p ció n co n e l ín d ice e s p e cifica d o e s t á s e le ccio n a d a .
in t g e t Ro w s ( )
De vu e lve e l n ú m e ro d e lín e s vis ib le s e n la lis t a .
b o o le a n a llo w s Mu lt ip le S e le c t io n s ( ) , b o o le a n s e t Mu lt ip le S e le c t io n s ( )
De vu e lve o ca m b ia s i la lis t a p e rm it e s e le ccio n e s m ú lt ip le s o n o .
in t g e t Vis ib le I n d e x ( ) , v o id m a k e Vis ib le ( in t ) ,
El m é t o d o m a k e Vis ib le ( ) fu e rza a q u e o p ció n s e le ccio n a d o s e a vis ib le . El m é t o d o
g e t Vis ib le I n d e x ( ) o b t ie n e e l in d ice d e la o p ció n q u e s e h izo vis ib le la ú lt im a ve z
co n e l m é t o d o m a k e Vis ib le ( ) .

Oz it o
Cómo Utilizar la Clase Menu
El s ig u ie n t e a p p le t m u e s t ra m u ch a s d e la s ca ra ct e ris t ica s d e lo s m e n ú s q u e q u e rra s u t iliza r. La
ve n t a n a t ie n e u n a b a rra d e m e n ú q u e co n t ie n e cin co m e n ú s . Ca d a m e n ú co n t ie n e u n a o m á s
o p cio n e s . El Me n ú 1 e s u n m e n ú d e a rra n q u e , p u ls a n d o la lín e a p u n t e a d a , e l u s u a rio cre a u n a
n u e va ve n t a n a q u e co n t ie n e la s m is m a s o p cio n e s d e m e n ú q u e e l m e n u 1 . ( Act u a lm e n t e , lo s
m e n ú s d e a rra n q u e s o lo e s t á n d is p o n ib le s p a ra la p la t a fo rm a S o la ris , n o p a ra Win d o ws 9 5 / NT o
Ma cOS . ) El m e n ú 2 s ó lo co n t ie n e u n b o t ó n d e ra d io . El m e n ú 3 co n t ie n e u n s e p a ra d o r e n t re s u
s e g u n d a y t e rce ra o p cio n e s . El m e n ú 4 co n t ie n e u n s u b m e n ú . El m e n ú 5 e s la ve n t a n a d e l m e n ú
d e a yu d a , q u e d e p e n d ie n d o d e la p la t a fo rm a ) g e n e ra lm e n t e s ig n ifica q u e s e s it ú a a la izq u ie rd a .
Cu a n d o e l u s u a rio p u ls a e n cu a lq u ie r o p ció n d e l m e n ú la ve n t a n a m u e s t ra u n a ca d e n a d e t e xt o
in d ica n d o q u é o p ció n h a s id o p u ls a d a y e n q u e m e n ú s e e n cu e n t ra .
La ra zó n p o r la q u e e l a p p le t t ra e u n a ve n t a n a p a ra d e m o s t ra r lo s m e n ú s e s q u e e l AWT lím it a
d o n d e s e p u e d e n u t iliza r lo s m e n ú s . Lo s m e n ú s s ó lo p u e d e n e xis t ir e n la s b a rra s d e m e n ú , y la s
b a rra s d e m e n ú s ó lo e s t á n d is p o n ib le s e n la s ve n t a n a s ( e s p e cifica m e n t e , e n lo s Fra m e s ) .
S i lo s m e n ú s n o e s t á n d is p o n ib le s o n o s o n a p ro p ia d o s e n t u p ro g ra m a d e b e ría s b u s ca r o t ra s
fo rm a s d e p re s e n t a r o p ció n e s a l u s u a rio : ch e ckb o x, ch o ice , y lis t .
La fu n cio n a lid a d d e lo s m e n ú s d e l AWT la p ro p o rcio n a n va ria s cla s e s . Es t a s cla s e s n o d e s cie n d e n
d e la cla s e Co m p o n e n t , ya q u e m u ch a s p la t a fo rm a s p o n e n m u ch o s lím it e s a la s ca p a cid a d e s d e
lo s m e n ú s . En s u lu g a r, la s cla s e s m e n u d e s cie n d e n d e la cla s e Me n u Co m p o n e n t . El AWT
p ro p o rcio n a la s s ig u ie n t e s s u b cla s e s d e Me n u Co m p o n e n t p a ra s o p o rt a r lo s m e n ú s :
Me n u It e m
Ca d a o p ció n d e u n m e n ú e s t á re p re s e n t a d a p o r u n o b je t o Me n u It e m .
Ch e ckb o xMe n u It e m
Ca d a o p ció n d e u n m e n ú q u e co n t ie n e u n b o t ó n d e ra d io e s t á re p re s e n t a d a p o r u n o b je t o
Ch e ckb o xMe n u It e m . Ch e ckb o xMe n u It e m e s u n a s u b cla s e d e Me n u It e m .
Me n u
Ca d a m e n ú e s t á re p re s e n t a d o p o r u n o b je t o Me n u . Es t a cla s e e s t á im p le m e n t a d a co m o u n a
s u b cla s e d e Me n u It e m p a ra s e p u e d a n cre a r s u b m e n ú s fá cilm e n t e a ñ a d ie n d o u n m e n ú a
o t ro .
Me n u Ba r
La s b a rra s d e m e n ú e s t á n im p le m e n t a d a s p o r la cla s e Me n u Ba r. Es t a cla s e re p re s e n t a u n a
n o ció n d e p e n d ie n t e d e la p la t a fo rm a d e u n g ru p o d e m a n ú s a d h e rid o s a u n a ve n t a n a . La s
b a rra s d e m e n ú n o n o p u e d e n u t iliza rs e co n la cla s e Pa n e l.
Pa ra p o d e r co n t e n e r u n Me n u Co m p o n e n t , u n o b je t o d e b e a d h e rirs e a l in t e rfa ce Me n u Co n t a in e r.
La s cla s e s Fra m e , Me n u y Me n u Ba r s o n la s ú n ica s d e l a WT q u e a ct u a lm e n t e im p le m e n t a n
Me n u Co n t a in e r.
Aq u í t ie n e s e l có d ig o p a ra la ve n t a n a d e l a p p le t a n t e rio r. Es t o có d ig o p u e d e e je cu t a rs e co m o u n a
a p lica ció n s o lit a ria o , co n la a yu d a d e la cla s e Ap p le t Bu t t o n , co m o u n a p p le t . Aq u í t ie n e e l có d ig o
q u e t ra t a co n lo s m e n ú s :
public class MenuWindow extends Frame {
. . .
public MenuWindow() {
MenuBar mb;
Menu m1, m2, m3, m4, m4_1, m5;
MenuItem mi1_1, mi1_2, mi3_1, mi3_2, mi3_3, mi3_4,
mi4_1_1, mi5_1, mi5_2;
CheckboxMenuItem mi2_1;

...//Añade la salida mostrada a esta ventana...

//Construye la barra de menú.


mb = new MenuBar();
setMenuBar(mb);

//Construye el primer menú en la barra de menñus.


//Especificando elsegundo argumento como ture
//hace de este un menú de arranque.
m1 = new Menu("Menu 1", true);
mb.add(m1);
mi1_1 = new MenuItem("Menu Item 1_1");
m1.add(mi1_1);
mi1_2 = new MenuItem("Menu Item 1_2");
m1.add(mi1_2);

//Construye el menñu de ayuda.


m5 = new Menu("Menu 5");
mb.add(m5); //Sólo seleccionandolo no funciona, debe añadirlo.
mb.setHelpMenu(m5);
mi5_1 = new MenuItem("Menu Item 5_1");
m5.add(mi5_1);
mi5_2 = new MenuItem("Menu Item 5_2");
m5.add(mi5_2);

//Construye el segundo menú en la barra de menús.


m2 = new Menu("Menu 2");
mb.add(m2);
mi2_1 = new CheckboxMenuItem("Menu Item 2_1");
m2.add(mi2_1);

//Construye el tercer menú en la barra de menús.


m3 = new Menu("Menu 3");
mb.add(m3);
mi3_1 = new MenuItem("Menu Item 3_1");
m3.add(mi3_1);
mi3_2 = new MenuItem("Menu Item 3_2");
m3.add(mi3_2);
m3.addSeparator();
mi3_3 = new MenuItem("Menu Item 3_3");
m3.add(mi3_3);
mi3_4 = new MenuItem("Menu Item 3_4");
mi3_4.disable();
m3.add(mi3_4);

//Construye el cuarto menú en la barra de menús.


m4 = new Menu("Menu 4");
mb.add(m4);
m4_1 = new Menu("Submenu 4_1");
m4.add(m4_1);
mi4_1_1 = new MenuItem("Menu Item 4_1_1");
m4_1.add(mi4_1_1);
}
. . .
public boolean action(Event event, Object arg) {
String str = "Action detected";

if (event.target instanceof MenuItem) {


MenuItem mi=(MenuItem)(event.target);
str += " on " + arg;
if (mi instanceof CheckboxMenuItem) {
str += " (state is "
+ ((CheckboxMenuItem)mi).getState()
+ ")";
}
MenuContainer parent = mi.getParent();
if (parent instanceof Menu) {
str += " in " + ((Menu)parent).getLabel();
} else {
str += " in a container that isn't a Menu";
}
}
str += ".\n";
...//Muestra la Cadena de texto en al área de salida...
return false;
}

Oz it o
Cómo Utilizar la Clase Panel
La cla s e Pa n e l e s u n a s u b cla s e d e Co n t a in e r p a ra p ro p ó s it o s g e n e ra le s . S e p u e d e u t iliza r t a l y
co m o e s p a ra co n t e n e r co m p o n e n t e s , o s e p u e d e d e fin ir u n a s u b cla s e p a ra re a liza r a lg u n a fu n ció n
e s p e cífica , co m o e l m a n e jo d e e ve n t o s p a ra lo s o b je t o s co n t e n id o s e n e l Pa n e l.
La cla s e Ap p le t e s u n a s u b cla s e d e Pa n e l co n b ro ch e s e s p e cia le s p a ra e je cu t a rs e e n u n n a ve g a d o r
o u n vis u a lia d o r d e a p p le t s . S ie m p re q u e ve a u n p ro g ra m a q u e s e p u e d e e je cu t a r t a n t o co m o u n
a p p le t co m o u n a a p lica ció n , e l t ru co e s t á e n q u e d e fin e u n a s u b cla s e d e a p p le t , p e ro n o u t iliza
n in g u n a d e la s ca p a cid a d e s e s p e cia le s d e l Ap p le t , u t iliza n d o s ó lo lo s m é t o d o s h e re d a d o s d e la
cla s e Pa n e l.
Aq u í t ie n e s u n e je m p lo d e u t iliza ció n d e u n e je m p la r d e Pa b e l p a ra co n t e n e r a lg u n o s
Co m p o n e n t e s :
Panel p1 = new Panel();
p1.add(new Button("Button 1"));
p1.add(new Button("Button 2"));
p1.add(new Button("Button 3"));
Aq u í t ie n e u n e je m p lo d e u n a s u b cla s e d e Pa n e l q u e d ib u ja u n m a rco a lre d e d o r d e s u s co n t e n id o s .
Va ria s ve rs io n e s d e e s t a cla s e s e u t iliza n e n lo s e je m p lo s 1 y 2 d e la p á g in a Dib u ja r fig u ra s .
class FramedArea extends Panel {
public FramedArea(CoordinatesDemo controller) {
...//Selecciona el controlador de disposición.
//Añade componentes a este panel...
}

//Asegura que no se han situado componentes en la parte superior del Frame.


//Los valores de inset fueron determinados por ensayo y error.
public Insets insets() {
return new Insets(4,4,5,5);
}

//Dibuja el marco a los lados del Panel.


public void paint(Graphics g) {
Dimension d = size();
Color bg = getBackground();

g.setColor(bg);
g.draw3DRect(0, 0, d.width - 1, d.height - 1, true);
g.draw3DRect(3, 3, d.width - 7, d.height - 7, false);
}
}
Mu ch o s d e lo s e je m p lo s d e e s t a le cció n u t iliza n u n a s u b cla s e d e Ap p le t p a ra m a n e ja r lo s e ve n t o s
d e lo s co m p o n e n t e s q u e co t ie n e n . Po r e je m p lo , p u e d e s ve rlo s e n la p á g in a Có m o u t iliza r la Cla s e
Dia lo g . Pu e d e u t iliza r e l m a n e jo d e e ve n t o s d e e s t o s y o t ro s e je m p lo s co m o m o d e lo p a ra e l
m a n e jo d e lo s e ve n t o s d e s u s p ro p ia s s u b cla s e s d e Ap p le t o Pa n e l.

Oz it o
Cómo Utilizar la Clase Scrollbar
La s b a rra s d e d e s p la za m ie n t o t ie n e n d o s u s o s :
● Un a b a rra d e d e s p la za m ie n t o p u e d e a ct u a r co m o u n d e s liza d o r q u e e l u s u a rio
m a n ip u la p a ra s e le ccio n a r u n va lo r. Un e je m p lo d e e s t o e s t á e n e l p ro g ra m a
Co n ve rt e r d e la p á g in a La An a t o m ía d e u n Pro g ra m a b a s a d o e n GUI.
● La s b a rra s d e d e s p la za m ie n t o le p u e d e n a yu d a r a m o s t ra r u n a p a rt e d e u n a
re g ió n q u e e s d e m a s ia d o g ra n d e p a ra e l á re a d e d ib u jo . La s b a rra s d e
d e s p la za m ie n t o le p e rm it e n a l u s u a rio e le g ir e xa ct a m e n t e la p a rt e d e la re g ió n
q u e e s vis ib le . Aq u í t ie n e u n e je m p lo ( p o d ría t a rd a r u n p o co e n ca rg a rs e la
im a g e n ) :
Pa ra cre a r u n a b a rra d e d e s p la za m ie n t o , n e ce s it a s cre a r u n e je m p la r d e la cla s e
S cro llb a r. Ta m b ié n s e p u e d e n in icia liza r lo s s ig u ie n t e s va lo re s , o b ie n
e s p e cificá n d o lo s a l Co n s t ru ct o r d e S cro llb a r o lla m a n d o a l m é t o d o s e t Va lu e s ( )
a n t e s d e q u e la b a rra d e d e s p la za m ie n t o s e a vis ib le .
in t o rie n t a t io n
In d ica s i la b a rra d e d e s p la za m ie n t o d e b e s e r ve rt ica l u h o rizo n t a l. Es p e cifica d o
co n S c ro llb a r. HORI ZON TAL o S c ro llb a r. VERTI CAL.
in t v a lu e
El va lo r in icia l d e la b a rra d e d e s p la za m ie n t o . Pa ra b a rra s d e d e s p la za m ie n t o
q u e co n t ro la n u n á re a d e s p la za b le , e s t o s ig n ifica e l va lo r x ( p a ra la s b a rra s
h o rizo n t a le s , o e l va lo r y ( p a ra la s ve rt ica le s ) d e la p a rt e d e l á re a q u e e s
vis ib le cu a n d o e l u s u a rio la vis it a p o r p rim e ra ve z. Po r e je m p lo , e l a p p le t
a n t e rio r a rra n ca e n la s p o s icio n e s 0 t a n t o ve rt ica l co m o h o rizo n t a l y la p o rció n
d e im a g e n re p re s e n t a d a e m p ie za e n ( 0 , 0 ) .
in t v is ib le
El t a m a ñ o e n p ixe ls d e la p o rció n vis ib le d e l á re a d e s p la za b le . Es t e va lo r, s i s e
s e le ccio n a a n t e s d e q u e la b a rra d e d e s p la za m ie n t o s e a vis ib le , d e t e rm in a
cu a n t o s p ixe ls s e d e s p la za rá la im a g e n co n u n a p u ls a ció n e n la b a rra d e
d e s p la za m ie n t o ( p e ro n o e n e l b o t ó n ) . S e le ccio n a r e s t e va lo r d e s p u é s d e q u e la
b a rra d e d e s p la za m ie n t o s e a vis ib le n o t ie n e n in g ú n e fe ct o . De s p u é s d e q u e la
b a rra d e d e s p la za m ie n t o s e a vis ib le , s e d e b e ría u t iliza r e l m é t o d o
s e t P a g e I n c re m e n t ( ) p a ra o b t e n e r e l m is m o e fe ct o .
in t m in im u m
El va lo r m ín im o q u e p u e d e t e n e r la b a rra d e d e s p la za m ie n t o . Pa ra b a rra s d e
d e s p la za m ie n t o q u e co n t ro la n á re a s d e s p la za b le s e s t e va lo r n o rm a lm e n t e e s 0
( la p a rt e s u p e rio r izq u ie rd a d e l á re a ) .
in t m a x im u m
El va lo r m á xim o q u e p u e d e t e n e r la b a rra d e d e s p la za m ie n t o . Pa ra b a rra s d e
d e s p la za m ie n t o q u e co n t ro la n á re a s d e s p la za b le s e s t e va lo r n o rm a lm e n t e
e s : ( la a n ch u ra o a lt u ra t o t a l , e n p ixe ls , d e l co m p o n e n t e q u e e s t á s ie n d o
p a rcia lm e n t e re p re s e n t a d a ) - ( la a n ch u ra o a lt u ra vis ib le a ct u a lm e n t e d e l á re a
d e s p la za b le ) .
Aq u í t ie n e s e l có d ig o d e l a p p le t a n t e rio r. Es t e có d ig o d e fin e d o s cla s e s . La p rim e ra
e s u n a s e n cilla s u b cla s e d e Ca n va s ( S cro lla b le Ca n va s ) q u e d ib u ja u n a im a g e n . La
s e g u n d a e s u n a s u b cla s e d e Pa n e l ( Im a g e S cro lle r, q u e re a lm e n t e d e s cie n d e d e
Ap p le t ) q u e cre a y co n t e n ie n e u n S cro lla b le Ca n va s y d o s S cro llb a rs . Es t e p ro g ra m a
ilu s t ra u n o s p o co s d e t a lle s im p o rt a n t e s s o b re e l m a n e jo d e u n á re a d e s p a lza b le :
● El m a n e jo d e e ve n t o s p a ra u n a b a rra d e d e s p la za m ie n t o e s b a s t a n t e s e n cillo .
El p ro g a m a s o lo d e b e re s p o n d e r a lo s e ve n t o s d e d e s p la za m ie n t o g u a rd a n d o
lo s n u e vo s va lo re s d e la b a rra d e d e s p la za m ie n t o e n u n lu g a r a cce s ib le p a ra
q u e e l co m p o n e n t e p u e d a m o s t ra rs e d e n t ro d e l á re a d e s p la za b le , y lu e g o
lla m a r a l m é t o d o re p a in t ( ) d e l Co m p o n e n t e .
public boolean handleEvent(Event evt) {
switch (evt.id) {
case Event.SCROLL_LINE_UP:
case Event.SCROLL_LINE_DOWN:
case Event.SCROLL_PAGE_UP:
case Event.SCROLL_PAGE_DOWN:
case Event.SCROLL_ABSOLUTE:
if (evt.target == vert) {
canvas.ty = ((Integer)evt.arg).intValue();
canvas.repaint();
}
if (evt.target == horz) {
canvas.tx = ((Integer)evt.arg).intValue();
canvas.repaint();
}
}
return super.handleEvent(evt);
}
● El Co m p o n e n t e q u e s e m u e s t ra a s í m is m o d e n t ro d e u n á re a d e s p la za b le
p u e d e s e r m u y s e n cillo . To d o lo q u e n e ce s it a e s d ib u ja rs e a s í m is m o e n e l
o rig e n e s p e cifica d o p o r lo s va lo re s d e s u s b a rra s d e d e s p la za m ie n t o . Un
Co m p o n e n t e p u e d e ca m b ia r s u o rig e n ( y a s í n o t e n e r q u e ca m b ia r s u có d ig o d e
d ib u jo n o rm a l) , p o n ié n d o e l s ig u ie n t e có d ig o a l p rin cip io d e s u s m é t o d o s
p a in t ( ) o u p d a t e ( ) :
g.translate(-tx, -ty);
● Cu a n d o o cu rre e l d e s p la za m ie n t o , p ro b a b le m e n t e n o t a rá s p a rp a d e o e n e l á re a
d e d is p la y, S i n o s e q u ie re q u e e s t o o cu rra , s e n e ce s it a im p le m e n t a r e l m é t o d o
u p d a t e ( ) e n e l co m p o n e n t e re p re s e n t a d o , y p o s ib le m e n t e t a m b ié n e l d o b le
b u ffe r. Có m o h a ce r e s t o s e e xp lica e n la p á g in a Elim in a r e l Pa rp a d e o .
● S i e l á re a d e s p la za b le p u e d e re d im e n s io n a rs e , cu id a d o co n u n p ro b le m a có m u n
d e l d e s p la za m ie n t o . Ocu rre cu a n d o e l u s u a rio d e s p la za e l á re a h a cia a b a jo y la
d e re ch a y lu e g o a g ra n d a e l á re a . S i n o s e t ie n e cu id a d o , e l á ra m o s t ra rá u n
e s p a cio e n b la n co e n s u p a rt e in fe rio r d e re ch a . De s p u é s d e q u e e l u s u a rio
d e s p la ce y vu e lve a la p a rt e in fe rio r d e re ch a , e l e s p a cio e n b la n co n o e s t á m á s
a llí. Pa ra e vit a r m o s t ra r u n e s p a cio e n b la n co in n e ce s a rio , cu a n d o e l á re a
d e s p la za b le s e a g ra n d a d e b e d e s p la za r t a m b ié n e l o rig e n d e l Co m p o n e n t e p a ra
a p ro ve ch a r e l n u e vo e s p a cio d is p o n ib le . Aq u í t ie n e s u n e je m p lo :
int canvasWidth = canvas.size().width;

//Desplaza todo a la derecha si se está mostrando un espacio vacío


//en el lado derecho.
if ((canvas.tx + canvasWidth) > imageSize.width) {
int newtx = imageSize.width - canvasWidth;
if (newtx < 0) {
newtx = 0;

}
canvas.tx = newtx;

Oz it o
Cómo Utilizar las Clases TextArea y TextField
La s cla s e s Te xt Are a y Te xt Fie ld m u e s t ra n t e xt o s e le ccio n a b le y, o p cio n a lm e n t e ,
p e rm it e a l u s u a rio e d it a r e s e t e xt o . S e p u e d e n cre a r s u b cla s e s d e Te xt Are a y
Te xt Fie ld p a ra re a liza r va ria s t a re a s có m o co m p ro b a r lo s e rro re s d e la e n t ra d a .
Co m o co n cu a lq u ie r co m p o n e n t e , p u e d e e s p e cifica r lo s co lo re s d e fo n d o y d e
p rim e r p la n o y la fu e n t e u t iliza d a e n lo s ca m p o s y á re a d e t e xt o . S in e m b a rg o n o
s e p u e d e ca m b ia r s u a p a rie n cia b á s ica .
Es t a s d o s cla s e s , Te xt Are a y Te xt Fie ld s o n s u b cla s e s d e Te xt Co m p o n e n t . De e s t a
cla s e h e re d a n m é t o d o s q u e le s p e rm it e n ca m b ia r y o b t e n e r la s e le cció n a ct u a l,
p e rm it ir o d e s a ct iva r la e d ició n , o b t e n e r e l t e xt o s e le ccio n a d o a ct u a lm e n t e ( o t o d o
e l t e xt o ) , y m o d ifica r e l t e xt o .
Ab a jo t ie n e u n a p p le t q u e p rim e ro m u e s t ra u n Te xt Fie ld y lu e g o u n Te xt Are a . El
Te xt Fie ld e s e d it a b le ; y e l Te xt Are a n o . Cu a n d o e l u s u a rio p u ls a la t e cla Re t u rn e n
e l Ca m p o d e Te xt o , s u co n t e n id o s e co p ia d e n t ro d e l Áre a d e Te xt o y lu e g o lo
s e le ccio n a e n e l Ca m p o d e Te xt o .
Aq u í t ie n e s e l p ro g ra m a . Aq u í t ie n e s e l có d ig o q u e cre a , in icia liza , y m a n e ja
e ve n t o s d e l Ca m p o y e l Áre a d e t e xt o :
//Donde se definan las variables de Ejemplar:
TextField textField;
TextArea textArea;

public void init() {


textField = new TextField(20);
textArea = new TextArea(5, 20);
textArea.setEditable(false);

...//Añade los dos componentes al Panel...


}

public boolean action(Event evt, Object arg) {


String text = textField.getText();
textArea.appendText(text + "\n");
textField.selectAll();
return true;
}
La s u p e rcla s e Te xt Co m p o n e n t e d e Te xt Are a y Te xt Fie ld s u m in is t ra lo s m é t o d o s
g e t Te x t ( ) , s e t Te x t ( ) , s e t Ed it a b le ( ) , y s e le c t All( ) u t iliza d o s e n e l e je m p lo
a n t e rio r. Ta m b ié n s u m in is t ra lo s s ig u ie n t e s m é t o d o s : g e t S e le c t e d Te x t ( ) ,
is Ed it a b le ( ) , g e t S e le c t io n S t a rt ( ) , y g e t S e le c t io n En d ( ) . Ta m b ié n p ro p o rcio n a
u n m é t o d o s e le c t ( ) q u e p e rm it e s e le ccio n a r e l t e xt o e n t re la s p o s icio n e s d e in icio
y fin a l q u e s e e s p e cifiq u e n .
La cla s e Te xt Fie ld t ie n e cu a t ro co n s t ru ct o re s : Te x t Fie ld ( ) , Te x t Fie ld ( in t ) ,
Te x t Fie ld ( S t rin g ) , y Te x t Fie ld ( S t rin g , in t ) . El a rg u m e n t o e n t e ro e s p e cifica e l
n ú m e ro d e co lu m n a s d e l ca m p o d e t e xt o . El a rg u m e n t o S t rin g e s p e cifica e l t e xt o
m o s t ra d o in icia lm e n t e e n e l ca m p o d e t e xt o . La cla s e Te xt Fie ld t a m b ié n s u m in is t ra
lo s s ig u ie n t e s m é t o d o s :
in t g e t Co lu m n s ( )
De vu e lve e l n ú m e ro d e co lu m n a s d e l ca m p o d e t e xt o .
s e t Ec h o Ch a r( )
Act iva e l e co d e l ca ra ct e r, e s ú t il p a ra lo s ca m p o s d e Pa s s wo rd .
c h a r g e t Ec h o Ch a r( ) y b o o le a n e c h o Ch a rI s S e t ( )
Es t o s m é t o d o s le p e rm it e p re g u n t a r s o b re e l e co d e ca ra ct e re s .
Co m o la cla s e Te xt Fie ld , la cla s e Te xt Are a t ie n e cu a t ro co n s t ru ct o re s : Te x t Are a ( ) ,
Te x t Are a ( in t , in t ) , Te x t Are a ( S t rin g ) , y Te x t Are a ( S t rin g , in t , in t ) . Lo s
a rg u m e n t o s e n t e ro s e s p e cifica n e l n ú m e ro d e fila s y co lu m n a s ( re s p e ct iva m e n t e )
d e l á re a d e t e xt o . El a rg u m e n t o S t rin g e s p e cifica e l t e xt o m o s t ra d a in icia lm e n t e e n
e l á re a d e t e xt o .
La cla s e Te xt Are a s u m in is t ra e l m é t o d o a p p e n d Te x t ( ) u t iliza d o e n e l e je m p lo
a n t e rio r. Ta m b ié n s u m in is t ra e s t o s m é t o d o s :
in t g e t Ro w s ( ) , in t g e t Co lu m n s ( )
De vu e lve n e l n ú m e ro d e fila s y co lu m n a s d e l á re a d e t e xt o .
v o id in s e rt Te x t ( S t rin g , in t )
In s e rt a e l t e xt o e s p e cifica d o e n la p o s ició n in d ica d a .
v o id re p la c e Te x t ( S t rin g , in t , in t )
Re e m p la za e l t e xt o d e s d e la p o s ició n in icia l in d ica d a ( e l p rim e r e n t e ro ) h a s t a
la p o s ició n fin a l in d ica d a .

Oz it o
Detalles de la Arquitectura de Componetes
El AWT fu e d is e ñ a d o d e s d e e l p rin cip io p a ra t e n e r u n API in d e p e n d ie n t e d e la
p la t a fo rm a y a ú n a s ó p re s e rva e l a s p e ct o y e l co m p o rt a m ie n t o d e ca d a p la t a fo rm a .
Po r e je m p lo , e l AWT s ó lo t ie n e u n API p a ra lo s b o t o n e s ( p ro p o rcio n a d o p o r la cla s e
Bu t t o n ) , p e ro u n b o t ó n e s d ife re n t e e n u n m a cin t o s h o e n u n PC b a jo Win d o ws 9 5 .
El AWT co s ig u e e s t e o b je t ivo lig e ra m e n t e co n t ra d ict o rio p ro p o rcio n a n d o la cla s e
( co m p o n e n t ) q u e p ro p o rcio n a u n API in d e p e n d ie n t e d e la p la t a fo rm a p a ra
a s e g u ra rs e d e q u e u t iliza la s im p le m e n t a cio n e s e s p e cifica s d e la s p la t a fo rm a s , lo s
( p a re s ) . Pa ra s e r e s p e cifico s , ca d a cla s e co m p o n e n t e d e l AWT ( Co m p o n e n t ,
Me n u Co m p o n e n t , y s u s s u b cla s e s ) t ie n e u n a cla s e p a r e q u iva le n t e , y ca d a o b je t o
co m p o n e n t e t ie n e u n o b je t o p a r q u e co n t ro la e l a s p e ct o y co m p o rt a m ie n t o d e l
o b je t o .
Lo s p a re s d e lo s b o t o n e s s o n im p le m e n t a d o s e n cla s e s e s p e cifica s d e la s
p la t a fo rm a s q u e im p le m e n t a e l in t e fa ce Bu t t o n Pe e r d e ja va . a wt . p e e r. La cla s e
ja va . a wwt To o lkit d e fin e m é t o d o s q u e e lig e n e xa ct a m e n t e la cla s e s a u t iliza r p o r la
im p le m e n t a ció n d e l p a r.

Cómo se crean los Pares


Lo s Pa re s s o n cre a d o s ju s t o a n t e s d e q u e s u o b je t o co m p o n e n t e
co rre s p o n d ie n t e s e a d ib u ja d o p o r p rim e ra ve z. Po d ría s h a b e r o b s e rva d o
u n e fe ct o la t e ra r d e e s t o : e l t a m a ñ o d e u n co m p o n e n t e n o e s vá lid o
h a s t a d e s p u é s d e q u e e l co m p o n e n t e n o s e h a ya m o s t ra d o p o r p rim e ra
ve z.
Cu a n d o s e a ñ a d e u n co m p o n e n t e a u n co n t e n e d o r n o vis ib le ( u n
co n t e n e d o r s in p a r) , ju s t o a n t e s d e q u e e l co n t e n e d o r s e m u e s t re p o r
p rim e ra ve z, s u p a r, - - y lo s p a re s d e t o d o s lo s co m p o n e n t e s q u e
co n t ie n e - - s o n cre a d o s .
S in e m b a rg o , s i s e a ñ a d e u n co m p o n e n t e a u n co n t e n e d o r v is ib le ,
n e ce s it a s d e cirle e xp lícit a m e n t e a l AWT q u e cre e u n p a r p a ra e l
co m p o n e n t e . Pu e d e s h a ce r e s t o lla m a n d o a l m é t o d o v a lid a t e ( ) . Au n q u e
s e p u e d e lla m a r a e s t e m é t o d o d ire ct a m e n t e s o b re e l co m p o n e n t e q u e s e
e s t á a ñ a d ie n d o , n o rm a lm e n t e s e in vo ca s o b re e l co n t e n e d o r. La ra zó n
p a ra e s t o e s q u e lla m a r a v a lid a t e ( ) d e u n co n t e n e d o r ca u s a u n a
re a cció n e n ca d e n a - - t o d o s lo s co m p o n e t e s d e l co n t e n e d o r t a m b ié n
o b t ie n e n s u va lid a ció n . Po r e je m p lo , d e s p u é s d e a ñ a d ir co m p o n e n t e s a
u n o b je t o Ap p le t , s e p u e d e lla m a r e l m é t o d o v a lid a t e ( ) d e l Ap p le t , e l
cu a l cre a rá p a re s p a ra t o d o s lo s co m p o n e n t e s d e l Ap p le t .
Cómo manejan los Eventos los Pares
Lo s Pa re s im p le m e n t a n e l co m p o rt a m ie n t e o ( e , in d ire ct a m e n t e , e l
a s p e ct o ) d e lo s co m p o n e n t e s d e l UI p a ra re a ccio n a r a n t e lo s e ve n t o s d e l
u s u a rio . Po r e je m p lo , cu a n d o e l u s u a rio p u ls a u n b o t ó n , e l p a r re a ccio n a
a la p u ls a ció n y la lib e ra ció n d e l b o t ó n d e l ra t ó n h a cie n d o q u e e l b o t ó n
p a re zca q u e h a ca m b ia d o s u a s p e ct o y e n viá n d o e l e ve n t o Act io n a l
o b je t o Bu t t o n a p ro p ia d o .
En t e o ría , lo s p a re s e s t á n a l fin a l d e la ca d e n a d e e ve n t o s . Cu a n d o
o cu rre u n e ve n t o ( co m o u n a p u ls a ció n d e t e cla ) , e l Co m p o n e n t e p a ra e l
q u e s e h a g e n e ra d o e l e ve n t o o b t ie n e e l m a n e jo p a ra e l e ve n t o , y lu e g o
( s i e l co n t ro la d o r d e e ve n t o s d e l co m p o n e n t e d e vu e lve fa ls e ) e l
Co n t e n e d o r d e l Co m p o n e n t e ve e e l e ve n t o , y a s í s u ce s iva m e n t e .
De s p u é s d e q u e t o d o s lo s co m p o n e n t e s d e l á rb o l h a ya n t e n id o la
o p o rt u n id a d d e m a n e ja r e l e ve n t o ( y t o d o s s u s co n t ro la d o re s d e e ve n t o
h a ya n d e vu e lt o fa ls e ) , lle g a a l p a r y é s t e p u e d e ve r y re a ccio n a r a l
e ve n t o .
En la im p le m e n t a ció n a ct u a l, e l e s ce n a rio a n t e rio r e s ve rd a d p a ra la s
p u ls a cio n e s d e t e cla s p e ro n o p a ra lo s e ve n t o s d e l ra t ó n . Pa ra lo s
e ve n t o s d e ra t ó n , e l p a r e s e l p rim e ro e n ve r e l e ve n t o , y n o n e ce s it a
p a s a r t o d o s lo s e ve n t o s a l co m p o n e n t e . Pla n e a m o s h a ce r q u e lo s
e ve n t o s d e ra t ó n t ra b a je n d e la m is m a fo rm a q u e lo s d e l t e cla d o e n u n a
fu t u ra ve rs ió n .
Pa ra p ro ce s o s co m o p u ls a cio n e s d e t e cla s o d e l ra t ó n , lo s p a re s a lg u n a s
ve ce s g e n e ra l e ve n t o s d e n ive l s u p e rio r - - a ct io n , fo cu s , ch a n g e ,
m in im iza ció n d e ve n t a n a s , e t c. Es t o s e ve n t o s d e a lt o n ive l s e p a s a n a l
co m p o n e n t e re le va n t e p a ra s u m a n e jo .

Oz it o
Problemas más comunes con los Componentes (y
sus Soluciones)
P ro b le m a :¿ Có m o a u m e n t a r o d is m in u ir e l n ú m e ro d e co m p o n e n t e s d e u n
co n t e n e d o r?
● Pa ra a ñ a d ir u n co m p o n e n t e a u n co n t e n e d o r, s e u t iliza u n a d e la s t re s fo rm a s
d e l m é t o d o a d d ( ) d e la cla s e Co n t a in e r. Pu e d e s ve r Re g la s Ge n e ra le s p a ra e l
Us o d e Co m p o n e n t e s p a ra m á s in fo rm a ció n . Pa ra e lim in a r u n co m p o n e n t e d e
u n co n t e n e d o r, s e u t iliza n lo s m é t o d o s re m o v e ( ) o re m o v e All( ) d e la cla s e
Co n t a in e r. O s im p le m e n t e s e a ñ a d e e l co m p o n e n t e a o t ro co n t e n e d o r, y e s t o
e lim in a a u t o m á t ica m e n t e e l co m p o n e n t e d e s u co n t e n e d o r a n t e rio r.
P ro b le m a : ¡Mi co m p o n e n t e n o s e re p re s e n t a !
● ¿ Ha s a ñ a d id o e l co m p o n e n t e a u n co n t e n e d o r u t iliza n d o e l m é t o d o a d d ( )
co rre ct o p a ra e l co n t ro la d o r d e d is p o s ició n d e l co n t e n e d o r? Bo rd e rLa yo u t ( e l
co n t ro la d o r d e d is p o s ició n p o r d e fe ct o p a ra la s ve n t a n a s ) , fa lla
s ile n cio s a m e n t e s u s e a ñ a d e u n co m p o n e n t e lla m a n d o a la ve rs ió n d e u n
a rg u m e n t o d e a d d ( ) . Pu e d e s ve r la le cció n Dis t rib u ir lo s Co m p o n e n t e s d e n t ro
d e u n Co n t e n e d o r p a ra ve r e je m p lo s d e u t iliza ció n d e l m é t o d o a d d ( ) .
● S i n o e s t á s u t iliza n d o e l co n t ro la d o r d e d is p o s ició n p o r d e fe ct o , ¿ h a s cre a d o
s a t is fa ct o ria m e n t e u n e je m p la r d e l co n t ro la d o r d e d is p o s ició n co rre ct o y h a s
lla m a d o a l m é t o d o s e t La y o u t ( ) d e l co n t e n e d o r?
● S i s e h a a ñ a d id o co rre ct a m e n t e e l co m p o n e n t e p e ro e l co n t e n e d o r ya p o d ría
e s t a r vis ib le , ¿ h a s lla m a d o a l m é t o d o v a lid a t e ( ) d e l co n t e n e d o r d e s p u é s d e
a ñ a d ir e l co m p o n e n t e ?
● S i e l co m p o n e n t e e s u n co m p o n e n t e p e rs o n a liza d o ( u n a s u b cla s e Ca n va s , p o r
e je m p lo ) , ¿ im p le m e n t a lo s m é t o d o s m in im u m S iz e ( ) y p re fe rre d S iz e ( )
p a ra d e vo lve r e l t a m a ñ o co rre ct o d e l co m p o n e n t e ?
● S i n o u t iliza s u n co n t ro la d o r d e d is p o s ició n d e l AWT, o n o u t iliza s n in g u n o ,
¿ t ie n e e l co m p o n e n t e u n t a m a ñ o y u n a s co o rd e n a d a s ra zo n a b le s ? En
p a rt icu la r, s i s e u t iliza p o s icio n a m ie n t o a b s o lu t o ( s in co n t ro la d o r d e
d is p o s ició n ) , s e d e b e s e le ccio n a r e xp lícit a m e n t e e l t a m a ñ o d e s u s
co m p o n e n t e s , o n o s e m o s t ra rá n . Pu e d e s ve r Ha ce rlo s in Co n t ro la d o r d e
Dis p o s ició n .

P ro b le m a : Mi co m p o n e n t e p e rs o n a liza d o n o s e a ct u a liza cu a n d o d e b e ría .


● As e g u ra t e d e q u e s e lla m a a l m é t o d o re p a in t ( ) d e l co m p o n e n t e ca d a ve z q u e
la a p a rie n cia d e l co m p o n e n t e d e b a ca m b ia r. Pa ra lo s co m p o n e n t e s e s t a n d a rd ,
e s t o n o e s u n p ro b le m a , ya q u e e l có d ig o e s p e cifico d e la p la t a fo rm a t ie n e
cu id a d o d e t o d o e l d ib u jo d e lo s co m p o n e n t e s . S in e m b a rg o p a ra lo s
co m p o n e n t e s p e rs o n a liza d o s , t ie n e q u e lla m a r e xp lícit a m e n t e a l m é t o d o
re p a in t ( ) d e l co m p o n e n t e s ie m p re q u e d e b a ca m b ia r s u a p a rie n cia . La m a r a l
m é t o d o re p a in t ( ) d e l co n t e n e d o r d e l co m p o n e n t e n o e s s u ficie n t e . Pu e d e s
ve r Có m o Ut iliza r la Cla s e Ca n va s p a ra m á s in fo rm a ció n .

P ro b le m a : Mi co m p o n e n t e n o o b t ie n e e l e ve n t o XYZ.
● Co m p ru e b a s i e l co m p o n e n t e o b t ie n e a lg ú n e ve n t o . S i n o lo h a ce , a s e g u ra t e
d e q u e t e e s t á s re firie n d o a l co m p o n e n t e co rre ct o - - q u e h a e je m p la riza d o la
cla s e co rre ct a , p o r e je m p lo .
● As e g u ra t e d e q u e e l co m p o n e n t e p u e d a ca p t u ra r la cla s e d e e ve n t o s q u e s e
q u ie re ca p t u ra r. Po r e je m p lo , m u ch o s co m p o n e n t e s e s t a n d a rd n o ca p t u ra n
e ve n t o s d e l ra t ó n , p o r e s o e l AWT n o p u e d e g e n e ra r o b je t o s Eve n t p a ra e llo s .
¿ S e p u e d e u t iliza o t ro t ip o d e e ve n t o co m o ACTION_ EVENT ( m a n e ja d o p o r e l
m é t o d o a c t io n ( ) ) , e n s u lu g a r? S i n o e s a s í, t e p o d ría s ve r fo rza d o a
im p le m e n t a r u n a s u b cla s e d e Ca n va s ( o d e Pa n e l o Ap p le t ) p a ra q u e la cla s e
p u e d a ve r t o d o s lo s e ve n t o s q u e o cu rra n .
P ro b le m a : Mi a p lica ció n n o p u e d e o b t e n e r u n e ve n t o WINDOW_ DES TROY, p o r e s o
n o p u e d e ce rra r m i ve n t a n a ( o s a lir d e la a p lica ció n ) !
● En u n a s u b c la s e d e Fr a m e , im p le m e n t a e l m é t o d o h a n d le Ev e n t ( ) p a ra
q u e re a ccio n e a l e ve n t o WINDOW_ DES TROY. No s e p u e d e ca p t u ra r e ve n t o s
WINDOW_ DES TROY e n u n a s u b cla s e d e Pa n e l, p o r e je m p lo , ya q u e e l Fra m e
e s s u p e rio r e n e l á rb o l d e h e re n cia . Pa ra s a lir, u t ilice S y s t e m . e x it ( ) . Pa ra
d e s t ru ir la ve n t a n a , s e p u e d e lla m a r a d is p o s e ( ) o p u e d e h id e ( ) e l Fra m e y,
d e ja r d e u t iliza rlo a s e g u rá n d o s e d e q u e t o d a s la s re fe re n cia s s e p o n e n a n u ll.
P ro b le m a : To d o s e s t o s e je m p lo s s o n a p p le t s . ¿ Có m o p u e d o a p lica rlo a la s
a p lica cio n e s ?
● Exce p t o d o n d e s e h a a vis a d o , e n cu a lq u ie r lu g a r d e e s t a ru t a d o n d e ve a u n a
s u b cla s e d e la cla s e Ap p le t , s e p u e d e s u s t it u irla p o r u n a s u b cla s e d e la cla s e
Pa n e l, o s i la cla s e n o e s u t iliza d a co m o co n t e n e d o r , u n a s u b cla s e d e la cla s e
Ca n va s . En g e n e ra l, e s s e n cillo co n ve rt ir u n a p p le t e n u n a a p lica ció n , s ie m p re
q u e e l a p p le t n o u t ilice n in g u n a d e la s h a b ilid a d e s e s p e cia le s d e lo s a p p le t s
( co m o u t iliza r m é t o d o s d e fin id o s e n la cla s e Ap p le t ) .
Pa ra co n ve rt ir u n a p p le t e n u n a a p lica ció n , s e n e ce s it a a ñ a d ir u n m é t o d o
m a in ( ) q u e cre e u n e je m p la r d e u n a s u b cla s e d e Fra m e , cre e u n e je m p la r d e
u n a s u b cla s e d e Ap p le t ( o Pa n e l, o Ca n va s ) , a ñ a d e e l e je m p la r a l Fra m e , y
lu e g o lla m e a lo s m é t o d o in it ( ) y s t a rt ( ) d e l e je m p la r. La s u b cla s e Fra m e
d e b e ría t e n e r u n a im p le m e n t a ció n d e h a n d le Ev e n t ( ) q u e m a n e je e ve n t o s
WINDOW_ DES TROY d e la fo rm a a p ro p ia d a .
P ro b le m a : S ie m p re q u e e je cu t o u n a a p lica ció n Ja va co n u n GUI, o b t e n g o e s t e
m e n s a je :
Warning:
Cannot allocate colormap entry for default background
● Es t e m e n s a je s ó lo o cu rre e n s is t e m a s Mo t if. Ocu rre cu a n d o la lib re ría Mo t if e s
in icia lzia d a y e n cu e n t ra q u e n o h a y s it io e n e l co lo rm a p p o r d e fe ct o p a ra
a s ig n a r s u s co lo re s d e l GUI. La s o lu ció n e s e je cu t a r a p lica io n e s m á s p e q u e ñ a s
e n s u e s crit o rio . El s is t e m a d e e je cu ció n d e Ja va s e a d a p t a a s í m is m o a lo s
co lo re s d e la p a le t a p o r d e fe ct o , p e ro la lib re ría Mo t if e s m e n o s g e n e ro s a .
S i n o h a s vis t o a q u í t u p ro b le m a p u e d e s ve r Pro b le m a s m á s co m u n e s co n la
Dis p o s ició n y, p a ra lo s co m p o n e n t e s p e rs o n a liza d o s , Pro b le m a s m á s co m u n e s co n
lo s Grá fico s . Ta m b ié n p o d ría s a rro ja r lu z s o b re u n p ro b le m a le ye n d o De t a lle s d e la
Arq u it e ct u ra d e Co m p o n e n t e s .

Oz it o
Distribuir Componentes dentro de un Contenedor

Arrib a t ie n e s la s im á g e n e s d e d o s p ro g ra m a s , ca d a u n o d e e llo s m u e s t ra cin co


b o t o n e s . El có d ig o Ja va d e lo s p ro g ra m a s e s ca s i id é n t ico . ¿ En t o n ce s p o r q u é
p a re ce n t a n d ife re n t e s ? Po rq u e u t iliza n u n co n t ro la d o r d e d is p o s ició n d ife re n t e p a ra
co n t ro la r la d is t rib u ció n d e lo s b o t o n e s .
Un Co n t ro la d o r d e d is p o s ició n e s u n o b je t o q u e co n t ro la e l t a m a ñ o y p o s ició n d e
lo s co m p o n e n t e s d e u n co n t e n e d o r. Lo s co n t ro la d o re s d e d is p o s ició n s e a d h ie re n a l
in t e rfa ce La yo u t Ma n a g e r. Po r d e fe ct o , t o d o s lo s o b je t o s Co n t a in e r t ie n e u n o b je t o
La yo u t Ma n a g e r q u e co n t ro la s u d is t rib u ció n . Pa ra lo s o b je t o s d e la cla s e Pa n e l, e l
co n t ro la d o r d e d is p o s ició n p o r d e fe ct o e s u n e je m p la r d e la cla s e Flo wLa yo u t . Pa ra
lo s o b je t o s d e la cla s e Win d o w, e l co n t ro la d o r d e d is p o s ició n p o r d e fe ct o e s u n
e je m p la r d e la cla s e Bo rd e rLa yo u t .
Es t a le cció n cu e n t a có m o u t iliza r lo s co n t ro la d o re s d e d is p o s ició n q u e p ro p o rcio n a
e l AWT. Ta m b ié n le e n s e ñ a có m o e s crib ir s u p ro p io co n t ro la d o r d e d is p o s ició n .
In clu s o cu e n t a có m o h a ce rlo s in u t iliza r n in g ú n co n t ro la d o r d e d is p o s ició n ,
e s p e cifica n d o e l t a m a ñ o y p o s ició n a b s o lu t o s d e lo s co m p o n e n t e s . Fin a lm e n t e , e s t a
le cció n e xp lica a lg u n o s d e lo s p ro b le m a s m á s co m u n e s co n la d is p o s ició n y s u s
s o lu cio n e s .

Utilizar Controladores de Disposición


Aq u í e s d o n d e s e a p re n d e rá có m o u t iliza r lo s co n t ro la d o re s d e
d is p o s ició n . Es t a s e cció n le d a u n a s re g la s g e n e ra le s y u n a s in s t ru ccio n e s
d e t a lla d a s d e l u s o d e ca d a u n o d e lo s co n t ro la d o re s d e d is t rib u ció n
p ro p o rcio n a d o s p o r e l AWT.

Crear un Controlador de Disposición Personalizado


En ve z d e u t iliza r u n o d e lo s co n t ro la d o re s d e d is p o s ició n d e l AWT, s e
p u e d e cre a r u n o p e rs o n a liza d o . Lo s co n t ro la d o re s d e d is p o s ició n d e b e n
im p le m e n t a r e l in t e rfa ce La yo u t Ma n a g e r, q u e e s p e cifica cin co m é t o d o s
q u e t o d o co n t ro la d o r d e d is p o s ició n d e b e d e fin ir.

Hacerlo sin Controlador de Disposición (Posicionamiento Absoluto)


S e p u e d e n p o s icio n a r lo s co m p o n e n t e s s in u t iliza r u n co n t ro la d o r d e
d is p o s ició n . Ge n e ra lm e n t e , e s t a s o lu ció n s e u t iliza p a ra e s p e cifica r
p o s icio n a m ie n t o a b s o lu t o p a ra lo s co m p o n e n t e s , y s ó lo p a ra a p lica cio n e s
q u e s e e je cu t e n e n u n a ú n ica p la t a fo rm a . El p o s icio n a m ie n t o a b s o lu t o
fre cu e n t e m e n t e e s t á co n t ra in d ica d o p a ra lo s a p p le t s y o t ro s p ro g ra m a s
in d e p e n d ie n t e s d e la p la t a fo rm a , ya q u e e l t a m a ñ o d e lo s co m p o n e n t e s
p u e d e d ife rir d e u n a p la t a fo rm a a o t ra .

Problemas más Comunes con la Disposición de Componentes ( y


sus soluciones)
Alg u n o s d e lo s p ro b le m a s m á s co m u n e s co n la d is p o s ició n d e
co m p o n e n t e s s o n lo s co m p o n e n t e s q u e s e m u e s t ra n d e m a s ia d o
p e q u e ñ o s o n o s e m u e s t ra n . Es t a s e cció n le e xp lica co m o e lim in a r e s t o s
y o t ro s p ro b le m a s co m u n e s .

Oz it o
Utilizar los Controladores de Disposición
Ca d a co n t e n e d o r, t ie n e u n co n t ro la d o r d e d is p o s ició n p o r d e fe ct o - - u n o b je t o q u e
im p le m e n t a e l in t e rfa ce La yo u t Ma n a g e r. S i e l co n t ro la d o r p o r d e fe ct o d e u n
co n t e n e d o r n o s a t is fa ce s u s n e ce s id a d e s , p u e d e s re e m p la za rlo fá cilm e n t e p o r
cu a lq u ie r o t ro . El AWT s u m in is t ra va rio s co n t ro la d o re s d e d is p o s ició n q u e va n
d e s d e lo s m á s s e n cillo s ( Flo wLa yo u t y Grid La yo u t ) a lo s d e p ro p ó s it o g e n e ra l
( Bo rd e rLa yo u t y Ca rd La yo u t ) h a s t a e l u lt ra - fle xib le ( Grid Ba g La yo u t ) .

Es t a le cció n d a a lg u n a s re g la s g e n e ra le s p a ra e l u s o d e lo s co n t ro la d o re s d e
d is p o s ició n , le o fre ce u n a in t ro d u cció n a lo s co n t ro la d o re s d e d is p o s ició n
p ro p o rcio n a d o s p o r e l AWT, y cu e n t a có m o u t iliza r ca d a u n o d e e llo s . En e s t a s
p á g in a s e n co n t ra rá s a p p le t s q u e ilu s t ra n lo s co n t ro la d o re s d e d is p o s ició n . Ca d a
a p p le t t ra e u n a ve n t a n a q u e s e p u e d e re d im e n s io n a r p a ra ve r lo s e fe ct o s d e l
ca m b io d e t a m a ñ o e n la d is p o s ició n d e lo s co m p o n e n t e s .

Reglas Generales para el uso de Controladores de Disposición


Es t a s e cció n re s p o n d e a lg u n a s d e la s p re g u n t a s m á s fre cu e n t e s s o b re lo s
co n t ro la d o re s d e d is p o s ició n :
● ¿ Có m o p u e d o e le g ir u n co n t ro la d o r d e d is p o s ició n ?

● ¿ Có m o p u e d o cre a r u n co n t ro la d o r d e d is p o s ició n a s o cia d o co n u n


co n t e n e d o r, y d e cirle q u e e m p ie ce a t ra b a ja r?
● ¿ Có m o s a b e u n co n t ro la d o r d e d is p o s ició n lo s co m p o n e n t e s q u e
d e b e m a n e ja r?

Cómo Utilizar BorderLayout


Bo rd e rLa yo u t e s e l co n t ro la d o r d e d is p o s ició n p o r d e fe ct o p a ra t o d a s la s
ve n t a n a s , co m o Fra m e s y Cu a d ro s d e Diá lo g o . Ut iliza cin co á re a s p a ra
co n t e n e r lo s co m p o n e n t e s : n o rt h , s o u t h , e a s t , we s t , a n d ce n t e r ( n o rt e ,
s u r, e s t e , o e s t e y ce n t ro ) . To d o e l e s p a cio e xt ra s e s it ú a e n e l á re a
ce n t ra l. Aq u í t ie n e s u n a p p le t q u e s it ú a u n b o t ó n e n ca d a á re a .

Cómo Utilizar CardLayout


Ut iliza la cla s e Ca rd La yo u t cu a n d o t e n g a s u n á re a q u e p u e d a co n t e n e r
d ife re n t e s co m p o n e n t e s e n d is t in t o s m o m e n t o s . Lo s Ca rd La yo u t
n o rm a lm e n t e s o n co n t ro la d o s p o r u n o b je t o Ch o ice , co n e l e s t a d o d e l
o b je t o , s e d e t e rm in a q u e Pa n e l ( g ru p o d e co m p o n e n t e s ) m o s t ra rá e l
Ca rd La yo u t . Aq u í t ie n e s u n a p p le t q u e u t iliza u n o b je t o Ch o ice y u n
Ca rd La yo u t d e e s t a fo rm a .
Cómo Utilizar FlowLayout
Flo wLa yo u t e s e l co n t ro la d o r p o r d e fe ct o p a ra t o d o s lo s Pa n e le s .
S im p le m e n t e co lo ca lo s co m p o n e n t e s d e izq u ie rd a a d e re ch a ,
e m p e za n d o u n a n u e va lín e a s i e s n e ce s a rio . Lo s d o s p a n e le s e n e l a p p le t
a n t e rio r u t iliza n Flo wLa yo u t . Aq u í t ie n e s o t ro e je m p lo d e a p p le t q u e
u t iliza u n Flo wLa yo u t .

Cómo utilizar GridLayout


Grid La yo u t s im p le m e n t e g e n e ra u n ra zim o d e Co m p o n e n t e s q u e t ie n e n
e l m is m o t a m a ñ o , m o s t rá n d o lo s e n u n a s u ce s ió n d e fila s y co lu m n a s .
Aq u í t ie n e s u n a p p le t q u e u t iliza u n Grid La yo u t p a ra co n t ro la r cin co
botone s.

Cómo Utilizar Use GridBagLayout


Grid Ba g La yo u t e s e l m á s s o fis t ica d o y fle xib le co n t ro la d o r d e d is p o s ició n
p ro p o rcio n a d o p o r e l AWT. Alín e a lo s co m p o n e n t e s s it u á n d o lo s e n u n a
p a rrilla d e ce ld a s , p e rm it ie n d o q u e a lg u n o s co m p o n e n t e s o cu p e n m á s d e
u n a ce ld a . La s fila s d e la p a rrilla n o t ie n e n p o rq u e s e r d e la m is m a
a lt u ra ; d e la m is m a fo rm a la s co lu m n a s p u e d e n t e n e r d ife re n t e s
a n ch u ra s . Aq u í t ie n e u n a p p le t q u e u t iliza u n Grid Ba g La yo u t p a ra
m a n e ja r d ie z b o t o n e s e n u n p a n e l.

Oz it o
Reglas Generales para el uso de los Controladores
de Disposición
A m e n o s q u e s e le d ig a a u n co n t e n e d o r q u e n o u t ilice u n co n t ro la d o r d e
d is p o s ició n , e l e s t á a s o cia d o co n s u p ro p io e je m p la r d e u n co n t ro la d o r d e
d is p o s ició n . Es t e co n t ro la d o r e s co n s u lt a d o a u t o m á t ica m e n t e ca d a ve z q u e e l
co n t e n e d o r n e ce s it a ca m b ia r s u a p a rie n cia . La m a yo ría d e lo s co n t ro la d o re s d e
d is p o s ició n n o n e ce s it a n q u e lo s p ro g ra m a n lla m e n d ire ct a m e n t e a s u s m é t o d o s .

Cómo Elegir un Controlador de Disposición


Lo s co n t ro la d o re s d e d is p o s ició n p ro p o rcio n a d o s p o r e l AWT t ie n e n
d ife re n t e s p o t e n cia s y p u n t o s d é b ile s . Es t a s e cció n d e s cu b re a lg u n o s d e
lo s e s ce n a rio s d e d is p o s ició n m á s co m u n e s y có m o p o d ría n t ra b a ja r lo s
co n t ro la d o re s d e d is p o s ició n d e l AWT e n ca d a e s ce n a rio . S i n in g u n o d e
lo s co n t ro la d o re s d e l AWT s e a d a p t a a s u s it u a ció n , d e b e rá s e n t irs e lib re
p a ra u t iliza r co n t ro la d o re s d e d is p o s ició n d is t rib u id o s p o r la re d , co m o u n
Pa cke rLa yo u t .
Es c e n a rio : Ne ce s it a m o s t ra r u n co m p o n e n t e e n t o d o e l e s p a cio q u e
p u e d a co n s e g u ir.
Co n s id e ra la u t iliza ció n d e Bo rd e rLa yo u t o Grid Ba g La yo u t . S i u t iliza s
Bo rd e rLa yo u t , n e ce s it a rá s p o n e r e l co m p o n e n t e q u e n e ce s it e m á s
e s p a cio e n e l ce n t ro . Co n Grid Ba g La yo u t , n e ce s it a rá s s e le ccio n a r la s
re s t riccio n e s d e l co m p o n e n t e p a ra q u e
fill= Grid Ba g Co n s t ra in t s . BOTH. O, s i n o s i n o t e im p o rt a q u e
t o d o s lo s co m p o n e n t e s d e l m is m o co n t e n e d o r t e n g a n e l t a m a ñ o t a n
g ra n d e có m o e l d e l co m p o n e n t e m a yo r, p u e d e s u t iliza r u n
Grid La yo u t .
Es c e n a rio : S e n e ce s it a m o s t ra r u n o s p o co s co m p o n e n t e s e n u n a lín e a
co m p a ct a e n s u t a m a ñ o n a t u ra l.
Co s id e ra la u t iliza ció n d e u n Pa n e l p a ra co n t e n e r lo s co m p o n e n t e s
u t iliza n e l co n t ro la d o p o r d e fe ct o d e la cla s e Pa n e l: Flo wLa yo u t .
Ec e n a rio : Ne ce s it a m o s t ra r u n o s co m p o n e n t e s co n e l m is m o t a m a ñ o e n
fila s y/ o co lu m n a s .
Grid La yo u t e s p e rfe ct o p a ra e s t o .

Cómo crear un Controlador de Disposición y Asociarlo con un


Contenedor
Ca d a co n t e n e d o r t ie n e a s o cia d o u n co n t ro la d o r d e d is p o s ició n p o r
d e fe ct o . To d o s lo s Pa n e le s ( in clu ye n d o lo s Ap p le t s ) e s t á n in icia liza d o s
p a ra u t iliza r Flo wLa yo u t . To d a s la s ve n t a n a s ( e xce p t o la s d e p ro p ó s it o
e s p e cia l co m o lo s File Dia lo g ) e s t á n in icia lzia d a s p a ra u t iliza r
Bo rd e rLa yo u t .
S i q u ie re s u t iliza r e l co n t ro la d o r d e d is p o s ició n p o r d e fe ct o d e u n
Co n t e n e d o r, n o t ie n e q u e h a ce r n a d a . El co n s t ru ct o r d e ca d a Co n t e n e d o r
cre a u n e je m p la r d e l co n t ro la d o r d e d is p o s ició n e in icia liza e l Co n t e n e d o r
p a ra q u e lo u t ilice .
Pa ra u t iliza r u n co n t ro la d o r d e d is p o s ició n q u e n o s e a p o r d e fe ct o ,
n e ce s it a rá s cre a r u n e je m p la r d e la cla s e d e l co n t ro la d o r d e s e a d o y lu e g o
d e cirle a l co n t e n e d o r q u e lo u t ilice . Ab a jo h a y u n có d ig o t íp ico q u e h a ce
e s t o . Es t e có d ig o cre a u n co n t ro la d o r Ca rd La yo u t y lo s e le ccio n a p a ra
u t iliza rlo co n e l Co n t e n e d o r.
aContainer.setLayout(new CardLayout());

Reglas del Pulgar para utilizar Controladores de Disposición


Lo s m é t o d o s d e l co n t e n e d o r q u e re s u lt a n e n lla m a d a s a l co n t ro la d o r d e
d is p o s ició n d e l Co n t e n e d o r s o n :
● add( )

● re m o v e ( ) ,

● re m o v e All( ) ,

● la y o u t ( ) ,

● p re fe rre d S iz e ( ) ,

● m in im u m S iz e ( ) .

Lo s m é t o d o s a d d ( ) , re m o v e ( ) , re m o v e All( ) a ñ a d e n y e lim in a n
Co m p o n e n t e s d e u n co n t e n d o r; y p u e d e s lla m a rlo s e n cu a lq u ie r
m om e nto.
El m é t o d o la y o u t ( ) , q u e e s lla m a d o co m o re s u lt a d o d e u n p e t ició n d e
d ib u ja d o d e u n Co n t e n e d o r, p e t ició n e n la q u e e l Co n t e n e d o r s e s it ú a y
a ju s t a s u t a m a ñ o y e l d e lo s co m p o n e n t e s q u e co n t ie n e ; n o rm a lm e n t e
n o lo lla m a rá s d ire ct a m e n t e .
Lo s m é t o d o s p re fe rre d S iz e ( ) y m in im u m S iz e ( ) d e vu e lve e l t a m a ñ o
id e a l y e l t a m a ñ o m ín im o , re s p e ct iva m e n t e . Lo s va lo re s d e vu e lt o s s o n
s ó lo a p u n t e s , n o t ie n e n e fe ct o a m e n o s q u e s u p ro g ra m a fu e rce e s t o
ta m a ños.
De b e rá s t e n e r e s p e cia l cu id a d o cu a n d o lla m e s a lo s m é t o d o s
p re fe rre d S iz e ( ) y m in im u m S iz e ( ) d e u n co n t e n e d o r. Lo s va lo re s
d e vu e lt o s p o r e s t o s m é t o d o s n o t ie n e n im p o rt a n cia a m e n o s q u e e l
co n t e n e d o r y s u s co m p o n e n t e s t e n g a n o b je t o s p a re s vá lid o s . Pu e d e s
ve r: De t a lle s d e la Arq u it e ct u ra d e Co m p o n e n t e s p a ra m á s in fo rm a ció n
s o b re cu a n d o s e cre a n lo s p a re s .
Oz it o
Cómo Utilizar BorderLayout
Aq u í t ie n e s u n Ap p le t q u e m u e s t ra u n Bo rd e rLa yo u t e n a cció n .

Co m o s e ve e n e l a p p le t a n t e rio r, u n Bo rd e rLa yo u t t ie n e cin co á re a s : n o rt h , s o u t h ,


e a s t , we s t , y ce n t e r. S i s e a g ra n d a la ve n t a n a , ve rá s q u e e l á re a ce n t ra l o b t ie n e
t o d o e l e s p a cio n u e vo q u e le s e a p o s ib le . La s o t ra s á re a s s ó lo s e e xp a n e n lo ju s t o
p a ra lle n a r t o d o e l e s p a d io d is p o n ib le .
Ab a jo t ie n e s e l có d ig o q u e cre a e l Bo rd e rLa yo u t y lo s co m p o n e n t e s q u e é s t e
m a n e ja . Aq u í t ie n e s e l p ro g ra m a co m p le t o . El p ro g ra m a s e p u e d e e je cu t a r d e n t ro
d e u n a p p le t , co n la a yu d a d e Ap p le t Bu t t o n , o co m o u n a a p lica ció n . La p rim e ra
lín e a d e có d ig o re a lm e n t e n o e s n e ce s a ria p a ra e s t e e je m p lo , ya q u e e s t á e n u n a
s u b cla s e d e Win d o w y t o d a s la s s u b cla s e s d e Win d o ws t ie n e n a s o cia d o u n e je m p la r
d e Bo rd e rLa yo u t . S in e m b a rg o , la p rim e ra lín e a s e ría n e ce s a ria s i e l có d ig o
e s t u vie ra e n u n u n Pa n e l e n lu g a r d e u n a Ve n t a n a .
setLayout(new BorderLayout());
setFont(new Font("Helvetica", Font.PLAIN, 14));

add("North", new Button("North"));


add("South", new Button("South"));
add("East", new Button("East"));
add("West", new Button("West"));
add("Center", new Button("Center"));
I m p o rt a n t e : Cu a n d o s e a ñ a d a u n co m p o n e n t e a u n co n t e n e d o r q u e u t iliza
Bo rd e rLa yo u t s e d e b e u t iliza r la ve rs ió n co n d o s a rg u m e n t o s d e l m é t o d o a d d ( ) , y
e l p rim e r a rg u m e n t o s d e b e s e r "N o rt h ", "S o u t h ", "Ea s t ", "W e s t ", o "Ce n t e r".
S i s e u t iliza la ve rs ió n d e u n a rg u m e n t o d e a d d ( ) , o s i s e e s p e cifica u n p rim e r
a rg u m e n t o q u e n o s e a vá lid o , s u co m p o n e n t e p o d ría n o s e r v is ib le .
Po r d e fe ct o , u n Bo rd e rLa yo u t n o d e ja e s p a cio e n t re lo s co m p o n e n t e s q u e m a n e ja .
En e l a p p le t a n t e rio r la s e p a ra ció n a p a re n t e e s e l re s u lt a n d o d e q u e lo s b o t o n e s
re s e rva n e s p a cio e xt ra a s u a lre d e d o r. S e p u e d e e s p e cifica r e l e s p a cia d o ( e n
p ixe ls ) u t iliza n d o e l s ig u ie n t e co n s t ru ct o r:
public BorderLayout(int horizontalGap, int verticalGap)

Oz it o
Cómo Utilizar CardLayout
Aq u í t ie n e s u n a p p le t q u e m u e s t ra u n Ca rd La yo u t e n a cció n .

Có m o s e ve e n e l a p p le t a n t e rio r, la cla s e Ca rd La yo u t a yu d a a m a n e ja r d o s o m á s
co m p o n e n t e s ( n o rm a lm e n t e e je m p la re s d e la cla s e Pa n e l) q u e co m p a rt e n e l m is m o
e s p a cio . Co n ce p t u a lm e n t e , ca d a co m p o n e n t e t ie n e u n Ca rd La yo u t q u e lo m a n e ja
co m o s i ju g a ra n a ca rt a s o la s co lo ca ra n e n u n a p ila , d o n d e s ó lo e s vis ib le la ca rt a
s u p e rio r. S e p u e d e e le g ir la ca rt a q u e s e e s t á m o s t ra n d o d e a lg u n a d e la s
s ig u ie n t e s fo rm a s :
● Pid ie n d o la p rim e ra o la ú lt im a ca rt a , e n e l o rd e n e n e l q u e fu e ro n a ñ a d id a s a l
co n t e n e d o r.
● S a lt a n d o a t ra vé s d e la b a ra ja h a cia d e la n t e o h a cia a t rá s ,

● Es p e cifica n d o la ca rt a co n u n n o m b re e s p e cifico . Es t e e s e l e s q u e m a q u e
u t iliza e l p ro g ra m a d e e je m p lo . Es p e cifica m e n t e , e l u s u a rio p u e d e e le g ir u n a
ca rt a ( co m p o n e n t e ) e lig ie n d o s u n o m b re e n u n a lis t a d e s p le g a b le .
Ab a jo t ie n e s e l có d ig o q u e cre a e l Ca rd La yo u t y lo s co m p o n e n t e s q u e m a n e ja . Aq u í
t ie n e s e l p ro g ra m a co m p le t o . El p ro g ra m a s e p u e d e e je cu t a r d e n t ro d e u n a p p le t
co n la a yu d a d e Ap p le t Bu t t o n , o co m o u n a a p lica ció n .
//Donde se declaren las variables de ejemplar:
Panel cards;
final static String BUTTONPANEL = "Panel with Buttons";
final static String TEXTPANEL = "Panel with TextField";

//Donde se inicialice el Panel:


cards = new Panel();
cards.setLayout(new CardLayout());

...//Crea un Panel llamado p1. Pone los botones en él.


...//Crea un Panel llamado p2. Pone un campo de texto en él.

cards.add(BUTTONPANEL, p1);
cards.add(TEXTPANEL, p2);
Cu a n d o s e a ñ a d e n co m p o n e n t e s a u n co n t ro la d o r q u e u t iliza u n Ca rd La yo u t , s e
d e b e u t iliza r la fo rm a d e d o s a rg u m e n t o s d e l m é t o d o a d d ( ) d e l co n t e n e d o r:
a d d ( S t rin g n a m e , Co m p o n e n t c o m p ) . El p rim e r a rg u m e n t o d e b e s e r u n a
ca d e n a co n a lg o q u e id e n t ifiq u e a l co m p o n e n t e q u e s e e s t á a ñ a d ie n d o .
Pa ra e le g ir e l co m p o n e n t e m o s t ra d o p o r e l Ca rd La yo u t , s e n e ce s it a a lg ú n có d ig o
a d icio n a l. Aq u í p u e d e s ve r có m o lo h a ce e l a p p le t d e e s t a p á g in a :
/Donde se inicialice el contenedor:
. . .
//Pone la lista en un Panel para que tenga un buen aspecto.
Panel cp = new Panel();
Choice c = new Choice();
c.addItem(BUTTONPANEL);
c.addItem(TEXTPANEL);
cp.add(c);
add("North", cp);

. . .

public boolean action(Event evt, Object arg) {


if (evt.target instanceof Choice) {
((CardLayout)cards.getLayout()).show(cards,(String)arg);
return true;
}
return false;
}
Co m o s e m u e s t ra e n e l có d ig o a n t e rio r, s e p u e d e u t iliza r e l m é t o d o s h o w ( ) d e
Ca rd La yo u t p a ra s e le ccio n a r e l co m p o n e n t e q u e s e e s t á m o s t ra n d o . El p rim e r
a rg u m e n t o d e l m é t o d o s h o w ( ) e s e l co n t e n e d o r q u e co n t ro la Ca rd La yo u t - - e s t o
e s , e l co n t e n e d o r d e lo s co m p o n e n t e s q u e m a n e ja Ca rd La yo u t . El s e g u n d o
a rg u m e n t o e s la ca d e n a q u e id e n t ifica e l co m p o n e n t e a m o s t ra r. Es t a ca d e n a e s la
m is m a q u e fu e u t iliza d a p a ra a ñ a d ir e l co m p o n e n t e a l co n t e n e d o r.
Ab a jo t ie n e s t o d o s lo s m é t o d o s d e Ca rd La yo u t q u e p e rm it e n s e le ccio n a r u n
co m p o n e n t e . Pa ra ca d a m é t o d o , e l p rim e r a rg u m e n t o e s e l co n t e n e d o r d e l q u e
Ca rd La yo u t e s e l co n t ro la d o r d e d is p o s ició n ( e l co n t e n e d o r d e la s ca rt a s q u e
co n t ro la Ca rd La yo u t ) .
public void first(Container parent)
public void next(Container parent)
public void previous(Container parent)
public void last(Container parent)
public void show(Container parent, String name)

Oz it o
Cómo Utilizar FlowLayout
Aq u í t ie n e s u n a p p le t q u e m u e s t ra u n Flo wLa yo u t e n a cció n .

Co m o s e ve e n e l a p p le t a n t e rio r, Flo wLa yo u t p o n e lo s co m p o n e n t e s e n u n a fila ,


a ju s t á n d o lo s a s u t a m a ñ o p re fe rid o . S i e l e s p a cio h o rizo n t a l d e l co n t e n e d o r e s
d e m a s ia d o p e q u e ñ o p a ra p o n e r t o d o s lo s co m p o n e n t e s e n u n a fila , Flo wLa yo u t
u t iliza va ria s fila s . De n t ro d e ca d a fila , lo s co m p o n e n t e s s e co lo ca n ce n t ra d o s ( p o r
d e fe ct o ) , a lin e á d o s a la izq u ie rd a o a la d e re ch a s e g ú n s e e s p e cifiq u e cu a n d o s e
cre e e l Flo wLa yo u t .
Ab a jo t ie n e s e l có d ig o q u e cre a e l Flo wLa yo u t y lo s co m p o n e n t e s q u e m a n e ja . Aq u í
t ie n e s e l p ro g ra m a co m p le t o . El p ro g ra m a p u e d e e je cu t a rs e d e n t ro d e u n a p p le t ,
co n la a yu d a d e Ap p le t Bu t t o n , o co m o u n a a p lica ció n .
setLayout(new FlowLayout());
setFont(new Font("Helvetica", Font.PLAIN, 14));

add(new Button("Button 1"));


add(new Button("2"));
add(new Button("Button 3"));
add(new Button("Long-Named Button 4"));
add(new Button("Button 5"));
La cla s e Flo wLa yo u t t ie n e t re s co n s t ru ct o re s :
public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment, int horizontalGap, int verticalGap)
El Arg u m e n t o a lig n m e n t d e b e t e n e r a lg u n o d e e s t o s va lo re s :
● Flo w La y o u t . RI GHT

● Flo w La y o u t . CEN TER

● Flo w La y o u t . LEFT

Lo s a rg u m e n t o s h o riz o n t a lGa p y v e rt ic a lGa p e s p e cifica n e l n ú m e ro d e p ixe ls d e l


e s p a cio e n t re lo s co m p o n e n t e s . S i n o s e e s p e cifica n in g ú n va lo r, Flo wLa yo u t a ct ú a
co m o s i s e h u b ie ra n e s p e cifica d o 5 p ix e ls .

Oz it o
Cómo Utilizar GridLayout
Aq u í t ie n e s u n a p p le t q u e m u e s t ra u n Grid La yo u t e n a cció n .
Co m o s e ve e n e l a p p le t a n t e rio r, u n Grid La yp u t s it ú a lo s co m p o n e n t e s e n u n a p a rrilla d e ce ld a s .
Ca d a co m p o n e n t e u t iliza t o d o e l e s p a cio d is p o n ib le e n s u ce ld a , y t o d a s la s ce ld a s s o n d e l m is m o
t a m a ñ o . S i s e re d im e n s io n a e l t a m a ñ o d e la ve n t a n a Grid La yo u t , ve rá s q u e e l Grid La yo u t ca m b ia
e l t a m a ñ o d e la s ce ld a s p a ra q u e s e a n lo m á s g ra n d e s p o s ib le , d a n d o e l e s p a cio d is p o n ib le a l
co n t e n e d o r.
Ab a jo e s t á e l có d ig o q u e cre a e l Grid La yo u t y lo s co m p o n e n t e s q u e m a n e ja . Aq u í t ie n e s e l
p ro g ra m a co m p le t o . El p ro g ra m a p u e d e e je cu t a rs e d e n t ro d e u n a p p le t , co n la a yu d a d e
Ap p le t Bu t t o n , o co m o u n a a p lica ció n .
//Construye un GridLayout con dos 2 columnas y un número no especificado de filas.
setLayout(new GridLayout(0,2));
setFont(new Font("Helvetica", Font.PLAIN, 14));

add(new Button("Button 1"));


add(new Button("2"));
add(new Button("Button 3"));
add(new Button("Long-Named Button 4"));
add(new Button("Button 5"));
El co n s t ru ct o r le d ice a la cla s e Grid La yo u t q u e cre e u n e je m p la r q u e t ie n e d o s co lu m n a s y
t a n t a s fila s co m o s e a n e ce s a rio . Es u n o d e lo s d o s co n s t ru ct o re s d e Grid La yo u t . Aq u í t ie n e s la s
d e cla ra cio n e s d e lo s d o s co n s t ru ct o re s :
● p u b lic Grid La yo u t ( in t ro ws , in t co lu m n s )

● p u b lic Grid La yo u t ( in t ro ws , in t co lu m n s , in t h o rizo n t a lGa p , in t ve rt ica lGa p )

Al m e n o s u n o d e lo s a rg u m e n t o s ro w s o c o lu m n s d e b e s e r d is t in t o d e ce ro . Lo s a rg u m e n t o s
h o riz o n t a lGa p y v e rt ic a lGa p d e l s e g u n d o co n s t ru ct o r p e rm it e n e s p e cifica r e l n ú m e ro d e p ixe ls
e n t re la s ce ld a s . S i n o s e e s p e cifica e l e s p a cio , s u s va lo re s p o r d e fe ct o s o n ce ro . ( En e l a p p le t
a n t e rio r, cu a lq u ie r a p a rie n cia d e e s p a cia d o e s e l re s u lt a d o d e q u e lo s b o t o n e s re s e rva n e s p a cio
e xt ra s o b re s u s p ro p ia s á re a s . )

Oz it o
Cómo Utilizar GridBagLayout
Aq u í t ie n e s u n a p p le t q u e m u e s t ra u n Grid Ba g La yo u t e n a cció n .

Grid Ba g La yo u t e s e l m á s fle xib le - y co m p le jo - co n t ro la d o r d e d is p o s ició n


p o rp o cio n a d o p o r e l AWT. Co m o s e ve e n e l a p p le t a n t e rio r, u n Grid Ba g La yo u t ,
s it ú a lo s co m p o n e n t e s e n u n a p a rrilla d e fila s y co lu m n a s , p e rm it ie n d o q u e lo s
co m p o n e n t e s s e e s p a n d a n m á s d e u n a fila o co lu m n a . No e s n e ce s a rio q u e t o d a s
la s fila s t e n g a n la m is m a a lt u ra , n i q u e la s co lu m n a s t e n g a n la m is m a a n ch u ra .
Es e n cia lm e n t e , Grid Ba g La yo u t s it ú a lo s co m p o n e n t e s e n ce ld a s e n u n a p a rrilla , y
lu e g o u t iliza lo s t a m a ñ o s p re fe rid o s d e lo s co m p o n e n t e s q u e d e t e m in a có m o d e b e
s e r e l t a m a ñ o d e la ce ld a .
S i s e a g ra n d a la ve n t a n a q u e t ra e e l a p p le t , o b s e rva rá s q u e la ú lt im a fila o b t ie n e
u n n u e vo e s p a cio ve rt ica l, y q u e e l n u e vo e s p a cio h o rizo n t a l e s d ivid id o e n t re t o d a s
la s co lu m n a s . Es t e co m p o rt a m ie n t o e s t á b a s a d o e n e l p e s o q u e e l a p p le t a s ig n a a
lo s co m p o n e n t e s in d ivid u a le s d e l Grid Ba g La yo u t . Ob s e rva t a m b ié n , q u e ca d a
co m p o n e n t e t o m a t o d o e l e s p a cio q u e p u e d e . Es t e co m p o rt a m ie n t o t a m b ié n e s t á
e s p e cifica d o p o r e l a p p le t .
La fo rm a e n q u e e l a p p le t e s p e cifica e l t a m a ñ o y la p o s ició n ca ra ct e rís t ico s d e s u s
co m p o n e t e s e s t á e s p e cifica d o p o r la s o b lig a cio n e s d e ca d a co m p o n e n t e . Pa ra
e s p e cifica r o b lig a cio n e s , d e b e s e le ccio n a r la s va ria b le s d e e je m p la r e n u n o b je t o
Grid Ba g Co n s t ra in t s y d e círs e lo a l Grid Ba g La yo u t ( co n e l m é t o d o
s e t Co n s t ra in t s ( ) ) p a ra a s o cia r la s o b lig a cio n e s co n e l co m p o n e n t e .
La s s ig u ie n t e s p á g in a s e xp lica n la s o b lig a cio n e s q u e s e p u e d e n s e le ccio n a r y
p ro p o rcio n a e je m p lo s d e e lla s .

Especificar Obligaciones
Es t a p á g in a m u e s t ra la s va ria b le s q u é t ie n e u n o b je t o
Grid Ba g Co n s t ra in t s , q u é va lo re s p u e d e n t e n e r, y có m o a s o cia r e l o b je t o
Grid Ba g Co n s t ra in t s re s u lt a n t e co n u n co m p o n e n t e .

El Applet de Ejemplo Explicado


En e s t á p á g in a s e p o n e t o d o ju n t o , e xp lica n d o e l có d ig o d e l a p p le t d e
e s t a p á g in a .

Oz it o
Cómo Utilizar GridBagLayout: Especificar Obligaciones
Ab a jo t ie n e s p a rt e d e l có d ig o q u e p o d rá s ve r e n u n co n t e n e d o r q u e u t iliza u n
Grid Ba g La yo u t . ( Ve rá s u n e je m p lo e xp lica d o e n la p á g in a s ig u ie n t e ) .
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setLayout(gridbag);

//Para cada componentes que sea añadido a este contenedor:


//...Crea el componente...
//...Seleccionar las variables de ejemplar en el objeto GridBagConstraints...
gridbag.setConstraints(theComponent, c);
add(theComponent);
Co m o p o d ría s h a b e r d e d u cid o d e l e je m p lo a n t e rio r, s e p u e d e re u t iliza r e l m is m o e je m p la r
d e Grid Ba g Co n s t ra in t s p a ra va rio s co m p o n e n t e s , in clu s o s i lo s co m p o n e n t e s t ie n e n
d is t in t a s o b lig a cio n e s . El Grid Ba g La yo u t e xt ra e lo s va lo re s d e la s o b lig a cio n e s y n o vu e lve
a u t iliza r e l Grid Ba g Co n s t ra in t s . S in e m b a rg o , s e d e b e t e n e r cu id a d o d e re s e t a r la s
va ria b le s d e e je m p la r d e l Grid Ba g Co n s t ra in t s a s u s va lo re s p o r d e fe ct o cu a n d o s e a
n e ce s a rio .
Pu e d e s e le ccio n a r la s s ig u ie n t e s va ria b le s d e e je m p la r d e l Grid Ba g Co n s t ra in t s :
g rid x , g rid y
Es p e cifica la fila y la co lu m n a d e la e s q u in a s u p e rio r izq u ie rd a d e l co m p o n e n t e . La
co lu m n a m á s a la izq u ie rd a t ie n e la d ire cció n g rid x = 0 , y la fila s u p e rio r t ie n e la
d ire cció n g rid y = 0 . Ut iliza Grid Ba g Co n s t ra in t s . RELATI VE ( e l va lo r p o r d e fe ct o )
p a ra e s p e cifica r q u e e l co m p o n e n t e d e b e s it u a rs e a la d e re ch a ( p a ra g rid x ) o d e b a jo
( p a ra g rid y ) d e l co m p o n e n t e q u e s e a ñ a d ió a l co n t e n e d o r in m e d ia t a m e n t e a n t e s .
g rid w id t h , g rid h e ig h t
Es p e cifica e l n ú m e ro d e co lu m n a s ( p a ra g rid w id t h ) o fila s ( p a ra g rid h e ig h t ) e n e l
á re a d e co m p o n e n t e . Es t a o b lig a ció n e s p e cifica e l n ú m e ro d e ce ld a s u t iliza d a s p o r e l
co m p o n e n t e , n o e l n ú m e ro d e p ixe ls . El va lo r p o r d e fe ct o e s 1 . Ut iliza
Grid Ba g Co n s t ra in t s . REMAI N D ER p a ra e s p e cifica r q u e e l co m p o n e n t e s e rá e l ú lt im o
d e e s t a fila ( p a ra g rid w id t h ) o co lu m n a ( p a ra g rid h e ig h t ) . Ut iliza
Grid Ba g Co n s t ra in t s . RELATI VE p a ra e s p e cifica r q u e e l co m p o n e n t e e s e l s ig u ie n t e
p a ra e l ú lt im o d e e s t a fila ( p a ra g rid w id t h ) o co lu m n a ( p a ra g rid h e ig h t ) .
N o t a : De b id o a u n e rro r e n la ve rs ió n 1 . 0 d e Ja va , Grid Ba g La yo u t n o p e rm it e u n
co m p o n e n t e s e e s p a n d a va ria s co lu m n a s a m e n o s q u e s e a e l p rim e ro p o r la izq u ie rd a .
fill
Ut iliza d a cu a n d o e l á re a d e l p a n t a lla d e l co m p o n e n t e s e s m a yo r q u e e l t a m a ñ o
re q u e rid o p o r é s t e p a ra d e t e rm in a r s i s e d e b e , y có m o re d im e n s io n a r e l co m p o n e n t e .
Lo s va lo re s vá lid o s s o n Grid Ba g Co n s t ra in t s . N ON E ( p o r d e fe ct o ) ,
Grid Ba g Co n s t ra in t s . HORI ZON TAL ( h a ce q u e e l co m p o n e n t e t e n g a s u ficie n t e
a n ch u ra p a ra lle n a r h o rizin t a lm e n t e s u á re a d e d ib u jo , p e ro n o ca m b ia s u a lt u ra ) ,
Grid Ba g Co n s t ra in t s . VERTI CAL ( h a ce q u e e l co m p o n e n t e s e a lo s u ficie n t e m e n t e
a lt o p a ra lle n a r ve rt ica lm e n t e s u á re a d e d ib u jo , p e ro n o ca m b ia s u a n ch u ra ) , y
Grid Ba g Co n s t ra in t s . BOTH ( h a ce q u e e l co m p o n e n t e lle n e s u á re a d e d ib u jo p o r
co m p le t o ) .
ip a d x , ip a d y
Es p e cifica e l e s p a cio in t e rn o : cu á n t o s e d e b e a ñ a d ir a l t a m a ñ o m ín im o d e l
co m p o n e n t e . El va lo r p o r d e fe ct o e s ce ro . La a n ch u ra d e l co m p o n e n t e d e b e s e r a l
m e n o s s u a n ch u ra m ín im a m á s ip a d x * 2 p ixe ls ( ya q u e e l e s p a cia d o s e a p lica a lo s
d o s la d o s d e l co m p o n e n t e ) . De fo rm a s im ila r, la a lt u ra d e u n co m p o n e n t e s e rá a l
m e n o s s u a lt u ra m ín im a m á s ip a d y * 2 p ixe ls .
in s e t s
Es p e cifica e l e s p a cia d o e xt e rn o d e l co m p o n e n t e - - la ca n t id a d m ín im a d e e s p a cio
e n t re lo s co m p o n e n t e s y lo s b o rd e s d e l á re a d e d ib u jo . Es va lo r e s e s p e cifica d o co m o
u n o b je t o In s e t s . Po r d e fe ct o , n in g ú n co m p o n e n t e t ie n e e s p a cia d o e xt e rn o .
anchor
Ut iliza d o cu a n d o e l co m p o n e n t e e s m á s p e q u e ñ o q u e s u á re a d e d ib u jo p a ra
d e t e rm in a r d ó n d e ( d e n t ro d e l á re a ) s it u a r e l co m p o n e n t e . Lo s va lo re s vá lid o s s o n :
❍ Grid Ba g Co n s t ra in t s . CEN TER ( p o r d e fe ct o ) ,

❍ Grid Ba g Co n s t ra in t s . N ORTH,

❍ Grid Ba g Co n s t ra in t s . N ORTHEAS T,

❍ Grid Ba g Co n s t ra in t s . EAS T,

❍ Grid Ba g Co n s t ra in t s . S OUTHEAS T,

❍ Grid Ba g Co n s t ra in t s . S OUTH,

❍ Grid Ba g Co n s t ra in t s . S OUTHW ES T,

❍ Grid Ba g Co n s t ra in t s . W ES T,

❍ Grid Ba g Co n s t ra in t s . N ORTHW ES T.

w e ig h t x , w e ig h t y
Es p e cifica r e l p e s o e s u n a rt e q u e p u e d e t e n e r u n im p a ct o im p o rt a n t e e n la a p a rie n cia
d e lo s co m p o n e n t e s q u e co n t ro la u n Grid Ba g La yo u t . El p e s o e s u t iliza p a ra d e t e rm in a r
có m o d is t rib u ir e l e s p a cio e n t re co lu m n a s ( w e ig h t x ) y fila s ( w e ig h t y ) ; e s t o e s
im p o rt a n t e p a ra e s p e cifica r e l co m p o rt a m ie n t o d u ra n t e e l re d im e n s io n a d o .
A m e n o s q u e s e e s p e cifiq u e u n va lo r d is t in t o d e ce ro p a ra w e ig h t x o w e ig h t y , t o d o s
lo s co m p o n e n t e s e s it u a rá n ju n t o s e n e l ce n t ro d e s u co n t e n e n d o r. Es t o e s a s í p o rq u e
cu a n d o e l p e s o e s 0 , 0 ( e l va lo r p o r d e fe ct o ) e l Gid Ba g La yo u t p o n e t o d o e l e s p a cio
e xt ra e n t re la s ce ld a s y lo s b o rd e s d e l co n t e n e d o r.
Ge n e ra lm e n t e , lo s p e s o s s o n e s p e cifica d o s co n 0 . 0 y 1 . 0 co m o lo s e xt re m o s , co n
n ú m e ro s e n t re e llo s s i s o n n e ce s a rio s . Lo s n ú m e ro s m a yo re s in d ica n q u e la fila o
co lu m n a d e l co m p o n e n t e d e b e ría n o b t e n e r m á s e s p a cio . Pa ra ca d a co lu m n a , s u p e s o
e s t á re la cio n a d o co n e l m a yo r w e ig h t x e s p e cifica d o p a ra u n co m p o n e n t e d e n t ro d e
e s a co lu m n a ( d o n d e ca d a co m p o n e t e q u e o cu p a va ria s co lu m n a s e s d ivid id o d e
a lg u n a fo rm a e n t re e l n ú m e ro d e co lu m n a s q u e o cu p a ) . Lo m is m o o cu rre co n la s fila s
p a ra e l m a yo r va lo r e s p e cifica d o e n w e ig h t y .
La p á g in a s ig u ie n t e e xp lica la s o b lica cio n e s e n m á s d e t a lle , e xp lica n d o có m o t ra b a ja e l
a p p le t d e l e je m p lo .

Oz it o
Cómo Utilizar GridBagLayout: El Applet de ejemplo Explicado
De n u e vo , a q u í e s t á e l a p p le t q u e m u e s t ra u n Grid Ba g La yo u t e n a cció n .
Ab a jo t ie n e s e l có d ig o q u e cre a e l Grid Ba g La yo u t y lo s co m p o n e n t e s q u e m a n e ja . Aq u í t ie n e s e l
p ro g ra m a co m p le t o . El p ro g ra m a p u e d e e je cu t a rs e d e n t ro d e u n a p p le t , co n la a yu d a d e
Ap p le t Bu t t o n , o co m o u n a a p lica ció n .
protected void makebutton(String name, GridBagLayout gridbag, GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}

public GridBagWindow() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();

setFont(new Font("Helvetica", Font.PLAIN, 14));


setLayout(gridbag);

c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
makebutton("Button1", gridbag, c);
makebutton("Button2", gridbag, c);
makebutton("Button3", gridbag, c);

c.gridwidth = GridBagConstraints.REMAINDER; //Final de fila


makebutton("Button4", gridbag, c);

c.weightx = 0.0; //resetea a los valores por defecto


makebutton("Button5", gridbag, c); //otra fila

c.gridwidth = GridBagConstraints.RELATIVE; /sigua al último de la fila


makebutton("Button6", gridbag, c);

c.gridwidth = GridBagConstraints.REMAINDER; //fin de fila


makebutton("Button7", gridbag, c);

c.gridwidth = 1; //resetea a los valores por defecto


c.gridheight = 2;
c.weighty = 1.0;
makebutton("Button8", gridbag, c);

c.weighty = 0.0; //resetea a los valores por defecto


c.gridwidth = GridBagConstraints.REMAINDER; //fin de fila
c.gridheight = 1; //resetea a los valores por defecto
makebutton("Button9", gridbag, c);
makebutton("Button10", gridbag, c);
}
Es t e e je m p lo u t iliza u n s ó lo e je m p la r d e Grid Ba g Co n s t ra in t s p a ra t o d o s lo s co m p o n e t e s m a n e ja d o s
p o r e l Grid Ba g La yo u t . Ju s t o a n t e s d e q u e ca d a co m p o n e n t e s e a a ñ a d id o a l co n t e n e d o r, e l có d ig o
s e le ccio n a ( o re s e t e a a lo s va lo re s p o r d e fe ct o ) la s va ria b le s a p ro p ia d a s d e l o b je t o
Grid Ba g Co n s t ra in t s . Lu e g o u t iliza e l m é t o d o s e t Co n s t ra in t s ( ) p a ra g ra b a r lo s va lo re s o b lig a t o rio s
d e e s e co m p o n e n t e .
Po r e je m p lo , ju s t o a n t e s d e a ñ a d ir u n co m p o n e n t e a l fin a l d e u n a fila ve rá e l s ig u ie n t e có d ig o :
c.gridwidth = GridBagConstraints.REMAINDER; //final de fila
Y ju s t o a n t e s d e a ñ a d ir e l s ig u ie n t e co m p o n e n t e ( s i e l s ig u ie n t e co m p o n e n t e n o o cu p a u n a fila
co m p le t a ) , ve rá s la m is m a va ria b le re s e t e a d a a s u va lo r p o r d e fe ct o :
c.gridwidth = 1; //resetea al valor por defecto
Pa ra m a yo r cla rid a d a q u í t ie n e s u n a t a b la q u e m u e s t ra t o d a s la s o b lig a cio n e s p a ra ca d a co m p o n e n t e
m a n e ja d o p o r Grid Ba g La yo u t . Lo s va lo re s q u e n o s o n p o r d e fe ct o e s t á n m a rca d o s e n n e g rit a . Lo s
va lo re s q u e s o n d ife re n t e s d e s u e n t ra d a a n t e rio r e n la t a b la e s t á n m a rca d o s e n it á lica .

Component Constraints
--------- -----------
All components gridx = GridBagConstraints.RELATIVE
gridy = GridBagConstraints.RELATIVE
fill = GridBagConstraints.BOTH
ipadx = 0, ipady = 0
insets = new Insets(0,0,0,0)
anchor = GridBagConstraints.CENTER

Button1, Button2, Button3 gridwidth = 1


gridheight = 1
weightx = 1.0
weighty = 0.0

Button4 gridwidth = GridBagConstraints.REMAINDER


gridheight = 1
weightx = 1.0
weighty = 0.0

Button5 gridwidth = GridBagConstraints.REMAINDER


gridheight = 1
weightx = 0.0
weighty = 0.0

Button6 gridwidth = GridBagConstraints.RELATIVE


gridheight = 1
weightx = 0.0
weighty = 0.0

Button7 gridwidth = GridBagConstraints.REMAINDER


gridheight = 1
weightx = 0.0
weighty = 0.0

Button8 gridwidth = 1
gridheight = 2
weightx = 0.0
weighty = 1.0

Button9, Button10 gridwidth = GridBagConstraints.REMAINDER


gridheight = 1
weightx = 0.0
weighty = 0.0
To d o s lo s co m p o n e n t e s d e e s t e co n t e n e d o r s o n t a n g ra n d e s co m o s e a a p o s ib le , d e p e n d ie n d o d e s u
fila y co lu m n a . El p ro g ra m a co n s ig u e e s t o s e le cció n la va ria b le fill d e Grid Ba g Co n s t ra in t s a
Grid Ba g Co n s t ra in t s . BOTH, d e já n d o la s e le ccio n a d a p a ra t o d o s lo s co m p o n e n t e s .
Es t e p ro g ra m a t ie n e cu a t ro co m p o n e n t e s q u e s e e s p a n d e n va ria s co lu m n a s ( Bu t t o n 5 , Bu t t o n 6 ,
Bu t t o n 9 , a n d Bu t t o n 1 0 ) y u n o q u e s e e s p a n d e va ria s fila s ( Bu t t o n 8 ) . S ó lo e n u n o d e e s t o s ca s o
( Bu t t o n 8 ) s e e s p e cifica e xp lícit a m e n t e la a n ch u ra y a lt u ra d e l co m p o n e n t e . En lo s o t ro s ca s o s , la
a n ch u ra d e lo s co m p o n e n t e s e s t á e s p e cifica d a co m o Grid Ba g Co n s t ra in t s . RELATI VE o
Grid Ba g Co n s t ra in t s . REMAI N D ER, lo q u e le p e rm it e a Grid Ba g La yo u t d e t e rm in a r e l t a m a ñ o d e l
co m p o n e n t e , t e n ie n d o e n cu e n t ra e l t a m a ñ o d e lo s o t ro s co m p o n e n t e s d e la fila .
Cu a n d o s e a g ra n d e la ve n t a n a d e l p ro g ra m a , o b s e rva rá q u e la a n ch u ra d e la s co lu m n a s cre ce lo s
m is m o q u e la ve n t a n a . Es t e e s e l re s u lt a d o d e ca d a co m p o n e n t e d e la p rim e r fila ( d o n d e ca d a
co m p o n e n t e t ie n e la a n ch u ra d e u n a co lu m n a ) t ie n e w e ig h t x = 1 . 0 . El va lo r re a l d e l w e ig h t x d e
e s t o s co m p o n e n t e s n o t ie n e im p o rt a n cia . Lo q u e im p o rt a e s q u e t o d o s lo s co m p o n e n t e s ( y a s í t o d a s
la s co lu m n a s ) t ie n e n e l m is m o p e s o q u e e s m a yo r q u e ce ro . S i n in g ú n co m p o n e n t e m a n e ja d o p o r e l
Grid Ba g La yo u t t u vie ra s e le ccio n a d o w e ig h t x , cu a n d o s e a m p lia ra la a n ch u ra d e l co n t e n e d o r, lo s
co m p o n e n t e s p e rm a n e ce ría n ju n t o s e n e l ce n t ro d e l co n t e n e d o r.
Ot ra co s a q u e h a b rá s o b s e rva d o e s q u e cu a n d o s e a u m e n t a la a lt u ra d e la ve n t a n a la ú lt im a lín e a e s
la ú n ica q u e s e a g ra n d a . Es t o e s a s í p o rq u e e l Bu t t o n 8 t ie n e w e ig h t y m a yo r q u e ce ro . Bu t t o n 8 s e
e s p a n d e d o s fila s , y e l Grid Ba g La yo u t h a ce q u e e l p e s o d e e s t e b o t ó n a s ig n e t o d o s e l e s p a cio a la s
d o s ú lt im a s fila s o cu p a d a s p o r é l.

Oz it o
Crear un Controlador de Disposición Personalizado
N o t a : An t e s d e e m p e za r a cre a r u n co n t ro la d o r d e d is p o s ició n p e rs o n a liza d o ,
a s e g u ra t e d e q u e n o e xis t e n in g ú n co n t ro la d o r q u e t ra b a je d e la fo rm a a p ro p ia d a .
En p a rt icu la r, Grid Ba g La yo u t e s lo s u ficie n t e m e n t e fle xib le p a ra t ra b a ja r e n m u ch o s
ca s o s .
Pa ra cre a r u n co n t ro la d o r d e d is p o s ició n p e rs o n a liza d o , d e b e s cre a r u n cla s e q u e
im p le m e n t e e l in t e rfa ce La yo u t Ma n a g e r. La yo u t Ma n a g e r re q u ie re q u e s e
im p le m e n t e n e s t o s cin co m é t o d o s :
p u b lic v o id a d d La y o u t Co m p o n e n t ( S t rin g n a m e , Co m p o n e n t c o m p )
Lla m a d o s ó lo p o r e l m é t o d o a d d ( n a m e , c o m p o n e n t ) d e l co n t e n e d o r. Lo s
co n t ro la d o re s d e d is p o s ició n q u e n o n e ce s it a n q u e s u s co m p o n e n t e s t e n g a n
n o m b re s e n e ra lm e n t e n o h a ce n n a d a e n e s t e m é t o d o .
p u b lic v o id re m o v e La y o u t Co m p o n e n t ( Co m p o n e n t c o m p )
Lla m a d o p o r lo s m é t o d o s re m o v e ( ) y re m o v e All( ) d e l co n t e n e d o r. Lo s
co n t ro la d o re s d e d is p o s ició n q u e n o n e ce s it a n q u e s u s co m p o n e n t e s t e n g a n
n o m b re s g e n e ra lm e n t e n o h a ce n n a d a e n e s t e m é t o d o ya q u e p u e d e n
p re g u n t a rle a l co n t e n e d o r p o r s u s co m p o n e n t e s u t iliza n d o e l m é t o d o
g e t Co m p o n e n t s ( ) d e l co n t e n e d o r.
p u b lic D im e n s io n p re fe rre d La y o u t S iz e ( Co n t a in e r p a re n t )
Lla m a d o p o r e l m é t o d o p re fe rre d S iz e ( ) d e co n t e n e d o r, q u e e s lla m a d o a s í
m is m o b a jo u n a va rie d a d d e circu n s t a n cia s . Es t e m é t o d o d e b e ría ca lcu la r e l
t a m a ñ o id e a l d e l p a d re , a s u m ie n d o q u e lo s co m p o n e n t e s co n t e n d id o s t e n d rá n
a p ro xim a d a m e n t e s u t a m a ñ o p re fe rid o . Es t e m é t o d o d e b e t o m a r e n cu e n t a
lo s b o rd e s in t e rn o s d e l p a d re ( d e vu e lt o s p o r e l m é t o d o in s e t s ( ) d e l
co n t e n e d o r) .
p u b lic D im e n s io n m in im u m La y o u t S iz e ( Co n t a in e r p a re n t )
Lla m a d o p o r e l m é t o d o m in im u m S iz e ( ) d e l co n t e n e d o r, q u e a s u ve z e s
lla m a d o b a jo va ria s circu n s t a n cia s . Es t e m é t o d o d e b e ría ca lcu la r e l t a m a ñ o
m ín im o d e l p a d re , a s u m ie n d o q u e t o d o s lo s co m p o n e n t e s q u e co n t ie n e
t e n d rá n a p ro xim a d a m e n t e s u t a m a ñ o m ín im o . Es t e m é t o d o d e b e t o m a r e n
cu e n t a lo s b o rd e s in t e rn o s d e l p a d re ( d e vu e lt o s p o r e l m é t o d o in s e t s ( ) d e l
co n t e n e d o r) .
p u b lic v o id la y o u t Co n t a in e r( Co n t a in e r p a re n t )
Lla m a d o cu a n d o e l co n t e n e d o r s e m u e s t ra p o r p rim e ra ve z, y ca d a ve z q u e
ca m b ia s u t a m a ñ o . El m é t o d o la y o u t Co n t a in e r( ) d e l co n t ro la d o r d e
d is p o s ició n re a lm e n t e n o d ib u ja lo s Co m p o n e n t e s . S im p le m e n t e in vo ca lo s
m é t o d o s re s iz e ( ) , m o v e ( ) , yre s h a p e ( ) p a ra s e le ccio n a r e l t a m a ñ o y
p o s ició n d e lo s co m p o n e n t e s . Es t e m é t o d o d e b e t o m a r e n cu e n t a lo s b o rd e s
in t e rn o s d e l p a d re ( d e vu e lt o s p o r e l m é t o d o in s e t s ( ) d e l co n t e n e d o r) . No s e
p u e d e a s u m ir q u e lo s m é t o d o s p re fe rre d La y o u t S iz e ( ) o
m in im u m La y o u t S iz e ( ) s e rá n lla m a d o s a n t e s d e q u e s e lla m e a l
la y o u t Co n t a in e r( ) .
Ju n t o a la im p le m e n t a ció n d e e s t o s cin co m é t o d o re q u e rid o s p o r La yo u t Ma n a g e r,
lo s co n t ro la d o re s d e d is p o s ició n g e n e ra lm e n t e im p le m e n t a n a l m e n o s u n
co n s t ru ct o r p ú b lico y e l m é t o d o t o S t rin g ( ) .

Aq u í t ie n e s e l có d ig o fu e n t e p a ra co n t ro la d o r d e d is p o s ició n p e rs o n a liza d o lla m a d o


Dia g o n a lLa yo u t . S it ú a s u s co m p o n e n t e s d ia g o n a lm e n t e , d e izq u ie rd a a d e re ch a co n
u n co m p o n e n t e p o r fila .
Aq u í t ie n e s u n e je m p lo d e Dia g o n a lLa yo u t :

Oz it o
Hacerlo sin Controlador de Disposición (Posicionamiento
Absoluto)
Au n q u e e s p o s ib le h a ce rlo s in u n co n t ro la d o r d e d is p o s ició n , s e d e b e ría u t iliza r u n co n t ro la d o r
d is p o s ició n s ie m p re q u e s e a p o s ib le . Lo s co n t ro la d o re s d e d is p o s ició n h a ce n m á s s e n cillo e n
re d im e n s io n a d o d e u n co n t e n e d o r y a ju s t a n a la a p a rie n cia d e lo s co m p o n e n t e s d e p e n d ie n t e s
d e la p la t a fo rm a y lo s d ife re n t e s t a m a ñ o s d e la s fu e n t e s . Ta m b ié n p u e d e n s e r re u t iliza d o s
fá cilm e n e p o r o t ro s co n t e n e d o re s y o t ro s p ro g ra m a s . S i u n co n t e n e d o r p e rs o n a liza d o n o s e rá
re u t iliza d o n i re d im e n s io n a d o , y co n t ro la n o rm a lm e n t e lo s fa ct o re s d e p e n d ie n t e s d e l s is t e m a
co m o e l t a m a ñ o d e la s fu e n t e s y la a p a rie n cia d e lo s co m p o n e n t e s ( im p le m e n t a n d o s u s
p ro p io s co n t ro le s s i fu e ra n e ce s a rio ) , e n t o n ce s , e l p o s icio n a m ie n t o a b s o lu t o p o d ría t e n e r
s e n t id o .
Aq u í t ie n e s u n a p p le t q u e m u e s t ra u n a ve n t a n a q u e u t iliza p o s icio n a m ie n t o a b s o lu t o .
Ab a jo t ie n e s la s d e cla ra cio n e s d e la s va ria b le s d e e je m p la r, la im p le m e n t a ció n d e l co n s t ru ct o r,
y d e l m é t o d o p a in t ( ) d e la cla s e win d o w. Aq u í t ie n e s u n e n la ce a l p ro g ra m a co m p le t o . El
p ro g ra m a s e p u e d e e je cu t a r d e n t ro d e u n a p p le t co n la a yu d a d e Ap p le t Bu t t o n , o co m o u n a
a p lica ció n .
public class NoneWindow extends Frame {
. . .
private boolean laidOut = false;
private Button b1, b2, b3;

public NoneWindow() {
super();
setLayout(null);
setFont(new Font("Helvetica", Font.PLAIN, 14));

b1 = new Button("one");
add(b1);
b2 = new Button("two");
add(b2);
b3 = new Button("three");
add(b3);
}

public void paint(Graphics g) {


if (!laidOut) {
Insets insets = insets();
/*
*Garantizamos que insets() devuelve un Insets válido
* si lo llamamos desde paint() -- no sería válido si los llamaramos
desde
* el constructor.
*
* Quizás podríamos guardar esto en una variable, pero insets puede
* cambiar, y cuando lo haga, el AWT crea un nuevo objeto
* Insets completo; el viejo no es válido.
*/
b1.reshape(50 + insets.left, 5 + insets.top, 50, 20);
b2.reshape(70 + insets.left, 35 + insets.top, 50, 20);
b3.reshape(130 + insets.left, 15 + insets.top, 50, 30);

laidOut = true;
}
}

. . .
}

Oz it o
Problemas más Comunes con la Distribución de
Componentes (y sus Soluciones)
P ro b le m a :¿ Có m o p u e d o e s p e cifica r e l t a m a ñ o e xa ct o d e u n co m p o n e n t e ?
● Prim e ro , a s e g ú ra t e d e q u e re a lm e n t e n e ce s it a s s e le ccio n a r e l t a m a ñ o e xa ct o
d e l co m p o n e n t e . Lo s co m p o n e n t e s e s t a n d a rd s t ie n e n d is t in t o s t a m a ñ o s ,
d e p e n d ie n d o d e la p la t a fo rm a d o n d e s e e s t á n e je cu t a n d o y d e la fu e n t e
u t iliza d a , p o r e s o n o rm a lm e n t e n o t ie n e s e n t id o e s p e cifica r s u t a m a ñ o e xa ct o .
Pa ra lo s co m p o n e n t e s p e rs o n a liza d o s q u e t ie n e n co n t e n id o s d e t a m a ñ o fijo
( co m o im á g e n e s ) , e s p e cifica r e l t a m a ñ o e xa ct o t ie n e s e n t id o . Pa ra
co m p o n e n t e s p e rs o n a liza d o s , n e ce s it a n s o b re e s crib ir lo s m é t o d o s
m in im u m S iz e ( ) y p re fe rre d S iz e ( ) d e l co m p o n e n t e p a ra d e vo lve r e l t a m a ñ o
co rre ct o d e l co m p o n e n t e .
Pa ra ca m b ia r e l t a m a ñ o d e u n co m p o n e n t e q u e ya h a s id o d ib u ja d o , p u e d e s
ve r e l s ig u ie n t e p ro b le m a .

N o t a : To d o s lo s t a m a ñ o s d e lo s co m p o n e n t e s e s t á n s u je t o s a la a p ro b a ció n
d e l co n t ro la d o r d e d is p o s ició n . Lo s co n t ro la d o re s Flo wLAyo u t y Grid Ba g La yo u t
u t iliza n e l t a m a ñ o n a t u ra l d e lo s co m p o n e n t e s ( e l ú lt im o d e p e n d ie n d o d e la s
o b lig a cio n e s q u e u s t e d s e le ccio n e ) , p e ro Bo rd e rLa yo u t y Grid LAyo u t n o . Ot ra s
o p cio n e s s o n e s cirib r o e n co n t ra r u n co n t ro la d o r d e d is p o s ició n p e rs o n a liza d o
o u t iliza n d o p o s icio n a m ie n t o a b s o lu t o .

P ro b le m a : ¿ Có m o p u e d o re d im e n s io n a r u n Co m p o n e n t e ?
● Un a ve z q u e e l co m p o n e n t e h a s id o d ib u ja d o , p u e d e s ca m b ia r s u t a m a ñ o
u t iliza n d o e l m é t o d o re s iz e ( ) d e l Co m p o n e n t e . Lu e g o n e ce s it a s lla m a r a l
m e t o d o v a lid a t e ( ) d e l co n t e n e d o r p a ra a s e g u ra rs e d e q u e é s t e s e m u e s t re
d e n u e vo .
P ro b le m a : Mi co m p o n e n t e p e rs o n a liza d o s e d ib u ja d e m a s ia d o p e q u e ñ o .
● ¿ Ha s im p le m e n t a d o lo s m é t o d o s p re fe rre d S iz e ( ) a n d m in im u m S iz e ( ) d e l
co m p o n e n t e ? S i lo h a s h e ch o , ¿ d e vu e lve n lo s va lo re s co rre ct o s ?
● ¿ Es t á s u t iliza n d o u n co n t ro la d o r d e d is p o s ició n q u e p u e d e u t iliza r t o d o e l
e s p a cio d is p o n ib le ? Pu e d e ve r Re g la s Ge n e ra le s p a ra e l Us o d e Co n t ro la d o re s
d e Dis p o s ició n p a ra ve r a lg u n a s s it u a cio n e s d e e le cció n d e l co n t ro la d o r d e
d is p o s ició n y e s p e cifica r q u e u t ilice e l m á xim o e s p a cio d is p o n ib le p a ra u n
co m p o n e n t e p a rt icu la r.
S i n o h a s vis t o t u p ro b le m a e n e s t a lis t a , p u e d e s ve r Pro b le m a s m á s Co m u n e s co n
lo s Co m p o n e n t e s .

Oz it o
Introducción al Soporte de Gráficos del AWT
Co m o s e a p re n d ió e n la p á g in a Dra win g , e l s is t e m a d e d ib u jo d e l AWT co n t ro la
cu á n d o y có m o p u e d e n d ib u ja r lo s p ro g ra m a s . En re s p u e s t a a u n a lla m a d a a l
m é t o d o re p a in t ( ) d e u n co m p o n e n t e , e l AWT in vo ca a l m é t o d o u p d a t e ( ) d e l
co m p o n e n t e , p a ra p e d ir q u e e l co m p o n e n t e s e d ib u je a s í m is m o . El m é t o d o
u p d a t e ( ) ( p o r d e fe ct o ) in vo ca a l m é t o d o p a in t ( ) d e l co m p o n e n t e .
Un a a yu d a a d icio n a l e n e s t e s is t e m a e s q u e a lg u n a ve ce s e l AWT lla m a
d ire ct a m e n t e a l m é t o d o p a in t ( ) e n ve z d e lla m a r a l m é t o d o u p d a t e ( ) . Es t o
s u ce d e ca s i s ie m p re co m o re s u lt a d o d e u n a re a cció n d e l AWT a n t e u n e s t ím u lo
e xt e rn o , co m o q u e e l co m p o n e n t e a p a re zca p o r p rim e ra ve z e n la p a n t a lla , o e l
co m p o n e n t e s e a d e s cu b ie rt o t ra s o cu lt a rs e p o r o t ra ve n t a n a . Ap re n d e rá s m á s
s o b re lo s m é t o d o s p a in t ( ) y u p d a t e ( ) e n la e xp lica ció n Elim in a r e l Pa rp a d e o , m á s
a d e la n t e e n e s t a le cció n .

El Objeto Graphics
El ú n ico a rg u m e n t o p a ra lo s m é t o d o s p a in t ( ) y u p d a t e ( ) e s u n o b je t o
Gra p h ics . Lo s o b je t o s Gra p h ics s o n la cla ve p a ra t o d o e l d ib u jo . S o p o rt a n
la s d o s cla s e s b á s ica s d e d ib u jo : g rá fico s p rim it ivo s ( co m o lín e a s ,
re ct á n g u lo s y t e xt o ) y la s im á g e n e s . Ap re n d e rá s s o b re lo s g rá fico s
p rim it ivo s e n Ut iliza r Grá fico s Prim it ivo s . Ap re n d e rá s s o b re la s im á g e n e s
e n Ut iliza r Im á g e n e s .

Ju n t o co n lo s m é t o d o s s u m in is t ra d o s p a ra d ib u ja r g rá fico s p rim it ivo s y


la s im á g e n e s e n la p a n t a lla , u n o b je t o Gra p h ics p ro p o rcio n a u n co n t e xt o
d e d ib u jo m a n t e n ie n d o e s t a d o s , co m o e l á re a d e d ib u jo a ct u a l o e l co lo r
d e d ib u jo a ct u a l. S e p u e d e d is m in in u ir e l á re a d e d ib u jo a ct u a l
re co rt á n d o la , p e ro n u n ca s e p o d rá in cre m e n t a r e l t a m a ñ o d e l á re a d e
d ib u jo . De e s t a fo rm a e l o b je t o Gra p h ics s e a s e g u ra q u e lo s
co m p o n e n t e s s ó lo p u e d a n d ib u ja r d e n t ro d e s u á re a d e d ib u jo .
Ap re n d e rá s m á s s o b re e l re co rt e e n S o b re e s crib ir e l Mé t o d o u p d a t e ( ) .

El Sistema de Coordenadas
Ca d a co m p o n e n t e t ie n e s u p ro p io s is t e m a d e co o rd e n a d a s e n t e ra s , q u e
va d e s d e ( 0 , 0 ) h a s t a ( w id t h - 1 , h e ig h t - 1 ) , d o n d e ca d a u n id a d
re p re s e n t a e l t a m a ñ o d e u n p ixe l. La e s q u in a s u p e rio r izq u ie rd a d e l á re a
d e d ib u jo d e l co m p o n e n t e e s ( 0 , 0 ) . La co o rd e n a d a X s e in cre m e n t a h a cia
la d e re ch a , y la co o rd e n a d a Y s e in cre m e n t a h a cia a b a jo .
Aq u í t ie n e s u n a p p le t q u e co n s t ru ire m o s m á s a d e la n t e e n e s t a le cció n .
S ie m p re q u e p u ls e d e n t ro d e l á re a e n m a rca d a , e l a p p le t d ib u ja u n p u n t o
d o n d e s e p u ls ó e l ra t ó n y m u e s t ra u n a ca d e n a d e s crib ie n d o d o n d e
o cu rrió la p u ls a ció n .

Las Cuatro Formas del Método repaint()


Re cu e rd a q u e e l p ro g ra m a p u e d e lla m a r a l m é t o d o re p a in t ( ) d e l
co m p o n e n t e p a ra p e d ir q u e e l AWT lla m e a l m é t o d o u p d a t e ( ) d e l
co m p o n e n t e . Aq u í t ie n e s la d e s crip ció n d e la s cu a t ro fo rm a s d e l m é t o d o
re p a in t ( ) :
p u b lic v o id re p a in t ( )
Pid e a l AWT q u e lla m e a l m é t o d o u p d a t e ( ) d e l co m p o n e n t e t a n
p ro n t o co m o s e a p o s ib le . Es t a e s la fo rm a m á s fre cu e n t e m e n t e
u t iliza d a d e re p a in t ( ) .
p u b lic v o id re p a in t ( lo n g t im e )
Pid e a l AWT q u e lla m e a l m é t o d o u p d a t e ( ) d e l co m p o n e n t e d e n t ro
d e t im e m ilis e g u n d o s d e s d e a h o ra .
p u b lic v o id re p a in t ( in t x , in t y , in t w id t h , in t h e ig h t )
Pid e a l AWT q u e lla m e a l m é t o d o u p d a t e ( ) d e l co m p o n e n t e t a n
p ro n t o co m o s e a p o s ib le , p e ro re d ib u ja n d o s ó lo la p a rt e
e s p e cifica d a d e l co m p o n e n t e .
p u b lic v o id re p a in t ( lo n g t im e , in t x , in t y , in t w id t h , in t h e ig h t )
Pid e a l AWT q u e lla m e a l m é t o d o u p d a t e ( ) d e l co m p o n e n t e d e n t ro
d e t im e m ilis e g u n d o s d e s d e a h o ra , p e ro re d ib u ja n d o s ó lo la p a rt e
e s p e cifica d a d e l co m p o n e n t e .

Oz it o
Dibujar Formas Sencillas
La cla s e Gra p h ics d e fin e m é t o d o s p a ra d ib u ja r lo s s ig u ie n t e s t ip o s d e fo rm a s :
● Lín e a s ( d ra w Lin e ( ) , q u e d ib u ja u n a lín e a e n e l co lo r a ct u a l d e l o b je t o Gra p h ics , q u e e s
in icia liza d o co n e l co lo r d e p rim e r p la n o d e l Co m p o n e n t e )
● Re ct á n g u lo s ( d ra w Re c t ( ) , fillRe c t ( ) , y c le a rRe c t ( ) - - d o n d e fillRe c t ( ) re lle n a u n re ct á n g u lo
co n e l co lo r a ct u a l d e l o b je t o Gra p h ics , y c le a rRe c t ( ) re lle n a u n re ct á n g u lo co n e l co lo r d e fo n d o
d e l Co m p o n e n t e )
● Re ct á n g u lo s e n 3 d im e n s io n e s ( d ra w 3 D Re c t ( ) y fill3 D Re c t ( ) )
● Re ct á n g u lo s co n lo s b o rd e s re d o n d e a d o s ( d ra w Ro u n d Re c t ( ) y fillRo u n d Re c t ( ) )
● Ova lo s ( d ra w Ov a l( ) y fillOv a l( ) )
● Arco s ( d ra w Arc ( ) y fillArc ( ) )
● Po líg o n o s ( d ra w P o ly g o n ( ) y fillP o ly g o n ( ) )
Exce p t o p a ra lo s p o líg o n o s y la s lín e a s t o d a s la s fo rm a s s o n e s p e cifica s u t iliza n d o s u re ct á n g u lo
e xt e rio r. Un a ve z q u e h a ya s co m p re n d id o e l d ib u jo d e re ct á n g u lo s , la s o t ra s fo rm a s s o n re la t iva m e n t e
s e n cilla s . Po r e s t a ra zó n , e s t a p á g in a s e co n ce n t ra e n e l d ib u jo d e re ct á n g u lo s .

Ejemplo 1: Dibujar un Rectángulo Sencillo


El a p p le t d e la p á g in a a n t e rio r u t iliza b a lo s m é t o d o s d ra w 3 D Re c t ( ) y fillRe c t ( ) p a ra
d ib u ja r s u in t e rfa ce . Aq u í t ie n e s e l a p p le t d e n u e vo :
Aq u í p u e d e s ve r e l có d ig o . Ab a jo s ó lo t ie n e s e l có d ig o d e d ib u jo :
//en FramedArea (una subclase de Panel):
public void paint(Graphics g) {
Dimension d = size();
Color bg = getBackground();

//Dibuja un marco divertido alrededor del applet.


g.setColor(bg);
g.draw3DRect(0, 0, d.width - 1, d.height - 1, true);
g.draw3DRect(3, 3, d.width - 7, d.height - 7, false);
}

//en CoordinateArea (una subclase de Canvas):


public void paint(Graphics g) {
//Si el usuario pulsa el ratón, dibuja un rectángulo pequeñito en esa posición
if (point != null) {
g.fillRect(point.x - 1, point.y - 1, 2, 2);
}
}
El a p p le t cre a ( y co n t ie n e ) u n o b je t o Fra m e d Are a , q u e cre a ( y co n t ie n e ) u n o b je t o
Co o rd in a t e Are a . La p rim e ra lla m a d a a d ra w 3 D Re c t ( ) cre a u n re ct á n g u lo t a n g ra n d e co m o
e l á re a d e d ib u jo d e l Fra m e d Are a . El a rg u m e n t o t ru e e s p e cifica q u e e l re ct á n g u lo d e b e
a p a re ce r e le va d o . La s e g u n d a lla m a d a a d ra w 3 D Re c t ( ) cre a u n s e g u n d o re ct á n g u lo u n
p o q u it o m e n o r, co n fa ls e e s p e cifica q u e e l re ct á n g u lo d e b e rá a p a rce r e m b e b id o . La s d o s
lla m a d a s ju n t a s p ro d u ce n e l e fe ct o d e u n m a rco e lva d o q u e co n t ie n e e l Co o rd in a t e Are a .
( Fra m e d Are a im p le m e n t a e l m é t o d o in s e t s ( ) p a ra q u e e l á re a d e d ib u jo d e la
Co o rd in a t e Are a e s t é u n o s p ixe ls d e n t ro d e l Fra m e d Are a . )
El Co o rd in a t e Are a u t iliza fillRe c t ( ) p a ra d ib u ja r u n re ct á n g u lo d e 2 x2 p ixle s e n e l p u n t o e n
e l q u e e l u s u a rio p u ls a e l b o t ó n d e l ra t ó n .
Ejemplo 2: Utilizar un Rectángulo para Indicar un Area Seleccionada
Aq u í t ie n e s u n a p p le t q u e p o d ría s u t iliza r p a ra im p le m e n t a r la s e le cció n b á s ica e n u n
p ro g ra m a d e d ib u jo . Cu a n d o e l u s u a rio m a n t ie n e p u ls a d o e l b o t ó n d e l ra t ó n , e l a p p le t
m u e s t ra co n t in u a m e n t e u n re ct á n g u lo . El re ct á n g u lo e m p ie za e n la p o s ició n d e l cu rs o r
cu a n d o e l u s u a rio p u ls ó e l b o t ó n d e l ra t ó n p o r p rim e ra ve z y t e rm in a e n la p o s ició n a ct u a l
d e l cu rs o r.
Aq u í t ie n e s e l có d ig o d e l a p p le t . Ab a jo t ie n e s e l có d ig o m á s im p o rt a n t e :
class SelectionArea extends Canvas {
. . .

public boolean mouseDown(Event event, int x, int y) {


currentRect = new Rectangle(x, y, 0, 0);
repaint();
return false;
}

public boolean mouseDrag(Event event, int x, int y) {


currentRect.resize(x - currentRect.x, y - currentRect.y);
repaint();
return false;
}

public boolean mouseUp(Event event, int x, int y) {


currentRect.resize(x - currentRect.x, y - currentRect.y);
repaint();
return false;
}

public void paint(Graphics g) {


Dimension d = size();

//Si existe currentRect exists, dibuja un rectángulo.


if (currentRect != null) {
Rectangle box = getDrawableRect(currentRect, d);
controller.rectChanged(box);

//Draw the box outline.


g.drawRect(box.x, box.y, box.width - 1, box.height - 1);
}
}

Rectangle getDrawableRect(Rectangle originalRect, Dimension drawingArea) {


. . .
//Asegurese de que las dimensiones de altura y anchura del rectángulo son
positiva.
. . .
//El rectángulo no debe sobrepasar el área de dibujo.
. . .
}
}
Co m o p u e d e s ve r, e l S e le ct io n Are a s ig u e la p is t a d e l re ct á n g u lo s e le ccio n a d o a ct u a lm e n t e ,
u t iliza n d o u n o b je t o Re ct a n g le lla m a d o c u rre n t Re c t . De b id o a la im p le m e n t a ció n , e l
c u rre n t Re c t m a n t ie n e e l m is m o o rig e n ( c u rre n t Re c t . x , c u rre n t Re c t . y ) m ie n t ra s e l
u s u a rio a rrra s t re e l ra t ó n . Es t o s ig n ifica q u e la a lt u ra y a n ch u ra d e l re ct á n g u lo p o d ría n s e r
n e g a t iva s .
S in e m b a rg o , lo s m é t o d o s d ra w Xx x ( ) y fillXx x ( ) n o d ib u ja rá n n a d a s i s u a lt u ra o a n ch u ra
s o n n e g a t ivo s . Po r e s t a ra zó n , cu a n d o S e le ct io n Are a d ib u ja u n re ct á n g u lo , d e b e e s p e cifica r
e l vé rt ice s u p e rio r izq u ie rd o d e l re ct á n g u lo p a ra q u e la a lt u ra y la a n ch u ra s e a n p o s it iva s .
La cla s e S e le ct io n Are a d e fin e e l m é t o d o g e t D ra w a b le Re c t ( ) p a ra re a liza r lo s cá lcu lo s
n e ce s a rio s p a ra e n co n t ra r e l vé rt ice s u p e rio r izq u ie rd o . El g e t D ra w a b le Re c t ( ) m é t o d o
t a m b ié n s e a s e g u ra d e q u e e l re ct á n g u lo n o s o b re p a s e lo s lím it e s d e s u á re a d e d ib u jo .
Aq u í t ie n e s d e n u e vo u n e n la ce a l có d ig o fu e n t e . En co n t ra rá d la d e fin ició n d e
g e t D ra w a b le Re c t ( ) a l fin a l d e l fich e ro .
N o t a : Es p e rfe ct a m e n t e le g a l e s p e cifica r va lo re s n e g a t ivo s p a ra x, y, h e ig h t o wid t h o h a ce r
q u e e l re s u lt a d o s e a m a yo r q u e e l á re a d e d ib u jo . Lo s va lo re s fu e ra d e l á re a d e d ib u jo n o
im p o rt a n d e m a s ia d o p o rq u e s o n re co rt a rd o s a l á re a d e d ib u jo . Lo ú n ico e s q u e n o ve rá s
u n a p a rt e d e la fo rm a . La a lt u ra o a n ch u ra n e g a t iva s d a n co m o re s u lt a d o q u e n o s e
d ib u ja rá n a d a e n a b s o lu t o .

Ejemplo 3: Un Ejemplarizador de Formas


El s ig u ie n t e a p p le t d e m u e s t ra t o d a s la s fo rm a s q u e s e p u e d e n d ib u ja r y re lle n a r.
A m e n o s q u e la fu e n t e p o r d e fe ct o d e s u vis u a liza d o r d e a p p le t s s e a m u y p e q u e ñ a , e l t e xt o
m o s t ra d o e n e l a p p le t a n t e rio r p o d ría p a re ce r d e m a s ia d o g ra n d e e n o ca s io n e s . La p a la b ra s
p o d ría n d ib u ja rs e u n a s s o b re o t ra s . Y co m o e s t e a p p le t n o u t iliza e l m é t o d o in s e t s ( ) p a ra
p ro t e g e r s u s lím it e s e l t e xt o p o d ría d ib u ja rs e s o b re e l m a rco a lre d e d o r d e l a p p le t . La
s ig u ie n t e p á g in a a m p lía e s t e e je m p lo , e n s e ñ á n d o lo co m o h a ce r q u e e l t e xt o q u e p a e n u n
e s p a cio d a d o .
Aq u í t ie n e s e l có d ig o p a ra e l a p p le t a n t e rio r. Ab a jo s ó lo t ie n e s e l có d ig o q u e d ib u ja la s
fo rm a s g e o m é t rica s . La s va ria b le s re c t He ig h t y re c t W id t h e s p e cifica n e l t a m a ñ o e n p ixe ls
d e l á re a e n q u e d e b e d ib u ja rs e ca d a fo rm a . La s va ria b le s x y y s e ca m b ia n p a ra ca d a
fo rm a , p a ra q u e n o s e d ib u je n u n a s s o b re o t ra s .
Color bg = getBackground();
Color fg = getForeground();
. . .

// drawLine()
g.drawLine(x, y+rectHeight-1, x + rectWidth, y); // x1, y1, x2, y2
. . .

// drawRect()
g.drawRect(x, y, rectWidth, rectHeight); // x, y, width, height
. . .

// draw3DRect()
g.setColor(bg);
g.draw3DRect(x, y, rectWidth, rectHeight, true);
g.setColor(fg);
. . .

// drawRoundRect()
g.drawRoundRect(x, y, rectWidth, rectHeight, 10, 10); // x, y, w, h, arcw, arch
. . .

// drawOval()
g.drawOval(x, y, rectWidth, rectHeight); // x, y, w, h
. . .
// drawArc()
g.drawArc(x, y, rectWidth, rectHeight, 90, 135); // x, y, w, h
. . .

// drawPolygon()
Polygon polygon = new Polygon();
polygon.addPoint(x, y);
polygon.addPoint(x+rectWidth, y+rectHeight);
polygon.addPoint(x, y+rectHeight);
polygon.addPoint(x+rectWidth, y);
//polygon.addPoint(x, y); //don't complete; fill will, draw won't
g.drawPolygon(polygon);
. . .

// fillRect()
g.fillRect(x, y, rectWidth, rectHeight); // x, y, width, height
. . .

// fill3DRect()
g.setColor(bg);
g.fill3DRect(x, y, rectWidth, rectHeight, true);
g.setColor(fg);
. . .

// fillRoundRect()
g.fillRoundRect(x, y, rectWidth, rectHeight, 10, 10); // x, y, w, h, arcw, arch
. . .

// fillOval()
g.fillOval(x, y, rectWidth, rectHeight); // x, y, w, h
. . .

// fillArc()
g.fillArc(x, y, rectWidth, rectHeight, 90, 135); // x, y, w, h
. . .

// fillPolygon()
Polygon filledPolygon = new Polygon();
filledPolygon.addPoint(x, y);
filledPolygon.addPoint(x+rectWidth, y+rectHeight);
filledPolygon.addPoint(x, y+rectHeight);
filledPolygon.addPoint(x+rectWidth, y);
//filledPolygon.addPoint(x, y);
g.fillPolygon(filledPolygon);

Oz it o
Trabajar con Texto
El s o p o rt e p a ra e l t ra b a jo co n t e xt o p rim it ivo s e e n cu e n t ra e n la s cla s e s Gra p h ics ,
Fo n t , , y Fo n t Me t rics d e l AWT.

Dibujar Texto
Cu a n d o e s crib a s có d ig o p a ra d ib u ja r t e xt o , lo p rim e ro q u e d e b e ría s
co n s id e ra r e s s i p u e d e u t iliza r u n Co m p o n e n t e o rie n t a d o a t e xt o co m o
u n a cla s e La b e l, Te xt Fie ld o Te xt Are a . S i n o h a y n in g ú n co m p o n e n t e
a p ro p ia d o p u e d e s u t iliza r lo s m é t o d o s d ra w By t e s ( ) , d ra w Ch a rs ( ) , o
d ra w S t rin g ( ) d e la cla s e Gra p h ics .
Aq u í t ie n e s u n e je m p lo d e có d ig o q u e d ib u ja u n a ca d e n a e n la p a n t a lla :
g.drawString("Hello World!", x, y);
Pa ra lo s m é t o d o s d e d ib u jo , x e y s o n e n t e ro s q u e e s p e cifica n la p o s ició n
d e e s q u in a in fe rio r iz q u ie rd a d e l t e xt o . Pa ra s e r m á s p re cis o s , la
co o rd e n a d a y e s p e cifica la lín e a b a s e d e l t e xt o - - la lín e a e n la q u e
d e s ca n s a n la m a yo ría d e la s le t ra s - - lo q u e n o in clu ye e s p a cio p a ra lo s
t a llo s ( d e s ce n d e n t e s ) d e le t ra s co m o la "y". As é g u ra t e d e h a ce r y lo
s u ficie n t e m e n t e g ra n d e p a ra p e rm it ir e l e s p a cio ve rt ica l p a ra e l t e xt o ,
p e ro lo s u ficie n t e m e n t e p e q u e ñ o p a ra a s ig n a r e s p a cio p a ra lo s
d e s ce n d e n t e s .
Aq u í t ie n e s u n a fig u ra q u e m u e s t ra la lín e a b a s e , a s í co m o la s lín e a s
a s ce n d e n t e y d e s ce n d e n t e . Ap re n d e rá s m á s s o b re lo s a s ce n d e n t e s y lo s
d e s ce n d e n t e s u n p o co m á s a d e la n t e .

Aq u í t ie n e s u n a p p le t s e n cillo q u e ilu s t ra lo q u e s u ce d e cu e n t o u s t e d n o
t ie n e cu id a d o co n la p o s ició n d e l t e xt o :
La ca d e n a s u p e rio r p ro b a b le m e n t e e s t a rá co rt a d a , ya q u e s u a rg u m e n t o
y e s 5 , lo q u e d e ja s ó lo 5 p ixe ls s o b re la lín e b a s e p a ra la ca d e n a - - lo
q u e n o e s s u ficie n t e p a ra la m a yo ría d e la s fu e n t e s . La ca d e n a ce n t ra l
p ro b a b le m e n t e s e ve rá p e rfe ct a , a m e n o s q u e t e n g a s u n a fu e n t e e n o rm e
p o r d e fe ct o . La m a yo ría d e la s le t ra s d e la ca d e n a in fe rio r s e m o s t ra rá n
b ie n , e xce p t o la le t ra s co n d e s ce n d e n t e s . To d o s lo s d e s ce n d e n t e s d e la
ca d e n a in fe rio r e s t a rá n co rt a d o s ya q u e e l có d ig o q u e m u e s t ra e s t a
ca d e n a n o d e ja e s p a cio p a ra e llo s . ( Aq u í t ie n e s e l có d ig o fu e n t e d e l
a p p le t . )
N o t a : la in t e rp re t a ció n q u e lo s m é t o d o s d e d ib u jo d e t e xt o h a ce n d e x e
y e s d ife re n t e d e la q u e h a ce n lo s m é t o d o s d e d ib u jo d e fo rm a s . Cu a n d o
s e d ib u ja u n a fo rm a ( u n re ct á n g u lo , p o r e je m p lo ) x e y e s p e cifica n la
e s q u in a s u p e rio r izq u ie rd a d e l re ct á n g u lo , e n lu g a r d e la e s q u in a in fe rio r
izq u ie rd a .

Obtener información sobre la Fuente: FontMetrics


El e je m p lo d e d ib u jo d e fo rm a s d e la p á g in a a n t e rio r p o d ría m e jo ra rs e
e lig ie n d o u n a fu e n t e m á s p e q u e ñ a q u e la fu e n t e p o r d e fe ct o n o rm a l. El
s ig u ie n t e e je m p lo h a ce e s t o y t a m b ié n a g ra n d a la s fo rm a s p a ra o cu p a r e l
e s p a cio lib e ra d o p o r la fu e n t e m á s p e q u e ñ a . Ab a jo t ie n e s e l a p p le t
m e jo ra d o ( a q u í t ie n e s e l có d ig o fu e n t e ) :

El e je m p lo e lig e la fu e n t e a p ro p ia d a u t iliza n d o u n o b je t o Fo n t Me t rics


p a ra o b t e n e r d e t a lle s d e l t a m a ñ o d e la fu e n t e . Po r e je m p lo , e l s ig u ie n t e
b u cle ( e n e l m é t o d o p a in t ( ) ) s e a s e g u ra q u e la ca d e n a m á s la rg a
m o s t ra d a p o r e l a p p le t ( "d ra wRo u n d Re ct ( ) ") e n t ra d e n t ro d e l e s p a cio
a s ig n a d o a ca d a fo rm a .
boolean textFits = false;
Font font = g.getFont();
FontMetrics fontMetrics = g.getFontMetrics();
while (!textFits) {
if ((fontMetrics.getHeight() <= maxCharHeight)
&& (fontMetrics.stringWidth("drawRoundRect()")
<= gridWidth)) {
textFits = true;
} else {
g.setFont(font = new Font(font.getName(),
font.getStyle(),
font.getSize() - 1));
fontMetrics = g.getFontMetrics();
}
}
El e je m p lo d e có d ig o a n t e rio r u t iliza lo s m é t o d o s g e t Fo n t ( ) , s e t Fo n t ( ) ,
y g e t Fo n t Me t ric s ( ) d e la cla s e Gra p h ics p a ra o b t e n e r y s e le ccio n a r la
fu e n t e a ct u a l y p a ra o b t e n e r e l o b je t o Fo n t Me t rics q u e co rre s p o n d e co n
e l fo n t . De s d e lo s m é t o d o s g e t He ig h t ( ) y g e t S t rin g W id t h ( ) d e
Fo n t Me t rics , e l có d ig o o b t ie n e la in fo rm a ció n s o b re e l t a m a ñ o ve rt ica l y
h o rizo n t a l d e la fu e n t e .
La s ig u ie n t e fig u ra m u e s t ra p a rt e d e la in fo rm a ció n q u e u n o b je t o
Fo n t Me t rics p u e d e p ro p o rcio n a r s o b re e l t a m a ñ o d e u n a fu e n t e .

Aq u í t ie n e s u n s u m a rio d e lo s m é t o d o s d e Fo n t Me t rics q u e d e vu e lve n


in fo rm a ció n s o b re e l t a m a ñ o ve rt ica l d e la fu e n t e :
g e t As c e n t ( ) , g e t Ma x As c e n t ( )
El m é t o d o g e t As c e n t ( ) d e vu e lve e l n ú m e ro d e p ixe ls e n t re la lín e a
d e a s ce n d e t e s y la lín e a b a s e . Ge n e ra lm e n t e , la lín e a d e
a s ce n d e n t e s re p re s e n t a la a lt u ra t íp ica d e u n a le t ra m a yú s cu la .
Es p e cifica m e n t e , lo s va lo re s a s ce n d e n t e y d e s ce n d e n t e lo s e lig e e l
d is e ñ a d o r d e la fu e n t e p a ra re p re s e n t a r e l "co lo r" co rre ct o d e l
t e xt o , o la d e n s id a d d e la t in t a , p a ra q u e e l t e xt o a p a re zca co m o lo
p la n e ó e l d is e ñ a d o r. El a s ce n d e n t e t íp ico p o rp o rcio n a s u ficie n t e
e s p a cio p a ra ca s i t o d o s lo s ca ra ct e re s d e la fu e n t e , e xce p t o q u izá s
p a ra lo s a ce n t o s d e la s le t ra s m a yú s cu la s . El m é t o d o
g e t Ma x As c e n t ( ) t ie n e e n cu e n t a e s t o s ca ra ct e re s
e xce p cio n a lm e n t e a lt o s .
g e t D e s c e n t ( ) , g e t Ma x D e s c e n t ( )
El m é t o d o g e t D e s c e n t ( ) d e vu e lve e l n ú m e ro d e p ixe ls e n t re la
lín e a b a s e y la lín e a d e d e s ce n d e n t e s . En la m a yo ría d e la s fu e n t e s ,
t o d o s lo s ca ra ct e re s ca e n e n la lín e a d e s ce n d e n t e e n s u p u n t o m á s
b a jo . S ó lo e n a lg u n o s ca s o , p o d rá u t iliza r e l m é t o d o
g e t Ma x D e s c e n t ( ) p a ra o b t e n e r u n a d is t a n cia g a ra n t iza d a p a ra
t o d o s lo s ca ra ct e re s .
g e t He ig h t ( )
Ob t ie n e e l n ú m e ro d e p ixe ls q u e s e e n cu e n t ra n n o rm a lm e n t e e n t re
la lín e a b a s e d e u n a lín e a d e t e xt o y la lín e a b a s e d e la s ig u ie n t e
lín e a d e t e xt o . Ob s e rva q u e e s t o in clu ye e l e s p a cio p a ra lo s
a s ce n d e n t e s y d e s ce n d e n t e s .
g e t Le a d in g ( )
De vu e lve la d is t a n cia s u g e rid a ( e n p ixe ls ) e n t re u n a lín e a d e t e xt o y
la s ig u ie n t e . Es p e cifica m e n t e , e s t a e s la d is t a n cia e n t re la lín e a
d e s ce n d e n t e d e u n a lín e a d e t e xt o y la lín e a a s ce n d e n t e d e la
s ig u ie n t e .
Ob s e rva q u e e l t a m a ñ o d e la fu e n t e ( d e vu e lt o p o r e l m é t o d o g e t S iz e ( )
d e la cla s e Fo n t ) e s u n a m e d ia a b s t ra ct a . Te o rica m e n t e , co rre s p o n d e a l
a s ce n d e n t e m á s e l d e s ce n d e n t e . S in e m b a rg o , e n la p rá ct ica , e l
d is e ñ a d o r d e cid e la a lt u ra q u e d e b e t e n e r u n a fu e n t e d e "1 2 p u n t o s ". Po r
e je m p lo , Tim e s d e 1 2 - p u n t o s e s lig e ra m e n t e m á s b a ja q u e He lve t ica d e
1 2 - p u n t o s . Típ ica m e n t e , la s fu e n t e s s e m id e n e n p u n t o s , q u e e s
a p ro xim a d a m e n t e 1 / 7 2 d e p u lg a d a .
La s ig u ie n t e lis t a m u e s t ra lo s m é t o d o s q u e p ro p o rcio n a Fo n t Me t rics p a ra
d e vo lve r in fo rm a ció n s o b re e l t a m a ñ o h o rizo n t a l d e u n a fu e n t e . Es t o s
m é t o d o s t ie n e n e n cu e n t a e l e s p a cio e n t re lo s ca ra ct e re s . Má s
p re cis a m e n t e , ca d a m é t o d o n o d e vu e lve e l n ú m e ro d e p ixe ls d e u n
ca rá ct e r p a rt icu la r ( o ca ra ct e re s ) , s in o e l n ú m e ro d e p ixe ls q u e a va n za rá
la p o s ició n a ct u a l cu a n d o s e m u e s t re e l ca rá ct e r ( o ca ra ct e re s ) .
Lla m a m o s a e s t o a n ch u ra d e a v a n ce p a ra d is t in g u irla d e la a n ch u ra d e l
t e xt o .
g e t Ma x Ad v a n c e ( )
La a n ch u ra d e a va n ce ( e n p ixe ls ) d e l ca rá ct e r m á s a n ch o d e la
fu e n t e .
b y t e s W id t h ( b y t e [ ] , in t , in t )
La a n ch u ra d e a va n ce d e l t e xt o re p re s e n t a d o p o r e l a rra y d e b yt e s
e s p e cifica d o . El p rim e r a rg u m e n t o e n t e ro e s p e cifica e l o rig e n d e lo s
d a t o s d e n t ro d e l a rra y. El s e g u n d o a rg u m e n t o e n t e ro e s p e cifica e l
n ú m e ro m á xim o d e b yt e s a ch e q u e a r.
c h a rW id t h ( in t ) , c h a rW id t h ( c h a r)
La a n ch u ra d e a va n ce d e l ca rá ct e r e s p e cifica d o .
c h a rs W id t h ( c h a r[ ] , in t , in t )
La a n ch u ra d e a va n ce d e la ca d e n a re p re s e n t a d a p o r e l a rra y d e
ca ra ct e re s e s p e cifica d o .
s t rin g W id t h ( S t rin g )
La a n ch u ra d e a va n ce d e la ca d e n a e s p e cifica d a .
g e t W id t h s ( )
La a n ch u ra d e a va n ce d e ca d a u n o d e lo s p rim e ro s 2 5 6 ca ra ct e re s
d e la fu e n t e .

Oz it o
Utilizar Imágenes
La s s ig u ie n t e s p á g in a s p ro p o rcio n a n lo d e t a lle s n e ce s a rio s p a ra t ra b a ja r co n
im á g e n e s . Ap re n d e rá s có m o ca rg a rla s , m o s t ra rla s y m a n ip u la rla s .
El s o p o rt e p a ra la u t iliza ció n d e im á g e n e s e s t á s it u a d o e n lo s p a q u e t e s ja va . a p p le t ,
ja va . a wt y ja va . a wt . im a g e . Ca d a im a g e n e s t á re p re s e n t a d a p o r u n o b je t o
ja va . a wt . im a g e . Ad e m á s d e la cla s e Im a g e , e l p a q u e t e ja va . a wt p ro p o rcio n a o t ro
s o p o rt e b á s ico p a ra im á g e n e s , co m o e l m é t o d o d ra w I m a g e ( ) d e la cla s e Gra p h ics , e l
m é t o d o g e t I m a g e ( ) d e la cla s e To o lkit y la cla s e Me d ia Tra cke r. En e l p a q u e t e
ja va . a p p le t , e l m é t o d o g e t I m a g e ( ) d e la cla s e Ap p le t h a ce q u e lo s a p p le t ca rg u e n
im á g e n e s d e fo rm a s e n cilla , u t iliza n d o URLs . Fin a lm e n t e e l p a q u e t e ja va . a wt . im a g e
p ro p o rcio n a in t e rfa ce s y cla s e s q u e p e rm it e n cre a r, m a n ip u la r y o b s e rva r im á g e n e s .

Cargar Imágenes
El AWT h a ce s e n cilla la ca rg a d e im á g e n e s e n e s t o s d o s fo rm a t o s : GIF y
JPEG. La s cla s e s Ap p le t y To o lkit p ro p o rcio n a n lo s m é t o d o s g e t I m a g e ( )
q u e t ra b a ja n co n a m b o s fo rm a t o s . Pu e d e s u t iliza rla s d e e s t a fo rm a :
myImage = getImage(URL); //Sólo en métodos de una subclase de Applet
o
myImage = Toolkit.getDefaultToolkit().getImage(filenameOrURL);
Lo s m é t o d o s g e t I m a g e ( ) vu e lve n in m e d ia t a m e n t e , p o r lo q u e n o s e t ie n e
q u e e s p e ra r a q u e s e ca rg u e u n a im a g e n a n t e s d e ir a re a liza r o t ra s
o p e ra cio n e s e n e l p ro g ra m a . Mie n t ra s e s t o a u m e n t a e l re n d im ie n t o , a lg u n o s
p ro g ra m a s re q u ie re n m á s co n t ro l s o b re la im a g e n q u e s e e s t á n ca rg a n d o .
S e p u e d e co n t ro la r e l e s t a d o d e la ca rg a d e u n a im a g e n u t iliza n d o la cla s e
Me d ia Tra cke r o im p le m e n t a n d o e l m é t o d o im a g e Up d a t e ( ) , q u e e s t á
d e fin id o p o r e l in t e fa ce Im a g e Ob s e rve r.
Es t a s e cció n t a m b ié n e xp lica rá có m o cre a r im á g e n e s a l vu e lo , u t iliza n d o la
cla s e Me m o ryIm a g e S o u rce .

Mostrar Imágenes
Es s e n cillo d ib u ja r u n a im a g e n u t iliza n d o e l o b je t o Gra p h ics q u e s e p a s ó a
s u s m é t o d o s u p d a t e ( ) o p a in t ( ) . S im p le m e n t e s e lla m a a l m é t o d o
d ra w I m a g e ( ) d e l o b je t o Gra p h ics . Po r e je m p lo :
g.drawImage(myImage, 0, 0, this);
Es t a s e cció n e xp lica la s cu a t ro fo rm a s d e d ra w I m a g e ( ) , d o s d e la cu a le s
e s ca la n la im a g e n . Al ig u a l q u e g e t I m a g e ( ) , d ra w I m a g e ( ) e s a s ín cro n a ,
vu e lve in m e d ia t a m e n t e in clu s o s i la im a g e n n o s e h a ca rg a d o o d ib u ja d o
co m p le t a m e n t e t o d a vía .
Manipular Imágenes
Es t a s e cció n o fre ce u n a in t ro d u cció n s o b re có m o ca m b ia r im á g e n e s ,
u t iliza n d o filt ro s . ( El e s ca la d o d e im á g e n e s s e cu b re e n Mo s t ra r Im á g e n e s . )

Oz it o
Cargar Imágenes
Es t a p á g in a d e s crib e có m o o b t e n e r e l o b je t o Im a g e co rre s p o n d ie n t e a u n a im a g e n . S ie m p re q u e la
im a g e n e s t e e n fo rm a t o GIF o JEPG y s e co n o zca s u n o m b re d e fich e ro o s u URL, e s s e n cillo o b t e n e r u n
o b je t o Im a g e p a ra e lla : co n s o lo u t iliza r u n o d e lo s m é t o d o s g e t I m a g e ( ) d e Ap p le t o To o lkit . Lo s
m é t o d o s g e t I m a g e ( ) vu e lve n in m e d ia t a m e n t e , s in co m p ro b a r s i e xis t e n lo s d a t o s d e la im a g e n .
No rm a lm e n t e la ca rg a re a l d e la im a g e n n o e m p ie za h a s t a q u e e l p ro g ra m a in t e n t a d ib u ja rla p o r
p rim e ra ve z.
Pa ra m u ch o s p ro g ra m a s , e s t a ca rg a e n s e g u n d o p la n o fu n cio n a b ie n . Ot ro s , s in e m b a rg o , n e ce s it a n
s e g u ir e l p ro ce s o d e ca rg a d e la im a g e n . Es t a p á g in a e xp lica có m o h a ce rlo u t iliza n d o la cla s e
Me d ia Tra cke r y e l in t e rfa ce Im a g e Ob s e rve r.
Fin a lm e n t e , e s t a p á g in a co n t a rá có m o cre a r im á g e n e s a l vu e lo , u t iliza n d o u n a cla s e co m o
Me m o ryIm a g e S o u rce .

Utilizar los Métodos getImage()


Es t a s e cció n e xp lica p rim e ro lo s m é t o d o s g e t I m a g e ( ) d e la cla s e a p p le t y lu e g o lo s d e la
cla s e To o lkit .
La cla s e Ap p le t s u m in is t ra d o s m é t o d o s g e t I m a g e ( ) :
● p u b lic I m a g e g e t I m a g e ( URL u rl)

● p u b lic I m a g e g e t I m a g e ( URL u rl, S t rin g n a m e )

S ó lo lo s a p p le t s p u e d e n u t iliza r lo s m é t o d o s g e t I m a g e ( ) d e la cla s e Ap p le t . Ad e m á s , lo s
m é t o d o s g e t I m a g e ( ) d e Ap p le t n o t ra b a ja n h a s t a q u e e l a p p le t t e n g a u n co n t e xt o co m p le t o
( Ap p le t Co n t e xt ) . Po r e s t a ra zó n , e s t o s m é t o d o s n o t ra b a ja n s i s e lla m a n d e s d e u n co n s t ru ct o r
o e n u n a s e n t e n cia q u e d e cla ra u n a va ria b le d e e je m p la r. En s u lu g a r, d e b e ría lla m a r a
g e t I m a g e ( ) d e s d e u n m é t o d o co m o in it ( ) .
El s ig u ie n t e e je m p lo d e có d ig o m u e s t ra có m o u t iliza r lo s m é t o d o s g e t I m a g e ( ) d e la cla s e
Ap p le t . Pu e d e ve r Cre a r u n GUI p a ra u n a e xp lica ció n d e lo s m é t o d o s g e t b Ba s e ( ) y
g e t D o c u m e n t Ba s e ( ) .
//en un método de una subclase de Applet:
Image image1 = getImage(getcodeBase(), "imageFile.gif");
Image image2 = getImage(getDocumentBase(), "anImageFile.jpeg");
Image image3 = getImage(new URL("http://java.sun.com/graphics/people.gif"));
La cla s e To o lkit d e cla ra d o s m é t o d o s g e t I m a g e ( ) m á s :
● p u b lic a b s t ra c t I m a g e g e t I m a g e ( URL u rl)

● p u b lic a b s t ra c t I m a g e g e t I m a g e ( S t rin g file n a m e )

S e p u e d e o b t e n e r u n o b je t o To o lkit lla m a n d o a l m é t o d o g e t D e fa u lt To o lk it ( ) p o r d e fe ct o d e
la cla s e o lla m a n d o a l m é t o d o g e t To o lk it ( ) d e la cla s e Co m p o n e n t . Es t e ú lt im o d e vu e lve e l
To o lkit q u e fu e u t iliza d o ( o q u e s e rá u t iliza d o ) p a ra im p le m e n t a r e l Co m p o n e n t e .
Aq u í t ie n e s u n e je m p lo d e la u t iliza ció n d e lo s m é t o d o s g e t I m a g e ( ) d e To o lkit . To d a s la s
a p p lica cio n e s Ja va y lo s a p p le t s p u e d e n u t iliza r e s t o s m é t o d o s , e n lo s a p p le t s e s t á n s u je t o s a
la s re s t riccio n e s d e s e g u rid a d u s u a le s . Pu e d e s le e r s o b re la s e g u rid a d d e lo s a p p le t s e n
En t e n d e r la s Ca p a cid a d e s y la s Re s t riccio n e s d e lo s Ap p le t s .
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image1 = toolkit.getImage("imageFile.gif");
Image image2 = toolkit.getImage(new URL("http://java.sun.com/graphics/people.gif"));
Petición y Seguimiento de la Carga de una Imagen: MediaTracker e ImageObserver
El AWT p ro p o rcio n a d o s fo rm a s d e s e g u ir la ca rg a d e u n a im a g e n : la cla s e Me d ia Tra cke r y e l
in t e rfa ce Im a g e Ob s e rve r.

La cla s e Me d ia t ra cke r e s s u ficie n t e p a ra la m a yo ría d e lo s p ro g ra m a s . S e cre a u n e je m p la r d e


Me d ia Tra cke r, s e le d ice q u e h a g a u n s e g u im ie n t o a u n a o m á s im á g e n e s , y lu e g o s e le
p re g u n t a p o r e l e s t a d o d e e s a s im á g e n e s , cu a n d o s e a n e ce s a rio . Pu e d e s ve r u n e je m p lo d e
e s t o e n Au m e n t a r la Ap a rie n cia y e l Re n d im ie n t o d e u n a An im a ció n d e Im á g e n e s .

El e je m p lo d e a n im a ció n m u e s t ra d o s ca ra ct e rís t ica s m u y ú t ile s d e Me d ia Tra cke r, p e t ició n


p a ra q u e s e a n ca rg a d o s lo s d a t o s d e u n g ru p o d e im á g e n e s , y e s p e ra a q u e s e a ca rg a d o e l
g ru p o d e im á g e n e s . Pa ra p e d ir q u e s e a n ca rg a d o s lo s d a t o s d e u n g ru p o d e im á g e n e s , s e
p u e d e n u t iliza r la s fo rm a s d e c h e c k I D ( ) y c h e c k All( ) q u e u t iliza n u n a rg u m e n t o b o o le a n o .
S e le ccio n a n d o e s t e a rg u m e n t o a t ru e e m p ie za la ca rg a d e lo s d a t o s p a ra t o d a s a q u e lla s
im á g e n e s q u e n o h a ya n s id o ca rg a d a s . O s e p u e d e p e d ir q u e lo s d a t o s d e la im a g e n s e n
ca rg a d o s y e s p e re n h a s t a s u u t iliza ció n u t iliza n d o lo s m é t o d o s w a it Fo rI D ( ) y w a it Fo rAll( ) .
El in t e rfa ce Im a g e Ob s e rve r p e rm it e s e g u ir m á s d e ce rca la ca rg a d e u n a im a g e n q u e
Me d ia Tra cke r. La cla s e Co m p o n e n t lo u t iliza p a ra q u e s u s co m p o n e n t e s s e a n re d ib u ja d o s y la s
im á g e n e s q u e m u e s t ra n s e a n re ca rg a d a s . Pa ra u t iliza r Im a g e Ob s e rve r, im p le m e n t e e l m é t o d o
im a g e Up d a t e ( ) d e e s t e in t e rfa ce y a s e g u re s e d e q u e e l o b je t o im p le m e n t a d o s e a re g is t ra d o
co m o e l o b s e rva d o r d e im a g e n . No rm a lm e n t e , e s t e re g is t ro s u ce d e cu a n d o e s p e cifica u n
Im a g e Ob s e rve r p a ra e l m é t o d o d ra w I m a g e ( ) , co m o s e d e s crib e e n la s ig u ie n t e p á g in a . El
m é t o d o im a g e Up d a t e ( ) e s lla m a d o e n cu a n t o la in fo rm a ció n s o b re la im a g e n e s t e d is p o n ib le .
Aq u í t ie n e s u n e je m p lo d e im p le m e n t a ció n d e l m é t o d o im a g e Up d a t e ( ) d e l in t e fa ce
Im a g e Ob s e rve r. Es t e e je m p lo u t iliza im a g e Up d a t e ( ) p a ra p o s icio n a r d o s im á g e n e s t a n
p ro n t o co m o s e co n o zca n s u s t a m a ñ o s , y re d ib u ja rla s ca d a 1 0 0 m ilis e g u n d o s h a s t a q u e la s
d o s im á g e n e s e s t e n ca rg a d a s ( Aq u í t ie n e s e l p ro g ra m a co m p le t o . )
public boolean imageUpdate(Image theimg, int infoflags,
int x, int y, int w, int h) {
if ((infoflags & (ERROR)) != 0) {
errored = true;
}
if ((infoflags & (WIDTH | HEIGHT)) != 0) {
positionImages();
}
boolean done = ((infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0);
// Redibuja inmediatamente si lo hemos hechom si no vuelve a
// pedir el redibujado cada 100 milisegundos
repaint(done ? 0 : 100);
return !done; //Si está hecho, no necesita más actualizaciones.
}
S i n a ve g a s p o r la d o cu m e n t a ció n d e l API s o b re Me d ia Tra cke r, p o d ría s h a b e r o b s e rva d o q u e la
cla s e Co m p o n e n t d e fin e d o s m é t o d o s d e a s p e ct o m u y ú t il: c h e c k I m a g e ( ) y
p re p a re I m a g e ( ) . La cla s e Me d ia Tra cke r h a h e ch o q u e e s t o s m é t o d o s ya n o s e a n n e ce s a rio s .

Crear Imágenes con MemoryImageSource


Co n la a yu d a d e u n p ro d u ct o r d e im á g e n e s có m o la cla s e Me m o ryIm a g e S o u rce , p o d rá s
co n s t ru ir im á g e n e s a p a rt ir d e la im p ro vis a ció n . El s ig u ie n t e e je m p lo ca lcu la u n a im a g e n d e
1 0 0 x1 0 0 re p re s e n t a n d o u n d e g ra a d o d e co lo re s d e l n e g ro a l a zu l a lo la rg o d e l e je X y u n
d e g ra d a d o d e l n e g ro a l ro jo a lo la rg o d e l e je Y.
int w = 100;
int h = 100;
int[] pix = new int[w * h];
int index = 0;
for (int y = 0; y < h; y++) {
int red = (y * 255) / (h - 1);
for (int x = 0; x < w; x++) {
int blue = (x * 255) / (w - 1);
pix[index++] = (255 << 24) | (red << 16) | blue;
}
}
Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));

Oz it o
Mostrar Imágenes
Aq u í t ie n e s u n e je m p lo d e có d ig o q u e m u e s t ra u n a im a g e a s u t a m a ñ o n o rm a l e n
la e s q u in a s u p e rio r izq u ie rd a d e l á re a d e l Co m p o n e n t e ( 0 , 0 ) :
g.drawImage(image, 0, 0, this);
Aq u í t ie n e s u n e je m p lo d e có d ig o q u e m u e s t ra u n a im a g e n e s ca la d a p a ra t e n e r 3 0 0
p ixe ls d e a n ch o y 6 2 d e a lt o , e m p e za n d o e n la s co o rd e n a d a s ( 9 0 , 0 ) :
g.drawImage(myImage, 90, 0, 300, 62, this);
Ab a jo t ie n e s u n a p p le t q u e m u e s t ra u n a im a g e n d o s ve ce s , u t iliza n d o lo s d o s
e je m p lo s d e có d ig o a n t e rio re s . Aq u í t ie n e s e l có d ig o co m p le t o d e l p ro g ra m a .

La cla s e Gra p h ics d e cla ra lo s s ig u ie n t e s m é t o d o s d ra w I m a g e ( ) . To d o s d e vu e lve n


u n va lo r b o o le n a o , a u n q u e e s e va lo r ca s i n u n ca s e u t iliza . El va lo r d e re t o rn o e s
t ru e s i la im a g e n s e h a ca rg a d o co m p le t a m e n t e , y p o r lo t a n t o s e h a d ib u ja d o
co m p le t a m e n t e ; d e o t ra fo rm a , e s fa ls e .
● p u b lic a b s t ra c t b o o le a n d ra w I m a g e ( I m a g e im g , in t x , in t y ,
I m a g e Ob s e rv e r o b s e rv e r)
● p u b lic a b s t ra c t b o o le a n d ra w I m a g e ( I m a g e im g , in t x , in t y , in t w id t h ,
in t h e ig h t , I m a g e Ob s e rv e r o b s e rv e r)
● p u b lic a b s t ra c t b o o le a n d ra w I m a g e ( I m a g e im g , in t x , in t y , Co lo r
b g c o lo r, I m a g e Ob s e rv e r o b s e rv e r)
● p u b lic a b s t ra c t b o o le a n d ra w I m a g e ( I m a g e im g , in t x , in t y , in t w id t h ,
in t h e ig h t , Co lo r b g c o lo r, I m a g e Ob s e rv e r o b s e rv e r)
Lo s m é t o d o s d ra w I m a g e ( ) t ie n e n lo s s ig u ie n t e s a rg u m e n t o s :
I m a g e im g
La im a g e n a d ib u ja r.
in t x , in t y
La s co o rd e n a d a s d e la e s q u in a s u p e rio r izq u ie rd a d e la im a g e n .
in t w id t h , in t h e ig h t
Al a n ch u ra y a lt u ra ( e n p ixe ls ) d e la im a g e n .
Co lo r b g c o lo r
El có lo r d e fo n d o d e la im a g e n . Es t o p u e d e s e r ú t il s i la im a g e n co n t ie n e p ixe ls
t ra n s p a re n t e s y s a b e q u e la im a g e n s e va a m o s t ra r s o b re u n fo n d o s ó lid o d e l
co lo r in d ica d o .
I m a g e Ob s e rv e r o b s e rv e r
Un o b je t o q u e im p le m e n t a e l in t e rfa ce Im a g e Ob s e rve r. Es t o re g is t ra e l o b je t o
co m o e l o b s e rva d o r d e la im a g e n p a ra q u e s e a n o t ifica d o s ie m p re q u e e s t é
d is p o n ib le n u e va in fo rm a ció n s o b re la im a g e n . La m a yo ría d e lo s
co m p o n e n t e s p u e d e n e s p e cifica r s im p le m e n t e t h is .
La ra zó n p o r la q u e t h is fu n cio n a co m o e l o b s e rva d o r d e la im a g e n e s q u e la cla s e
Co m p o n e n t im p le m e n t a e l in t e rfa ce Im a g e Ob s e ve r. Es t a im p le m e n t a ció n lla m a a l
m é t o d o re p a in t ( ) cu a n d o s e h a n ca rg a d o lo s d a t o s d e la im a g e n , q u e
n o rm a lm e n t e e s lo q u e s e q u ie re q u e s u ce d a .
Lo s m é t o d o s d ra w I m a g e ( ) vu e lve n d e s p u é s d e m o s t ra r lo s d a t o s d e la im a g e n
q u e h a s id o ca rg a d a . S i q u ie re s a s e g u ra rt e d e q u e d ra w I m a g e ( ) s ó lo d ib u ja
im á g e n e s co m p le t a s , d e b e s s e g u ir la ca rg a d e la im a g e n . Pu e d e s ve r la p á g in a
a n t e rio r p a ra in fo rm a ció n s o b re e l s e g u im ie n t o d e la ca rg a d e u n a im a g e n .

Oz it o
Manipular Imágenes

La fig u ra a n t e rio r m u e s t ra co m o s e cre a n lo s d a t o s d e u n a im a g e n d e t rá s d e la e s ce n a . Un p ro d u ct o r d e


im a g e n - - u n o b je t o q u e im p le m e n t a e l in t e rfa ce Im a g e Pro d u ce r - - p ro d u ce u n a co lu n m a d e d a t o s p a ra
u n o b je t o Im a g e . El p ro d u ct o r d e im a g e n p ro p o rcio n a e s t o s d a t o s a l co n s u m id o r d e im a g e n - - u n o b je t o
q u e im p le m e n t a e l in t e rfa ce Im a g e Co n s u m e r. A m e n o s q u e s e n e ce s it e m a n ip u la r o cre a r im á g e n e s
p e rs o n a liza d a s , n o n e ce s it a rá s s a b e r co m o t ra b a ja n e l p ro d u ct o r y e l co n s u m id o r d e im á g e n e s . El AWT
u t iliza a u t o m á t ica m e n t e p ro d u ct o re s y co n s u m id o re s d e im á g e n e s d e t rá s d e la e s ce n a .
El AWT s o p o rt a la m a n ip u la ció n d e im á g e n e s p e rm it ié n d o in s e rt a r filt ro s d e im a g e n e n t re e l p ro d u ct o r y
e l co n s u m id o r. Un filt ro d e im a g e n e s u n o b je t o Im a g e Filt e r q u e s e s it ú a e n t re e l p ro d u ct o r y e l
co n s u m id o r, m o d ifica n d o lo s d a t o s d e la im a g e n a n t e s d e q u e lo s o b t e n g a e l co n s u m id o r. Im a g e Filt e r
im p le m e n t a e l in t e rfa ce Im a g e Co n s u m e r, ya q u e in t e rce p t a lo s m e n s a je s q u e e l p ro d u ct o r e n vía a l
co n s u m id o r. La s ig u ie n t e fig u ra m u e s t ra có m o s e s it ú a u n filt ro d e im a g e n e n t re e l p ro d u ct o r y e l
co n s u m id o r d e im á g e n e s .

Cómo utilizar un Filtro de Imagen


Ut iliza r u n filt ro d e im a g e n e xis t e n t e e s s e n cillo . S ó lo t ie n e s q u e u t iliza r e l s ig u ie n t e có d ig o ,
m o d ifica n d o e l co n s t ru ct o r d e l filt ro d e im a g e n s i e s n e ce s a rio .
Image sourceImage;
...//Inicializa sourceImage, utilizando el método getImage() de Toolkit o de Applet.
ImageFilter filter = new SomeImageFilter();
ImageProducer producer = new FilteredImageSource(sourceImage.getSource(), filter);
Image resultImage = createImage(producer);
La p á g in a s ig u ie n t e e xp lica có m o t ra b a ja e l có d ig o a n t e rio r y t e d ice d o n d e p u e d e s e n co n t ra r
a lg u n o s filt ro s d e im a g e n .

Cómo escribir un Filtro de Imagen


¿ Y s i n o e n cu e n t ra s u n filt ro d e im a g e n q u e h a g a lo q u e n e ce s it a s ? Pu e d e s e s crib ir t u p ro p io
filt ro d e im a g e n . Es t a p á g in a o fre ce a lg u n o s t ru co s s o b re có m o h a ce rlo , in clu ye n e n la ce s a
e je m p lo s y u n a e xp lica ció n d e u n filt ro p e rs o n a liza d o q u e ro t a im á g e n e s .

Oz it o
Cómo Utilizar un Filtro de Imagen
El s ig u ie n t e a p p le t u t iliza u n filt ro p a ra ro t a r u n a im a g e n . El filt ro e s u n o p e rs o n a liza d o
lla m a d o Ro t a t e Filt e r q u e p o d rá s ve r e xp lica d o e n la p á g in a s ig u ie n t e . To d o lo q u e
n e ce s it a s s a b e r s o b re e l filt ro p a ra u t iliza rlo e s q u e s u co n s t ru ct o r t o m a u n s ó lo
a rg u m e n t o d o u b le : e l á n g u lo d e ro t a ció n e n ra d ia n e s . El a p p le t co n vie rt e e l n ú m e ro
q u e in t ro d u ce e l u s u a rio d e g ra d o s a ra d ia n e s , p a ra q u e e l a p p le t p u e d a co n s t ru ir u n
Ro t a t e Filt e r.
Ab a jo t ie n e s e l có d ig o fu e n t e q u e u t iliza e l filt ro . ( Aq u í t ie n e s e l p ro g ra m a co m p le t o . )
public class ImageRotator extends Applet {
. . .
RotatorCanvas rotator;
double radiansPerDegree = Math.PI / 180;

public void init() {


//Carga la imagen.
Image image = getImage(getCodeBase(), "../images/rocketship.gif");

...//Crea el componente que utiliza el filtro de imagen:


rotator = new RotatorCanvas(image);
. . .
add(rotator);
. . .
}

public boolean action(Event evt, Object arg) {


int degrees;

...//obtiene el número de grados que se tiene que rotar la imagen.

//Lo convierte a Radianes.


rotator.rotateImage((double)degrees * radiansPerDegree);

return true;
}
}

class RotatorCanvas extends Canvas {


Image sourceImage;
Image resultImage;

public RotatorCanvas(Image image) {


sourceImage = image;
resultImage = sourceImage;
}
public void rotateImage(double angle) {
ImageFilter filter = new RotateFilter(angle);
ImageProducer producer = new FilteredImageSource(
sourceImage.getSource(),
filter);
resultImage = createImage(producer);
repaint();
}

public void paint(Graphics g) {


Dimension d = size();
int x = (d.width - resultImage.getWidth(this)) / 2;
int y = (d.height - resultImage.getHeight(this)) / 2;

g.drawImage(resultImage, x, y, this);
}
}

Cómo trabaja el Código


Pa ra u t iliza r u n filt ro d e im a g e n , u n p ro g ra m a d e b e s e g u ir lo s s ig u ie n t e s
pa sos:
1 . Ob t e n e r u n o b je t o Im a g e ( n o rm a lm e n t e s e h a ce co n e l m é t o d o
g e tIm a g e ( ) ).
2 . Ut iliza n d o e l m é t o d o g e t S o u rc e ( ) , o b t ie n e la fu e n t e d e lo s d a t o s ( u n
Im a g e Pro d u ce r) p a ra e l o b je t o Im a g e .
3 . Cre a u n e je m p la r d e l filt ro d e im a g e n , in icia liza n d o e l filt ro s i e s
n e ce s a rio .
4 . Cre a u n o b je t o Filt e re d Im a g e S o u rce , p a s a n d o a l co n s t ru ct o r la fu e n t e
d e la im a g e n y e l o b je t o d e l filt ro .
5 . Co n e l m é t o d o c re a t e I m a g e ( ) d e l co m p o n e n t e , cre a u n n u e vo o b je t o
Im a g e q u e t ie n e e l Filt e re d Im a g e S o u rce co m o s u p ro d u ct o r d e im a g e n .
Es t o p o d ría s o n a r co m p le jo , p e ro re a lm e n t e e s s e n cillo d e im p le m e n t a r. Lo
re a lm e n t e co m p le jo e s t á d e t rá s d e la e s ce n a , co m o e xp lica re m o s u n p o co
m á s t a rd e . Prim e ro e xp lica re m o s e l có d ig o d e l a p p le t q u e u t iliza e l filt ro d e
im a g e n .
En e l a p p le t d e e je m p lo , e l m é t o d o ro t a t e I m a g e ( ) d e Ro t a t o rCa n va s re a liza
la m a yo ría d e la s t a re a s a s o cia d a s co n e l u s o d e l filt ro d e im a g e n . La ú n ica
e xce p ció n e s e l p rim e r p a s o , o b t e n e r e l o b je t o Im a g e o rig in a l, q u e e s
re a liza d o p o r e l m é t o d o in it ( ) d e l a p p le t . Es t e o b je t o Im a g e e s p a s a d o a
Ro t a t o Ca n va s , q u e s e re fie re a é l co m o s o u rc e I m a g e .
El m é t o d o ro t a t e I m a g e ( ) e je m p la riza e l filt ro d e im a g e n lla m a n d o a l
co n s t ru ct o r d e l filt ro . El ú n ico a rg u m e n t o d e l co n s t ru ct o r e s e l á n g u lo , e n
ra d ia n e s , q u e s e va a ro t a r la im a g e n .
ImageFilter filter = new RotateFilter(angle);
Lu e g o , e l m é t o d o ro t a t e I m a g e ( ) cre a u n e je m p la r d e Filt e re d Im a g e S o u rce .
El p rim e r a rg u m e n t o d e l co n s t ru ct o r d e Filt e re d Im a g e S o u rce e s la fu e n t e d e
la im a g e n , o b t e n id a co n e l m é t o d o g e t S o u rc e ( ) . El s e g u n d o a rg u m e n t o e s
e l o b je t o filt ro .
ImageProducer producer = new FilteredImageSource(
sourceImage.getSource(),
filter);
Fin a lm e n t e , e l có d ig o cre a u n a s e g u n d a Im a g e n , re s u lt I m a g e , lla m a n d o a l
m é t o d o c re a t e I m a g e ( ) d e la cla s e Co m p o n e n t . El ú n ico a rg u m e n t o d e
c re a t e I m a g e ( ) e s e l o b je t o Filt e re d Im a g e S o u rce cre a d o e n e l p a s o a n t e rio r.
resultImage = createImage(producer);

Qué sucede detrás de la escena


Es t a s e cció n e xp lica có m o t ra b a ja e l filt ra d o d e la im a g e n , d e t rá s d e la
e s ce n a . S i n o t e in t e re s a n e s t o s d e t a lle s d e la im p le m e n t a ció n , p u e d e s s a lt a r
a Do n d e En co n t ra r Filt ro s d e Im a g e n .
Lo p rim e r q u e n e ce s it a s s a b e r e s q u e e l AWT u t iliza Im a g e Co n s u m e r d e t rá s
d e la e s ce n a , e n re s p u e s t a a u n a p e t ició n a d ra w I m a g e ( ) . Po r e s o e l
Co m p o n e n t e q u e m u e s t ra la im a g e n n o e s e l co n s u m id o r d e im a g e n - -
a lg u n o o b je t o p e o fu n d o d e l AWT e s e l co n s u m id o r d e im a g e n .
La lla m a d a a n t e rio r a c re a t e I m a g e ( ) s e le ccio n a u n a Im a g e n
( re s u lt I m a g e ) q u e e s p e ra o b t e n e r lo s d a t o s d e s d e s u p ro d u ct o r, e l e je m p la r
d e Filt e re d Im a g e S o u rce . Aq u í t ie n e s lo q u e p a re ce ría e l p a t h d e lo s d a t o s d e
la im a g e n , d e s d e la p e rs p e ct iva d e re s u lt I m a g e ( ) :

La lín e a p u n t e a d a in d ica q u e e l co n s u m id o r d e im a g e n re a lm e n t e n u n ca
o b t ie n e lo s d a t o s d e l Filt e re d Im a g e S o u rce . En s u lu g a r, cu a n d o e l
co n s u m id o r p id e d a t o s d e la im a g e n ( e n re s p u e s t a a
g . d ra w I m a g e ( re s u lt I m a g e , . . . ) ) , e l Filt e re d Im a g e S o u rce re a liza a lg ú n
e s ca m o t e o y lu e g o lo d is o cia d e a lg u n a m a n e ra . Aq u í t ie n e s la m a g ia
re a liza d a p o r Filt e re d Im a g e S o u rce :
● Cre a u n n u e vo o b je t o d e l filt ro d e im a g e n in vo ca n d o a l m é t o d o
g e t Filt e rI n s t a n c e ( ) e n e l o b je t o filt ro q u e s e le h a p a s a d o a l
co n s t ru ct o r d e Filt e re d Im a g e S o u rce . Po r d e fe ct o , g e t Filt e rI n s t a n c e ( )
clo n a e l o b je t o filt ro .
● Co n e ct a e l n u e vo filt ro d e im a g e n a l co n s u m id o r d e im a g e n .

● Co n e ct a la fu e n t e d e lo s d a t o s d e la im a g e n , q u e s e h a p a s a d o a l
co n s t ru ct o r d e Filt e re d Im a g e S o u rce , a l filt ro d e im a g e n .
Aq u í t ie n e s e l re s u lt a d o :

Dónde Encontrar Filtros de Imagen


En t o n ce s , ¿ d o n d e p u e d e s e n co n t ra r filt ro s d e im a g e n e xis t e n t e s ? El p a q u e t e
ja va . a wt . im a g e in clu ye u n filt ro lis t o p a ra u t iliza r, Cro p Im a g e Filt e r, q u e
p ro d u ce u n a im a g e n q u e co n s it e e n u n re g ió n re ct a n g u la r d e la im a g e n
o rig in a l. Ta m b ié n p u e d e e n co n t ra r va rio s filt ro s d e im a g e n u t iliza d o s p o r
a p p le t s e n la we b s it e s e s u n . To d a s e s t a s p á g in a s in clu ye n e n la ce s a l có d ig o
fu e n t e d e lo s a p p le t s q u e u t iliza n u n filt ro d e im a g e n :
● La p á g in a Ge n e ra ció n Din á m ica d e Et iq u e t a s d e Co lo r co n t ie n e d o s
a p p le t s q u e m o d ifica n e l co lo r d e u n a im a g e n . El p rim e r a p p le t ,
Alp h a Bu le t , d e fin e y u t iliza u n Alp h a Co lo rFilt e r; e l s e g u n d o Hu e Bu lle t ,
d e fin e y u t iliza Hu e Filt e r.
● La p á g in a Re a lim e n t a ció n e n d ire ct o d e Im a g e m a p d e m u e s t ra u n a p p le t
q u e m a p e a u n a im a g e n . Ut iliza m u ch o s filt ro s p a ra p o rp o rcio n a n
re a lim e n t a ció n vis u a l cu a n d o e l cu rs o r s e m u e ve s o b re cie rt a s á re a s o
cu a n d o e l u s u a rio p u ls a u n á re a e s p e cia l.
● La p á g in a Pru e b a d e Im a g e n re a liza u n a va rie d a d d e p ro ce s o s d e
im á g e n e s . Ad e m á s d e p e rm it ir a l u s u a rio e s ca la r o m o ve r la im a g e n ,
d e fin e y u t iliza t re s filt ro s . El Alp h a Filt e r h a ce la im a g e n t ra n s p a re n t e , e l
Re d Blu e S wa p Filt e r ca m b ia lo s co lo re s d e la ia m g n y e l Ro t a t e Filt e r ro t a
la im a g e n , co m o h a s p o d id o ve r e n e s t a s e cció n .

Oz it o
Cómo Escribir un Filtro de Imagen
To d o s lo s filt ro s d e im a g e n d e b e n s e r s u b cla s e s d e la cla s e Im a g e Filt e r. S i u n filt ro d e im a g e n va a
m o d ifica r lo s co lo re s o la t ra n s p a re n cia d e u n a im a g e n , e n ve z d e cre a r d ire ct a m e n t e u n a s u b cla s e d e
Im a g e Filt e r, p ro b a b le m e n t e d e b e ría s cre a r u n a s u b cla s e d e RGBIm a g e Filt e r.

An t e s d e e s crib ir u n filt ro d e im a g e n , d e b e ría s e n co n t ra r o t ro s e s t u d ia n d o lo s q u e s o n s im ila re s a l q u e


p la n e a s e s crib ir. Ta m b ié n d e b e rá s e s t u d ia r lo s in t e rfa ce s Im a g e Pro d u ce r e Im a g e Co n s u m e r, p a ra
fa m ilia riza rt e co n e llo s .

Encontrar ejemplos
Po d rá s e n co n t ra r e je m p lo s d e s u b cla s e s d e RGBIm a g e Filt e r e n lo s a p p le t s d e la s p á g in a s
m e n cio n a d a s e n la p á g in a a n t e rio r
Má s a d e la n t e e n e s t a p á g in a ve ra s u n e je m p lo d e u n a s u b cla s e d ire ct a d e Im a g e Filt e r,
Ro t a t e Filt e r.

Crear una subclase de ImageFilter


Co m o s e m e cio n ó a n t e s , lo s filt ro s d e im a g e n in p le m e n t a n e l in t e rfa ce Im a g e Co n s u m e r. Es t o
p e rm it e in t e rce p t a r lo s d a t o s d e s t in a d o s a l co n s u m id o r d e im a g e n . Im a g e Co n s u m e r d e fin e lo s
s ig u ie n t e s m é t o d o s :
void setDimensions(int width, int height);
void setProperties(Hashtable props);
void setColorModel(ColorModel model);
void setHints(int hintflags);
void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int off,
int scansize);
void setPixels(int x, int y, int w, int h, ColorModel model, int pixels[], int off,
int scansize);
void imageComplete(int status);
La cla s e Im a g e Filt e r im p le m e n t a t o d o s lo s m é t o d o s a n t e rio re s p a ra q u e re e n vie n lo s d a t o s d e l
m é t o d o a l co n s u m id o r d e l filt ro . Po r e je m p lo , Im a g e n Filt e r im p le m e n t a e l m é t o d o
s e t D im e n s io n s ( ) d e la s ig u ie n t e fo rm a :
public void setDimensions(int width, int height) {
consumer.setDimensions(width, height);
}
Gra cia s a e s t o s m é t o d o s d e Im a g e n Filt e r, t u s u b cla s e n o n e ce s it a rá im p le m e n t a r t o d o s lo s
m é t o d o s d e Im a g e Co n s u m e r. S ó lo n e ce s it a rá im p le m e n t a r lo s m é t o d o s q u e t ra n s m it a n lo s
d a t o s q u e q u ie re s ca m b ia r.
Po r e je m p lo , la cla s e Cro p Im a g e Filt e r im p le m e n t a cu a t ro m é t o d o s d e Im a g e Co n s u m e r:
s e t D im e n s io n s ( ) , s e t P ro p e rt ie s ( ) , y d o s va rie d a d e s d e s e t P ix e ls ( ) . Ta m b ié n im p le m e n t a
u n co n s t ru ct o r co n a rg u m e n t o s q u e e s p e cifica e l re ct á n g u lo a re co rt a r. Có m o o t ro e je m p lo , la
cla s e RGBIm a g e Filt e r im p le m e n t a a lg u n o s m é t o d o s d e a yu d a , d e fin e u n m é t o d o d e a yu d a
a b s t ra ct o q u e re a liza la s m o d ifica cio n e s re a le s d e l co lo r d e ca d a p ixe l, e im p le m e n t a lo s
s ig u ie n t e s m é t o d o s d e Im a g e Co n s u m e r: s e t Co lo rMo d e l( ) y d o s va rie d a d e s d e s e t P ix e ls ( ) .
La m a yo ría , s i n o t o d o s , lo s filt ro s im p le m e n t a n m é t o d o s s e t P ix e ls ( ) . Es t o s m é t o d o s
d e t e rm in a n e xa ct a m e n t e q u é d a t o s d e la im a g e n s e va n a u t iliza r p a ra co n s t ru ir la im a g e n .
Un o o lo s d o s m é t o d o s s e t P ix e ls ( ) p o d ría n s e r lla m a d o s va ria s ve ce s d u ra n t e la co n s t ru cció n
d e u n a s o la im a g e n . Ca d a lla m a d a le d a in fo rm a ció n a l Im a g e Co n s u m e r s o b re u n re ct á n g u lo
d e p ixe ls d e n t ro d e la im a g e n . Cu a n d o s e lla m a a l m é t o d o im a g e Co m p le t e ( ) d e l
Im a g e Co n s u m e r co n cu a lq u ie r e s t a d o e xce p t o S INGLEFRAMEDONE ( lo q u e im p lica q u e
a p a re ce rá n lo s d a t o s p a ra m á s m a rco s ) , e n t o n ce s e l Im a g e Co n s u m e r p u e d e a s u m ir q u e n o va
a re cib ir m á s lla m a d a s d e s e t P ix e ls ( ) . Un im a g e Co m p le t e ( ) co n e s t a d o d e
S TATICIMAGEDONE e s p e cifica n o s ó lo q u e s e h a n re cib id o lo s d a t o s co m p le t o s d e la im a g e n ,
s in o q u e a d e m á s n o s e h a d e t e ct a d o n in g ú n e rro r.
La s ig u ie n t e ilu s t ra ció n y la t a b la d e s crib e n lo s a rg u m e n t o s d e lo s m é t o d o s s e t P ix e ls ( ) .

x, y
Es p e cifica la p o s ició n d e n t ro d e la im a g e n , re la t iva a s u e s q u in a s u p e rio r izq u ie rd a , e n la
q u e e m p ie za e l re ct á n g u lo .
w, h
Es p e cifica la a n ch u ra y a lt u ra , e n p ixe ls , d e e s t e re ct á n g u lo .
m o de l
Es p e cifica e l m o d e lo d e co lo r u t iliza d o p o r lo s d a t o s e n e l a rra y d e p ixe ls .
p ix e ls [ ]
Es p e cifica u n a rra y d e p ixe ls . El re ct á n g u lo d e lo s d a t o s d e la im a g e n e s t á co n t e n id o e n
e s t e a rra y, p e ro e l a rra y d e b e ría co n t e n e r m á s d e w * h e n t ra d a s , d e p e n d ie n d o d e lo s
va lo re s d e o ffs e t y s c a n s iz e . Aq u í t ie n e s la fó rm u la p a ra d e t e rm in a q u e e n t ra d a e n e l
a rra y p ix e ls co n t ie n e lo s d a t o s d e l p ixe l s it u a d o e n ( x + i, y + j) , d o n d e ( 0 < = i < w ) y ( 0
< = j < h):
offset + (j * scansize) + i
La fó rm u la a n t e rio r a s u m e q u e ( m , n ) e s t á e n e l re ct á n g u lo e s p e cifica d o p o r e s t a lla m a d a
a s e t P ix e ls ( ) , y q u e ( m , n ) e s re la t ivo a l o rig e n d e la im a g e n . Ab a jo t ie n e s u n a
ilu s t ra ció n d e l a rra y p ix e ls p a ra a cla ra rlo . Mu e s t ra có m o u n p ixe ls e s p e cifico ( p o r
e je m p lo ( x, y) ) o b t ie n e s u e n t ra d a e n e l a rra y.

o ffs e t
Es p e cifica e l ín d ice ( e n e l a rra y p ix e ls ) d e l p rim e r p ixe l d e l re ct á n g u lo .
s c a n s iz e
Es p e cifica la a n ch u ra d e ca d a fila e n e l a rra y p ix e ls . De b id o a co n s id e ra cio n e s d e
e ficie n cia , e s t e p o d ría s e r m á s g ra n d e q u e w .
El Filtro de Imagen RotateFilter
La cla s e Ro t a t e Filt e r ro t a u n a im a g e n e l á n g u lo e s p e cifica d o . S e b a s a e n la s s ig u ie n t e s
fó rm u la s g rá fica s p a ra ca lcu la r la n u e va p o s ició n d e ca d a p ixe l:
newX = oldX*cos(angle) - oldY*sin(angle)
newY = oldX*sin(angle) + oldY*cos(angle)
Ro t a t e Filt e r im p le m e n t a lo s s ig u ie n t e s m é t o d o s d e Im a g e Co n s u m e r:
s e t D im e n s io n s ( )
Gra b a la a n ch u ra y a lt u ra d e la im a g e n s in filt ra r p a ra u t iliza rla s e n lo s m é t o d o s
s e t P ix e ls ( ) y im a g e Co m p le t e ( ) . Ca lcu la la a n ch u ra y a lt u ra fin a le s d e la im a g e n
filt ra d a , g ra b á n d o la s p a ra u t iliza rla s co n e l m é t o d o im a g e Co m p le t e ( ) , cre a u n b u ffe r
p a ra a lm a ce n a r lo s d a t o s q u e e n t ra n d e la im a g e n , y lla m a a l m é t o d o s e t D im e n s io n s ( )
d e l co n s u m id o r p a ra s e le ccio n a r la a n ch u ra y a lt u ra n u e va s .
s e t Co lo rMo d e l( )
Le d ice a l co n s u m id o r q u e e s p e re lo s p ixe ls e n e l m o d e lo d e l co lo r RGB, p o r d e fe ct o .
s e t Hin t s ( )
Le d ice a l co n s u m id o r q u e e s p e re lo s d a t o s d e la im a g e n e n o rd e n d e s d e a rrib a a a b a jo y
d e izq u ie rd a a d e re ch a ( e l o rd e n e n q u e e s t á s le ye n d o e s t a p á g in a ) , e n p a s o s d e lín e a s
co m p le t a s , y q u e ca d a p ixe l e s e n via d o e xa ct a m e n t e u n a ve z.
s e t P ix e ls ( ) ( la s d o s va rie d a d e s d e e s t e m é t o d o )
Co n vie rt e n lo s p ixe ls a l m o d e lo RBG p o r d e fe ct o ( s i e s n e ce s a rio ) y co p ia e l p ixe l e n
b u ffe r d e a lm a ce n a m ie n t o . La m a yo ría d e lo s filt ro s d e im a g e n s im p le m e n t e m o d ifica n e l
p ixe l y lo e n vía n a l co n s u m id o r, p e ro co m o e l la d o d e u n re ct á n g u lo g ira d o ya n o e s
h o rizo n t a l o ve rt ica l ( p a ra la m a yo ría d e lo s á n g u lo s ) , e s t e filt ro p u e d e q u e n o e n vie lo s
p ixe ls d e fo rm a e ficie n t e d e s d e s u m é t o d o s e t P ix e ls ( ) . En s u lu g a r, Ro t a t e Filt e r
a lm a ce n a t o d o s lo s d a t o s d e lo s p ixe ls h a s t a q u e re cib e u n m e n s a je im a g e Co m p le t e ( ) .
im a g e Co m p le t e ( )
Ro t a la im a g e n y lu e g o lla m a d a re p e t id a m e n t e n a c o n s u m e r. s e t P ix e ls ( ) p a ra e n via r
ca d a lín e a d e la im a g e n a l co n s u m id o r. De s p u é s d e e n via r t o d a la im a g e n , e s t e m é t o d o
lla m a a c o n s u m e r. im a g e Co m p le t e ( ) .

Oz it o
Realizar Animaciones
Lo q u e t o d a s la s fo rm a s d e a n im a ció n t ie n e n e n co m ú n e s q u e t o d a s e lla cre a n
a lg u n a cla s e d e p e rce p ció n d e m o vim ie n t o , m o s t ra n d o m a rco s s u ce s ivo s a u n a
ve lo cid a d re la t iva m e n t e a lt a . La a n im a ció n p o r o rd e n a d o r n o rm a lm e n t e m u e s t ra
1 0 - 2 0 m a rco s p o r s e g u n d o . En co m p a ra ció n , la a n im a ció n d e d ib u jo s m a n u a le s
u t iliza d e s d e 8 m a rco s p o r s e g u n d o ( p a ra u n a a n im a ció n d e p o ca ca lid a d ) h a s t a 2 4
m a rco s p o r s e g u n d o ( p a ra m o vim ie n t o re a lis t a ) p a s a n d o p o r 1 2 m a rco s p o r
s e g u n d o ( d e la a n im a ció n e s t a n d a rd ) . La s s ig u ie n t e s p á g in a s cu e n t a n t o d o lo q u e
s e n e ce s it a s a b e r p a ra e s crib ir u n p ro g ra m a Ja va q u e re a lice u n a a n im a ció n .
An t e s d e e m p e z a r: Co m p ru e b a la s h e rra m ie n t a s d e a n im a ció n e xis t e n t e s y lo s
a p p le t co m o An im a t o r, p a ra ve r s i p u e d e s u t iliza r u n o d e e llo s e n ve z d e e s crib ir s u
p ro p io p ro g ra m a .

Crear el Bucle de Animación


El p a s o m á s im p o rt a n t e p a ra cre a r u n p ro g ra m a d e a n im a ció n e s
s e le ccio n a r co rre ct a m e n t e e l m a rco d e t ra b a jo . Exce p t o p a ra la
a n im a ció n re a liza d a s ó lo e n re s p u e s t a d ire ct a a e ve n t o s e xt e rn o s ( co m o
u n o b je t o a rra s t a d o p o r e l u s u a rio a t ra vé s d e la p a n t a lla ) , u n p ro g ra m a
q u e re a liza u n a a n im a ció n n e ce s it a u n b u cle d e a n im a ció n .
El b u cle d e a n im a ció n e s e l re s p o n s a b le d e s e g u ir la p is t a d e l m a rco
a ct u a l, y d e la p e t ició n p e rió d ica d e a ct u a liza cio n e s d e la p a n t a lla . Pa ra
lo s a p p le t s y m u ch a s a p lica cio n e s n e ce s it a rá u n t h re a d s e p a ra d o p a ra
e je cu t a r e l b u cle d e a n im a ció n . Es t a s e cció n co n t ie n e u n a p p le t d e
e je m p lo y u n a a p lica ció n q u e s e p u e d e n u t iliza r co m o p la n t illa s p a ra
t o d a s t u s a n im a cio n e s .

Generar Gráficos
Es t a s e cció n g e n e ra u n e je m p lo q u e a n im a g rá fico s p rim it ivo s .

Eliminar el Parpadeo
El e je m p lo d e s a rro lla d o e n la s e cció n a n t e rio r n o e s p e rfe ct o , p o rq u e
p a rp a d e a . Es t a s e cció n e n s e ñ a có m o u t iliza r d o s t é cn ica s p a ra e lim in a r e l
p a rp a d e o :
● S o b re e s crib ir e l m é t o d o u p d a t e ( )

● Do b le b u ffe r ( t a m b ié n co n o cid o co m o u t iliz a r u n b u ffe r d e v u e lt a )


Mover una Imagen a través de la Pantalla
Es t a s im p le fo rm a d e a n im a ció n e n vu e lve e l m o vim ie n t o d e u n a im a g e n
e s t a b le a t ra vé s d e la p a n t a lla . En e l m u n d o d e la a n im a ció n t ra d icio n a l
e s t o e s co n o cid o co m o a n im a ció n re co rt a b le , ya q u e g e n e ra lm e n t e s e
co n s e g u ía co rt a n d o u n a fo rm a e n p a p e l y m o vie n d o la fo rm a d e la n t e d e
la cá m a ra . En p ro g ra m a s d e o rd e n a d o re s , e s t a t é cn ica s e u t iliza
fre cu e n t e m e n t e e n in t e rfa ce s d e l t ip o d ra g & d ro p ( a rra s t a r y s o lt a r) .

Mostrar una Secuencia de Imágenes


Es t a s e cció n e n s e ñ a có m o re a liza r u n a a n im a ció n clá s ica , a l e s t ilo d e lo s
d ib u jo s a n im a d o s , d a n d o u n a s e cu e n cia d e im á g e n e s .

Aumentar la Apariencia y el Rendimiento de una Animación


Es t a s e cció n e n s e ñ a có m o u t iliza r la cla s e Me d ia Tra cke r p a ra q u e s e
p u e d a re t a rd a r la a n im a ció n h a s t a q u e la s im á g e n e s s e h a ya n ca rg a d o .
Ta m b ié n e n co n t ra rá s va rio s t ru co s p a ra a u m e n t a r e l re n d im ie n t o d e u n a
a n im a ció n d e u n a a p p le t co m b in a n d o lo s fich e ro s d e im á g e n e s u t iliza n d o
u n e s q u e m a d e co m p re s ió n co m o Flic.

Oz it o
Crear un Bucle de Animación
To d o p ro g ra m a q u e re a lice a n im a cio n e s d ib u ja n d o a in t e rva lo s re g u la re s n e ce s it a u n b u cle
d e a n im a ció n . Ge n e ra lm e n t e , e s t e b u cle d e b e ría e s t a r e n s u p ro p io t h re a d . N u n c a d e b e ría
e s t a r e n lo s m é t o d o s p a in t ( ) o u p d a t e ( ) , ya q u e a h í s e e n cu e n t ra e l t h re a d p rin cip a l d e l
AWT, q u e s e e n ca rg a d e t o d o e l d ib u jo y m a n e jo d e e ve n t o s .
Es t a p á g in a p ro p o rcio n a d o s p la n t illa s p a ra re a liza r a n im a ció n , u n a p a ra a p p le t s y o t ra
p a ra a p lica cio n e s . La ve rs ió n d e a p p le t s s e e s t á e je cu t a n d o ju s t o d e b a jo . Pu e d e s p u ls a r
s o b re e lla p a ra p a ra r la a n im a ció n y p u ls a r d e n u e vo p a ra a rra n ca rla .
La a n im a ció n q u e re a liza la p la n t illa e s u n p o co a b u rrid a : s ó lo m u e s t ra e l n ú m e ro d e m a rco
a ct u a l, u t iliza n d o u n ra t io p o r d e fe ct o d e 1 0 m a rco s p o r s e g u n d o . La s s ig u ie n t e s p á g in a s
co n s t ru ye n e s t e e jb p lo , m o s t rá n d o t e có m o a n im a r g rá fico s p rim it ivo s e im á g e n e s .
Aq u í t ie n e s e l có d ig o p a ra la p la n t illa d e a n im a ció n p a ra a p p le t s . Aq u í t ie n e s e l có d ig o
e q u iva le n t e p a ra la p la n t illa d e a n im a ció n p a ra a p lica cio n e s . El re s t o d e e s t a p á g in a e xp lica
e l có d ig o d e la p la n t illa , Aq u í t ie n e s u n s u m a rio d e lo q u e h a ce n la s d o s p la n t illa s :
public class AnimatorClass extends AComponentClass implbents Runnable {

//En el código de inicialización:


//El valor de marcos por segundos especificado por el usuario
determina
//el retardo entre marcos.

//En un método que no hace nada salvo bpezar la animación:


//Crea y arranca el thread de la animación.

//En un método que no hace nada salvo parar la animación:


//Parar el Thread de la animación.

public boolean mouseDown(Event e, int x, int y) {


if (/* la animación está parada actualmente */) {
//Llamar al método que arranca la animación.
} else {
//LLamar al método que para la animación.
}
}

public void run() {


//Bajar la prioridad de este thread para que no interfiera
//con otros procesos.

//Recuerde el momento de arranque.

//Aquí tiene el bucle de animación:


while (/* el thread de animación se está ejecutando todavía */) {
//Avance un marco la animación.
//Lo muestra.
//Retardo dependiendo del numero de marcos por segundo.
}
}

public void paint(Graphics g) {


//Dibuja el marco actual de la animación.
}
}

Inicializar Variables de Ejemplar


La s p la n t illa s d e a n im a ció n u t iliza n cu a t ro va ria b le s d e e je m p la r.
La p rim e ra va ria b le ( fra m e N u m b e r) re p re s e n t a e l m a rco a ct u a l. Es in icia liza d a
a - 1 , a u n q u e e l n ú m e ro d e l p rim e r m a rco e s 0 . La ra zó n , e l n ú m e ro d e m a rco e s
in crb e n t a d o a l b p e za r e l b u cle d e a n im a ció n , a n t e s d e q u e s e d ib u je n lo s
m a rco s . As í, e l p rim e r m a rco a p in t a r e s e l 0 .
La s e g u n d a va ria b le d e e jb p la r ( d e la y ) e s e l n ú m e ro d e m ilis e g u n d o s e n t re
m a rco s . S e in icia liza u t iliza n d o e l n ú m e ro d e m a rc o s p o r s e g u n d o
p ro p o rcio n a d o p o r e l u s u a rio . S i e l u s u a rio p ro p o rcio n a u n n ú m e ro n o vá lid o , la s
p la n t illa s t o m a n p o r d e fe ct o e l va lo r d e 1 0 m a rco s p o r s e g u n d o . El s ig u ie n t e
có d ig o co n vie rt e lo s m a rco s p o r s e g u n d o e n e l n ú m e ro d e s e g u n d o s e n t re
m a rco s :
delay = (fps > 0) ? (1000 / fps) : 100;
La n o t a ció n ? : d e l có d ig o a n t e rio r s o n u n a a b re via t u ra d e if e ls e . S i e l u s u a rio
p o rp o rcio n a u n n ú m e ro d e m a rco s m a yo r d e 0 , e l re t a rd o e s 1 0 0 0 m ilis e g u n d o s
d ivid id o p o r e l n ú m e ro d e m a rco s p o r s e g u n d o . De o t ra fo rm a , e l re t a rd o e n t re
m a rco s e s 1 0 0 m ilis e g u n d o s .
La t e rce ra va ria b le d e e jb p la r ( a n im a t o rTh re a d ) e s u n o b je t o Th re a d , q u e
re p re s e n t a la t h re a d e n e l q u e s e va a e je cu t a r la a n im a ció n . S i n o e s t a s
fa m ilia riza d o co n lo s Th re a d s , p u e d e s ve r la le cció n Th re a d s d e Co n t ro l.

La cu a rt a va ria b le d e e jb p la r ( fro z e n ) e s u n va lo r b o o le a n o q u e e s t á in icia liza d o


a fa ls e . La p la n t illa p o n e e s a va ira b le a t ru e p a ra in d ica r q u e e l u s u a rio a
p e d id o q u e t e rm in e la a n im a ció n . Ve rá s m á s s o b re e s t o m á s a d e la n t e e n e s t a
s e cció n .

El bucle de animación
El b u cle d e a n im a ció n ( e l b u cle w h ile e n e l t h re a d d e la a n im a ció n ) h a ce lo
s ig u ie n t e u n a ve z t ra s o t ra :
1 . Ava n za e l n ú m e ro d e m a rco .
2 . Lla m a a l m é t o d o re p a in t ( ) p a ra p e d ir q u e s e d ib u je e l n ú m e ro d e m a rco
a ct u a l d e la a n im a ció n .
3 . Du e rm e d u ra n t e d e la y m ilis e g u n d o s ( m á s o m e n o s ) .
Aq u í t ie n e s e l có d ig o q u e re a liza e s t a s t a re a s :
while (/* El bucle de animación se está ejecutando todavía */) {
//Avanza el marco de animación.
frameNumber++;
//Lo muestra.
repaint();

...//Retardo dependiendo del número de marcos por segundo.


}

Asegurar un Ratio de Marcos por Segundos


La fo rm a m á s o b via d e im p le m e n t a r e l t ie m p o d e d e s ca n s o d e l b u cle d e
a n im a ció n e s d o rm ir d u ra n t e d e la y m ilis e g u n d o s . Es t o , s in b b a rg o , h a ce q u e e l
t h re a d d u e rm a d b a s ia d o , ya q u e h a p e rd id o cie rt o t ib p o m ie n t ra s e je cu t a e l
b u cle d e a n im a ció n .
La s o lu ció n d e e s t e p ro b lb a e s re co rd a r cu a n d o co m e n zó la a n im a ció n , s u m a rle
d e la y m ilis e g u n d o s p a ra lle g a r a l m o m e n t o d e le va n t a rs e , y d o rm ir h a s t a q u e
s u e n e e l d e s p e rt a d o r. Aq u í t ie n e s e l có d ig o q u e im p lb e n t a e s t o :
long startTime = Systb.currentTimbillis();
while (/* El thread de animación se está ejecutando todavía */) {
...//Avnaza el marco de la animación y lo muestra.
try {
startTime += delay;
Thread.sleep(Math.max(0,
startTime-Systb.currentTimbillis()));
} catch (InterruptedException e) {
break;
}
}

Comportamiento Educado
Do s ca ra ct e ris t ica s m á s d e e s t a s p la n t illa s d e a n im a ció n p e rt e n e ce n a la
ca t e g o ría d e co m p o rt a m ie n t o e d u ca d o .
La p rim e ra ca ra ct e ris t ica e s p e rm it ir e xp licit a m e n t e q u e e l u s u a rio p a re ( y
a rra n q u e ) la a n im a ció n , m ie n t ra s e l a p p le t o la a p lica ció n s e a n vis ib le s . La
a n im a ció n p u e d e d is t ra e r b a s t a n t e y e s b u e n a id e a d a rle a l u s u a rio e l p o d e r d e
p a ra rla p a ra q u e p u e d a co n ce n t ra rs e e n o t ra co s a . Es t a ca ra ct e ris t ica e s t á
im p lb e n t a d a s o b re e s crib ie n d o e l m é t o d o m o u s e D o w n ( ) p a ra q u e p a re o
a rra n q u e e l t h re a d d e la a n im a ció n . , d e p e n d ie n d o d e l e s t a d o a ct u a l d e l t h re a d .
Aq u í t ie n e e l có d ig o q u e im p lb e n t a e s t o :
...//En el código de Inicialización:
boolean frozen = false;

...//En el método que arranca el thread de la animación:


if (frozen) {
//No hacer nada. El usuario ha pedido que se pare la animación.
} else {
//bpezar la animación!
...//Crear y arrancar el thread de la animación.
}
}

. . .

public boolean mouseDown(Event e, int x, int y) {


if (frozen) {
frozen = false;
//Llama al método que arranca la animación.
} else {
frozen = true;
//Llama al método que para la animación.
}
return true;
}
La s e g u n d a ca ra ct e ris t ica e s s u s p e n d e r la a n im a ció n s ib p re q u e e l a p p le t o la
a p lica ció n n o s e a n vis ib le s . Pa ra la p la n t illa d e a n im a ció n d e a p p le t , e s t o s e
co n s ig u e im p lb e n t a n d o lo s m é t o d o s s t o p ( ) y s t a rt ( ) d e l a p p le t . Pa ra la p la n t illa
d e la a p lia ció n , e s t o s e co n s ig u e im p lb e n t a n d o u n m a n e ja d o r d e e ve n t o s p a ra
lo s e ve n t o s WINDOW_ ICONIFY y WINDOW_ DEICONIFY. En la s d o s p la n t illa s , s i
e l u s u a rio a co n g e la d o la a n im a ció n , cu a n d o e l p ro g ra m a d e t e ct a q u e la
a n im a ció n n o e s vis ib le , le d ice a l t h re a d d e la a n im a ció n q u e p a re . Cu a n d o e l
u s u a rio re vis it a la a n im a ció n , e l p ro g ra m a re b p ie za e l t h re a d a m e n o s q u e e l
u s u a rio h a ya p e d id o q u e s e p a ra ra la a n im a ció n .
Po d ría s p re g u n t a rt e p o r q u é in crb e n t a r e l n ú m e ro d e m a rco a l p rin cip io d e l t u rn o
e n ve z a l fin a l. La ra zó n p a ra h a ce r e s t o e s lo q u e s u ce d e cu a n d o e l u s u a rio
co n g e la la a p lica ció n , la d e ja y lu e g o la re vis it a . Cu a n d o e l u s u a rio co n g e la la
a n im a ció n , e l b u cle d e a n im a ció n s e co m p le t a a n t e s d e s a lir. S i e l n ú m e ro d e
m a rco s e in crb e n t a ra a l fin a l d e l b u cle , e n lu g a r d e a l p rin cip io , e l n ú m e ro d e
m a rco cu a n d o e l b u cle s a le s e ría u n o m á s q u e e l m a rco q u e s e e s t á m o s t a n d o .
Cu a n d o e l u s u a rio re vis it a la a n im a ció n , la a n im a ció n p o d ría s e r co n g e la d a e n u n
m a rco d ife re n t e d e l q u e d e jó e l u s u a rio . Es t o p o d ría s e r d e s co n ce rt a n t e y, s i e l
u s u a rio p a ra la a n im a ció n e n u n m a rco p a rt icu la r, a b u rrid o .

Oz it o
Animar Gráficos
Es t a p á g in a g e n e ra u n a p p le t e je m p lo q u e cre a u n e fe ct o d e m o vim ie n t o ,
d ib u ja n d o cu a d ra d o s a lt e rn a t ivo s . Lo s cu a d ra d o s s o n d ib u ja d o s p o r e l m é t o d o
fillRe c t ( ) d e Gra p h ics . Aq u í t ie n e s e l a p p le t e n a cció n :
Ha b rá s o b s e rva d o q u e lo s g rá fico s n o s e a n im a n p e fe ct a m e n t e - - ya q u e
o ca s io n a lm e n t e a lg u n a p a rt e d e l á re a d e d ib u jo p a rp a d e a n o t a b le m e n t e . La
s ig u ie n t e p á g in a e xp lica la ca u s a d e l p a rp a d e o y le e xp lica co m o e lim in a rlo .
Aq u í t ie n e s e l có d ig o d e l a p p le t . La m a yo r d ife re n cia e n t re e s t e y la p la n t illa d e
a n im a ció n e s q u e e l m é t o d o p a in t ( ) h a ca m b ia d o p a ra d ib u ja r re ct á n g u lo s
re lle n o s , u s a n d o u n a lg o rit m o q u e d e p e n d e d e l n ú m e ro d e m a rco a ct u a l. Es t e
a p p le t t a m b ié n in t ro d u ce u n p a r d e va ria b le s d e e je m p la r, u n a q u e co n t ie n e e l
t a m a ñ o d e l cu a d ra d o y o t ra q u e m a n t ie n e la p is t a d e s i la s ig u ie n t e co lu m n a q u e
s e rá d ib u ja d a co n u n cu a d ra d o n e g ro . El u s u a rio p u e d e s e le ccio n a r e l t a m a ñ o d e l
cu a d ra d o m e d ia n t e u n n u e vo p a rá m e t ro d e l a p p le t .
Ab a jo t ie n e s e l có d ig o d e l m é t o d o p a in t ( ) q u e re a liza e l d ib u jo re a l. Ob s e rva q u e
e l p ro g ra m a s ó lo d ib u ja cu a d ra d o s n e g ro s ( in d ica d o s p o rq u e fillS q u a re e s t ru e ) ,
n o lo s o t ro s cu a d ra d o s . S e p u e d e e lim in a r e s t o p o rq u e , p o r d e fe ct o , e l á re a d e
d ib u jo d e u n Co m p o n e n t e s e lim p ia ( s e le ccio n a e l co lo r d e fo n d o ) ju s t o a n t e s d e
lla m a r a l m é t o d o p a in t ( ) .
// Dibuja el rectángulo si es necesario.
if (fillSquare) {
g.fillRect(x, y, w, h);
fillSquare = false;
} else {
fillSquare = true;
}

Oz it o
Eliminar el Parpadeo
El p a rp a d e o q u e p o d ría s h a b e r o b s e rva d o e n e l e je m p lo d e la p á g in a a n t e rio r e s u n
p ro b le m a co m ú n co n la a n im a ció n ( y o ca s io n a lm e n t e co n lo s g rá fico s e s t á t ico s ) . El
e fe ct o d e p a rp a d e o e s e l re s u lt a d o d e d o s fa ct o re s :
● Po r d e fe ct o , e l fo n d o d e la a n im a ció n e s lim p ia d o ( s e re d ib u ja s u á re a
co m p le t a co n e l co lo r d e fo n d o ) a n t e s d e lla m a r a l m é t o d o p a in t ( ) .
● El cá lcu lo d e l m é t o d o p a in t ( ) d e l e je m p lo a n t e rio r e s t a n la rg o q u e u t iliza
m á s t ie m p o e n ca lcu la r y d ib u ja r ca d a m a rco d e la a n im a ció n q u e e l ra t io d e
re fre s co d e la p a n t a lla . Co m o re s u lt a d o , la p rim e ra p a rt e d e l m a rco s e d ib u ja
e n u n p a s e d e re fre s co d e víd e o , y e l re s t o d e l m a rco s e d ib u ja e n e l s ig u ie n t e
( o in clu s o e l s ig u ie n t e a l s ig u ie n t e ) . El re s u lt a d o e s q u e a u n q u e la p rim e ra
p a rt e d e l m a rco s e a n im a n o rm a lm e n t e ( u s u a lm e n t e ) , p u e d e ve r u n a ru p t u ra
e n t re la p rim e ra y la s e g u n d a p a rt e , ya q u e la s e g u n d a p a rt e e s t á n e n b la n co
ha sta e l se gundo pa se .
S e p u e d e u t iliza r d o s t é cn ica s p a ra e lim in a r e l p a rp a d e o : s o b re e s crib ir e l m é t o d o
u p d a t e ( ) e im p le m e n t a r d o b le b u ffe r.

Sobreescribir el método update()


Pa ra e lim in a r e l p a rp a d e o , t a n t o s i s e u t iliza co m o s i n o e l d o b le b u ffe r,
d e b e s o b re e s crib ir e l m é t o d o u p d a t e ( ) . Es t o e s n e ce s a rio , p o rq u e e s la
ú n ica fo rm a p a ra p re ve n ir q u e fo n d o d e l co m p o n e n t e s e a lim p ia d o ca d a
ve z q u e s e d ib u ja e l co m p o n e n t e .

Implementar el Doble Buffer


Do b le b u ffe r im p lica re a liza r m ú lt ip le s o p e ra cio n e s g rá fica s e n u n b u ffe r
g rá fico q u e n o e s t á e n la p a n t a lla , y lu e g o d ib u ja r la im a g e n re s u lt a n t e
e n la p a n t a lla . El d o b le b u ffe r e vit a q u e la s im á g e n e s in co m p le t a s s e
d ib u je n e n la p a n t a lla .

Oz it o
Eliminar el Parpadeo: Sobreescribir el Método update()
Pa ra e lim in a r e l p a rp a d e o , d e b e s o b re e s crib ir e l m é t o d o u p d a t e ( ) . La ra zó n t ra t a co n la
fo rm a e n q u e e l AWT le p id e a ca d a co m p o n e n t e ( co m o u n Ap p le t , u n Ca n va s o u n Fra m e )
q u e s e re d ib u je a s í m is m o .
El AWT p id e q u e s e re d ib u je lla m a n d o a l m é t o d o u p d a t e ( ) d e l co m p o n e n t e . La
im p le m e n t a ció n p o r d e fe ct o d e u p d a t e ( ) lim p ia e l fo n d o d e l co m p o n e n t e a n t e s d e lla m a r
a l m é t o d o p a in t ( ) . Có m o e lim in a r e l p a rp a d e o re q u ie re q u e e lim in e t o d o e l d ib u jo
in n e ce s a rio , s u p rim e r p a s o s ie m p re e s s o b re e s crib ir e l m é t o d o u p d a t e ( ) p a ra q u e b o rre
t o d o e l fo n d o s ó lo cu a n d o s e a n e ce s a rio . Cu a n d o m u e va e l có d ig o d e d ib u jo d e l m é t o d o
p a in t ( ) a l m é t o d o u p d a t e ( ) , p o d ría n e ce s it a r m o d ifica r e l có d ig o d e d ib u jo , p a ra q u e n o
d e p e n d a d e s i e l fo n d o h a s id o b o rra d o .
N o t a : In clu s o s i s u im p le m e n t a ció n d e u p d a t e ( ) n o lla m a a p a in t ( ) , d e b e im p le m e n t a r
e s t e m é t o d o . La ra zó n : Cu a n d o u n á re a d e u n co m p o n e n t e s e re ve la d e re p e n t e d e s p u é s
d e h a ce r e s t a d o o cu lt a ( d e t rá s d e a lg u n a o t ra ve n t a n a , p o r e je m p lo ) , e l AWT lla m a
d ire ct a m e n t e a l m é t o d o p a in t ( ) , s in lla m a r a u p d a t e ( ) . Un a fo rm a s e n cilla d e
im p le m e n t a r e l m é t o d o p a in t ( ) e s h a ce r u n a lla m a d a a u p d a t e ( ) .
Aq u í t ie n e s e l có d ig o d e u n a ve rs ió n m o d ifica d a d e l e je m p lo a n t e rio r q u e im p le m e n t a
u p d a t e ( ) p a ra e lim in a r e l p a rp a d e o . Aq u í t ie n e s e l a p p le t e n a cció n :
Aq u í t ie n e s la n u e va ve rs ió n d e l m é t o d o p a in t ( ) , ju n t o co n e l n u e vo m é t o d o u p d a t e ( ) .
To d o e l có d ig o d e d ib u jo q u e e ra u t iliza d o p o r e l m é t o d o p a in t ( ) e s t á a h o ra e n e l m é t o d o
u p d a t e ( ) . Lo s ca m b io s s ig n ifica n t e s e n e l có d ig o d e d ib u jo e s t á n e n n e g rit a .
public void paint(Graphics g) {
update(g);
}

public void update(Graphics g) {


Color bg = getBackground();
Color fg = getForeground();

...//igual que el viejo método paint() hasta que dibujamos el rectángulo:


if (fillSquare) {
g.fillRect(x, y, w, h);
fillSquare = false;
} else {
g.setColor(bg);
g.fillRect(x, y, w, h);
g.setColor(fg);
fillSquare = true;
}
...//igual que el viejo método paint()
}
Ob s e rva q u e ya q u e n o s e lim p ia a u t o m á t ica m e n t e e l fo n d o , e l có d ig o d e d ib u jo d e b e
a h o ra d ib u ja r lo s re ct á n g u lo s q u e n o s e a n n e g ro s , a s í co m o lo s q u e lo s e a n .
Recortar el Area de Dibujo
Un a t é cn ica q u e s e p o d ría u t iliza r e n e l m é t o d o u p d a t e ( ) e s re co rt a r s u á re a d e
d ib u jo . Es t o n o fu n cio n a p a ra e l a p p le t d e e je m p lo d e e s t a p á g in a , ya q u e e n
ca d a m a rco ca m b ia t o d o e l á re a d e d ib u jo . El re co rt a d o fu n cio n a b ie n , a u n q u e ,
s ó lo cu a n d o ca m b ia u n a p e q u e ñ a p a rt e d e l á re a d e d ib u jo - - co m o cu a n d o e l
u s u a rio a rra s t ra u n o b je t o a lo la rg o d e la p a n t a lla .
Pu e d e re a liza r e l re co rt a d o u t iliza n d o e l m é t o d o c lip Re c t ( ) . Un e je m p lo d e
u t iliza ció n d e c lip Re c t ( ) s e e n cu e n t ra e n la p á g in a Au m e n t a r e l Re n d im ie n t o y
la Ap e rie n cia d e u n a An im a ció n .

Oz it o
Eliminar el Parpadeo: Implementar el Doble Buffer
La p á g in a a n t e rio r m o s t ró có m o e lim in a r e l p a rp a d e o im p le m e n t a n d o e l m é t o d o u p d a t e ( ) .
Po d ría s h a b e r o b s e rva d o ( d e p e n d ie n d o d e l re n d im ie n t o d e t u o rd e n a d o r) q u e e l a p p le t
re s u lt a n t e , a u n q u e n o p a rp a d e a , s e a rra s t ra u n p o co . Es t o e s , e n lu g a r d e a ct u a liza rs e
co m p le t a m e n t e e l á re a d e d ib u jo ( o m a rco ) d e u n a ve z, a lg u n a s ve ce s , u n a p a rt e s e a ct u a liza
a n t e s q u e la p a rt e d e s u d e re ch a , ca u s a n d o u n d ib u jo b a ch e a d o e n t re co lu m n a s .
Pu e d e s u t iliza r e l d o b le b u ffe r p a a e vit a r e s t e e fe ct o d e a rra s t re fo rza n d o q u e t o d o e l m a rco s e
d ib u je d e u n a s o la ve z. Pa ra im p le m e n t a r e l d o b le b u ffe r, s e n e ce s it a cre a r u n b u ffe r fu e ra d e
p a n t a lla ( n o rm a lm e n t e lla m a d o ( b a ck b u ffe r o b u ffe r fu e ra d e p a n t a lla ) , d ib u ja r e n é l, y lu e g o
m o s t ra r la im a g e n re s u lt a n t e e n la p a n t a lla .
Aq u í t ie n e s e l có d ig o p a ra e l e je m p lo d e a n im a ció n d e g rá fico s , m o d ifica d o p a ra im p le m e n t a r e l
d o b le b u ffe r. Ab a jo t ie n e s e l a p p le t re s u lt a n t e e n a cció n .
Pa ra cre a r u n b u ffe r fu e ra d e p a n t a lla co n e l AWT, p rim e ro n e ce s it a s cre a r u n a im a g e n d e l
t a m a ñ o a p ro p ia d o y lu e g o o b t e n e r u n co n t e xt o g rá fico p a ra m a n ip u la r la im a g e n . Ab a jo t ie n e e l
có d ig o q u e h a ce e s t o :
//Donde se declaren las Variables de ejemplar:
Dimension offDimension;
Image offImage;
Graphics offGraphics;
. . .
//en el método update(), donde d contiene el tamaño del área de dibujo en la
pantalla:
if ( (offGraphics == null)
|| (d.width != offDimension.width)
|| (d.height != offDimension.height) ) {
offDimension = d;
offImage = createImage(d.width, d.height);
offGraphics = offImage.getGraphics();
}
Ab a jo , e n n e g rit a , e s t á e l n u e vo có d ig o d e d ib u jo e n e l m é t o d o u p d a t e ( ) . Ob s e rva q u e e l
có d ig o d e d ib u jo a h o ra lim p ia co m p le t a m e n t e e l fo n d o , p e ro n o ca u s a p a rp a d e o p o q u e e l có d ig o
e s t á d ib u ja n d o e n e l b u ffe r fu e ra d e p a n t a lla , n o e n la p a n t a lla . Ob s e rva t a m b ié n q u e t o d a s la s
lla m a d a s a fillRe c t ( ) s e re a liza n a l b u ffe r fu e ra d e p a n t a lla . El re s u lt a d o fin a l s e m u e s t ra e n la
p a n t a lla ju s t o a n t e s d e q u e e l m é t o d o u p d a t e ( ) re t o rn e .
public void update(Graphics g) {
...//Primero, inicializa las variables y crea el buffer fuera de pantalla
//Luego borra al imagen anterior:
offGraphics.setColor(getBackground());
offGraphics.fillRect(0, 0, d.width, d.height);
offGraphics.setColor(Color.black);

...//Hace todo lo que hacia el viejo método paint() -- hasta que dibujamos el
rectángulo
if (fillSquare) {
offGraphics.fillRect(x, y, w, h);
fillSquare = false;
} else {
fillSquare = true;
}
...//El resto es exactamente igual que el viejo método paint() hasta casi el
final
//donde añadimos lo siguiente:
//dibuja la imgen en la pantalla.
g.drawImage(offImage, 0, 0, this);
}
No e s n e ce s a rio q u e e l m é t o d o u p d a t e ( ) lla m e a l m é t o d o p a in t ( ) . To d o lo n e ce s a rio e s q u e e l
m é t o d o u p d a t e ( ) d e a lg u n a fo rm a d ib u je s u b u ffe r fu e ra d e p a n t a lla e n la p a n t a lla , y q u e e l
m é t o d o p a in t ( ) p u e d a d ib u ja r la im a g e n a p ro p ia d a cu a n d o s e a lla m a d o d ire ct a m e n t e p o r e l
AWT.
Po d ría s p re g u n t a rt e p o r q u é s e cre a n la im a g e n fu e ra d e p a n t a lla y e l co n t e xt o g rá fico d e n t ro d e l
m é t o d o u p d a t e ( ) , e n ve z d e h a ce rlo ( p o r e je m p lo ) e n e l m é t o d o s t a rt ( ) . La ra zó n e s q u e la
im a g e n y e l co n t e xt o g rá fico d e p e n d e n d e l t a m a ñ o d e l á re a d e d ib u jo d e l Pa n e l d e l Ap p le t y d e l
t a m a ñ o d e l á re a d e d ib u jo d e l co m p o n e n t e y n o s o n vá lid o s h a s t a q u e e l co m p o n e n t e s e h a ya
d ib u ja d o p o r p rim e ra ve z e n la p a n t a lla .

Oz it o
Mover una Imagen a través de la Pantalla
Es t a p á g in a g e n e ra u n a p p le t d e e je m p lo q u e m u e ve u n a im a g e n ( u n co h e t e q u e
re a lm e n t e p a re ce u n t ro zo d e p izza ) d e la n t e d e u n a im a g e n d e fo n d o ( u n ca m p o d e
e s t re lla s ) . Es t a p á g in a s ó lo m u e s t ra e l có d ig o p a ra u n a p p le t . El có d ig o p a ra u n a
a p lica ció n s e ría s im ila r e xce p t o p o r e l có d ig o u t iliza d o p a ra ca rg a r la s im á g e n e s ,
co m o s e d e s crib ió e n Ca rg a r Im á g e n e s .

Ab a jo t ie n e s la s d o s im á g e n e s u t iliza d a s p o r e l a p p le t :

ro cke t s h ip . g if:

s t a rfie ld . g if:
N o t a : la im a g e n ro cke t s h ip t ie n e u n fo n d o t ra n s p a re n t e . El fo n d o t ra n s p a re n t e
h a ce q u e la im a g e n d e l co h e t e p a re zca t e n e r fo rm a d e co ch e s in im p o rt a r e l co lo r
d e l fo n d o d o n d e s e e s t é d ib u ja n d o . S i e l fo n d o d e l co h e t e n o fu e ra t ra n s p a re n t e , e n
ve z d e la ilu s ió n d e ve r u n co h e t e m o vie n d o s e p o r e l e s p a cio , s e ve ria u n co h e t e
d e n t ro d e u n re ct á n g u lo q u e s e m u e ve p o r e l e s p a cio .
Aq u í t ie n e s e l a p p le t e n a cció n . Re cu e rd a q u e s e p u e d e p u ls a r s o b re e l a p p le t p a ra
d e t e n e r y a rra n ca r la a n im a ció n
El có d ig o q u e re a liza e s t a a n im a ció n n o e s co m p le jo . Es e n cia lm e n t e , e s la p la n t illa
d e a n im a ció n d e l a p p le t , m á s u n có d ig o d e d o b le b u ffe r q u e vió e n la p á g in a
a n t e rio r, m á s u n a s cu a n t a s lín e a d e có d ig o a d icio n a le s . El có d ig o a d icio n a l, ca rg a
la s im á g e n e s , d ib u ja la im a g e n d e fo n d o , y u t iliza u n s e n cillo a lg o rit m o q u e
d e t e rm in a d o n d e d ib u ja r la im a g e n e n m o vim ie n t o . Aq u í t ie n e s e l có d ig o a d icio n a l:
...//Donde se declaren las variables de ejemplar:
Image stars;
Image rocket;

...//en el método init():


stars = getImage(getCodeBase(), "../images/starfield.gif");
rocket = getImage(getCodeBase(), "../images/rocketship.gif");

...//en el método update():


//dibujar el marco dentro de la imagen.
paintFrame(offGraphics);

...//Un nuevo método:


void paintFrame(Graphics g) {
Dimension d = size();
int w;
int h;

//Si tenemos una anchura y altura válidas de la imagen de fondo


//la dibujamos.
w = stars.getWidth(this);
h = stars.getHeight(this);
if ((w > 0) && (h > 0)) {
g.drawImage(stars, (d.width - w)/2,
(d.height - h)/2, this);
}

//Si tenemos una anchura y altura válidas de la imagen móvil


//la dibujamos.
w = rocket.getWidth(this);
h = rocket.getHeight(this);
if ((w > 0) && (h > 0)) {
g.drawImage(rocket, ((frameNumber*5) % (w + d.width)) - w,
(d.height - h)/2, this);
}
}
S e p o d ría p e n s a r q u e e s t e p ro g ra m a n o n e ce s it a lim p ia r e l fo n d o ya q u e u t iliza u n a
im a g e n d e fo n d o . S in e m b a rg o , t o d a vía e s n e ce s a rio lim p ia r e l fo n d o . Un a ra zó n e s
q u e e l a p p le t n o rm a lm e n t e e m p ie za a d ib u ja r a n t e s d e q u e la s im á g e n e s e s t é n
ca rg a d a s t o t a lm e n t e . S i la im a g e n d e l co h e t e s e ca rg a ra a n t e s q u e la im a g e n d e
fo n d o , ve ría p a rt e s d e va rio s co h e t e s h a s t a q u e la im a g e n d e fo n d o s e a ca rg a d a .
Ot ra ra zó n e s q u e s i e l á re a d e d ib u jo d e l a p p le t fu e ra m á s a n ch a q u e la im a g e n d e
fo n d o , p o r a lg u n a ra zó n , ve ría va rio s co h e t e s a a m b o s la d o s d e la im a g e n d e
fo n d o .
S e p o d ría re s o lve r e s t e p ro b le m a re t a rd a n d o t o d o e l d ib u jo h a s t a q u e la s d o s
im á g e n e s e s t u vie ra n t o t a lm e n t e ca rg a d a s . El s e g u n d o p ro b le m a s e p o d ría re s o lve r
e s ca la n d o la im a g e n d e fo n d o p a ra q u e cu b rie ra t o d o e l á re a d e l a p p le t . Ap re n d e rá
co m o e s p e ra r a q u e la s im á g e n e s s e ca rg u e n co m p le t a m e n t e e n Au m e n t a r e l
Re n d im ie n t o y la Ap a rie n cia d e u n a An im a ció n , m á s a d e la n t e e n e s t a le cció n . El
e s ca la d o s e d e s crib e e n Mo s t ra r Im á g e n e s .

Oz it o
Mostrar una Secuencia de Imágenes
El e je m p lo d e e s t a p á g in a m u e s t rá lo b á s ico p a ra m o s t ra r u n a s e cu e n cia d e
im á g e n e s . La s ig u ie n t e s e cció n t ie n e t ru co s p a ra a u m e n t a r e l re n d im ie n t o y la
a p a rie n cia d e e s t a a n im a ció n . Es t a p á g in a s ó lo m u e s t ra e l có d ig o d e l a p p le t . El
có d ig o d e la a p lica ció n e s s im ila r, e xce p t o p o r e l có d ig o u t iliza d o p a ra ca rg a r la s
im á g e n e s , có m o s e d e s crib ió e n Ca rg a r Im á g e n e s .

Ab a jo t ie n e s la s d ie z im á g e n e s q u e u t iliza e s t e a p p le t .

T1 . g if: T2 . g if: T3 . g if: T4 . g if:

T5 . g if: T6 . g if: T7 . g if: T8 . g if:

T9 . g if: T1 0 . g if:
Aq u í t ie n e s e l a p p le t e n a cció n ; re cu e rd a q u e s e p u e d e p u ls a r s o b re e l a p p le t p a ra
d e t e n e r o a rra n ca r la a n im a ció n .
El có d ig o d e e s t e e je m p lo e s in clu s o m á s s e n cillo q u e e l d e la p á g in a a n t e rio r, q u e
m o vía u n a im a g e n . Aq u í t ie n e e l có d ig o q u e lo d ife re n cia d e l e je m p lo q u e m o vía la
im a g e n :
. . .//Donde se declaren las variables de ejemplar:
Image duke[10];

. . .//En el método init():


for (int i = 1; i <= 10; i++) {
images[i-1] = getImage(getCodeBase(),
"../../../images/duke/T"+i+".gif");
}

. . .//En el método update(), en vez de llamar a drawFrame():


offGraphics.drawImage(images[frameNumber % 10], 0, 0, this);

Oz it o
Aumentar la Apariencia y el Rendimiento de una
Animación
Po d ría s h a b e r o b s e rva d o d o s co s a s e n la a n im a ció n d e la p á g in a a n t e rio r:
● Mie n t ra s s e ca rg a rn la s im á g e n e s , e l p ro g ra m a m u e s t ra a lg u n a s im á g e n e s
p a rcia lm e n t e y o t ra s n o la s m u e s t ra .
● La ca rg a d e im á g e n e s t a rd a m u ch o t ie m p o .

El p ro b le m a d e la m u e s t ra d e im á g e n e s p a rcia le s t ie n e fá cil s o lu ció n , u t iliza n d o la cla s e


Me d ia Tra cke r. Me d ia Tra cke r t a m b ié n d is m in u ye e l t ie m p o q u e t a rd a n e n ca rg a rs e la s
im á g e n e s . Ot ra fo rm a d e t ra t a r e l p ro b le m a d e la ca rg a le n t a e s ca m b ia r e l fo rm a t o d e la
im a g e n d e a lg u n a fo rm a ; e s t a p á g in a le o fre ce a lg u n a s s u g e re n cia s p ra h a ce rlo .

Utilizar MediaTracker para Cargar Imágenes y Retardar el dibujo de éstas


La cla s e Me d ia Tra cke r p e rm it e ca rg a r fá cilm e n t e lo s d a t o s d e u n g ru p o d e
im á g e n e s y s a b e r cu a n d o s e h a n ca rg a d o é s t a s co m p le t a m e n t e . No rm a lm e n t e ,
lo s d a t o s d e u n a im a g e n n o s e ca rg a n h a s t a q u e la im a g e n e s d ib u ja d a p o r
p rim e ra ve z. Pa ra p e d ir q u e q u e lo s d a t o s d e u n a g ru p o d e im á g e n e s s e a n
p re ca rg a d o s a s ín cro n a m e n t e , p u e d e u t iliza r la s fo rm a s d e c h e c k I D ( ) y
c h e c k All( ) q u e u t iliza n u n a rg u m e n t o b o o le a n d o , s e le ccio n a n d o e l a rg u m e n t o
a t ru e . Pa ra ca rg a r lo s d a t o s s ín cro n a m e n t e ( e s p e ra n d o a q u e lo s d a t o s
lle g u e n ) u t ilice lo s é t o d o s w a it Fo rI D ( ) y w a it Fo rAll( ) . Lo s m é t o d o s d e
Me d ia Tra cke r q u e ca rg a n lo s d a t o s u t iliza n va rio s Th re a d s e n s e g u n d o p la n o
p a ra d e s ca rg a r lo s d a t o s , re s u lt a n d o e n u n a u m e n t o d e la ve lo cid a d .
Pa ra co m p ro b a r e l e s t a d o d e ca rg a d e u n a im a g e n , s e p u e d e n u t iliza r lo s
m é t o d o s s t a t u s I D ( ) y s t a t u s All( ) d e Me d ia Tra cke r. Pa ra co m p ro b a r s i q u e d a
a lg u n a im a g e n p o r ca rg a r, p u e d e u t iliza lo s m é t o d o s c h e c k I D ( ) y c h e c k All( ) .
Aq u í t ie n e s la ve rs ió n m o d ifica d a d e l a p p le t d e e je m p lo q u e u t iliza lo s m é t o d o s
w a it Fo rAll( ) y c h e c k All( ) d e Me d ia Ta cke r. Ha s t a q u e s e ca rg u e n t o d a s la s
im á g e n e s , e l a p p le t s ó lo m u e s t ra e l m e n s a je "Ple a s e wa it . . . ". Pu e d e ve r la
d o cu m e n t a ció n d e la cla s e Me d ia Tra cke r p a ra ve r u n e je m p lo q u e d ib u ja e l
fo n d o in m e d ia t a m e n t e p e ro e s p e ra a d ib u ja r la s im á g e n e s a n im a d a s .
Aq u í t ie n e s e l a p p le t e n a cció n :
Ab a jo t ie n e s e l có d ig o m o d ifica d o q u e u t iliza Me d ia Tra cke r co m o a yu d a p a ra
re t a rd a r e l d ib u jo d e la s im a g e n e s . La s d ife re n cia s s e h a n m a rca d o e n n e g rit a .
...//Donde se declaren las variables de ejemplar:
MediaTracker tracker;

...//En el método init():


tracker = new MediaTracker(this);
for (int i = 1; i <= 10; i++) {
images[i-1] = getImage(getCodeBase(),
"../../../images/duke/T"+i+".gif");
tracker.addImage(images[i-1], 0);
}

...//Al principio del método run():


try {
//Empieza la carga de imágenes. Esperar hasta que se hayan cargado
tracker.waitForAll();
} catch (InterruptedException e) {}

...//Al principio del método update():


//Si no se han cargado todas las imágenes, borrar el fondo
//y mostrar la cadena de estado.
if (!tracker.checkAll()) {
g.clearRect(0, 0, d.width, d.height);
g.drawString("Please wait...", 0, d.height/2);
}

//Si las imágenes se han cargado, dibujarlas


else {
...//el mismo código de antes...

Acelerar la Carga de Imágenes


Ta n t o s i u s e t iliza Me d ia Tra cke r co m o s i n o , la ca rg a d e im á g e n e s u t iliza n d o
URLs ( có m o h a ce n n o rm a lm e n t e lo s a p p le t s ) t a rd a m u ch o t ie m p o . La m a yo ría
d e l t ie m p o s e co n s u m e e n in icia liza r la s co n e xio n e s HTTP. Ca d a fich e ro d e
im a g e n re q u ie re u n co n e xió n HTTP s e p a ra d a , y ca d a co n e xió n t a rd a va rio s
s e g u n d o s e n in icia liza rs e . La t é cn ica a p ra e vit a r e s t o e s co m b in a r la s im á g e n e s
e n u n s ó lo fich e ro . S e p u e d e a d e m á s a u m e n t a r e l re n d im ie n t o u t iliza n d o a lg ú n
a lg o rit m o d e co m p re s ió n , e s p e cia lm e n t e u n o d is e ñ a d o p a ra im á g e n e s m ó vile s .
Un a fo rm a s e n cilla d e co m b in a r im á g e n e s e n u n ú n ico fich e ro e s cre a r u n a t ira
d e im á g e n e s . Aq u í t ie n e s u n e je m p lo d e u n a t ira d e im á g e n e s :

ja ck. g if:
Pa ra d ib u ja r u n a im a g e n d e la t ira , p rim e ro s e d e b e s e le ccio n a r e l á re a d e
re co rt e a l t a m a ñ o d e u n a im a g e n . Cu a n d o s e d ib u je la t ira d e im á g e n e s ,
d e s p la za lo a la izq u ie rd a ( s i e s n e ce s a rio ) p a ra q u e s ó lo a p a re zca d e n t ro d e l
á re a d e d ib u jo la im a g e n q u e s e q u ie re . Po r e je m p lo :
//imageStrip es el objeto Image que representa la tira de imágenes.
//imageWidth es el tamaño individual de una imagen.
//imageNumber es el número (desde 0 a numImages) de la imagen a dibujar.
int stripWidth = imageStrip.getWidth(this);
int stripHeight = imageStrip.getHeight(this);
int imageWidth = stripWidth / numImages;
g.clipRect(0, 0, imageWidth, stripHeight);
g.drawImage(imageStrip, -imageNumber*imageWidth, 0, this);
S i s e q u ie re q u e la ca rg a d e im á g e n e s s e a a ú n m á s rá p id a , s e d e b e ría b u s ca r
u n fo rm a t o d e co m p re s ió n d e im á g e n e s , e s p e cia lm e n t e có n o Flic q u e re a liza
u n a co m p re s ió n in t e r- m a rco s .

Oz it o
Problemas más comunes con los Gráficos (y sus
Soluciones)
P ro b le m a : No s e d o n d e p o n e r m i có d ig o d e d ib u jo .
● El có d ig o d e d ib u jo p e rt e n e ce a l m é t o d o p a in t ( ) d e u n co m p o n e n t e
p e rs o n a liza d o . S e p u e d e n cre a r co m p o n e n t e s p e rs o n a liza d o s cre a n d o u n a
s u b cla s e d e Ca n va s , Pa n e l, o Ap p le t . Pu e d e s ve r Có m o u t iliza r la cla s e Ca n va s
p a ra m á s in fo rm a ció n s o b re lo s co m p o n e n t e s p e rs o n a liza d o s . Po r e ficie n cia ,
u n a ve z q u e e l có d ig o d e d ib u jo fu n cio n a , p u e d e s m o d ifica rlo y lle va rlo a l
m é t o d o u p d a t e ( ) ( a u n q u e a ú n d e b e ría s im p le m e n t a r e l m é t o d o p a in t ( ) ) ,
co m o s e d e s crib e e n Elim in a r e l Pa rp a d e o .

P ro b le m a : La s co s a s q u e d ib u jo n o s e m u e s t ra n .
● Co m p ru e b a s i t u co m p o n e n t e s e m u e s t ra t o t a lm e n t e . Pro b le m a s m á s
Co m u n e s co n lo s Co m p o n e n t e s p o d ría a yu d a rt e co n e s t o .

P ro b le m a :Es t o y u t iliza n d o e l m is m o có d ig o q u e e l e je m p lo d e l t u t o ria l, p e ro n o


fu n cio n a ¿ p o r q u é ?
● ¿ El có d ig o e je cu t a d o e s e xa ct a m e n t e e l m is m o có d ig o q u e e l d e l t u t o ria l? Po r
e je m p lo , s i e l e je m p lo d e l t u t o ria l t ie n e e l có d ig o e n lo s m é t o d o s < > p a in t ( )
o u p d a t e ( ) , e n t o n ce s e s t o s m é t o d o s d e b e ría n s e r e l ú n ico lu g a r d o n d e s e
g a ra n t iza q u e e l có d ig o fu n cio n a .
P ro b le m a :¿ Có m o p u e d o d ib u ja r lín e a s p u n t e a d a s y p a t ro n e s ?
● Act u a lm e n t e e l API p a ra g rá fico s p rim it ivo s d e l AWT e s t á b a s t a n t e lim it a d o .
Po r e je m p lo , s ó lo s o p o rt a u n a a n ch u ra d e lín e a . Pu e d e s s im u la r la s lín e a s
p u n t e a d a s , d ib u ja n d o va ria s ve ce s co n u n e s p a cio d e u n p ixe ls o d ib u ja n d o
re ct á n g u lo s re lle n o s . El AWT t a m p o co s o p o rt a lo s p a t ro n e s d e re lle n o .
S i n o h a s vis t o t u p ro b le m a e s e s t a lis t a , p u e d e s ve r Pro b le m a s Co m u n e s co n lo s
Co m p o n e n t e s y Pro b le m a s Co m u n e s co n la Dis t rib u ció n

Oz it o
Introducción al API 2D de Java
El API 2 D d e Ja va in t ro d u cid o e n e l JDK 1 . 2 p ro p o rcio n a g rá fico s a va n za d o s e n d o s
d im e n s io n e s , t e xt o , y ca p a cid a d e s d e m a n e jo d e im á g e n e s p a ra lo s p ro g ra m a s
Ja va a t ra vé s d e la e xt e n s ió n d e l AWT. Es t e p a q u e t e d e re n d e rin g s o p o rt a lín e a s
a rt ís it ca s , t e xt o e im á g n e e s e n u n m a rco d e t ra b a jo fle xib le y lle n o d e p o t e n cia
p a ra d e s a rro lla r in t e rfa ce s d e u s u a rio , p ro g ra m a s d e d ib u jo s o fis t ica d o s y e d it o re s
d e im á g e n e s .
El API 2 D d e Ja va p ro p o rcio n a :
● Un m o d e lo d e re n d e rin g u n ifo rm e p a ra p a n t a lla s e im p re s o ra s .

● Un a m p lio co n ju n t o d e p rim it ivo s g e o m é t rico s , co m o cu rva s , re ct á n g u lo s , y


e lip s e s y u n m e ca n is m o p a ra re n d re in za r virt u a lm e n t e cu a lq u ie r fo rm a
g e o m é t rica .
● Me ca n is m o x p a ra d e t e ct a r e s q u in a s d e fo rm a s , t e xt o e im á g e n e s .

● Un m o d e lo d e co m p o s ició n q u e p ro g p o rcio n a co n t ro l s o b re có m o s e
re n d e riza n lo s o b je t o s s o la p a d o s .
● S o p o rt e d e co lo r m e jo ra d o q u e fa cilit a s u m a n e jo .

● S o p o rt e p a ra im p rim ir d o cu m e n t o s co m p le jo s .

Es t o s t ó p ico s s e e xp lica n e n la s s ig u ie n t e p á g in a s :
● Dib u ja d o 2 D d e Ja va

● S ys t e m a d e Co o rd e n a d a s
● fo rm a s
● Te xt o
● Im á g e n e s
● Im p re s ió n

Oz it o
Rendering en Java 2D
El m e ca n is m o d e re n d e rin g b á s ico e s e l m is m o q u e e n la s ve rs io n e s a n t e rio re s d e l
JDK - - e l s is t e m a d e d ib u jo co n t ro la cu a n d o y co m o d ib u ja u n p ro g ra m a . Cu a n d o
u n co m p o n e n t e n e ce s it a s e r m o s t ra d o , s e lla m a a u t o m á t ica m e n t e a s u m é t o d o
p a in t o u p d a t e d e n t ro d e l co n t e xt o Gra p h ic s a p ro p ia d o .
El API 2 D d e Ja va p re s e n t a ja va . a wt . Gra p h ics 2 D, u n n u e vo t ip o d e o b je t o
Gra p h ic s . Gra p h ic s 2 D d e s cie n d e d e la cla s e Gra p h ics p a ra p ro p o rcio n a r a cce s o a
la s ca ra ct e rís it ca s a va n za d a s d e re n d e rin g d e l API 2 D d e Ja va .
Pa ra u s a r la s ca ra ct e rís t ica s d e l API 2 D d e Ja va , t e n e m o s q u e fo rza r e l o b je t o
Gra p h ic s p a a d o a l m é t o d o d e d ib u jo d e u n co m p o n e n t e a u n o b je t o Gra p h ic s 2 D .

public void Paint (Graphics g) {


Graphics2D g2 = (Graphics2D) g;
...
}

Contexto de Rendering de Graphics2D


Al co n ju n t o d e a t rib u t o s d e e s t a d o a s o cia d o s co n u n o b je t o Gra p h ic s 2 D
s e le co n o ce co m o Co n t e x t o d e Re n d e rin g d e Gra p h ic s 2 D . Pa ra
m o s t ra r t e xt o , fo rm a s o im á g e n e s , p o d e m o s co n fig u ra r e s t e co n t e xt o y
lu e g o lla m a r a u n o d e lo s m é t o d o s d e re n d e rin g d e la cla s e Gra p h ic s 2 D ,
co m o d ra w o fill. Có m o m u e s t ra la s ig u ie n t e fig u ra , e l co n t e xt o d e
re n d e rin g d e Gra p h ic s 2 D co n t ie n e va rio s a t rib u t o s .

El e s t ilo d e lá p iz q u e s e a p lica a l e xt e rio r d e u n a fo rm a . Es t e


a rib u t o s t ro k e n o s p e rm it e d ib u ja r lín e a s co n cu a lq u ie r
t a m a ñ o d e p u n t o y p a t ró n d e s o m b re a d o y a p lica r
fin a liza d o re s y d e co ra cio n e s a la lín e a .

El e s t ilo d e re lle n o q u e s e a p lica a l in t e rio r d e la fo rm a . Es t e


a t rib u t o p a in t n o s p e rm it e re lle n a r fo rm a s co n có lo re s
s ó lid o s , g ra d ie n t e s o p a t ro n e s .

El e s t ilo d e co m p o s ició n s e u t iliza cu a n d o lo s o b je t o s


d ib u ja d o s e s o la p a n co n o b je t o s e xis t e n t e s .
La t ra n s fo rm a ció n q u e s e a p lica d u ra n t e e l d ib u ja d o p a ra
co n ve rt ir e l o b je t o d ib u ja d o d e s d e e l e s p a cio d e u s u a rio a
la s co o rd e n a d a s d e e s p a cio d e l d is p o s it ivo . Ta m b ié n s e
p u e d e n a p lica r o t ra s t ra n s fo rm a cio n e s o p cio n a le s co m o la
t ra d u cció n , ro t a ció n e s ca la d o , re co rt a d o , a t ra vé s d e e s t e
a t rib u t o .

El Clip q u e re s t rin g e e l d ib u ja d o a l á re a d e n t ro d e lo s
b o rd e s d e la S h a p e s e u t iliza p a ra d e fin ir e l á ra d e re co rt e .
S e p u e d e u s a r cu a lq u ie r S h a p e p a ra d e fin ir u n clip .

La fu e n t e s e u s a p a ra co n ve rt ir ca d e n a s d e t e xt o .

Pu n t o d e Re n d e rin g q u e e s p e cifica n la s p re fe re n cia s e n


cu a n t ro a ve lo cid a d y ca lid a d . Po r e je m p lo , p o d e m o s
e s p e cifica r s i s e d e b e ría u s a r a n t ia lia s in g , s i e s t á d is p o n ib le .

Pa ra co n fig u ra r u n a t rib u t o e n e l co n t e xt o d e re n d e rin g d e Gra p h ic s 2 D ,


s e u s a n lo s m é t o d o s s e t At t rib u t e :
● s e t S t ro k e

● s e t P a in t

● s e t Co m p o s it e

● s e t Tra n s fo rm

● s e t Clip

● s e t Fo n t

● s e t Re n d e rin g Hin t s

Cu a n d o co n fig u ra m o s u n a t rib u t o , s e e l p a s a a l o b je t o e l a t rib u t o


a p ro p ia d o . Po r e je m p lo , p a ra ca m b ia r e l a t rib u t o p a in t a u n re lle n o d e
g ra d ie n t e a zu l- g ris , d e b e ría m o s co n s t ru ir e l o b je t o Gra d ie n t P a in t y
lu e g o lla m a r a s e t P a in t .

gp = new GradientPaint(0f,0f,blue,0f,30f,green);
g2.setPaint(gp);
Gra p h ic s 2 D co n t ie n e re fe re n cia s a s u s o b je t o a t rib u t o s - - n o s o n
clo n a d o s . S i m o d ifica m o s u n o b je t o a t rib u t o q u e fo rm a p a rt e d e l
co n t e xt o Gra p h ic s 2 D , n e ce s it a m o s lla m a r a l m é t o d o s e t p a ra n o t ifica rlo
a l co n t e xt o . La m o d ifica ció n d e u n a t rib u t o d e u n o b je t o d u ra n t e e l
re n d e rin p u e d e ca u s a r co m p o rt a m ie n t o s im p re d e cib le s .

Métodos de rendering de Graphics2D


Gra p h ic s 2 D p ro p o rcio n a lo s s ig u ie n t e s m é t o d o s g e n e ra le s d e d ib u ja d o
q u e p e u d e n s e r u s a d o s p a ra d ib u ja r cu a lq u ie r p rim it ivo g e o m é t rico , t e xt o
o im a g e n :
● d ra w - - d ib u ja e l e xt e rio r d e u n a fo rm a g e o m é t rica p rim it iva u s a n d o
lo s a t rib u t o s s t ro ke y p a in t .
● fill- - d ib u ja cu a lq u ie r fo rm a g e o m é t rica p rim it iva re lle n a d o s u
in t e rio r co n e l co lo r o p a t ró n e s p e cifica d o p o r e l a t rib u t o p a in t .
● d ra w S t rin g - - d ib u ja cu a lq u ie r ca d e n a d e t e xt o . El a t rib u t o fo n t s e
u s a p a ra co n ve rt ir la fu e n t e a g lyp h s q u e lu e g o s o n re lla n d o s co n e l
co lo r o p a t ró n e s p e cifica d o s p o r e l a t rib u t o p a in t .
● d ra w I m a g e - - d ib u ja la im a g e n e s p e cifica d a .

Ad e m ñ a s , Gra p h ic s 2 D s o p o rt a lo s m é t o d o d e re n d e rin g d e Gra p h ic s


p a ra fo rm a s p a rt icu la re s , co m o d ra w Ov a l y fillRe c t .

Oz it o
Sistema de Coordenadas
El s is t e m a 2 D d e Ja va m a n t ie n e d o s e s p a cio s d e co o rd e n a d a s .
● El e s p a cio d e u s u a rio e s e l e l e s p a cio e n q u e s e e s p e cifica n lo s g rá fico s
p rim it ivo s .
● El e s p a cio d e d is p o s it ivo e s e l s is t e m a d e co o rd e n a d a s p a ra u n d io p o s it ivo d e
s a lid a , co m o u n a p a n t a lla , u n a ve n t a n a o u n a im p re s o ra .
El e s p a cio d e u s u a rio e s u n s is t e m a d e co o rd e n a d a s ló g ica s in d e p e n d ie n t e d e l
d is p o s it ivo : e l e s p a cio d e co o rd e n a s q u e u s a n n u e s t ro s p ro g ra m a s . To d o s lo s
g e o m é t rico s p a s a d o s a la s ru t in a s Ja va 2 D d e re n d e rin g s e e s p e cifica n e n
co o rd e n a d a s d e e s p a cio d e u s u a rio .
Cu a n d o s e u t iliza la t ra n s fo rm a ció n p o r d e fe ct o d e s d e e l e s p a cio d e u s u a rio a l
e s p a cio d e d is p o s it ivo , e l o rig e n d e l e s p a cio d e u s u a rio e s la e s q u in a s u p e rio r
izq u ie rd a d e l á re a d e d ib u jo d e l co m p o n e n t e . La co o rd e n a X s e in cre m e n t a h a cia la
d e re ch a , y la co o rd e n a Y h a cia a b a jo , co m o s e m u e s t ra la s ig u ie n t e fig u ra .
El e s p a cio d e d is p o s it ivo e s u n s is t e m a d e co o rd e n a d a s d e p e n d ie n t e d e l d is p o s it ivo
q u e va ría d e a cu e rd o a la fu e n t e d e l d is p o s it ivo . Au n q u e e l s is t e m a d e co o rd e n a s
p a ra u n a ve n t a n a o u n a p a n t a lla p o d ría s e r m u y d is t in t o q u e p a ra u n a im p re s o ra ,
e s t a s d ife re n cia s s o n in vis ib le s p a ra lo s p ro g ra m a s Ja va . La s co n ve rs io n e s
n e ce s a ria s e n t re e l e s p a cio d e u s u a rio y e l e s p a cio d e d is p o s it ivo s e re a liza n
a u t o m á t ica m e n t e d u ra n t e e l d ib u ja d o .

Oz it o
Formas
La s cla s e s d e l p a q u e t e ja v a . a w t . g e o m d e fin e n g rá fico s p rim it ivo s co m u n e s , co m o
p u n t o s , lín e a s , cu rva s , a rco s , re ct á n g u lo s y e lip s e s .

Clases en el paquete java.awt.geom


Arc 2 D Ellip s e 2 D Qu a d Cu rv e 2 D
Are a Ge n e ra lP a t h Re c t a n g le 2 D
Cu b ic Cu rv e 2 D Lin e 2 D Re c t a n g u la rS h a p e
D im e n s io n 2 D P o in t 2 D Ro u n d Re c t a n g le 2 D

Exce p t o p a ra P o in t 2 D y D im e n s io n 2 D , ca d a u n a d e la s o t ra s cla s e s g e o m é t rica s


im p le m e n t a e l in t e rfa ce S h a p e , q u e p ro p o rcio n a u n co n ju n t o d e m é t o d o s co m u n e s
p a ra d e s crib ir e in s p e cio n a r o b je t o s g e o m é t rico s b i- d im e n s io n a le s .
Co n e s t a s cla s e s p o d m e o s cre a r d e fo rm a virt u a l cu a lq u ie re fo rm a g e o m é t rica y
d ib u ja rla a t ra vé s d e Gra p h ic s 2 D lla m a n d o a l m é t o d o d ra w o a l m é t o d o fill. Po r
e je m p lo , la s fo rm a s g e o m é t rica s d e l s ig u ie n t e a p p le t e s t á n d e fin id a s u s a n d o lo s
g e o m é t rico s b á s ico s d e Ja va 2 D.
S i t ie n e s cu rio s id a d , e l có d ig o d e l p ro g ra m a e s t á e n S h a p e s De m o 2 D. ja va . La fo rm a
d e d ib u ja r y re lle n a r fo rm a s s e d e s crib e e n la s ig u ie n t e le cció n Mo s t ra r Grá fico s co n
Gra p h ics 2 D.

Es t a fig u t a h a s id o re d u cid a p a ra q u e q u e p a e n la p á g in a .
Pu ls a s o b re la im a g e n p a ra v e rla e n s u t a m a ñ o n a t u ra l.

Formas Rectangulares
Lo s p rim it ivo s Re c t a n g le 2 D , Ro u n d Re c t a n g le 2 D , Arc 2 D , y Ellip s e 2 D
d e s cie n d e n d e l Re c t a n g u la rS h a p e , q u e d e fin e m é t o d o s p a ra o b je t o s
S h a p e q u e p u e d e n s e r d e s crit o s p o r u n a ca ja re ct á n g u la r. La g e o m e t ría
d e u n Re c t a n g u la rS h a p e p u e d e s e r e xt ra p o la d a d e s d e u n re ct á n g u lo
q u e e n cie rra co m p le t a m e n t e e l e xt e rio r d e la S h a p e .
QuadCurve2D y CubicCurve2D
La cla s e Qu a d Cu rv e 2 D n o s p e rm it e cre a r s e g m e n t o s d e cu rva s
cu a d rá t ico s . Un a cu rva cu a d rá t ica e s t á d e fin id a p o r d o s p u n t o s fin a le s y
u n p u n t o d e co n t ro l.
La cla s e Cu b ic Cu rv e 2 D n o p e rm it e cre a r s e g m e n t o s d e cu rva s cú b ico s .
Un a cu rva cú b ica e s t á d e fin id a p o r d o s p u n t o s fin a le s y d o s p u n t o s d e
co n t ro l. La s s ig u ie n t e s fig u ra s m u e s t ra n e je m p lo s d e cu rva s cu a d rá t ica s
y cú b ica s .

GeneralPath
La cla s e Ge n e ra lP a t h n o s p e rm it e cre a r u n a cu rva a rb it ra ria
e s p e cifica n d o u n a s e rie d e p o s icio n e s a lo la rg o d e lo s lím it e s d e la
fo rm a . Es t a s p o s icio n e s p u e d e n s e r co n e ct a d a s p o r s e g m e n t o s d e lín e a ,
cu rva s cu a d rá t ica s o cu rva s cú b ica s . La s ig u ie n t e fig u ra p u e d e s e r cre a d a
co n 3 s e g m e n t o s d e lín e a y u n a cu rva cú b ica .
Areas
Co n la cla s e Are a p o d e m o s re a liza r o p e ra cio n e s b o o le n a s , co m o
u n io n e s , in t e rs e ccio n e s y s u b t ra ccio n e s , s o b re d o s o b je t o s S h a p e
cu a le s q u ie ra . Es t a t é cn ica , n o s p e rm it e cre a r rá p id a m e n t e o b je t o s
S h a p e co m p le jo s s in ye n e r q u e d e s crib ir ca d a lín e a d e s e g m e n t o o ca d a
cu rva .

Oz it o
Texto
Cu a n d o n e ce s it e m o s m o s t ra r t e xt o , p o d e m o s u s a r u n o d e lo s co m p o n e n t e s
o rie n t a d o s a t e xt o , co m o lo s co m p o n e n t e s Co m o u s a r La b e ls o Us a r Co m p o n e n t e s
d e Te xt o d e S win g . Cu a n d o s e u t iliza u n co m p o n e n t e d e t e xt o , m u ch o d e l t ra b a jo
lo h a ce n p o r n o s o t ro s - - p o r e je m p lo , lo s o b je t o s JTe x t Co m p o n e n t p ro p o rcio n a n
s o p o rt e in t e rn o p a ra ch e q u e o d e p u ls a cio n e s y p a ra m o s t ra r t e xt o in t e rn a cio n a l.
S i q u e re m o s m o s t ra r u n a ca d e n a d e t e xt o e s t á t ica , p o d e m o s d ib u ja rla
d ire ct a m e n t e a t ra vé s d e Gra p h ic s 2 D u s a n d o e l m é t o d o d ra w S t rin g . Pa ra
e s p e cifica r la fu e n t e , p o d e m o s u s a r e l m é t o d o s e t Fo n t d e Gra p h ic s 2 D .
S i q u e re m o s im p le m e n t a r n u e s t ra s p ro p ia s ru t in a s d e e d ició n d e t e xt o o
n e ce s it a m o s m á s co n t ro l s o b re la d is t rib u cció n d e l t e xt o q u e la q u e p ro p o rcio n a n
lo s co m p o n e n t e s d e t e xt o , p o d e m o s u s a r la s cla s e s d e l p a q u e t e ja v a . a w t . fo n t .

Fuentes
La s fo rm a s q u e u n a fu e n t e u s a p a ra re p re s e n t a r lo s ca ra ct e re s d e u n a
ca d e n a s o n lla m a d a s g ly p h s . Un ca ra ct e r p a rt icu la r o u n a co m b in a ció n
d e ca ra ct e re s p o d ría s e r re p re s e n t a d a co m o u n o o m á s g lyp h s . Po r
e je m p lo , á p o d ría s e r re p re s e n t a d o p o r d o s g lyp h s , m ie n t ra s q u e la
lig a d u ra fi p o d ría s e r re p re s e n t a d a p o r u n s ó lo g lyp h .
S e p u e d e p e n s a r e n u n a fu e n t e co m o e n u n a co le cció n d e g lyp h s . Un a
s o la fu e n t e p o d ría t e n e r m u ch a s ca ra s , co m o u n a p e s a d a , m é d ia ,
o b líq u a , g ó t ica y re g u la r, To d a s la s ca ra s d e u n a fu e n t e t ie n e n
ca ra ct e rís t ica s t ip o g rá fica s s im ila re s y p u e d e n s e r re co n o cid a d co m o
m ie m b ro s d e la m is m a fa m ilia . En o t ra s p a la b ra s , u n a co le cció n d e
g lyp h s co n u n e s t ilo p a rt icu la r fo rm a u n a c a ra d e fu e n t e ; y u n a
co le cció n d e ca ra s d e fu e n t e s fo rm a s u n a fa m ilia d e fu e n t e s ; y e l
co n ju n t o d e fa m ilia s d e fu e n t e s fo rm a n e l ju e g o d e fu e n t e s d is p o n ib le s
e n e l s is t e m a .
Cu a n d o s e u t iliza e l API 2 D d e Ja va , s e e s p e cifica n la s fu e n t e s u s a n d o u n
e je m p la r d e Fo n t . Po d e m o s d e t e rm in a r la s fu e n t e s d is p o n ib le s e n e l
s is t e m a lla m a n d o a l m é t o d o e s t á t ico
Gra p h ic s En v iro n m e n t . g e t Lo c a lGra p h ic s En v iro n m e n t y p re g u n t a n d o
a l Gra p h ic s En v iro n m e n t d e vu e lt o . El m é t o d o g e t AllFo n t s d e vu e lve u n
a rra y q u e co n t ie n e e je m p la re s Fo n t p a ra t o d a s la s fu e n t e s d is p o n ib le s
e n e l s is t e m a ; g e t Av a ila b le Fo n t Fa m ily N a m e s d e vu e lve u n a lis t a d e
la s fa m ilia s d e fu e n t e s d is p o n ib le s .
Gra p h ic s En v iro n m e n t t a m b ié n d e s crib e la co le cció n d e d is p o s it ivo s d e
d ib u jo d e la p la t a fo rm a , co m o p a n t a lla s e im p re s o ra s , q u e u n p ro g ra m a
Ja va p u e d e u t iliza r. Es t a in fo rm a ció n e s u s a d a cu a n d o e l s is t e m a re a liza
la co n ve rs ió n d e l e s p a cio d e u s u a rio a l e s p a cio d e d is p o s it ivo d u ra n t e e l
d ib u jo .
N o t a : En e l JDK 1 . 1 , la s fu e n t e s s e d e s crib ía n co n n o m b re s
ló g ico s q u e e ra n m a p e a d o s e n d ife re n t e s ca ra s d e fu e n t e s ,
d e p e n d ie n d o d e la s fu e n t e s q u e e s t a b a n d is p o n ib le s e n u n a
p la t a fo rm a p a rt icu la r. Po r ra zo n e s d e co m p a t ib ilid a d ,
Gra p h ic s 2 D t a m b ié n s o p o rt a la e s p e cifica ció n d e fu e n t e s p o r
e l n o m b re ló g ico . Pa ra o b t e n e r u n a lis t a d e lo s n o m b re s ló g ico s
d e la fu e n t e s , s e p u e d e lla m a r a
ja v a . a w t . To o lk it . g e t Fo n t Lis t .

Distribución de Texto
An t e s d e p o d e r m o s t ra r e l t e xt o , d e b e s e r d is t rib u id o p a ra q u e lo s
ca ra ct e re s s e a n re p re s e n t a d o s p o r lo s g lyp h s a p ro p ia d o s e n la s
p o s icio n e s a p ro p ia d a s . S i e s t a m o s u s a n d o S win g , p o d e m o s d e ja r q u e
JLa b e l o JTe x t Co m p o n e n t m a n e je n la d is t rib u ció n d e t e xt o p o r
n o s o t ro s . JTe x t Co m p o n e n t s o p o rt a t e xt o b id ire ccio n a l y e s t á d is e ñ a d a
p a ra m a n e ja r la s n e ce s id a d e s d e la m a yo ría d e la s a p lica cio n e s
in t e n a cio n a le s . Pa ra m á s in fo rm a ció n s o b re e l u s o d e lo s co m p o n e n t e s
d e t e xt o S win g , p u e d e s ve r Us a r Co m p o n e n t e s d e Te xt o .

S i n o e s t a m o s u s a n d o u n co m p o n e n t e d e t e xt o S win g p a ra m o s t ra r e l
t e xt o a u t o m á t ica m e n t e , p o d e m o s u s a r u n o d e lo s m e ca n is m o s d e Ja va
2 D p a ra m a n e ja r la d is t rib u ció n d e t e xt o .
● S i q u e re m o s im p le m e n t a r n u e s t ra s p ro p ia s ru t in a s d e e d ició n d e
t e xt o , p o d e m o s u s a r la cla s e Te x t La y o u t p a ra m a n e ja r la
d is t rib u ció n d e t e xt o , ilu m in a ció n y d e t e cció n d e p u ls a ció n . La s
fa cilid a d e s p ro p o rcio n a d a s p o r Te x t La y o u t m a n e ja n m u ch o s ca s o s
co m u n e s , in clu iye n d o ca d e n a s co n fu e n t e s m e zcla d a s , le n g u a je s
m e zcla d o s y t e xt o b id ire ccin a l. Pa ra m á s in fo rm a ció n s o b re
Te x t La y o u t , p u e d e s ve r Ma n e ja r la d is t t rib u ció n d e Te xt o .
● S i q u e re m o s u n co n t ro l t o t a l s o b re la fo rm a y p o s ició n d e n u e s t ro
t e xt o , p o d e m o s co n s t ru ir n u e s t ro p ro p io o b je t o Gly p h Ve c t o r
u s a n d o Fo n t y re n d e riza n d o ca d a Gly p h Ve c t o r a t ra vé s d e
Gra p h ic s 2 D . Pa ra m á s in fo rm a ció n s o b re la im p le m e n t a ció n d e
n u e s t ro p ro p io m e ca n is m o d e d is t rib u ció n d e t e xt o , p u e d e s ve r
Im p le m e n t a r u n Me ca n is m o Pe rs o n a liza d o d e Dis t rib u ció n d e Te xt o

Oz it o
Imágenes
El API 2 D d e Ja va im p le m e n t a u n n u e vo m o d e lo d e im a g e n q u e s o p o rt a la
m a n ip u la ció n d e im á g e n e s d e re s o lu ció n fija a lm a ce n a d a s e n m e m o ria . Un a n u e va
cla s e I m a g e e n e l p a q u e t e ja v a . a w t . im a g e , Bu ffe re d I m a g e , p u e d e s e r u s a d a
p a ra m a n ip u la r d a t o s d e u n a ija g e n re cu p e ra d o s d e s d e u n fich e ro o u n a URL. Po r
e je m p lo , s e p u e d e u s a r u n Bu ffe re d I m a g e p a ra im p le m e n t a r d o b le b u ffe r - - lo s
e le m e n t o s g rá fico s o n d ib u ja d o s fu e ra d e la p a n t a lla e n e l Bu ffe re d I m a g e y lu e g o
s o n co p ia d o s a la p a n t a lla a t ra vé s d e lla m a d a s a l m é t o d o d ra w I m a g e d e
Gra p h ic s 2 D . La s cla s e s Bu ffe re d I m a g e y Bu ffe re d I m a g e Op t a m b ié n p e rm it e n
re a liza r u n a g ra n va rie d a d d e o p e ra cio n e s d e filt ra d o d e im á g e n e s co m o b lu r. El
m o d e lo d e im a g e n p ro d u ct o r/ co n s u m id o r p ro p o rcio n a d o e n la s ve rs io n e s a n t e rio re s
d e l JDK s ig u e s ie n d o s o p o rt a d o p o r ra zo n e s d e co m p a t ib ilid a d .

Oz it o
Imprimir
To d o s lo s g rá fico s d e l AWT y d e Ja va 2 D, in clu id o s lo s g rá fico s co m p u e s t o s y la s
im á g e n e s , p u e d e n s e r d ib u ja d a s e n u n a im p re s o t a u s a n d o e l API d e Ja va 2 D. Es t e
API p ro p o rcio n a ca ra ct e rís it ca s d e co m p o s ició n d e d o cu m e n t o s q u e n o s p e rm it e
re a liza r d ich a s o p e ra cio n e s co m o ca b ia r e l o rd e n d e im p re s ió n d e la s p á g in a s .
Dib u ja r e n la im p re s o ra e s co m o d ib u ja r e n la p a n t a lla . El s is t e m a d e im p re s ió n
co n t ro la cu a n d o s e d ib u ja n la s p á g in a s , có m o lo h a ce e l s is t e m a g rá fico d e la
p a n t a lla cu a n d o u n co m p o n e n t e s e d ib u ja e n la p a n t a lla .
Nu e s t ra a p lica ció n p ro p o rcio n a n e l s is t e m a d e im p re s ió n co n in fo rm a ció n s o b re e l
d o cu m e n t o a im p rim ir, y e l s is t e m a d e im p re s ió n d e t e rm in a cu a n d o n e ce s it a r
d ib u ja r ca d a p á g in a . cu a n d o la s p á g in a n e ce s it a n s e r d ib u ja d a s , e l s is t e m a d e
im p re s ió n lla m a a l m é t o d o p rin t d e la a p lica ció n co n e l co n t e xt o Gra p h ic s
a p ro p ia d o . Pa ra u s a r la s ca ra ct e rís t ica s d e l API 2 D d e Ja va e n la im p re s ió n ,
d e b e m o s fo rza r e l o b je t o Gra p h ic s a u n o b je t o Gra p h ic s 2 D , ig u a l q u e s e h a ce
cu a n d o s e d ib u ja e n la p a n t a lla .

Oz it o
Mostrar Gráficos con Graphics2D
Es t a le cció n n o s m u e s t ra có m o u s a r Gra p h ic s 2 D p a ra m o s t ra r g rá fico s co n lín e a s
e xt e rio re s , e s t ilo s d e re lle n o , t ra n s fo rm a ció n d e g rá fico s m ie n t ra s s o n d ib u ja d o s ,
re s t ricció n d e d ib u jo e n u n á re a p a rt icu la r y g e n e ra lm e n t e co n t ro la la fo rm a y
a s p e ct o d e lo s g rá fico s . Ta m b ié n a p re n d e re m o s có m o cre a r o b je t o s co m p le jo s
co m b in a n d o a lg u n o s s im p le s y có m o d e t e ct a r cu a n d o e l u s u a rio p u ls a s o b re u n
g rá fico p rim it ivo . Es t o s t ó p ico s s e d e s crib ie n e n la s s ig u ie n t e s s e ccio n e s :

Dibujar y rellenar gráficos primitivos


Es t a s e cció n ilu s t ra có m o s e le ccio n a r e l p u n t e a d o y lo s a t rib u t o s d e
d ib u jo p a ra co n t ro la r la lín e a e xt e rio r y e l re lle n o a p lica d o a l o b je t o
S h a p e y e l t e xt o .

Transformar formas, texto e imágenes


Es t a s e cció n m u e s t ra có m o m o d ifica r la t ra n s fo rm a ció n p o r d e fe ct o p a ra
q u e lo s o b je t o s s e a n t ra s la d a d o s , g ira d o s , e s ca la d o s o s o m b re a d o s
m ie n t ra s s o n d ib u ja d o s .

Recortar el área de dibujo


S e p u e d e u s a r la fo rm a co m o p a t h d e re c o rt a d o - - e l á re a e n la q u e
t ie n e lu g a r e l d ib u ja d o .

Componer Gráficos
Es t a s e cció n ilu s t ra lo s d is t in t o s e s t ilo s d e co m p o s ició n s o p o rt a d o s p o r
Alp h a Co m p o s it e y m u e s t ra có m o s e le ccio n a r e l e s t ilo d e co m p o s ició n
e n e l co n t e xt o Gra p h ic s 2 D .

Controlar la Claidad de dibujo


Es t a s e cció n d e s crib e lo s t ru co s d e d ib u jo q u e s o p o rt a Gra p h ic s 2 D y
m u e s t ra có m o e s p e cifica r n u e s t ra s p re fe re n cia s e n t re la ca lid a d d e
d ib u jo y la ve lo cid a d .

Construir formas complejas desde gráficos primitivos


Es t a s e cció n d e s crib e có m o re a liza r o p e ra cio n e s b o o le n a n a s s o b re o b je t o
S h a p e u s a n d o la cla s e Are a .
Soportar Interacción del Usuario
Es t a s e cció n m u e s t ra co m o re a liza r d e t e cció n d e p u ls a cio n e s s o b re
g rá fico s p rim it ivo s .

Oz it o
Punteado y Relleno de Gráficos Primitvos
Ca m b ia n d o e l p u n t e a d o y lo s a t rib u t o s d e d ib u jo e n e l co n t e xt o d e Gra p h ic s 2 D ,
a n t e s d e l d ib u jo , p o d e m o s fá cilm e n t e a p lica r e s t ilo s d ive rt id o s d e lín e a s y p a t ro n e s
d e re lle n o p a ra g rá fico s p rim it ivo s . Po r e je m p lo , p o d e m o s d ib u ja r u n a lín e a
p u n t e a d a cre a n d o e l o b je t o S t ro k e a p ro p ia d o y lla m a n d o a s e t S t ro k e p a ra
a ñ a d irlo a l co n t e xt o Gra p h ic s 2 D a n t e s d e d ib u ja r la lín e a . De fo rm a s im ila r,
p o d e m o s a p lica r u n re lle n o d e g ra d ie n t e a u n S h a p e cre a n d o u n o b je t o
Gra d ie n t P a in t y a ñ a d ie n d o a l co n t e xt o Gra p h ic s 2 D lla m a n d o a s e t P a in t a n t e s
d e d ib u ja r la S h a p e .
El s ig u ie n t e a p p le t d e m u e s t ra có m o p o d e m o s d ib u ja r fo rm a s g e o m é t rica s u s a n d o
lo s m é t o d o s Gra p h ic s 2 D d ra w y fill.

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a s o b re e lla . El
a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
S h a p e s D e m o 2 D . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

Ca d a u n a d e la s fo rm a s d ib u ja d a s p o r e l a p p le t e s t á co n s t ru id a s d e g e o m e t ría s y
e s t á d ib u ja d a a t ra vé s d e Gra p h ic s 2 D . La s va ria b le s re c t He ig h t y re c t W id t h d e
e s t e e je m p lo d e fin e n la s d im e n s io n e s d e l e s p a cio e n q u e s e d ib u ja ca d a fo rm a , e n
p ixe ls . La va ria b le s x e y ca m b ia n p a ra ca d a fo rm a p a ra q u e s e a n d ib u ja d a s e n
fo rm a ció n d e p a rrilla .

// draw Line2D.Double
g2.draw(new Line2D.Double(x, y+rectHeight-1,
x + rectWidth, y));
// draw Rectangle2D.Double
g2.setStroke(stroke);
g2.draw(new Rectangle2D.Double(x, y,
rectWidth,
rectHeight));

// draw RoundRectangle2D.Double
g2.setStroke(dashed);
g2.draw(new RoundRectangle2D.Double(x, y,
rectWidth,
rectHeight,
10, 10));

// draw Arc2D.Double
g2.setStroke(wideStroke);
g2.draw(new Arc2D.Double(x, y,
rectWidth,
rectHeight,
90, 135,
Arc2D.OPEN));

// draw Ellipse2D.Double
g2.setStroke(stroke);
g2.draw(new Ellipse2D.Double(x, y,
rectWidth,
rectHeight));

// draw GeneralPath (polygon)


int x1Points[] = {x, x+rectWidth,
x, x+rectWidth};
int y1Points[] = {y, y+rectHeight,
y+rectHeight, y};
GeneralPath polygon = new
GeneralPath(GeneralPath.WIND_EVEN_ODD,
x1Points.length);
polygon.moveTo(x1Points[0], y1Points[0]);

for (int index = 1;


index < x1Points.length;
index++) {
polygon.lineTo(x1Points[index],
y1Points[index]);
};
polygon.closePath();
g2.draw(polygon);

// draw GeneralPath (polyline)


int x2Points[] = {x, x+rectWidth, x,
x+rectWidth};
int y2Points[] = {y, y+rectHeight,
y+rectHeight, y};
GeneralPath polyline = new
GeneralPath(GeneralPath.WIND_EVEN_ODD,
x2Points.length);

polyline.moveTo (x2Points[0], y2Points[0]);

for (int index = 1;


index < x2Points.length;
index++) {
polyline.lineTo(x2Points[index],
y2Points[index]);
};

g2.draw(polyline);

// fill Rectangle2D.Double (red)


g2.setPaint(red);
g2.fill(new Rectangle2D.Double(x, y,
rectWidth, rectHeight));

// fill RoundRectangle2D.Double
g2.setPaint(redtowhite);
g2.fill(new RoundRectangle2D.Double(x, y,
rectWidth,
rectHeight,
10, 10));

// fill Arc2D
g2.setPaint(red);
g2.fill(new Arc2D.Double(x, y, rectWidth,
rectHeight, 90,
135, Arc2D.OPEN));
// fill Ellipse2D.Double
g2.setPaint(redtowhite);
g2.fill (new Ellipse2D.Double(x, y,
rectWidth,
rectHeight));

// fill and stroke GeneralPath


int x3Points[] = {x, x+rectWidth, x,
x+rectWidth};
int y3Points[] = {y, y+rectHeight,
y+rectHeight, y};

GeneralPath filledPolygon = new


GeneralPath(GeneralPath.WIND_EVEN_ODD,
x3Points.length);
filledPolygon.moveTo(x3Points[0],
y3Points[0]);

for (int index = 1;


index < x3Points.length;
index++) {
filledPolygon.lineTo(x3Points[index],
y3Points[index]);

};
filledPolygon.closePath();
g2.setPaint(red);
g2.fill(filledPolygon);
Ob s e rva q u e e s t e e je m p lo u s a im p le m e n t a cio n e s d e d o b le p re cis io n d e la s cla s e s
g e o m é t rica s . Do n d e s e a p o s ib le , la s im p le m e n t a cio n e s d e lo s flo a t y d o b le
p re cis ió n d e ca d a g e o m é t rico e s t á n p ro p o rcio n a d o s p o r cla s e s in t e rn a s .

Dibujar Curvas
Lo s a p p le t s Cu b ic y Qu a d d e m u e s t ra n co m o cre a r cu rva s cú b ica s y
cu a d rá ica s u s a n d o Cu b ic Cu rv e 2 D y Qu a d Cu rv e 2 D . Es t o s a p p le t s
t a m b ié n d e m u e s t ra n co m o s e d ib u ja n la s cu rva s co n re s p e ct o a l
p o s icio n a m ie n t o d e lo s p u n t o s d e co n t ro l p e rm it ie n d o n o s
in t e ra ct iva m e n t e m o ve r t a n t o lo s p u n t o s d e co n t ro l co m o lo s p u n t o s
fin a le s .
Ejemplo: Quad
El a p p le t Qu a d d e m u e s t ra u n a cu rva cu a d rá t ica , q u e e s u n
s e g m e n t o d e cu rva q u e t ie n e d o s p u n t o s fin a le s y u n ú n ico
p u n t o d e co n t ro l. El p u n t o d e co n t ro l d e t e rm in a la fo rm a d e la
cu rva co n t ro la n d o t a n t o e l p u n t o d e co n t ro l co m o lo s ve ct o re s
t a n g e n cia le s d e lo s p u n t o s fin a le s .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r,
p u ls a s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l
n a v e g a d o r.
Qu a d . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

Prim e ro s e crra u n a n u e va cu rva cu a d rá t ica co n d o s p u n t o s


fin a le s y u n p u n t o d e co n t ro l y la s p o s icio n e s d e lo s p u n t o s s e
s e le ccio n a n co n re s p e ct o a l t a m a ñ o d e la ve n t a n a .

QuadCurve2D.Double quad = new QuadCurve2D.Double();

Point2D.Double start, end, control;


start = new Point2D.Double();
one = new Point2D.Double();
control = new Point2D.Double();

quad.setCurve(start, one, control);

start.setLocation(w/2-50, h/2);
end.setLocation(w/2+50, h/2);
control.setLocation((int)(start.x)+50, (int)(start.y)-50);
Ca d a ve z q u e e l u s u a rio m u e va u n o d e lo s p u n t o s , la cu rva s e
re s e t e a rá .

quad.setCurve(start, control, end);

Ejemplo: Cubic
El e je m p lo Cu b ic d e m u e s t ra u n a cu rva cú b ica , q u e
e s u n s e g m e n t o d e cu rva q u e t ie n e d o s p u n t o s
fin a le s y d o s p u n t o s d e co n t ro l. Ca d a p u n t o d e
co n t ro l d e t e rm in a la fo rm a d e la cu rva m e d ia n t e e l
co n t ro l d e u n o d e lo s ve ct o re s t a n g e n cia le s d e u n
p u n t o fin a l. En e l e je m p lo Cu b ic , la s cru ce s
co lo re a d a s s e d ib u ja n d o n d e s e e n cu e n t ra n lo s
p u n t o s d e co n t ro l y lo s p u n t o s fin a le s . El p u n t o d e
co n t ro l a zu l co n t a la e l p u n t o fin a l ro lo y e l p u n t o d e
co n t ro l ve rd e co n t ro la e l p u n t o fin a l m a g e n t a .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r
e l a p p le r, p u ls a s o b re e lla . El a p p le t a p a re ce rá e n
u n a n u e v a v e n t a n a d e l n a v e g a d o r.
Cu b ic . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e
a p p le t .
Un a cu rva cú b ica s e cre a co n d o s p u n t o s fin a le s y
d o s p u n t o s d e co n t ro l y la s lo ca liza cio n e s d e lo s
p u n t o s s e s e le ccio n a n co n re s p e ct o a l t a m a ñ o d e la
ve n t a n a .
CubicCurve2D.Double cubic = new CubicCurve2D.Double();

Point2D.Double start, end, one, two;


start = new Point2D.Double();
one = new Point2D.Double();
two = new Point2D.Double();
end = new Point2D.Double();

cubic.setCurve(start, one, two, end);

...

start.setLocation(w/2-50, h/2);
end.setLocation(w/2+50, h/2);
one.setLocation((int)(start.x)+25, (int)(start.y)-25);
two.setLocation((int)(end.x)-25, (int)(end.y)+25);
Co m o e n e l e je m p lo Qu a d , la cu rva e s re s e t e a d a
ca d a ve z q u e s e m u e ve n lo s p u ls o s .

cubic.setCurve(start, one, two, end);

Dibujar formas arbitrarias


El e je m p lo S h a p e s D e m o u s a Ge n e ra lP a t h p a ra h a ce r p o líg o n o s e n
fo rm a d e cris t a le s , p e ro t a m b ie n p o d e m o s u s a r Ge n e ra lP a t h p a ra h a ce r
fo rm a s a rb it ra ria s t a n t o co n lín e a s re ct a s co m o cu rva s .

Ejemplo: Odd_Shape
El e je m p lo Od d _ S h a p e u s a Ge n e ra lP a t h p a ra cre a r fo rm a s
a rb it ra ria s e n la s e cció n Fo rm a s .
Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r,
p u ls a s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l
n a v e g a d o r.
Od d _ S h a p e . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

El s ig u ie n t e có d ig o cre a u n n u e vo Ge n e ra lP a t h y a ñ a d e e l
p rim e r p u n t o a l p a rh .

GeneralPath oddShape = new GeneralPath();


...

x = w/2 + 50;
y = h/2 - 25;

x2 = x;
y2 = y;

oddShape.moveTo(x, y);
De s p u é s d e a ñ a d ir e l p rim e r p u n t o a l p a t h , s e a ñ a d e n t re s
lín e a s re ct a s .

x -= 100;
oddShape.lineTo(x, y);
y += 50;
oddShape.lineTo(x, y);
x += 100;
oddShape.lineTo(x, y);
Fin a lm e n t e , s e a ñ a d e u n a cu rva cú b ica .

x += 10;
y -= 10;
x1 = x - 20;
y1 = y - 20;
oddShape.curveTo(x, y, x1, y1, x2, y2);

Definir Estilos de línea divertidos y Patrones de relleno.


Pro b a b le m e n t e h a b rá s o b s e rva d o e n e l e je m p lo a n t e rio r a lg u n a s d e la s
fo rm a s t ie n e lín e a p u n t e a d a s o e s t á n re lle n a s co n g ra d ie n t e s d e d o s
co lo re s . Us a n d o la s cla s e s S t ro k e y P a in t d e Ja va 2 D, p o d e m o s
fá cilm e n t e d e fin ir e s t ilo s d e lín e a d ive rt id o s y p a t ro n e s d e re lle n o
Estilos de Línea
Lo s e s t ilo s d e lín e a e s t á d e fin id a p o r e l a t rib u t o s t ro ke e n e l
co n t e xt o Gra p h ic s 2 D . Pa ra s e le ccio n a r e l a t rib u t o s t ro ke
p o d e m o s cre a r u n o b je t o Ba s ic S t ro k e y p a s a rlo d e n t ro d e l
m é t o d o Gra p h ic s 2 D s e t S t ro k e .
Un o b je t o Ba s ic S t ro k e co n t ie n e in fo rm a ció n s o b re la a n ch u ra
d e la lín e a , e s t ilo d e u n io n e s , e s t ilo s fin a le s , y e s t ilo d e
p u n t e a d o . Es t a in fo rm a ció n e s u s a d a cu e n d o u n S h a p e e s
d ib ju ja d o co n e l m é t o d o d ra w .
La a n c h u ra d e lín e a e s la lo n g it u d d e la lín e a m e d id a
p e rp e n d icu la rm e n t e a s u t ra ye ct o ria . La a n ch u ra d e la lín e a s e
e s p e cifica co m o u n va lo r flo a t e n la s u n id a d e s d e co o rd e n a d a s
d e u s u a rio , q u e e s e q u iva le n t e a 1 / 7 2 p u lg a d a s cu a n d o s e
u t iliza la t ra n s fo rm a ció n p o r d e fe ct o .
El e s t ilo d e u n ió n e s la d e co rica ció n q u e s e a p lica cu a n d o s e
e n cu e n t ra n d o s s e g m e n t o s d e lín e a . Ba s ic S t ro k e s o p o rt a t re s
e s t ilo s d e u n ió n : :

JOI N _ BEVEL

JOI N _ MI TER

JOI N _ ROUN D
El e s t ilo d e fin a le s e s la d e co ra ció n q u e s e a p lica cu a n d o u n
s e g m e n t o d e lín e a t e rm in a . Ba s ic S t ro k e s o p o rt a t re s e s t ilo s
d e fin a liza ció n : :
CAP _ BUTT
CAP _ ROUN D
CAP _ S QUARE
El e s t ilo d e p u n t e a d o d e fin e e l p a t ró n d e la s s e ccio n e s o p a ca s
y t ra n s p a re n t e s a p lica d a s a lo la rg o d e la lo n g it u d d e la lín e a .
Es t e e s t ilo e s d e fin id o p o r u n a rra y d e p u n t e a d a y u n a fa s e d e
p u n t e a d o . El a rra y d e p u n t e a d o d e g in e e l p a t ró n d e p u n t e a d o .
Lo s e le m e n t o s a lt e rn a t ivo s e n e l a rra y re p re s e n t a n la lo n g it u d
d e l p u n t e a d o y e l e s p a cio e n t re p u n t e a d o s e n u n id a d e s d e
co o rd e n a d a s d e u s u a rio . . El e le m e n t o 0 re p re s e n t a e l p rim e r
p u n t e a d o , e l e le m e n t o 1 e l p rim e r e s p a cio , e t c. La fa s e d e
p u n t e a d o e s u n d e s p la za m ie n t o e n e l p a t ró n d e p u n t e a d o ,
t a m b ié n e s p e cifica d o e n u n id a d e s d e co o rd e n a d a s d e u s u a rio .
La fa s e d e p u n t e a d o in d ica q u e p a rt e d e l p a t ró n d e p u n t e a d o
s e a p lica a l p rin cip io d e la lín e a .

Patrón de Relleno
Lo s p a t ro n e s d e re lle n o s e s t á n d e fin id o s p o r e l a t rib u t o p a in t
e n e l co n t e xt o Gra p h ic s 2 D . Pa ra s e le ccio n a r e l a t rib u t o p a in t ,
s e cre a u n e je m p la r d e u n o b je t o q u e im p le m e n t e e l in t e rfa ce
P a in t y s e p a s a d e n t ro d e l m é t o d o Gra p h ic s 2 D s e t P a in t .
Tre s cla s e s im p le m e n t a n e l in t e rfa ce P a in t : Co lo r,
Gra d ie n t P a in t , y Te x t u re P a in t . Gra d ie n t P a in t y
Te x t u re P a in t s o n n u e va s e n e l JDK 1 . 2 .
Pa ra cre a r u n Gra d ie n t Pa in t , s e e s p e cifica u n a p o s ició n in icia l y
u n co lo r y u n a p o s ició n fin a l y o t ro co lo r. El g ra d ie n t e ca m b ia
p ro p o rcio n a lm e n t e d e s d e u n co lo r a l o t ro a lo la rg o d e la lín e a
q u e co n e ct a la s d o s p o s icio n e s .

El p a t ró n p a ra u n a Te x t u re P a in t e s t a d e fin id a p o r u n
Bu ffe re d I m a g e . Pa ra cre a r u n Te x t u re P a in t , s e e s p e cifica
u n a im a g e n q u e co n t ie n e e l p a t ró n y u n re ct á n g u lo q u e e s
u s a d o p a ra re p lica r y a n cla r e l p a t ró n .
Ejemplo: StrokeAndFill
El a p p le t S t ro k e An d Fill p e rm it e a l u s u a rio s e le ccio n a r u n
g rá fico p rim it ivo , u n e s t ilo d e lín e a , u n e s t ilo d e d ib u jo y o b ie n
p u n t e a r e l e xt e rio r d e l o b je t o , re lle n a rlo co n e l d ib u jo
s e le ccio n a d o , o p u n t e a r e l o b je t o e n b la n co y re lle n a r e l d ib u jo
co n e l d ib u jo s e le ccio n a d o .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r,
p u ls a s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l
n a v e g a d o r.
S t ro k e An d Fill. ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e
a p p le t .
Lo s p rim it ivo s s o n in icia liza d o s e in t ro d u cid o s e n u n a rra y d e
o b je t o S h a p e . El s ig u ie n t e có d ig o cre a u n Re c t a n g le y u n
Ellip s e 2 D . D o u b le y lo s in t ro d u ce e n e l a rra y s h a p e s .

shapes[0] = new Rectangle(0, 0, 100, 100);


shapes[1] = new Ellipse2D.Double(0.0, 0.0, 100.0, 100.0);
Pa ra cre a r u n o b je t o S h a p e d e s d e u n a ca d e n a d e t e xt o ,
p rim e ro d e b e m o s cre a r u n o b je t o Te x t La y o u t d e s d e e l t e xt o
d e la ca d e n a .

TextLayout textTl = new TextLayout("Text",


new Font("Helvetica", 1, 96),
new FontRenderContext(null, false, false));
La s s ig u in e t e s lín e a s t ra n s fo rm a n e l Te x t La y o u t p a ra q u e s e a
ce n t ra d o e n e l o rig e n y lu e g o in t o rd u ce e l o b je t o S h a p e
re s u lt a n t e d e la lla m d a a g e t Ou t lin e d e n t ro d e l a rra y s h a p e s .

AffineTransform textAt = new AffineTransform();


textAt.translate(0,
(float)textTl.getBounds().getHeight());
shapes[2] = textTl.getOutline(textAt);
Po d e m o s e le g ir u n p rim it ivo a cce d ie n d o a l ín d ice a p ro p ia d o
d e n t ro d e l a rra y s h a p e s .

Shape shape =
shapes[Transform.primitive.getSelectedIndex()];
Có m o s e re a liza e l d ib u jo d e p e n d e n d e la s o p cio n e s e le g id a s .
● Cu a n d o e l u s u a rio e lig e s t ro k e , s e lla m a a
Gra p h ic s 2 D . d ra w p a ra re a liza r e l d ib u jo , S u s e e lig e
t e x t co m o p rim it ivo , la s lín e a s s o n re cu p e ra d a s y e l
d ib u jo s e h a ce co n e l m é t o d o d ra w .
● Cu a n d o e l u s u a rio e lig e fill, s e lla m a a Gra p h ic s 2 D . fill o
Gra p h ic s 2 D . d ra w S t rin g p a ra re a liza r e l d ib u ja d o .
● Cu a n d o e l u s u a rio e lig e s t ro k e a n d fill, s e lla m a a fill o
d ra w S t rin g p a ra re lle n a r e l S h a p e , y lu e g o s e lla m a a
b > d ra w p a ra d ib u ja r la lín e a e xt e rio r.

N o t a : Pa ra re lle n a r y p u n t e a r u n g rá fico p rim it ivo ,


n e ce s it a m o s h a ce r d o s lla m a d a s s e p a ra d a s a
m é t o d o s : fill o d ra w S t rin g p a ra re lle n a r e l in t e rio r,
y d ra w p a ra d ib u ja r e l e xt e rio r.

Lo s t re s e s t ilo s d e lín e a u s a d o s e n e s t e e je m p lo - - a n ch o ,
e s t re ch o y p u n t e a d o - - s o n e je m p la re s d e Ba s ic S t ro k e .

// Sets the Stroke.


...
case 0 : g2.setStroke(new BasicStroke(3.0f)); break;
case 1 : g2.setStroke(new BasicStroke(8.0f)); break;
case 2 : float dash[] = {10.0f};
g2.setStroke(new BasicStroke(3.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER,
10.0f, dash, 0.0f));
break;
El e s t ilo d e p u n t e a d o d e e s t e e je m p lo t ie n e 1 0 u n id a d e s d e
p u n t e a d o a lt e rn a d o s co n 1 0 u n id a d e s d e e s p a cio . El p rin cip io
d e l p a t ró n d e l p u n t e a d o s e a p lica a l p rin cip io d e la lín e a - - la
fa s e d e p u n t e a d o e s 0 . 0 .
En e s t e e je m p lo s e u s a n t re s e s t ilo s d e d ib u jo - - s ó lid o ,
g ra d ie n t e y p o lka . El d ib u jo d e co lo r s ó lid o e s u n e je m p la r d e
Co lo r, e l g ra d ie n t e u n e je m p la r d e Gra d ie n t P a in t , y e l p a t ró n
u n e je m p la r d e Te x t u re P a in t .

// Sets the Paint.


...
case 0 : g2.setPaint(Color.blue); break;
case 1 : g2.setPaint(new GradientPaint(0, 0,
Color.lightGray,
w-250, h, Color.blue, false));
break;
case 2 : BufferedImage bi = new BufferedImage(5, 5,
BufferedImage.TYPE_INT_RGB);
Graphics2D big = bi.createGraphics();
big.setColor(Color.blue);
big.fillRect(0, 0, 5, 5);
big.setColor(Color.lightGray);
big.fillOval(0, 0, 5, 5);
Rectangle r = new Rectangle(0,0,5,5);
g2.setPaint(new TexturePaint(bi, r));
break;

Oz it o
Transformar Formas, Texto e Imágenes
Po d e m o s m o d ifica r e l a t rib u t o t ra n s fo rm e n e l co n t e xt o Gra p h ic s 2 D p a ra m o ve r,
ro t a r, e s ca la r y m o d ifica r g rá fico s p rim it ivo s m ie n t ra s s o n d ib u ja d o s . El a t rib u t o
t ra n s fo rm e s t á d e fin id o p o r u n e je m p la r d e Affin e Tra n s fo rm .
Gra p h ic s 2 D p ro p o rcio n a va rio s m é t o d o s p a ra ca m b ia r e l a t rib u t o t ra n s fo rm .
Po d e m o s co n s t ru ir u n n u e vo Affin e Tra n s fo rm y ca m b ia r e l a t rib u t o t ra n s fo rm d e
Gra p h ic s 2 D lla m a n d o a l m é t o d o s e t Tra n s fo rm .
Affin e Tra n s fo rm d e fin e lo s s ig u ie n t e s m é t o d o s p a ra h a ce r m á s s e n cilla la
co n s t ru cció n d e n u e va s t ra n s fo rm a cio n e s :
● g e t Ro t a t e I n s t a n c e

● g e t S c a le I n s t a n c e

● g e t S h e a rI n s t a n c e

● g e t Tra n s la t e I n s t a n c e

De fo rm a a lt e rn a t iva p o d m e o s u s a r u n o d e lo s m é t o d o s d e t ra n s fo rm a ció n d e
Gra p h ic s 2 D p a ra m o d ifica r la t ra n s fo rm a ció n a ct u a l. Cu a n d o s e lla m a a u n o d e
e s o s m é t o d o s d e co n ve n ie n cia , la t ra n s fo rm a ció n re s u lt a t e s e co n ca t e n a co n la
t ra n s fo rm a ció n a ct u a l y e s a p lica d a d u ra n t e r e l d ib u ja d o :
● ro t a t e - - p a ra e s p e cifica r u n á n g u lo d e ro t a ció n e n ra d ia n e s .

● s c a le - - p a ra e s p e cifica r u n fa ct o r d e e s ca la e n d ire ccio n e s x e y .

● s h e a r- - p a ra e s p e cifica r u n fa ct o r d e co m p a rt ició n e n d ire ccio n e s x e y

● t ra n s la t e - - p a ra e s p e cifica r u n d e s p la za m ie n t o d e m o vim ie n t o e n d ire ccio n e s


x e y
Ta m b ié n p o d e m o s co n s t ru ir d ire ct a m e n t e u n Affin e Tra n s fo rm y co n ca t e n a rlo co n
la t ra n s fo rm a ció n a ct u a l lla m a n d o a l m é t o d o t ra n s fo rm .
El m é t o d o d ra w I m a g e t a m b ié n e s t á s o b re ca rg a d o p a ra p e rm it irn o s e s p e cifica r u n
Affin e Tra n s fo rm q u e e s a p lica d a a la im a g e n a d ib u ja r. Es p e cifica r u n t ra n s fo rm
cu a n d o s e lla m a a d ra w I m a g e n o a fe ct a a l a t rib u t o t ra n s fo rm d e Gra p h ic s 2 D .

Ejemplo: Transform
El s ig u ie n t e p ro g ra m a e s e l m is m o q u e S t ro k e a n d Fill, p e ro t a m b ié n
p e rm it e a l u s u a rio e le g ir u n a t ra n s fo rm a ció n p a ra a p lica rla a l o b je t o
s e le ccio n a cu a n d o s e d ib u je .
Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
Tra n s fo rm . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

Cu a n d o s e e lig e u n a o p ció n d e t ra n s fo rm a ció n , s e m o d ifica u n e je m p la r


d e Affin e Tra n s fo rm y e s co n ca t e n a d o co n u n a t ra n s fo rm a ció n d e
m o vim ie n t o q u e m u e ve la S h a p e h a cia e l ce n t ro d e la ve n t a n a . La
t ra n s fo rm a ció n re s u lt a n t e s e p a s a a l m é t o d o s e t Tra n s fo rm p a ra
s e le ccio n a r e l a t rib u t o t ra n s fo rm d e Gra p h ic s 2 D

switch (Transform.trans.getSelectedIndex()){
case 0 : at.setToIdentity();
at.translate(w/2, h/2); break;
case 1 : at.rotate(Math.toRadians(45)); break;
case 2 : at.scale(0.5, 0.5); break;
case 3 : at.shear(0.5, 0.0); break;
...
AffineTransform toCenterAt = new AffineTransform();
toCenterAt.concatenate(at);
toCenterAt.translate(-(r.width/2), -(r.height/2));
g2.setTransform(toCenterAt);

Oz it o
Recortar la Región de Dibujo
Cu a lq u ie r S h a p e p u e d e u s a rs e co m o u n p a t h d e re co rt a d o q u e re s t rin g e la s
p o rcio n e s d e l á re a d e d ib u jo q u e s e rá n re n d e riza d a s . El p a t h d e re co rt a d o fo rm a
p a rt e d e l co n t e xt o Gra p h ic s 2 D ; p a ra s e le ccio n a r e l a t rib u t o clip , s e lla m a a
Gra p h ic s 2 D . s e t Clip y s e p a s a a la S h a p e q u e d e fin e e l p a t h d e re co rt a d o q u e
q u e ra m o s u s a r. Po d e m o s re d u cir e l p a t h d e re co rt a d o lla m a n d o a l m é t o d o c lip y
p a s á n d o lo e n o t ra S h a p e ; e l a t rib u t o clip s e co n fig u ra a la in t e rs e cció n e n t re e l clip
a ct u a l y e l S h a p e e s p e cifica d o .

Ejemplo: ClipImage
Es t e e jm e m p lo a n im a u n p a t h d e re co rt a d o p a ra re ve la r d ife re n t e
p o rcio n e s d e u n a im a g e n .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
Clip I m a g e . ja v a co n t ie n e t o d o e l có d ig o d e e s t e a p p le t . El a p p le t
re q u ie re e l fich e ro d e im a g e n c lo u d s . jp g .

El p a t h d e re co rt a d o e s t á d e fin id o p o r la in t e rs e cció n d e u n a e lip s e y u n


re ct á n g u lo cu ya s d im e n s io n e s s o n a le a t o ria s . La e lip s e s e p a s a a l
m é t o d o s e t Clip , y lu e g o s e lla m a a l m é t o d o c lip p a ra s e le ccio n a r e l p a t h
d e re co rt a d o a la in t e rs e cció n e n t re la e lip s e y e l re ct á n g u lo .

private Ellipse2D ellipse = new Ellipse2D.Float();


private Rectangle2D rect = new Rectangle2D.Float();
...
ellipse.setFrame(x, y, ew, eh);
g2.setClip(ellipse);
rect.setRect(x+5, y+5, ew-10, eh-10);
g2.clip(rect);
Ejemplo: Starry
Un á re a d e re co rt a d o t a m b ié n p u e d e s e r cre a d a d e s d e u n a ca d e n a d e
t e xt o e xis t e n t e . El s ig u ie n t e e je m p lo cre a u n Te x t La y o u t co n la ca d e n a
Th e S t a rry Nig h t . Lu e g o , o b t ie n e u n a lín e a e xt e rio r d e l Te x t La y o u t . El
m é t o d o Te x t La y o u t . g e t Ou t lin e d e vu e lve u n o b je t o S h a p e y u n
Re c t a n g le cre a d o a p a rt ir d e lo s lím it e s d e l o b je t o S h a p e . Lo s lím it e s
co n t ie n e n t o d o s lo s p ixe ls q u e la yo u t p u e d e d ib u ja r. El co lo r e n e l
co n t e xt o g rá fico s e s e le ccio n a a a zu l y s e d ib u ja la fig u ra e xt e rio r d e la
fo rm a , co m o ilu s t ra n la s ig u ie n t e im a g e n y e l fra g m e n t o d e có d ig o .

FontRenderContext frc = g2.getFontRenderContext();


Font f = new Font("Helvetica", 1, w/10);
String s = new String("The Starry Night");
TextLayout tl = new TextLayout(s, f, frc);
AffineTransform transform = new AffineTransform();
Shape outline = textTl.getOutline(null);
Rectangle r = outline.getBounds();
transform = g2.getTransform();
transform.translate(w/2-(r.width/2), h/2+(r.height/2));
g2.transform(transform);
g2.setColor(Color.blue);
g2.draw(outline);
Lu e g o , s e s e le ccio n a u n á re a d e re co rt a d o e n e l co n t e xt o g rá fico u s a n d o
e l o b je t o S h a p e cre a d o a p a rt ir d e g e t Ou t lin e . La im a g e n s t a rry . g if,
q u e e s u n a p in t u ra fa m o s a d e Va n Go g h , Th e S t a rry Nig h t , s e d ib u ja
d e n t ro d e á re a d e re co rt a d o q u e e m p ie za e n la e s q u in a in fe rio r izq u ie rd a
d e l o b je t o Re c t a n g le .

g2.setClip(outline);
g2.drawImage(img, r.x, r.y, r.width, r.height, this);

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
S t a rry . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e p ro g ra m a . El a p p le t
re q u ie re e l fich e ro d e im a g e n S t a rry . g if.

Oz it o
Componer Gráficos
La cla s e Alp h a Co m p o s it e e n ca p s u la va rio s e s t ilo s d e co m p o s ició n , q u e
d e t e rm in a n có m o s e d ib u ja n lo s o b je t o s o la p a d o s . Un Alp h a Co m p o s it e t a m b ié n
p u e d e t e n e r u n va lo r a lp h a q u e e s p e cifica e l g ra d o d e t ra n s p a rie n cia : a lp h a = 1 . 0
e s t o t a lm e n t e o p a co , a lp h a = 0 . 0 e s t o t a lm e n t e t ra n s p a re n t e . Alp h a Co m p o s it e
s o p o rt a la m a yo ria d e lo s e s t a n d a re s d e co m p o s ició n co m o s e m u e s t ra e n la
s ig u ie n t e t a b la .
S o u rce - o ve r ( S RC_ OVER) S i lo s p ixe ls d e l o b je t o q u e e s t á s ie n d o
re n d e riza d o ( la fu e n t e ) t ie n e n la m is m a p o s ició n
q u e lo s p ixe ls re n d e riza d o a p ré via m e n t e ( e l
d e s t in o ) , lo s p ixe ls d e la fu e n t e s e re n d e riza n
s o b re lo s p ixe ls d e l d e s t in o .
S o u rce - in ( S RC_ I N )
S i lo s p ixe ls d e la fu e n t e y e l d e s t in o s e s o la p a n ,
s ó lo s e re n d e riza rá n lo s p ixe ls q u e h a ya e n e l á re a
s o la p a d a .

S o u rce - o u t ( S RC_ OUT)


S i lo s p ixe ls d e la fu e n t e y e l d e s t in o s e s o la p a n ,
s ó lo s e re n d e riza rá n lo s p ixe ls q u e h a ya fu e ra d e l
á re a s o la p a d a . Lo s p ixe ls q u e h a ya e n e l á re a
s o la p a d a s e b o rra rá n .

De s t in a t io n - o ve r ( D S T_ OVER)
S i lo s p ixe ls d e la fu e n t e y d e l d e s t in o s e s o la p a n ,
s ó lo re n d e riza rá n lo s p ixe ls d e la fu e n t e q u e h a ya
fu e ra d e l á re a s o la p a d a . Lo s p ixe ls q u e h a ya e n e l
á re a s o la p a d a n o s e ca m b ia n .

De s t in a t io n - in ( D S T_ I N ) S i lo s p ixe ls d e la fu e n t e y d e l d e s t in o s e s o la p a n ,
e l a lp h a d e la fu e n t e s e a p lica a lo s p ixe ls d e l á re a
s o la p a d a d e l d e s t in o . S i e l a lp h a = 1 . 0 , lo s p ixe ls
d e l á re a s o la p a d a n o ca m b ia n ; s i a lp h a e s 0 . 0 lo s
p ixe ls d e l á re a s o la p a d a s e b o rra rá n .
De s t in a t io n - o u t ( D S T_ OUT) S i lo s p ixe ls d e la fu e n t e y d e l d e s t in o s e s o la p a n ,
e l a lp h a d e la fu e n t e s e a p lica a lo s p ixe ls d e l á re a
s o la p a d a d e l d e s t in o . S i e l a lp h a = 1 . 0 , lo s p ixe ls
d e l á re a s o la p a d a n o ca m b ia n ; s i a lp h a e s 0 . 0 lo s
p ixe ls d e l á re a s o la p a d a s e b o rra rá n .
Cle a r ( CLEAR)

S i lo s p ixe ls d e la fu e n t e y d e l d e s t in o s e s o la p a n ,
lo s p ixe ls d e l á re a s o la p a d a s e b o rra rá n .

To ch a n g e t h e co m p o s it in g s t yle u s e d b y Gra p h ic s 2 D , yo u cre a t e a n


Alp h a Co m p o s it e o b je ct a n d p a s s it in t o t h e s e t Co m p o s it e m e t h o d .

Ejemplo: Composite
Es t e p ro g ra m a ilu s t ra lo s e fe ct o s d e va rio s co m b in a cio n e s d e e s t ilo s d e
co m p o s ició n y va lo re s d e a lp h a .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
Co m p o s it e . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

S e h a co n s t ru id o u n n u e vo o b je t o Alp h a Co m p o s it e a c lla m a n d o a
Alp h a Co m p o s it e . g e t I n s t a n c e y e s p e cifica n la s re g la s d e co m p o s ició n
deseadas.

AlphaComposite ac =
AlphaComposite.getInstance(AlphaComposite.SRC);
Cu a n d o s e s e le ccio n a u n a re g la d e co m p o s ició n o u n va lo r a lp h a , s e
lla m a d e n u e vo a Alp h a Co m p o s it e . g e t I n s t a n c e , y e l n u e vo
Alp h a Co m p o s it e s e a s ig n a a a c. El a lp h a s e le ccio n a s e a p lica a l va lo r
a lp h a d e ca d a p ixe l y s e le p a s a u n s e g u n d o p a rá m e t ro a
Alp h a Co m p o s it e . g e t I n s t a n c e .

ac = AlphaComposite.getInstance(getRule(rule), alpha);
El a t rib u t o co m p o s it e s e m o d ifica p a s a n d o e l o b je t o Alp h a Co m p o s it e a
Gra p h ic s 2 D s e t Co m p o s it e . Lo s o b je t o s s o n re n d e riza d o s d e n t ro d e u n
Bu ffe re d I m a g e y m á s t a rd e s o n co p ia d o s e n la p a n t a lla , p o r e s o e l
a t rib u t o co m p o s it e e s co n fig u ra d o a l co n t e xt o Gra p h ic s 2 D p a ra e l
Bu ffe re d I m a g e :

BufferedImage buffImg = new BufferedImage(w, h,


BufferedImage.TYPE_INT_ARGB);
Graphics2D gbi = buffImg.createGraphics();
...
gbi.setComposite(ac);

Oz it o
Controlar la Calidad de Dibujo
Po d e m o s u s a r e l a t rib u t o 're n d e rin g h in t ' d e Gra p h ic s 2 D p a ra e s p e cifica r s i
q u e re m o s q u e lo s o b je t o s s e a n d ib u ja d o s t a n rá p id o co m o s e a p o s ib le o s i
p re fe rim o s q u e s e d ib u je n co n la m a yo r ca lid a d p o s ib le .
Pa ra s e le ccio n a r o co n fig u ra r e l a t rib u t o 're n d e rin g h in t ' e n e l co n t e xt o ,
Gra p h ic s 2 D p o d e m o s co n s t ru ir u n o b je t o Re n d e rin g Hin t s y p a s a rlo d e n t ro d e
Gra p h ic s 2 D s e t Re n d e rin g Hin t s . S i s ó lo q u e re m o s s e le ccio n a r u n h in t , p o d e m o s
lla m a r a Gra p h ic s 2 D s e t Re n d e rin g Hin t y e s p e cifica r la p a re ja cla ve - va lo r p a ra e l
h in t q u e q u e re m o s s e le ccio n a r. ( Es t a s p a re ja s e s t á n d e fin id a s e n la cla s e
Re n d e rin g Hin t s . )

N o t a : No t o d a s la s p la t a fo rm a s s o p o rt a n la m o d ifica ció n d e l m o d o d e
d ib u jo , p o r e s o e l e s p e cifica r lo s h in t s d e d ib u jo n o g a ra n t iza q u e s e a n
u t iliza d o s .

Re n d e rin g Hin t s s o p o rt a lo s s ig u ie n t e s t ip o s d e h in t s :
● Alp h a in t e rp o la t io n - - p o r d e fe ct o , ca lid a d , o ve lo cid a d .

● An t ia lia s in g - - p o r d e fe ct o , o n , u o ff

● Co lo r re n d e rin g - p o r d e fe ct o , ca lid a d , o ve lo cid a d

● Dit h e rin g - - p o r d e fe ct o , a ct iva d o o d e s a ct iva d o

● Fra ct io n a l m e t rics - - p o r d e fe ct o , o n u o ff

● In t e rp o la t io n - - ve cin o m á s ce rca n o , b ilin e a r, o b icú b ico

● Re n d e rin g - - p o r d e fe ct o , ca lid a d , o ve lo cid a d

● Te xt a n t ia lia s in g - - p o r d e fe ct o , o n u o ff.

Cu a n d o s e s e le ccio n a u n h in t p o r d e fe ct o , s e u s a e l s is t e m a d e d ib u jo p o r d e fe ct o
d e la p la t a fo rm a .

Oz it o
Construir Formas Complejas desde Geométricos
Primitivos
Co n s t ru ir u n á re a g e o m é t rica ( CAG) e s e l p ro ce s o d e cre a r u n a n u e va fo rm a
g e o m é t rica re a liza n d o o p e ra cio n e s co n la s ya e xis t e n t e s . En e l API Ja va 2 D u n t ip o
e s p e cia l d e S h a p e lla m a d o Are a s o p o rt a o p e ra cio n e s b o o le a n a s . Po d e m o s
co n s t ru ir u n Are a d e s d e cu a lq u ie r S h a p e .
Are a s s o p o rt a la s ig u ie n t e s o p e ra cio n e s b o o le a n a s :

Un ió n S u b t ra cció n

In t e rs e cció n Or- Exclu s ivo ( XOR)

Ejemplo: Areas
En e s t e e je m p lo , lo s o b je t o s Are a co n s t ru ye n u n a fo rm a d e p e ra
p a rt ie n d o d e va ria s e lip s e s .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
P e a r. ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

La s h o ja s s o n cre a d a s re a liza n d o u n a in t e re s e cció n e n t re d o s círu lo s


s o la p a d o s .

leaf = new Ellipse2D.Double();


...
leaf1 = new Area(leaf);
leaf2 = new Area(leaf);
...
leaf.setFrame(ew-16, eh-29, 15.0, 15.0);
leaf1 = new Area(leaf);
leaf.setFrame(ew-14, eh-47, 30.0, 30.0);
leaf2 = new Area(leaf);
leaf1.intersect(leaf2);
g2.fill(leaf1);
...
leaf.setFrame(ew+1, eh-29, 15.0, 15.0);
leaf1 = new Area(leaf);
leaf2.intersect(leaf1);
g2.fill(leaf2);
Lo s círcu lo s s o la p a d o s t a m b ié n s e u s a n p a ra co s n t ru ir e l ra b o m e d ia n t e
u n a o p e ra ció n d e s u b t ra cció n .

stem = new Ellipse2D.Double();


...
stem.setFrame(ew, eh-42, 40.0, 40.0);
st1 = new Area(stem);
stem.setFrame(ew+3, eh-47, 50.0, 50.0);
st2 = new Area(stem);
st1.subtract(st2);
g2.fill(st1);
El cu e rp o d e la p e ra e s t á co n s t ru id o m e d ia n t e u n a o p e ra ció n u n ió n d e u n
círcu lo y u n ó va lo .

circle = new Ellipse2D.Double();


oval = new Ellipse2D.Double();
circ = new Area(circle);
ov = new Area(oval);
...
circle.setFrame(ew-25, eh, 50.0, 50.0);
oval.setFrame(ew-19, eh-20, 40.0, 70.0);
circ = new Area(circle);
ov = new Area(oval);
circ.add(ov);
g2.fill(circ);
Oz it o
Soportar Interacción con el Usuario
Pa ra p e rm it ir q u e e l u s u a rio in t e ra ct ú e co n lo s g ra fico s q u e h e m o s d ib u ja d o ,
n e ce s it a m o s p o d e r d e t e rm in a r cu a n d o e l u s u a rio p u ls a s o b re u n o d e llo . El m é t o d o
Gra p h ic s 2 D h it p ro p o rcio n a u n a fo rm a p a ra d e t e rm in a r fá cilm e n t e s i h a o cu rrid o u n a
p u ls a ció n d e ra t ó n s o b re u n a S h a p e p a rt icu la r. De fo rm a a lt e rn a t iva p o d e m o s o b t e n e r
la p o s ició n d e l click d e ra t ó n y lla m a r a c o n t a in s s o b re la S h a p e p a ra d e t e rm in a r s i e l
click o cu rió d e n t ro d e lo s lím it e s d e la S h a p e .
S i e s t a m o u s a n d o t e xt o p rim it vo , p o d e m o s re a liza r u n a s im p le co m p ro b a ció n
o b t e n ie n d o la lín e a e xt e rio r d e la S h a p e q u e co rre s p o n d e a l t e xt o y lu e g o lla m a n d o a
h it o c o n t a in s co n e s a S h a p e . El s o p o rt e d e e d ició n d e t e xt o re q u ie re u n a
co m p ro b a ció n m u ch o m á s s o fis t ica d a . S i q u e re m o s p e rm it ir q u e e l u s u a rio e d it e e l
t e xt o , g e n e ra lm e n t e d e b e ría m o s u s a r u n o d e lo s co m p o n e n t e s d e t e xt o e d it a b le d e
S win g . S i e s t a m o s t ra b a ja n d o co n t e xt o p rim it ivo y e s t a m o s u s a n d o Te x t La y o u t p a ra
m a n e ja r la fo rm a y p o s ició n d e lt e xt o , t a m b ié n p o d e m o s u s a r Te x t La y o u t p a ra re a liza r
la co m p ro b a ció n p a ra la e d ició n d e t e xt o . Pa ra m á s in fo rm a ció n p u e d e s ve r Ja v a 2 D
P ro g ra m m e r's Gu id e .

Ejemplo: ShapeMover
Es t e a p p le t p e rm it e a l u s u a rio a rra s t ra r la S h a p e p o r la ve n t a n a d e l a p p le t .
La S h a p e e s re d ib u ja d a e n ca d a n u e va p o s ició n d e l ra t ó n p a ra p ro p o rcio n a
in fo rm a ció n a l u s u a rio m ie n t ra s la a rra s t ra .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a s o b re
e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
S h a p e Mo v e r. ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

S e lla m a a l m é t o d o c o n t a in s p a rfa d e t e rm in a r s i e l cu rs o r e s t á d e n t ro d e lo s
lím it e s d e l re ct á n g u lo cu a n d o s e p u ls a e l b o t ó n . S i e s a s í, s e a ct u a liza la
p o s ició n d e l re ct á n g u lo .
public void mousePressed(MouseEvent e){
last_x = rect.x - e.getX();
last_y = rect.y - e.getY();
if(rect.contains(e.getX(), e.getY())) updateLocation(e);
...

public void updateLocation(MouseEvent e){


rect.setLocation(last_x + e.getX(), last_y + e.getY());
...
repaint();
Po d ría s h a b e r s o b s e rva d o q u e re d ib u ja r la S h a p e e n ca d a p o s ició n d e l ra t ó n
e s m u y le n t o , p o rq u e re ct á n g u lo re lle n o e s re n d e riza d o ca d a ve z q u e s e
m u e ve , Us a n d o e l d o b le b u ffe r p o d e m o s e lim in a r e s t e p ro b le m a . S i e s t a m o s
u s a n d o S win g , e l d ib u jo u s a rá d o b le b u ffe r a u t o m á t ica m e n t e ; s i n o e s a s í
t e n d re m o s q u e ca m b ia r t o d o e l có d ig o d e re n d e riza d o . El có d ig o p a ra u n a
ve rs ió n s win g d e e s t e p ro g ra m a e s S w in g S h a p e Mo v e r. ja v a . Pa ra e je cu t a r
la ve rs ió n S win g , vis it a S win g S h a p e Mo ve r.
S i n o e s t a m o u s a n d o S win g , e l Eje m p lo : Bu ffe re d S h a p e Mo ve r e n la s ig u ie n t e
le cció n n o s m u e s t ra có m o p o d e m o s im p le m e n t a r e l d o b le b u ffe r u s a n d o u n
Bu ffe re d I m a g e . Po d e m o s d ib u ja r e n u n Bu ffe re d I m a g e y lu e g o co p ia r la
im a g e n e n la p a n t a lla .

Ejemplo: HitTestSample
Es t a a p lica ció n ilu s t ra la co m p ro b a ció n d e p u ls a cio n e s d ib u ja n d o e l cu rs o r p o r
d e fe ct o s ie m p re q u e e l u s u a rio p u ls e s o b re e l Te x t La y o u t , co m o s e m u e s t ra
e n la s ig u ie n t e fig u ra .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a s o b re
e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
Hit Te s t S a m p le . ja v a co n t ie n e e l có d ig o co m p le t o d e e s t e a p p le t .

El m é t o d o m o u s e Clic k e d u s a Te x t La y o u t . h it Te s t Ch a r p a ra d e vo lve r u n
o b je t o ja v a . a w t . fo n t . Te x t Hit I n fo q u e co n t ie n e la p o s ició n d e l click ( e l
ín d ice d e in s e rció n ) e n e l o b je t o Te x t La y o u t .
La in fo rm a cin d e vu e lt a p o r lo s m é t o d o s d e Te x t La y o u t , g e t As c e n t ,
g e t D e s c e n t y g e t Ad v a n c e s e u t iliza p a ra a ca lcu la r la p o s ició n d e l o rig e n d e l
o b je t o Te x t La y o u t p a ra q u e e s t é ce n t ra d o t a n t o h o rizo n t a l co m o
ve rt ica lm e n t e .

...

private Point2D computeLayoutOrigin() {


Dimension size = getPreferredSize();
Point2D.Float origin = new Point2D.Float();

origin.x = (float) (size.width - textLayout.getAdvance()) / 2;


origin.y =
(float) (size.height - textLayout.getDescent()
+ textLayout.getAscent())/2;
return origin;
}

...

public void paintComponent(Graphics g) {


super.paintComponent(g);
setBackground(Color.white);
Graphics2D graphics2D = (Graphics2D) g;
Point2D origin = computeLayoutOrigin();
graphics2D.translate(origin.getX(), origin.getY());

// Draw textLayout.
textLayout.draw(graphics2D, 0, 0);

// Retrieve caret Shapes for insertionIndex.


Shape[] carets = textLayout.getCaretShapes(insertionIndex);

// Draw the carets. carets[0] is the strong caret and


// carets[1] is the weak caret.
graphics2D.setColor(STRONG_CARET_COLOR);
graphics2D.draw(carets[0]);
if (carets[1] != null) {
graphics2D.setColor(WEAK_CARET_COLOR);
graphics2D.draw(carets[1]);
}
}

...

private class HitTestMouseListener extends MouseAdapter {

/**
* Compute the character position of the mouse click.
*/
public void mouseClicked(MouseEvent e) {

Point2D origin = computeLayoutOrigin();

// Compute the mouse click location relative to


// textLayout's origin.
float clickX = (float) (e.getX() - origin.getX());
float clickY = (float) (e.getY() - origin.getY());

// Get the character position of the mouse click.


TextHitInfo currentHit = textLayout.hitTestChar(clickX, clickY);
insertionIndex = currentHit.getInsertionIndex();

// Repaint the Component so the new caret(s) will be displayed.


hitPane.repaint();
}

Oz it o
Trabajar con Texto y Fuentes
Es t a le cció n m u e s t ra co m o d e t e rm in a r la s fu e n t e s d is p o n ib le s e n n u e s t ro s is t e m a ,
cre a r fu e n t e s co n a t rib u t o s p a rt icu la re s , d e riva r n u e va s fu e n t e s m o d ifica n d o
a t rib u t o s d e a lg u n a fu e n t e e xis t e n t e , y p o s icio n a r m ú lt ip le s lín e a s d e t e xt o d e n t ro
d e u n co m p o n e n t e .
Es t o s t ó p ico s s e e xp lica n e n la s s ig u ie n t e s s e ccio n e s :

Crear y Derivar Fuentes


Es t a s e cció n ilu s t ra có m o u s a r e l Gra p h ic s En v iro n m e n t p a ra
d e t e rm in a r la s fu e n t e s d is p o n ib le s e n n u e s t ro s is t e m a , có m o cre a r u n
o b je t o Fo n t y co m o ca m b ia r lo s a t rib u t o s d e la fu e n t e d e u n a ca d e n a d e
t e xt o .

Dibujar Múltiples Líneas de Texto


Es t a s e cció n n o s m u e s t ra có m o p o s icio n a r u d ib u ja rt u n p á rra fo d e t e xt o
co n e s t ilo u s a n d o Te x t La y o u t y Lin e Bre a k Me a s u re r.

Oz it o
Crear y Derivar Fuentes
Po d e m o s m o s t ra r u n a ca d e n a d e t e xt o co n cu a lq u ie r fu e n e d is p o n ib le e n n u e s t ro
s is t e m a , e n cu a lq u ie r e s t ilo y t a m a ñ o q u e e lija m o s . Pa ra d e t e rm in a r la s fu e n t e s
d is p o n ib le s e n n u e s t ro s is t e m a , p o d e m o s lla m a r a l m é t o d o
Gra p h ic s En v iro n m e n t . g e t Av a ila b le Fo n t Fa m ily N a m e s . Es t e m é t o d o d e vu e lve
u n a rra y d e s t rin g s q u e co n t ie n e lo s n o m b re s d e fa m ilia d e la s fu e n t e s d is p o n ib le s .
Ca u lq u ie ra d e la s ca d e n a s , ju n t o co n u n a rg u m e n t o t a m a ñ o y o t ro d e e s t ilo ,
p u e d e n s e r u s a d o s p a ra cre a r u n n u e vo o b je t o Fo n t . De s p u é s d e cre a r u n o b je t o
Fo n t , p o d e m o s ca m b ia r s u n o m b re d e fa m ilia , s u t a m a ñ o o s u e s t ilo p a ra cre a r
u n a fu e n t e p e rs o n a liza d a .

Ejemplo: FontSelection
El s ig u ie n t e a p p le t n o s p e rm it e ca m b ia r la fu e n t e , e l t a m a ñ o y e l e s t ilo
d e l t e xt o d ib u ja d o .

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
El có d ig o co m p le t o d e l a p p le t e s t á e n Fo n t S e le c t io n . ja v a .

El m é t o d o g e t Av a ila b le Fo n t Fa m ily N a m e s d e Gra p h ic s En v iro n m e n t


d e vu e lve lo s n o m b re s d e fa m ilia d e t o d a s la s fu e n t e s d is p o n ib le s e n
n u e s t ro s is t e m a :

GraphicsEnvironment gEnv =
GraphicsEnvironment.getLocalGraphicsEnvironment();
String envfonts[] = gEnv.getAvailableFontFamilyNames();
Vector vector = new Vector();
for ( int i = 1; i < envfonts.length; i++ ) {
vector.addElement(envfonts[i]);
}
El o b je t o Fo n t in icia l s e cre a co n e s t ilo Fo n t . P LAI N y t a m a ñ o 1 0 . Lo s
o t ro s e s t ilo s d is p o n ib le s s o n ITALIC, BOLD y BOLD+ ITALIC.

Font thisFont;
...

thisFont = new Font("Arial", Font.PLAIN, 10);


Un n u e vo Fo n t s e cre a a p a rt ir d e u n n o m b re d e fu e n t e m u n e s t ilo y u n
ta m a ño.

public void changeFont(String f, int st, String si){


Integer newSize = new Integer(si);
int size = newSize.intValue();
thisFont = new Font(f, st, size);
repaint();
}
Pa ra u s a r la m is m a fa m ilia d e fu e n t e s , p e ro ca m b ia n d o u n o o lo s d o s
a t rib u t o s d e e s t ilo y t a m a ñ o , p o d e m o s lla m a r a u n o d e lo s m é t o d o s
d e riv e Fo n t .
Pa ra co n t ro la r la fu e n t e u t iliza d a p a ra re n d e riza r t e xt o , p o d e m o s
s e le ccio n a r e l a t rib u t o fo n t e n e l co n t e xt o Gra p h ic s 2 D a n t e s d e
d ib u ja rlo . Es t e a t rib u t o s e s e le ccio n a p a s a n d o u n o b je t o Fo n t a l m é t o d o
s e t Fo n t . En e s t e e je m p lo , e l a t rib u t o fo n t s e co n fig u ra p a ra u s a r u n
o b je t o fo n t re cie n t e m e n t e co n s t ru id o y lu e g o s e d ib u ja la ca d e n a d e
t e xt o e n e l ce n t ro d e l co m p o n e n t e u s a n d o la fu e n t e e s p e cifica d a .
En e l m é t o d o p a in t , e l a t rib u t o fo n t d e l co n t e ct o Gra p h ic s 2 D s e
co n fig u ra co m o e l n u e vo Fo n t . La ca d e n a s e d ib u ja e n e l ce n t ro d e l
co m p o n e n t e co n la n u e va fu e n t e .

g2.setFont(thisFont);
String change = "Pick a font, size, and style to change me";
FontMetrics metrics = g2.getFontMetrics();
int width = metrics.stringWidth( change );
int height = metrics.getHeight();
g2.drawString( change, w/2-width/2, h/2-height/2 );

N o t a : d e b id o a l b u g # 4 1 5 5 8 5 2 , Fo n t S e le ct io n p o d ría n o
fu n cio n a r d e fo rm a a p ro p ia d a co n t o d o s lo s n o m b re s d e
fu e n t e s d e vu e lt o s p o r la lla m a d a a g e t Fo n t Fa m ilyNa m e s . La
fo rm a p o d ría n o co rre s p o n d e r co n ca m b io s e n e l t a m a ñ o o e l
e s t ilo y e l t e xt o p o d ría n o m o s t ra rs e cu a n d o s e s e le cio n a n
a lg u n o s n o m b re s d e fu e n t e s . En g e n e ra l, Co u rie r y He lve t ica
fu n cio n a n b ie n . Mie n t ra s t a n t o , co m p ru e b a lo p e rió d ica m e n t e
p a ra ve r s i s e h a n re s u e lt o e s t o s p ro b le m a s .

Oz it o
Dibujar Múltiples Líneas de Texto
S i t e n e m o s u n p á rra fo d e t e xt o co n e s t ilo q u e q u e re m o s q u e q u e p a d e n t ro d e u n a
a n ch u ra e s p e cifica , p o d e m o s u s a r Lin e Bre a k Me a s u re r, q u e p e rm it e q u e e l t e xt o co n
e s t ilo s e ro m p a e n lín e a s q u e ca b e n d e n t ro d e u n e s p a cio vis u a l. Co m o h e m o s a p re n d id o
e n Mo s t ra r Grá fico s co n Gra p h ics 2 D, u n o b je t o Te x t La y o u t re p re s e n t a d a t o s d e
ca ra ct e re s co n e e s t ilo , q u e n o s e p u e d e n ca m b ia r, p e ro t a m b ié n p e rm it e a cce d e r a la
in fo rm a ció n d e d is t rib u ció n . Lo s m é t o d o s g e t As c e n t y g e t D e s c e n t d e Te x t La y o u t
d e vu e lve n in fo rm a ció n s o b re la fu e n t e u s a d a p a ra p o s icio n a r la s lín e a s e n e l
co m p o n e n t e . El t e xt o s e a lm a ce n a co m o u n At t rib u t e d Ch a ra c t e rI t e ra t o r p a ra q u e lo s
a t rib u t o s d e fu e n t e y t a m a ñ o d e p u n t o p u e d a n s e r a lm a ce n a d o s co n e l t e xt o

Ejemplo: LineBreakSample
El s ig u ie n t e a p p le t p o s icio n a u n p á rra fo d e t e xt o co n e s t u lo d e n t ro d e u n
co m p o n e n t e , u s a n d o Lin e Bre a k Me a s u re r, Te x t La y o u t y
At t rib u t e d Ch a ra c t e rI t e ra t o r.

Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a s o b re
e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
El có d ig o co m p le t o d e l a p p le t e s t á e n Lin e Bre a k S a m p le . ja v a .

El s ig u ie n t e có d ig o cre a u n b u cle co n la ca d e n a v a n Go g h . El in icio y fin a l d e l


b u cle s e re cu p e ra y s e cre a u n a n u e va lín e a .

AttributedCharacterIterator paragraph = vanGogh.getIterator();


paragraphStart = paragraph.getBeginIndex();
paragraphEnd = paragraph.getEndIndex();

lineMeasurer = new LineBreakMeasurer(paragraph,


new FontRenderContext(null, false, false));
El t a m a ñ o d e la ve n t a n a s e u t iliza p a ra d e t e rm in a r d ó n d e s e d e b e ría ro m p e r la
lín e a y s e cre a u n o b je t o Te x t La y o u t p o r ca d a lín e a d e l p á rra fo .
Dimension size = getSize();
float formatWidth = (float) size.width;
float drawPosY = 0;
lineMeasurer.setPosition(paragraphStart);

while (lineMeasurer.getPosition() < paragraphEnd) {


TextLayout layout = lineMeasurer.nextLayout(formatWidth);

// Move y-coordinate by the ascent of the layout.


drawPosY += layout.getAscent();

/* Compute pen x position. If the paragraph is


rogth-to-left, we want to align the TextLayouts
to the right edge of the panel.
*/
float drawPosX;
if (layout.isRIGHTToLEFT()) {
drawPosX = 0;
}
else {
drawPosX = formatWidth - layout.getAdvance();
}

// Draw the TextLayout at (drawPosX, drawPosY).


layout.draw(graphics2D, drawPosX, drawPosY);

// Move y-coordinate in preparation for next layout.


drawPosY += layout.getDescent() + layout.getLeading();
}

Oz it o
Manipular y Mostrar Imégenes
Es t a le cció n m u e s t ra có m o re a liza r o p e ra cio n e s d e filt ra d o co n Bu ffe re d I m a g e s y
có m o u s a r u n Bu ffe re d Im a g e co m o u n b u ffe r fu e ra d e p a n t a lla .

Modo Inmediato con BufferedImage


Es t a s e cció n d e s crib e e l m o d e lo d e m o d o in m e d ia t o im p le m e n t a d o e n e l
API Ja va 2 D y e xp lica co m o Bu ffe re d I m a g e p e rm it e la m a n ip u la ció n d e
d a t o s d e im á g e n e s .

Filtrado y BufferedImage
Es t a s e cció n m u e s t ra có m o s a r la s cla s e s Bu ffe re d I m a g e Op p a ra
re a liza r o p e ra cio n e s d e filt ra d o s o b re Bu ffe re d I m a g e .

Usar un BufferedImage para doble buffer


Es t a s e cció n n o s e n s e ñ a có m o u s a r u n Bu ffe re d I m a g e co m o u n b u ffe r
fu e ra d e p a n t a lla p a ra a u m e n t a r e l re n d im ie n t o d e la s im á g e n e s .

Oz it o
Modo Inmediato con BufferedImage
El m o d e lo d e im á g e n e s m o d o in m e d ia t o p e rm it e m a n ip u la r y m o s t ra r im á g e n e s d e
p ixe ls m a p e a d o s cu yo s d a t o s e s t á n a lm a ce n a d o s e n m e m o ria . Po d e m o s a cce d e r a
lo s d a t o s d e la im a g e n e n u n a g ra n va rie d a d d e fo rm a t o s y u s a r va rio s t ip o s d e
o p e ra cio n e s d e filt ra d o p a ra m a n ip u la r lo s d a t o s .
Bu ffe re d I m a g e e s la cla s e cla ve d e l API d e l m o d o - in m e d ia t o . Es t a cla s e m a n e ja
u n a im a g e n e n m e m o ria y p ro p o rcio n a m é t o d o s p a ra a lm a ce n a r, in t e rp re t a r y
d ib u ja r ca d a d a t o d e p ixe l. Un Bu ffe re d I m a g e p u e d e s e r re n d e riza d o e n u n
co n t e xt o Gra p h ic s o o n u n co n t e xt o Gra p h ic s 2 D .
Un Bu ffe re d I m a g e e s e s e n cia lm e n t e u n I m a g e u n b u ffe r d e d a t o s a cce s ib le . Un
Bu ffe re d I m a g e t ie n e u n Co lo rMo d e l y u n Ra s t e r d e lo s d a t o s d e la im a g e n .

El Co lo rMo d e l p ro p o rcio n a u n a in t e rp re t a ció n d e co lo r d e lo s d a t o s d e lo s p ixe ls


d e la im a g e n . El Ra s t e r re p re s e n t a la s co o rd e n a d a s re ct a n g u la re s d e la im a g e n ,
m a n t ie n e lo s d a t o s d e la im a g e n e n m e m o ria , y p ro p o rcio n a u n m e ca n is m o p a ra
cre a r m ú lt ip le s s u b im a g e n e s d e u n s ó lo b u ffe r d e im a g e n . El Ra s t e r t a m b ié n
p ro p o rcio n a m é t o d o s p a ra a cce d e r a p ixe ls e s p e cífico s d e n t ro d e la im a g e n . Pa ra
m á s in fo rm a ció n s o b re co m o m a n ip u la r d ire ct a m e n t e lo s d a t o s d e lo s p ixe ls y
e s crib ir filt ro s p a ra o b je t o s Bu ffe re d I m a g e , p u e d e s ve r e l ca p ít u lo Im a g in g d e
Ja v a 2 D P ro g ra m m e r's Gu id e .

Oz it o
Filtrar un BufferedImage
El API Ja va 2 D d e fin e va ria s o p e ra cio n e s d e filt ra d o p a ra o b je t o Bu ffe re d I m a g e .
Ca d a o p e ra ció n d e p ro ce s o d e im á g e n e s e s t á in clu id a e n u n a cla s e q u e im p le m e n t a
e l in t e rfa ce Bu ffe re d I m a g e Op . La m a m ip u la ció n d e im á g e n e s s e re a liza e n e l
m é t o d o filt e r. La cla s e Bu ffe re d I m a g e Op e n e l API Ja va 2 D s o p o rt a n a
● Tra n fo rm a ció n a fin .

● Es ca la d o .

● Mo d ifica ció n d e As p e ct o .

● Co m b in a ció n Lin e a r d e Ba n d a s .

● Co n ve rs ió n d e co lo r.

● Co n vo lu ció n .

Pa ra filt ra r u n Bu ffe re d I m a g e u s a n d o u n a d e la s cla s e s d e o p e a ra ció n d e im a g e n ,


de be m os
1 . Co n s t u ir u n e je m p la r d e u n a d e la s cla s e s Bu ffe re d I m a g e Op :
Affin e Tra n s fo rm Op , Ba n d Co m b in e Op , Co lo rCo n v e rt Op , Co n v o lv e Op ,
Lo o k u p Op , o Re s c a le Op .
2 . Lla m a r a l m é t o d o d e o p e ra ció n filt e r, p a s a n d o e n e l Bu ffe re d I m a g e q u e
q u e re m o s filt ra r y e l Bu ffe re d I m a g e d o n d e q u e re m o s a lm a ce n a r e l
re s u lt a d o .

Ejemplo: ImageOps
El s ig u ie n t e a p p le r ilu s t ra e l u s o d e cu a t ro o p e ra cio n e s d e filt ra d o d e
im a g e n e s : lo w- p a s s , s h a rp e n , lo o ku p , y re s ca le .
Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
El có d ig o co m p le t o d e l a p p le t e s t á e n I m a g e Op s . ja v a . El a p p le r u s a
e s t o s d o s fich e ro s d e im a g e n : b ld . jp g y b o a t . g if.

El filt ro s h a rp e n s e re a liza u s a n d o u n Co n v o lv e Op . Co n vo lu ció n e s e l


p ro ce s o d e h a ce r m á s p e s a d o e l va lo r d e ca d a p ixe l e n u n a im a g e n co n
lo s va lo re s d e lo s p ixe ls ve cin o s . La m a yo ría d e lo s a lg o rit m o s d e filt ra d o
e s p a cia e s t a n b a s a d o s e n la s o p e ra cio n e s d e co n vo lu ció n .
Pa ra co n s t ru ir y a p lica r e s t e t ip o d e filt ra d o a l Bu ffe re d I m a g e , e s t e
e je m p lo u s a u n có d ig o s im ila r a l d e l s ig u ie n t e fra g m e n t o .

public static final float[] SHARPEN3x3 = {


0.f, -1.f, 0.f,
-1.f, 5.0f, -1.f,
0.f, -1.f, 0.f};
BufferedImage dstbimg = new
BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB);
Kernel kernel = new Kernel(3,3,SHARPEN3x3);
ConvolveOp cop = new ConvolveOp(kernel,
ConvolveOp.EDGE_NO_OP,
null);
cop.filter(srcbimg,dstbimg);
El o b je t o Ke rn e l d e fin e m a t e m á t ica m e n t e có m o s e ve a fe ct a d a la s a lid a
d e ca d a p ixe ls e n s u á re a in m e d ia t a . La d e fin ició n d e l Ke rn e l d e t e rm in e
e l re s u lt a d o d e l filt ro . Pa ra m á s in fo rm a ció n s o b re có m o t ra b a ja e l ke rn e l
co n Co n v o lv e Op p u e d e s ve r la s e cció n 'Im a g e Pro ce s s in g a n d
En h a n ce m e n t ' e n Ja v a 2 D P ro g ra m m e r's Gu id e

Oz it o
Usar un BufferedImage para Doble Buffer
Cu a n d o u n g rá fico e s co m p le jo o s e u s a re p e t id a m e n t e , p o d e m o s re d u cir e l t ie m p o
q u e t a rd a e n m o s t ra rs e re n d e rizá n d o lo p rim e ro e n u n b u ffe r fu e ra d e p a n t a lla y
lu e g o co p ia n d o e l b u ffe r e n la p a n t a lla . Es t a t é cn ica , lla m a d a d o b le b u ffe r, s e u s a
fre cu e n t e m e n t e p a ra a n im a cio n e s .
N o t a : cu a n d o d ib u ja m o s s o b re u n co m p o n e n t e S win g , é s t e u t iliza
a u t o m á t ica m e n t e e l d o b le b u ffe r.

Un Bu ffe re d I m a g e p u e d e u s a rs e fá cilm e n t e co m o u n b u ffe r fu e ra d e p a n t a lla .


Pa ra cre a r u n Bu ffe re d I m a g e cu yo e s p a cio , co lo r, p ro fu n d id a d y d is t rib u ció n d e
p ixe ls co rre s p o n d e n e xa ct a m e n t e la ve n t a n a e n la q u e s o n d ib u ja d o s , s e lla m a a l
m é t o d o Co m p o n e n t c re a t e I m a g e . S i n e ce s it a m o s co n t ro l s o b re t ip o d e la
im a g e n fu e ra d e la p a n t a lla , la t ra n s p a re n cia , p o d e m o s co n s t ru ir d ire ct a m e n t e u n
o b je t o Bu ffe re d I m a g e y u s a rlo co m o u n b u ffe r.
Pa ra d ib u ja r d e n t ro d e u n a im a g e n a lm a ce n a d a , s e lla m a a l m é t o d o
Bu ffe re d I m a g e . c re a t e Gra p h ic s p a ra o b t e n e r e l o b je t o Gra p h ic s 2 D ; lu e g o s e
lla m a a lo s m é t o d o s d e d ib u jo a p ro p ia d o s d e l Gra p h ic s 2 D . To d o e l API d e d ib u jo
d e Ja va 2 D p u e d e u s a rs e cu a n d o s e d ib u ja s o b re u n Bu ffe re d I m a g e q u e e s t á
s ie n d o u t iliza d o co m o u n b u ffe r fu e ra d e p a n t a lla .
Cu a n d o e s t e m o s lis t o s p a ra co p ia r e l Bu ffe re d I m a g e e n la p a n t a lla , s im p le m e n t e
lla m a m o a a l m é t o d o d ra w I m a g e s o b re e l Gra p h ic s 2 D d e n u e s t ro co m p o n e n t e y
p a s a rlo e n Bu ffe re d I m a g e .

Ejemplo: BufferedShapeMover
El s ig u ie n t e a p p le t p e rm it e a l u s u a rio a rra s t ra r u n re ct á n g u lo s o b re la
ve n t a n a d e l a p p le t . En lu g a r d e d ib u ja r e l re ct á n g u lo e n ca d a p o s ició n d e l
cu rs o r, p a ra p ro p o rcio n a r in fo rm a ció n a l u s u a rio , s e u s a u n
Bu ffe re d I m a g e co m o b u ffe r fu e ra d e la p a n t a lla . Cu a n d o s e a rra s t ra e l
re ct á n g u lo , e s re n d e riza d o d e n t ro d e l Bu ffe re d I m a g e e n ca d a n u e va
p o s ició n y Bu ffe re d I m a g e s e co p ia e n la p a n t a lla .
Es t a e s u n a im a g e n d e l GUI d e l a p p le t . Pa ra a je cu t a r e l a p p le r, p u ls a
s o b re e lla . El a p p le t a p a re ce rá e n u n a n u e v a v e n t a n a d e l n a v e g a d o r.
El có d ig o co m p le t o d e l a p p le t e s t á e n Bu ffe re d S h a p e Mo v e r. ja v a .

Aq u ís e a t ñ a e l có d ig o u s a d o p a ra re n d e riza r e n e l Bu ffe re d I m a g e y
m o s t ra r la im a g e n e n la p a n t a lla :

public void updateLocation(MouseEvent e){


rect.setLocation(last_x + e.getX(),
last_y + e.getY());
...
repaint();
...
// In the update method...
if(firstTime) {
Dimension dim = getSize();
int w = dim.width;
int h = dim.height;
area = new Rectangle(dim);
bi = (BufferedImage)createImage(w, h);
big = bi.createGraphics();
rect.setLocation(w/2-50, h/2-25);
big.setStroke(new BasicStroke(8.0f));
firstTime = false;
}

// Clears the rectangle that was previously drawn.


big.setColor(Color.white);
big.clearRect(0, 0, area.width, area.height);

// Draws and fills the newly positioned rectangle


// to the buffer.
big.setPaint(strokePolka);
big.draw(rect);
big.setPaint(fillPolka);
big.fill(rect);

// Draws the buffered image to the screen.


g2.drawImage(bi, 0, 0, this);
}

Oz it o
Imprimir
Es t a le cció n n o s e n s e ñ a có m o u s a r e l API Prin t in f d e Ja va p a ra im p rim ir d e s d e
n u e s t ra s a p lica cio n e s Ja va . Ap re n d e re m o s có m o d ib u ja r lo s co n t e n id o s d e n u e s t ro s
co m p o n e n t e s a la im p re s o ra e n lu g a r d e a l d is p o s it ivo d e p a n t a lla y co m o
co m p o n e r d o cu m e n t o s d e m ú lt ip le s p á g in a s . Es t a le cció n a s u m e q u e h a s le id o la
p rim e ra le cció n d e e s t a ru t a , In t ro d u cció n a l API 2 D d e Ja va , y q u e e s t á s
fa m ilia riza d o co n e l u s o d e l co n t e xt o d e d ib u jo Gra p h ic s 2 D .

Introducción a la Impresión en Java


Es t a s e cció n n o s o fre ce u n a in t ro d u cció n a l s o p o rt e d e im p re s ió n d e l
AWT y e l API 2 D d e Ja va y d e s crib e e l m o d e lo d e im p re s ió n d e Ja va .

Imprimir los Contenidos de un Componente


Es t a s e cció n n o s e n s e ñ a có m o cre a r u n P rin t e rJo b y có m o u s a r u n
P rin t a b le p a ra im p rim ir lo s co n t e n id o s d e u n co m p o n e n t e .

Mostrar el diálogo 'Page Setup'


Es t a s e cció n d e s crib e e l d iá lo g o e s t a n d a rd d e co n fig u ra ció n d e p á g in a y
n o s e n s e ñ a có m o u s a rla p a ra p e rm it ir q u e e l u s u a rio co n fig u re u n
t ra b a jo d e im p re s ió n .

Imprimir una Colección de Páginas


Es t a s e cció n e n s e la có m o co n fig u ra r u n Bo o k p a ra im p rim ir u n a
co le cció n d e p á g in a s q u e n o t ie n e n n i e l m is m o t a m a ñ o n i o rie n t a ció n .

Oz it o
Introducción a la Impresión en Java
El s is t e m a co n t ro la t o t a lm e n t e e l p ro ce s o d e im p re s ió n , a l ig u a l q u e co n t ro la có m o
y cu á n d o p u e d e n d ib u ja r lo s p ro g ra m a s , Nu e s t ra s a p lica cio n e s p ro p o rcio n a n
in fo rm a ció n s o b re e l d o cu m e n t o a im p rim ir, y e l s is t e m a d e im p re s ió n d e t e rm in a
cu a n d o n e ce s it a re n d e riza r ca d a p á g in a .
Es t e m o d e lo d e im p re s ió n p e rm it e s o p o rt a r u n a a m p lio ra n g o d e im p re s o ra s y d e
s is t e m a s . In clu s o p e rm it e a l u s u a rio im p rim ir e n u n a im p re s o ra d e b it m a p s d e s d e
u n o rd e n a d o r q u e n o t ie n e s u ficie n t e m e m o ria o e s p a cio e n d is co p a ra co n t e n e r e l
m a p a d e b it s d e u n a p á g in a co m p le t a . En e s t a s it u a ció n e l s is t e m a d e im p re s ió n le
p e d irá a n u e s t a a p lica ció n q u e re n d e rize la p á g in a d e fo rm a re p e t id a p a ra q u e
p u e d a s e r im p rim id a co m o u n a s e rie d e p e q u e ñ a s im á g e n e s .
Pa ra s o p o rt a r im p re s ió n , u n a a p lia ció n n e ce s it a re a liza r d o s t a re a s :
● Jo b co n t ro l- - m a n e ja r e l t ra b a jo d e im p re s ió n

● Im a g in g - - re n d e riza r la s p á g in a s a im p rim ir

Job Control
Au n q u e e l s is t e m a co n t ro la t o d o e l p ro ce s o d e im p re s ió n , n u e s t ra
a p lica ció n t ie n e q u e o b t e n e r la o p o rt u n id a d d e co n fig u ra r u n P rin t e rJo b .
El P rin t e rJo b , e l p u n t o cla ve d e l co n t ro l d e l p ro ce s o d e im p re s ió n ,
a lm a ce n a la s p ro p ie d a d e s d e l t ra b a jo d e im p re s ió n , co n t ro la la vis ió n d e
lo s d iá lo g o s d e im p re s ió n y s e u s a p a ra in icia liza r la im p re s ió n .
Pa ra d irig ir e l P rin t e rJo b a t ra vé s d e l p ro ce s o d e im p re s ió n , n u e s t ra
a p lica ció n n e ce s it a
1 . Ob t e n e r u n P rin t e rJo b lla m a n d o a P rin t e rJo b . g e t P rin t e rJo b
2 . De cirle a l P rin t e rJo b d ó n d e e s t á e l có d ig o d e d ib u jo lla m a n d o a
s e t P rin t a b le o s e t P a g e a b le
3 . S i s e d e s e a , m o s t ra r lo s d iá lo g o s d e co n fig u ra ció n d e p á g in a e
im p re s ió n lla m a n d o a p a g e D ia lo g y p rin t D ia lo g
4 . In icia r la im p re s ió n lla m a n d o a p rin t
El d ib u jo d e p á g in a s e s t á co n t ro la d o p o r e l s is t e m a d e im p re s ió n a t ra vé s
d e lla m a d a s a l có d ig o d e im á g e n e s d e la a p lica ció n .

Imaging
Nu e s t ra a p lica ció n d e b e p o d e r re n d e riza r cu a lq u ie r p á g in a cu a n d o e l
s is t e m a d e im p re s ió n lo p id a . Es t e có d ig o d e re n d e riza d o e s t á co n t e n id o
e n e l m é t o d o p rin t d e u n p a g e p a in t e r- - u n a cla s e q u e im p le m e n t a e l
in t e rfa ce P rin t a b le . No s o t ro s im p le m e n t a m o s p rin t p a ra re n d e riza r e l
co n t e n id o d e la p á g in a u s a n d o u n Gra p h ic s o u n Gra p h ic s 2 D . Po d e m o s
u s a r u n ú n ico 'p a g e p a in t e r' p a ra re n d e riza r t o d a s la s p á g in a s d e u n
'p rin t jo b ' o d ife re n t e s 'p a g e p a in t e rs ' p a ra lo s d ife re n t e s t ip o s d e
p á g in a s . Cu a n d o e l s is t e m a d e im p re s ió n n e ce s it a re n d e riza r u n a p á g in a ,
lla m a a l m é t o d o p rin t d e l 'p a g e p a in t e r' a p ro p ia d o .
Cu a n d o s e u s a u n ú n ico 'p a g e p a in t e r', a l 'p rin t jo b ' s e le lla m a u n
p rin t a b le jo b . Us a r u n 'p rin t a b le jo b ' e s la fo rm a m á s s e n cilla d e s o p o rt a r
im p re s ió n . La s o p e ra cio n e s d e im p re s ió n m á s co m p le ja s q u e u s a n
m ú lt ip le s 'p a g e p a in t e re s ' s o n co n o cid a s co m o p a g e a b le jo b s . En u n
'p a g e a b le jo b ' s e u s a u n e je m p la r d e u n a cla s e q u e im p le m e n t e e l
in t e rfa ce P a g e a b le p a ra m a n e ja r lo s 'p a g e p a in t e rs '.

Printable Jobs
En u n 'p rin t a b le jo b ' t o d a s la s p á g in a s u s a n e l m is m o 'p a g e
p a in t e r' y P a g e Fo rm a t , q u e d e fin e e l t a m a ñ o y o rie n t a ció n d e
la p á g in a a im p rim ir. S e le p id e a l 'p a g e p a in t e r' q u e re n d e rice
ca d a p á g in a e n o rd e n in d e xa d o , e m p e za n d o e n la p á g in a co n
ín d ice 0 . Al'p a g e p a in t e r' s e le p o d ría p e d ir q u e re n d e riza rá
u n a p á g in a va ria s ve ce s a n t e s d e p e d ir la s ig u ie n t e p á g in a . Po r
e je m p lo , s i u n u s u a rio im p rim ir la s p á g in a s 2 y 3 d e u n
d o cu m e n t o , s e le p id e a l 'p a g e p a in t e r' q u e re n d e rice la s
p á g in a s co n ín d ice s 0 , 1 y 2 in clu s o a u q n u e la s d o s p rim e ra s n o
s e a n im p re s a s .
S i s e p re s e n t a u n d iá lo g o d e im p re s ió n , n o s e m o s t ra rá
e ln ú m e ro d e p á g in a s , p o rq u e e s a in fo rm a ció n n o e s t á
d is p o n ib le p a ra e l s is t e m a d e im p re s ió n , El 'p a g e p a in t e r'
in fo rm a a l s is t e m a d e im p re s ió n cu a n d o s e a lca n za e l fin a l d e l
d o cu m e n t o .

Pageable Jobs
Lo s 'p a g e a b le jo b s ' s ó n ú t ile s s o n u e s t ra a p lica ció n co n s t ru ye
u n a re p re s e n t a ció n e xp lícit a d e u n d o cu m e n t o , p á g in a p o r
p á g in a . En u n 'p a g e a b le jo b ' d ife re n t e s p á g in a s p u e d e n u s a r
d ife re n t e s 'p a g e p a in t e s ' y P a g e Fo rm a t s . El s is t e m a d e
im p re s ió n p u e d e p e d ir a lo s 'p a g e p a in t e rs ' q u e re n d e rice n la s
p á g in a s e n cu a lq u ie r o rd e n , in clu s o p u e d e s a lt a rs e a lg u n a s .
Po r e je m p lo s i u n u s u a rio im p rim ri la s p á g in a s 2 y 3 d e u n
d o cu m e n t o , s ó lo s e le p e d irá a l 'p a g e p a in t e r' q u e re n d e rice la s
p á g in a s co n lo s ín d ice s 1 y 2 .
Lo s d is t in t o s 'p a g e p a in t e re s ' d e u n 'p a g e a b le jo b ' s o n
co o rd in a d o s p o r u n a cla s e q u e im p le m e n t a e l in t e rfa ce
P a g e a b le , co m o u n Bo o k . Un Bo o k re p re s e n t a u n a co le cció n
d e p á g in a q u e p u e d e n u s a r d ife re n e s 'p a g e p a in t e r' y q u e
p u e d e n va ria r e n t a m a ñ o y o rie n t a ció n , Ta m b ié n p o d e m o s
u s a r n u e s t ra p ro p ia im p le m e n t a ciu ó n d e l in t e rfa ce P a g e a b le
s i Bo o k n o cu m p le co n la s n e ce s id a d e s d e n u e s t ra a p lica ció n .

Oz it o
Imprimir los Contenidos de un Componente
Cu a lq u ie r co s a q u e p o d a m o s d ib u ja r e n la p a n t a lla t a m b ié n p u e d e s e r im p rim id a .
Po d e m o s fá cilm e n t e u s a r u n 'p rin t a b le jo b ' p a ra im p rim ir e l co n t e n id o d e u n
co m p o n e n t e .

Ejemplo: ShapesPrint
En e s t e e jm p lo u s a m o s e l m is m o có d ig o d e d ib u jo p a ra m o s t ra r e
im p rim ir lo s co n t e n id o s d e u n co m p o n e n t e . Cu a n d o e l u s u a rio p u ls a
s o b re e l b o t ó n p rin t , s e cra u n 'p rin t jo b ' y s e lla m a a p rin t D ia lo g p a ra
m o s t ra r e l d iá lo g o d e im p re s ió n . S i e l u s u a rio co n t ín u a co n e l t ra b a jo , e l
p rce s o d e im p re s ió n s e in icia , y e l s is t e m a d e im p re s ió n lla m a a p rin t
cu a n d o s e a n e ce s a rio re n d e riza r e l t ra b a jo a la im p re s o ra .

Es t a fig u ra h a s id o re d u cid a d p a ra q u e q u e p a e n la p á g in a .
Pu ls a s o b re la im a g e n p a ra v e rla a s u t a m a ñ o n a t u ra l.
S h a p e s P rin t e s e l 'p a g e p a in t e r'. S u s m é t o d o p rin t lla m a a
d ra w S h a p e s p a ra re a liza r e l d ib u jo d e l 'p rin t jo b '. ( Ta m b ié n s e lla m a a l
m é t o d o d ra w S h a p e s p o r p a rt e d e p a in t Co m p o n e n t p a ra d ib u ja r e n la
p a n t a lla . )

public class ShapesPrint extends JPanel


implements Printable, ActionListener {
...
public int print(Graphics g, PageFormat pf, int pi)
throws PrinterException {
if (pi >= 1) {
return Printable.NO_SUCH_PAGE;
}
drawShapes((Graphics2D) g);
return Printable.PAGE_EXISTS;
}
...
public void drawShapes(Graphics2D g2) {
Dimension d = getSize();
int gridWidth = 400/6;
int gridHeight = 300/2;
int rowspacing = 5;
int columnspacing = 7;
int rectWidth = gridWidth - columnspacing;
int rectHeight = gridHeight - rowspacing;
...

int x = 85;
int y = 87;
...
g2.draw(new Rectangle2D.Double(x,y,rectWidth,rectHeight));
...
El có d ig o d e co n t ro l d e l t ra b a jo e s t á e b e l m é t o d o S h a p e s P rin t
a c t io n P e rfo rm e d .

public void actionPerformed(ActionEvent e) {


if (e.getSource() instanceof JButton) {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(this);
if (printJob.printDialog()) {
try {
printJob.print();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
Pu e d e s e n co n t ra r e l có d ig o co m p le t o d e e s t e p ro g ra m a e n
S h a p e s P rin t . ja v a .

Oz it o
Mostrar el Diálogo de configuración de Página
Po d e m o s p e rm it ir q u e e l u s u a rio e s p e cifiq u e la s ca ra ct e rís it ca s d e la p á g in a , co m o
e l t a m a ñ o d e l p a p e l y la o rie n t a ció n , m o s t rá n d o e l d iá lo g o d e Co n fig u ra ció n d e
Pá g in a . La in fo rm a ció n d e la p á g in a s e a lm a ce n a e n u n o b je t o P a g e Fo rm a t . Al
ig u a l q u e e l d iá lo g o d e Im p re s ió n , e l d iá lo g o d e Co n fig u ra ció n d e Pá g in a s e
m u e s t ra lla m a n d o u n m é t o d o s o b re e l o b je t o P rin t e rJo b , p a g e D ia lo g .
El d iá lo g o d e Co n fig u ra ció n d e Pá g in a s e in icia liza u s a n d o e l P a g e Fo rm a t p a s a d o
a l m é t o d o p a g e D ia lo g . S i e l u s u a rio p u ls a s o b re e l b o t ó n OK d e l d iá lo g o , s e clo n a
P a g e Fo rm a t , a lt e ra d o p a ra re fle ja r la s s e le ccio n e s d e l u s u a rio , y lu e g o re t o rn a . s i
e l u s u a rio ca n ce la e l d iá lo g o , p a g e D ia lo g d e vu e lve e l o rig in a l, s in m o d ifica r
P a g e Fo rm a t .
S h a p e s P rin t p o d ría fá cilm e n t e s e r m o d ifica d o p a ra m o s t ra r u n d iá lo g o d e
co n fig u ra ció n d e p á g in a a ñ a d ie n d o u n a lla m a d a a p a g e D ia lo g d e s p u é s d e o b t e n e r
e l P rin t e rJo b .

// Get a PrinterJob
PrinterJob job = PrinterJob.getPrinterJob();
// Ask user for page format (e.g., portrait/landscape)
PageFormat pf = job.pageDialog(job.defaultPage());

Oz it o
Imprimir una Colección de Páginas
Cu a n d o s e n e ce s it e m á s co n t ro l s o b re la s p á g in a s in d ivid u a le s e n u n t ra b a jo d e
im p re s ió n , p o d e m o s u s a r u n 'p a g e a b le jo b ' e n lu g a r d e u n 'p rin t a b le jo b '. La fo rm a
m á s s e n cilla d e m a n e ja r u n 'p a g e a b le jo b ' e s u t iliza r la cla s e Bo o k , q u e re p re s e n t a
u n a co le cció n d e p á g in a s .

Ejemplo: SimpleBook
El p ro g ra m a S im p le Bo o k u s a u n Bo o k p a ra m a n e ja r d o s 'p a g e
p a in t e rs ': P a in t Co v e r s e u t iliza p a ra la cu b ie rt a , y P a in t Co n t e n t p a ra la
p á g in a d e co n t e n id o . La cu b ie rt a s e im p rim e e n m o d o a p a is a d o , m ie n t ra s
q u e e l co n t e n id o s e im p rim e e n m o d o ve rt ica l.
Un a ve z cre a d o e l Bo o k , la s p á g in a s s e a ñ a d e n co n e l m é t o d o a p p e n d .
Cu a n d o s e a ñ a d e u n a p á g in a a u n Bo o k , s e n e ce s it a e s p e cifica r e l
P rin t a b le y e l P a g e Fo rm a t p a ra u s a r co n ca d a p á g in a .

// In the program's job control code...


// Get a PrinterJob
PrinterJob job = PrinterJob.getPrinterJob();

// Create a landscape page format


PageFormat landscape = job.defaultPage();
landscape.setOrientation(PageFormat.LANDSCAPE);

// Set up a book
Book bk = new Book();
bk.append(new PaintCover(), job.defaultPage());
bk.append(new PaintContent(), landscape);

// Pass the book to the PrinterJob


job.setPageable(bk);
S e lla m a a l m é t o d o s e t P a g e a b le s o b re P rin t e rJo b p a ra d e cirle a l
s is t e m a d e co n t ro l q u e u t ilice e l Bo o k p a ra lo ca liza r e l có d ig o d e d ib u jo
a d e cu a d o .
Pu e d e s e n co n t ra r e l p ro g ra m a co m p le t o e n S im p le Bo o k . ja v a .

Oz it o
Resolver problemas comunes con Gráficos 2D
P ro b le m a : Pu e d o e je cu t a r a p p le t s Ja va 2 D co n a p p le t vie we r, p e ro n o fu n cio n a n co n m i n a ve g a d o r. La co n s o la Ja va d e l n a ve g a d o r
d ice : d e fn n o t fo u n d fo r ja v a / a w t / Gra p h ic s 2 D .
● Ne ce s it a s d e s ca rg a r e l Ja va Plu g in 1 . 2 p a ra e je cu t a r S win g y a p p le t s 2 D e n u n n a ve g a d o r. Pu e d e s d e s ca rg a r e l p lu g in a q u í:

h t t p :/ / ja v a . s u n . c o m / p ro d u c t s / p lu g in / in d e x . h t m l
Ne ce s it a rá s a ju s t a r t u s fich e ro s HTML p a ra a p u n t a r h a cia e l p u g in . Aq u í t ie n e s u n a p á g in a co n va rio s e je m p lo s , in clu id o u n
e je m p lo 2 D e n la p a rt e in fe rio r:
h t t p :/ / ja v a . s u n . c o m / p ro d u c t s / p lu g in / 1 . 2 / d e m o s / a p p le t s . h t m l

P ro b le m a : ¿ Có m o p u e d o e s crib ir s o b re u n a im a g e n a n t e rir? Nu e s t ro p ro b le m a e s q u e n u e s t ro a p p le t m u e s t e a u n a im a g e n d e u n
m a p a , p e ro cu a n d o s e d ib u ja u n a lín e a s o b re e l m a p a , la lín e a s o b re e s crib e e l m a p a .
● De b e ría s in t e n t a r d ib u ja r t u im a g e n d e n t ro d e u n Bu ffe re d I m a g e . Lu e g o , d ib u ja e l Bu ffe re d I m a g e d e n t ro d e u n co n t e xt o
Gra p h ic s 2 D y lu e g o d ib u je la lín e a s o b re e l co n t e xt o Gra p h ic s 2 D u n e je m p lo d e có d ig o e s t á e n
Ma p _ Lin e . ja va
S ó lo d e b e s s u s t it u ir e l n o m b re d e t u im a g e n p o r im a g e s / b ld . jp g .

P ro b le m a : ¿ Có m o cre o u n Bu ffe re d I m a g e d e s d e u n fich e ro g if o jp e g ?


● Pa ra cre a r u n Bu ffe re d I m a g e d e s d e u n g if o jp e g fro m a g if o r jp e g , d e b e s ca rg a r t u fich e ro fig o jp e g e n u n o b je t o I m a g e
y lu e g o d ib u ja r e l I m a g e e n e l o b je t o Bu ffe re d I m a g e . El s ig u ie n t e fra g m e n t o d e có d ig o ilu s t ra e s t o :

Image img = getImage("picture.gif");


int width = img.getWidth(this);
int height = img.getHeight(this);

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);


Graphics2D biContext = bi.createGraphics();
biContext.drawImage(img, 0, 0, null);
g e t I m a g e e s u n m é t o d o Ap p le t . S i t ie n e u n a a p lica ció n , p u e d e s u s a r:

Image img = Toolkit.getDefaultToolkit().getImage("picture.gif");


Bu ffe re d I m a g e . TYP E_ I N T_ RGB e s u n o d e lo s m u ch o s t ip o s d e Bu ffe re d I m a g e . Pa ra m á s in fo rm a ció n , p u e d e s ve r:
h t t p :/ / ja v a . s u n . c o m / p ro d u c t s / ja v a - m e d ia / 2 D / fo rD e v e lo p e rs / 2 D a p i/ ja v a / a w t / im a g e / Bu ffe re d I m a g e . h t m l
Ne ce s it a s cre a r u n co n t e xt o Gra p h ic s 2 D p a ra e l Bu ffe re d I m a g e u s a n d o e l m é t o d o c re a t e Gra p h ic s . Lu e g o , p u e d e s u s a r e l
m é t o d o d ra w I m a g e d e la cla s e Gra p h ic s 2 D p a ra d ib u ja r la im a g e n d e n t ro d e l b u ffe r.

P ro b le m a : No p u e d o co m p ila r e l có d ig o fu e n t e d e S t ro k e An d Fill. ja v a y Tra n s fo rm . ja v a co n jd k1 . 2 b e t a 4 .


● La im p le m e n t a ció n d e Te x t La y o u t . g e t Ou t lin e s e ca m b ió e n t re la b e t a 4 y e l JDK a ct u a l. La n u e va im p le m e n t a ció n s ó lo t o m a
u n Affin e Tra n s fo rm co m o a rg u m e n t o . Ne ce s it a s d e s ca rg a r e l n u e vo JDK p a ra e je cu t a r e l e je m p lo .
P ro b le m a : ¿ Exis t e a lg u n a fo rm a d e e s p e cifica r u n a fó rm u la p a ra u n a lín e a y d ib u ja r u n g rá fico d e a cu e rd o a e lla ?
● Us a r lo s s e g m e n t o s d e lín e a p o d ría s e r la fo rm a m á s s e n cilla . Pu d e s re p re s e n t a r lo s s e g m e n t o s d e lín e a re lle n a n d o u n
Ge n e ra lP a t h co n e llo s , o im p le m e n t a n d o S h a p e y P a t h I t e ra t o r y le ye n d o lo s s e g m e n t o s d e lín e a 'b a jo d e m a n d a ' p a ra
g u a rd a r e l a lm a ce n a m ie n t o in t e rm e d io d e l o b je t o Ge n e ra lP a t h . Ob s e rva q u e p o d ría s a n a liza r t u f´ ro m u la p a ra d e re rm in a r s i
co rre s p o n d e co n cu rva s cú b ica s o cu a d rá t ica s .

P ro b le m a : ¿ Có m o p u e d o a ñ a d ir t e xt o a u n ca m p o g rá fico e n u n a cie rt a p o s ició n ?


● En e l JDK 1 . 2 s e a ñ a d ió u n a cla s e lla m a d a Gra p h ic s 2 D ( a h o ra lla m a d o Ja va 2 S DK) . Es t a cla s e d e s cie n d e d e Gra p h ic s . Ha y
d o s m é t o d o s d ra w S t rin g e n Gra p h ic s 2 D q u e p u e d e s u t iliza r. S i q u ie re s ro t a r e l t e xt o , d e b e ría s u s a r Gra p h ic s 2 D e n ve z d e
Gra p h ic s p o r lo q u e p o d rá s re a liza r ro t a cio n e s y o t ra s t ra n s fo rm a cio n e s e n t u co n t e xt o Gra p h ic s 2 D .
El e je m p lo Tra n s fo rm e n e l t u t o ria l d e 2 D n o u s a d ra w S t rin g p a ra d ib u ja r t e xt o . Lo q u e s u ce d e e s q u e s e cre a u n
Te x t La y o u t d e s d e la ca d e n a "Te xt . " El Te x t La y o u t n o s p e rm it e cre a r u n o b je t o S h a p e a p a rt ir d e l S t rin g o b t e n ie n d o s u
fo rm a e xt e rio r. In t ro d u cim o s e s t á S h a p e e n e l a rra y d e s h a p e s , ju n t o co n la s fo rm a s d e l re ct á n g u lo y d e la e lip s e . Cu a n d o
d ib u ja m o s o re lle n a m o s e l S h a p e s e le ccio n a d o d e l a rra y d e s h a p e s , lla m a m o s a g 2 . d ra w ( S h a p e ) o a g 2 . fill( S h a p e ) .
Po d ría s u s a r d ra w S t rin g p a ra d ib u ja r e l t e xt o e n e l co n t e xt o Gra p h ic s 2 D y lu e g o lla m a r a g 2 . ro t a t e ( á n g u lo d e ro t a ció n ) .
Es t o ra t a rá t o d o lo q u e h a ya m o s in t ro d u cid o d e n t ro d e l co n t e xt o Gra p h ic s 2 D . Po r e s o , p o d ría m o s re s e t e a r e l co n t e xt o g 2
ca d a ve z q u e q u e rra m o s t ra n s fo rm a r u n a im a g e n p a rt icu la r o u n a p a rt e d e l t e xt o e n e l co n t e xt o d e fo rm a s e p a ra d a d e o t ra s
ca d e n a s q u e h a ya n s id o re n d e riza d a s e n e l co n t e xt o g 2 .

P ro b le m a : He le id o s u co m e n t a rio e n la p a rt e in fe rio r d e Cre a r y De riva r fu e n t e s s o b re e l b u g 4 1 5 5 8 5 2 . Es t e b u g h a s id o ce rra d o


s in n in g u n a a cció n . ¿ Es cie rt o q u e n o s e p u e d e a p lica r u n e s t ilo a u n a fu e n t e co m o Aria l?
El p ro b le m a e s q u e la co rre s p o n d e n cia fu e n t e - a - e s t ilo n o fu n cio n a d e fo rm a a p ro p ia d a p a ra fu e n t e s fís ica s ( co m o Aria l o
Pa la t in o ) . S ó lo s e p u e d e n a p lica r e s t ilo s a la s fu e n t e s ló g ica s e n e s t e m o m e n t o ( co m o Dia lo g o S a n s S e rif) .
Co m o a t a jo h a s t a q u e s e co rrija e l b u g , p o d ría s h a ce r lo s ig u ie n t e s :

Font f = new Font("Palatino Bold", Font.PLAIN, 12);


e n lu g a r d e :

Font f = new Font("Palatino", Font.BOLD, 12);

Oz it o
Conectividad y Seguridad del Cliente
El e n t o rn o Ja va e s a lt a m e n t e co n s id e ra d o e n p a rt e p o r s u ca p a cid a d p a ra e s crib ir
p ro g ra m a s q u e u t iliza n e in t e ra ct ú a n co n lo s re cu rs o s d e In t e rn e t y la Wo rld Wid e
We b . De h e ch o , lo s n a ve g a d o re s q u e s o p o rt a n Ja va u t iliza n e s t a ca p a cid a d d e l
e n t o rn o Ja va h a s t a e l e xt re m o d e t ra n s p o rt a r y e je cu t a r a p p le t s a t ra vé s d e la re d .

Indice de Contenidos:
● In t ro d u cció n a l Tra b a jo e n Re d
❍ Tra b a jo e n Re d Bá s ico

❍ Lo q u é p o d ría s co n o ce r ya s o b re e l t ra b a jo e n Re d e n Ja va
● Tra b a ja r co n URLs
❍ ¿ Qu é e s u n a URL?

❍ Cre a r u n a URL
❍ Co m p a rt ir u n a URL
❍ Le e r Dire ct a m e n t e d e s d e u n a URL
❍ Co n e ct a r co n u n a URL
❍ Le e r y Es crib ir u t iliza n d o u n a Co n e xió n URL
● To d o s o b re lo s S o cke t s
❍ ¿ Qu é e s u n S o cke t ?
❍ Le e r y Es crib ir u t iliza n d o u n S o cke t
❍ Es crib ir e l la d o d e l s e rvid o r d e u n S o cke t
● To d o s s o b re lo s Da t a g ra m a s
❍ ¿ Qu é e s u n Da t a g ra m a ?

❍ Es crib ir u n Da t a g ra m a Clie n t e y S e rvid o r


● Pro p o rcio n a r s u p ro p io Co n t ro la d o r d e S e g u rid a d
❍ In t ro d u cció n a lo s Co n t ro la d o re s d e S e g u rid a d
❍ Es crib ir u n Co n t ro la d o r d e S e g u rid a d
❍ In s t a la r s u Co n t ro la d o r d e S e g u rid a d
❍ De cid ir q u é m é t o d o s s o b re e s crib ir d e l S e cu rit yMa n a g e r
● Ca m b io s e n e l JDK 1 . 1

Co n s id e ra c io n e s d e S e g u rid a d : Ob s e rva q u e la co m u n ica ció n a t ra vé s d e la re d


e s t á s u je t a a la a p ro va ció n d e l co n t ro la d o r d e s e g u rid a d a ct u a l. Lo s p ro g ra m a s d e
e je m p lo co n t e n id o s e n la s le ccio n e s s o b re URLs , s o cke t s y Da t a g ra m a s d e e s t a
ru t a s o n a p lica cio n e s s o lit a ria s , q u e p o r d e fe ct o n o t ie n e n co n t ro la d o r d e
s e g u rid a d . S i q u ie re s co n ve rt ir e s t a s a p lica cio n e s e n a p p le t s p o d ría s e r p o s ib le q u e
n o s e co m u n ica rá n a t ra vé s d e la re d , d e p e n d ie n d o d e l n a ve g a d o r o vis u a liza d o s
e n e l q u e s e e s t é e je cu t a n d o . Pu e d e s ve r En t e n d e r la s Ca p a cid a d e s y la s
Re s t riccio n e s d e u n Ap p le t p a ra m á s in fo rm a ció n s o b re la s re s t riccio n e s d e
s e g u rid a d d e lo s a p p le t s

Oz it o
Trabajo en Red Básico
Lo s o rd e n a d o re s q u e s e e je cu t a n e n In t e rn e t co m u n ica n u n o s co n o t ro s u t iliza n d o
lo s p ro t o co lo s TCP y UDP, q u e s o n p ro t o co lo s d e 4 ca p a s .

Cu a n d o s e e s crib e n p ro g ra m a s Ja va q u e s e co m u n ica n a t ra vé s d e la re d , s e e s t á
p ro g ra m a n d o e n la ca p a d e a p lica ció n . Típ ica m e n t e , n o s e n e ce s it a t ra b a ja r co n la s
ca p a s TCP y UDP - - e n s u lu g a r s e p u e d e u t iliza r la s cla s e s d e l p a q u e t e ja va . n e t .
Es t a s cla s e s p o rp o rcio n a n co m u n ica ció n d e re d in d e p e n d ie n t e d e l s is t e m a . S in
e m b a rg o , n e ce s it a s e n t e n d e r la d ife re n cia e n t re TCP y UDP p a ra d e cid ir q u e cla s e s
Ja va d e b e ría n u t iliza r t u s p ro g ra m a s .
Cu a n d o d o s a p lica ció n s e q u ie re n co m u n ica r u n a co n o t ra d e fo rm a fia b le ,
e s t a b le ce n u n a co n e xió n y s e e n vía n d a t o s a t ra vé s d e la co n e xió n . Es t o e s
p a re cid o a h a ce r u n a lla m a d a d e t e lé fo n o - - s e e s t a b le ce u n a co m u n ica ció n cu a n d o
s e m a rca e l n ú m e ro d e t e lé fo n o y la o t ra p e rs o n a re s p o n d e . S e e n vía n y re cib e n
d a t o s cu a n d o s e h a b la p o r e l t e lé fo n o y s e e s cu ch a lo q u e le d ice la o t ra p e rs o n a .
Al ig u a l q u e la co m p a ñ ia t e le fó n ica , TCP g a ra n t iza q u e lo s d a t o s e n via d o s p o r u n a
p a rt e d e la co n e xió n re a lm e n t e lle g a n a la o t ra p a rt e y e n e l m is m o o rd e n e n e l
q u e fu e ro n e n via d o s ( d e o t ra fo rm a d a ría u n e rro r) .
D e fin ic ió n : TCP e s u n p ro t o co lo b a s a d o e n co n e xió n q u e p ro p o rcio n a u n flu jo
fia b le d e d a t o s e n t re d o s o rd e n a d o re s .

La s a p lica cio n e s q u e re q u ie re n fia b ilid a d , ca n a le s p u n t o a p u n t o p a ra co m u n ica rs e ,


u t iliza n TCP p a ra e llo . Hyp e r Te xt Tra n s fe r Pro t o co l ( HTTP) , File Tra n s fe r Pro t o co l
( ft p ) , y Te ln e t ( t e ln e t ) s o n e je m p lo s d e a p lica cio n e s q u e re q u ie re n u n ca n a l d e
co m u n ica ció n fia b le . El o rd e n e n q u e lo s d a t o s s o n e n via d o s y re cib id o s a t ra vé s d e
la Re d e s crít ico p a ra e l é xit o d e e s t a s a p lica cio n e s - - cu a n d o s e u t iliza HTTP p a ra
le e r d e s d e u n a URL, lo s d a t o s d e b e n re cib irs e e n e l m is m o o rd e n e n q u e fu e ro n
e n via d o s , d e o t ra fo rm a t e n d rá s u n fich e ro HTML re vu e lt o , u n fich e ro Zip co rru p t o
o cu a lq u ie r o t ra in fo rm a ció n n o vá lid a .
Pa ra m u ch a s a p lica cio n e s e s t a g a ra n t ía d e fia b ilid a d e s crít ica p a ra e l é xit o d e la
t ra n s fe re n cia d e in fo rm a ció n d e s d e u n p u n t o d e la co n e xió n a l o t ro . S in e m b a rg o ,
o t ra s fo rm a s d e co m u n ica ció n n o n e ce s it a n e s t a co m u n ica ció n t a n e s t rict a y d e
h e ch o lo q u e h a ce e s e s t o rb a r p o rq u e la co n e xió n fia b le a n u la e l s e rvicio .
Co n s id e ra , p o r e je m p lo , u n s e rvicio d e h o ra q u e e n vía la h o ra a ct u a l a s u s clie n t e s
cu a n d o e s t o s lo p id e n . S i e l clie n t e p ie rd e u n p a q u e t e , ¿ t ie n e s e n t id o vo lve r a
e n via r e l p a q u e t e ? No p o rq u e la h o ra q u e re cib iría e l clie n t e ya n o s e ría e xa ct a . S i
e l clie n t e h a ce d o s p e t icio n e s y re cib e d o s p a q u e t e s d e l s e rvid o r e n d is t in t o o rd e n ,
re a lm e n t e n o im p o rt a p o rq u e e l clie n t e p u e d e im a g in a rs e q u e lo s p a q u e t e s n o
e s t á n e n o rd e n y p e d ir o t ro . El ca n a l fia b le , a q u í n o e s n e ce s a rio , ca u s a n d o u n a
d e g ra d a ció n d e l re n d im ie n t o , y p o d ría e s t o rb a r a la u t ilid a d d e l s e rvicio .
Ot ro e je m p lo d e s e rvicio q u e n o n e ce s it a u n ca n a l d e fia b ilid a d g a ra n t iza d a e s e l
co m a n d o p in g . El ú n ico o b je t ivo d e l co m a n d o p in g e s co m p ro b a r la co m u n ica ció n
e n t re d o s p ro g ra m a s a t ra vé s d e la re d . De h e ch o , p in g n e ce s it a co n ce r la s ca id a s
o lo s p a q u e t e s fu e ra d e o rd e n p a ra d e t e rm in a r lo b u e n a o m a la q u e e s la co n e xió n .
As í u n ca n a l fia b le in va lid a ría e s t e s e rvicio .
El p ro t o co lo UDP p ro p o rcio n a u n a co m u n ica ció n n o g a ra n t iza d a e n t ro s d o s
a p lica cio n e s e n la Re d . UDP n o e s t á b a s a d o e n la co n e xió n co m o TCP. UDP e n vía
p a q u e t e s d e d a t o s , lla m a d o s d a t a g ra m a s d e u n a a p lica ció n a la o t ra . En via r
d a t a g ra m a s e s co m o e n vía r u n a ca rt a a t ra vé s d e l s e rvicio d e co rre o s : e l o rd e n d e
e n vío n o e s im p o rt a n t e y n o e s t á g a ra n t iza d o , y ca d a m e n s a je e s in d e p e n d ie n t e d e
lo s o t ro s .

D e fin ic ió n : UDP e s u n p ro t o co lo q u e e n vía p a q u e t e s d e d a t o s in d e p e n d ie n t e s ,


lla m a d o s d a t a g ra m a s d e s d e u n o rd e n a d o r a o t ro s in g a ra n t ía s s o b re s u lle g a d a .
UDP n o e s t á b a s a d o e n la co n e xió n co m o TCP.

Puertos
Ge n e ra lm e n t e h a b la n d o , u n o rd e n a d o r t ie n e u n a s o la co n e xió n fís ica co n
la Re d . To d o s lo s d a t o s d e s t in a d o s a u n o rd e n a d o r p a rt icu la r lle g a n a
t ra vé s d e la co n e xió n . S in e m b a rg o , lo s d a t o s p o d ría s e r u t iliza d o s p o r
d ife re n t e s a p lica cio n e s e je cu t á n d o s e e n e l o rd e n a d o r. ¿ En t o n ce s có m o
s a b e e l o rd e n a d o r a q u é a p lica ció n e n via rle lo s d a t o s ? A t ra vé s d e l u s o
d e lo s p u e rt o s .
Lo s d a t o s t ra n s m it id o s p o r in t e rn e t e s t á n a co m p a ñ a d o s p o r u n a
in fo rm a ció n d e d ire cció n q u e id e n t ifica e l o rd e n a d o r y e l p u e rt o a l q u e
e s t á n d e s t in a d o s . El o rd e n a d o r e s t á id e n t ifica d o p o r s u d ire cció n IP d e 3 2
b it s , e s t a d ire cció n s e u t iliza p a ra e n vía r lo s d a t o s a l o rd e n a d o r co rre ct o
e n la re d . Lo s p u e rt o s e s t á n id e n t ifica d o s p o r u n n ú m e ro d e 1 6 b it s , q u e
TCP y UDP u t iliza n p a ra e n vía r lo s d a t o s a la a p lica ció n co rre ct a .
En a p lica cio n e s b a s a d a s e n la co n e xió n , u n a a p lica ció n e s t a b le ce u n a
co n e xió n co n o t ra a p lica ció n u n ie n d o u n s o cke t a u n n ú m e ro d e p u e rt o .
Es t o t ie n e e l e fe ct o d e re g is t ra r la a p lica ció n co n e l s is t e m a p a ra re cib ir
t o d o s lo s d a t o s d e s t in a d o s a e s e p u e rt o . Do s a p lica cio n e s n o p u e d e n
u t iliza r e l m is m o p u e rt o : in t e n t a r a cce d e r a u n p u e rt o q u e ya e s t á
u t iliza d o d a rá u n e rro r.
En co m u n ica cio n e s b a s a d a s e n d a t a g ra m a s , lo s p a q u e t e s d e d a t a g ra m a s
co n t ie n e n e l n ú m e ro d e p u e rt o d e l d e s t in a t a rio .

D e fin ic ió n : Lo s p ro t o co lo s TCP y UDP u t iliza n p u e rt o s p a ra d irig ir lo s


d a t o s d e e n t ra d a a lo s p ro ce s o s p a rt icu la re s q u e s e e s t á n e je cu t a n d o e n
u n o rd e n a d o r.

Lo s n ú m e ro s d e p u e rt o s t ie n e n u n ra n g o d e 0 a 6 5 5 3 5 ( p o rq u e lo s
p u e rt o s e s t á n re p re s e n t a d o s p o r u n n ú m e ro d e 1 6 b it s ) . Lo s p u e rt o s
e n t re lo s n ú m e ro s 0 - 1 0 2 3 e s t á n re s t rin g id o s - - e s t á n re s e rva d o s p a ra
s e rvicio s b ie n co n o cid o s co m o HTTP, FTP y o t ro s s e rvicio s d e l s is t e m a .
Tu s a p lica cio n e s n o d e b e ría n in t e n t a r u n irs e a e s t o s p u e rt o s . Lo s p u e rt o s
q u e e s t á n re s e rva d o s p a ra lo s s e rvicio s b ie n co n o cid o s co m o HTTP y FTP
s o n lla m a d o s p u e rt o s b ie n co n o cid o s .
A t ra vé s d e la s cla s e s d e l p a q u e t e ja va . n e t , lo s p ro g ra m a s Ja va p u e d e u t iliza n TCP
o UDP p a ra co m u n ica rs e a t ra vé s d e In t e rn e t . La s cla s e s URL, URLCo n n e ct io n ,
S o cke t , y S o cke t S e rve r u t iliza n e l TCP p a ra co m u n ica rs e a t ra vé s d e la Re d . La s
cla s e s Da t a g ra m Pa cke t y Da t a g ra m S e rve r u t iliza n UDP.

Oz it o
Lo que ya podrías Conocer sobre el Trabajo en Red
en Java
La s p a la b ra s t ra b a jo e n re d la n za n e l t e m o r e n lo s co ra zo n e s d e m u ch o s
p ro g ra m a d o re s . Te m o r n o ! Ut iliza n d o la s ca p a cid a d e s p ro p o rcio n a d a s p o r e l
e n t o rn o Ja va e s m u y s e n cillo . De h e ch o , p o d ría s h a b e r u it liza d o la re d s in s a b e rlo !

Cargar Applets desde la Red


S i a cce d e s a u n n a ve g a d o r q u e s o p o rt a Ja va , in d u d a b le m e n t e h a b rá s
e je cu t a d o m u ch o s a p p le t s . Lo s a p p le t s q u e h a s e je cu t a d o e s t á n
re fe re n cia d o s p o r u n a e t iq u e t a e s p e cia l e n e l fich e ro HTML - - le e t iq u e t a
< AP P LET> . Lo s a p p le t s p u e d e n s it u a rs e e n cu a lq u ie r lu g a r, e n u n a
m á q u in a lo ca l o e n cu a lq u ie r lu g a r d e In t e rn e t . La p o s ició n d e l a p p le t e s
co m p le t a m e n t e in vis ib le p a ra t i, e l u s u a rio . S in e m b a rg o , la p o s ició n d e l
a p p le t e s t á co d ifica d a d e n t ro d e la e t iq u e t a < AP P LET> . El n a ve g a d o r,
d e co d ifica e s t a in fo rm a ció n , lo ca liza e l a p p le t y lo e je cu t a . S i e l a p p le t
e s t á e n o t ra m á q u in a d is t in t a a la t u ya , e l n a ve g a d o r d e b e d e s ca rg a r e l
a p p le t a n t e s d e e je cu t a rlo .
Es t o e s e l a cce s o d e a lt o n ive l q u e t ie n e s e n In t e rn e t d e s d e e l e n t o rn o d e
d e s a rro llo d e Ja va . Alg u íe n h a u t iliza d o s u t ie m p o e n e s crib ir u n
n a ve g a d o r q u e h a ce t o d o e l t ra b a jo s u cio d e co n e xió n a la re d , y o b t e n e r
lo s d a t o s d e e lla , y q u e t e p e rm it e e je cu t a r a p p le t s d e cu a lq u ie r lu g a r d e l
m undo.
P a ra m á s in fo rm a c ió n :
La s le ccio n e s d e Es crib ir Ap p le t s d e s crib e n co m o e s crib ir a p p le t s Ja va
d e s d e la A h a s t a la Z.

Cargar Imágenes desde URLs


S i t e h a s a ve n t u ra d o a e s crib ir t u s p ro p io s a p p le t s y a p lica cio n e s Ja va ,
p o d ría s h a b e r e je cu t a d o u n a cla s e d e l p a q u e t e ja va . n e t lla m a d a URL.
Es t a cla s e re p re s e n t e a u n Un ifo rm Re s o u rce Lo ca t o r, q u e e s la d ire cció n
d e a lg ú n re cu rs o e n la re d . Tu s a p p le t s y a p lica cio n e s p u e d e n u t iliza r u n a
URL p a ra re fe re n cia r e in clu s o co n e ct a rs e a re cu rs o s d e la re d . Po r
e je m p lo , p a ra ca rg a r u n a im a g e n d e s d e la re d , u n p ro g ra m a Ja va d e b e
p rim e ro cre a r u n a URL q u e co n t e n g a la d ire cció n d e la im a g e n .
Es t a e s la s ig u ie n t e in t e ra cció n d e a lt o n ive l q u e p u e d e s t e n e r co n
In t e rn e t - - t u s p ro g ra m a s Ja va o b t ie n e n u n a d ire cció n d e a lg o q u e
q u ie re n , cre a n u n a URL p a ra e llo , y u t iliza n a lg u n a fu n ció n e xis t e n t e e n
e l e n t o rn o d e d e s a rro llo d e Ja va q u e h a ce e l t ra b a jo s u cio d e co n e ct a r
co n la re d y re cu p e ra r e l re cu rs o .
P a ra m á s in fo rm a c ió n :
Ca rg a r Im á g e n e s m u e s t ra có m o ca rg a r u n a im a g e n e n t u p ro g ra m a Ja va
( t a n t o e n a p p le t s co m o e n a p lica cio n e s ) cu a n d o s e t ie n e s u URL. An t e s
d e p o d e r ca rg a r la im a g e n d e b e cre a r u n o b je t o URL co n la d ire cció n d e l
re cu rs o .
Tra b a ja r co n URLs , la s ig u ie n t e le cció n e n e s t a ru t a , p ro p o rcio n a u n a
co m p le t a e xp lica ció n s o b re la s URLs , in clu ye n d o có m o p u e d e n t u s
p ro g ra m a s co n e ct a r co n e lla s y le e r y e s crib ir d a t o s d e s d e e s a co n e xió n .

Oz it o
¿Qué es una URL?
S i h a s n a ve g a d o p o r la Wo rld Wid e We b , in d u d a b le m e n t e h a b rá s o id o e l t é rm in o
URL y h a b rá s u t iliza d o URLs p a ra a cce d e r a va ria s p á g in a s HTML d e la We b .
En t o n ce s , ¿ q u é e s e xa ct a m e n t e u n a URL? Bie n , lo s ig u ie n t e e s u n a s e n cilla , p e ro
fo rm a l d e fin ició n d e URL:

D e fin ic ió n : URL e s u n a cró n im o q u e vie n e d e Un ifo rm Re s o u rce Lo ca t o r y e s u n a


re fe re n cia ( u n a d ire cció n ) a u n re cu rs o d e In t e rn e t .

Alg u n a s ve ce s e s m á s s e n cillo ( a n q u e n o e n t e ra m e n t e a ce rt a d o ) p e n s a r e n u n a
URL co m o e l n o m b re d e u n fich e ro e n la re d p o rq u e la m a yo ría d e la s URLs s e
re fie re n a u n fich e ro o a lg u n a m á q u in a d e la re d . S in e m b a rg o , d e b e ría s re co rd a r
q u e la s URLs p u e d e n a p u n t a r a o t ro s re cu rs o s d e la re d , co m o co n s u lt a s a b a s e s d e
d a t o s , o s a lid a s d e co m a n d o s .
Lo s ig u ie n t e e s u n e je m p lo d e u n a URL:
http://java.sun.com/
Es t a URL p a rt icu la r d ire cció n a la We b d e Ja va h o s p e d a d a p o r S u n Micro s ys t e m s . La
URL a n t e rio r, co m o o t ra s URLs , t ie n e d o s co m p o n e n t e s p rin cip a le s :
● El in d e n d ifica d o r d e p ro t o co lo

● El n o m b re d e l re cu rs o

En e l e je m p lo , h t t p e s e l id e n t ifica d o r d e p ro t o co lo y / / ja v a . s u n . c o m / e s e l
n o m b re d e l re cu rs o .
El id e n t ifica d o r d e p ro t o co lo in d ica e l n o m b re d e l p ro t o co lo a u t iliza r p a ra b u s ca r
e s e re cu rs o . El e je m p lo u t iliza e l p ro t o co lo Hyp e r Te xt Tra n s fe r Pro t o co l ( HTTP) ,
q u e e s u t iliza d o t íp ica m e n t e p a ra s e rvir d o cu m e n t o s d e h yp e rt e xt o . HTTP e s s ó lo
u n o d e lo s d ife re n t e s p ro t o co lo s u t iliza d o s p a ra a cce d e r a lo s d is t in t o s t ip o s d e
re cu rs o s d e la re d . Ot ro s p ro t o co lo s in clu ye n File Tra n s fe r Pro t o co l ( ft p ) , Go p h e r
( g o p h e r) , File ( file ) , y Ne ws ( n e ws ) .
El n o m b re d e l re cu rs o e s la d ire cció n co m p le t a a l re cu rs o . El fo rm a t o d e l n o m b re
d e l re cu rs o d e p e n d e co m p le t a m e n t e d e l p ro t o co lo u t iliza d o , p e ro la m a yo ría d e lo s
fo rm a t o s d e n o m b re s d e re cu rs o s co n t ie n e n u n o o m á s d e lo s s ig u ie n t e s
co m p o n e n t e s :
n o m b re d e l h o s t
n o m b re d e la m á q u in a d o n d e re s id e e l re cu rs o .
n o m b re d e fic h e ro
e l p a t h a l fich e ro d e n t ro d e la m á q u in a
n ú m e ro d e p u e rt o
e l n ú m e ro d e p u e rt o a co n e ct a r ( n o rm a lm e n t e e s o p cio n a l)
re fe re n c ia
u n a re fe re n cia a u n a p o s ició n m a rca d a d e n t ro d e l re cu rs o ; n o rm a lm e n t e
id e n t ifica u n a p o s ició n e s p e cífica d e n t ro d e u n fich e ro ( n o rm a lm e n t e e s
o p cio n a l)
Pa ra m u ch o s p ro t o co lo s , e l n o m b re d e l h o s t y e l n o m b re d e l fich e ro s o n
o b lig a t o rio s y e l n ú m e ro d e p u e rt o y la re fe re n cia s o n o p cio n a le s . Po r e je m p lo , e l
n o m b re d e re cu ro s p a ra u n a URL HTTP d e b e ría e s p e cifica r u n s e rvid o r d e la re d ( e l
n o m b re d e l h o s t ) y e l p a t h a l d o cu m e n t o e n e s a m á q u in a ( n o m b re d e fich e ro ) , y
t a m b ié n p u e d e e s p e cifica r u n n ú m e ro d e p u e rt o y u n a re fe re n cia . En la URL
m o s t ra d a a n t e rio rm e n t e , ja v a . s u n . c o m e s e l n o m b re d e l h o s t y la b a rra in clin a d a
'/ ' e s e l p a t h p a ra e l n o m b re d e l fich e ro / in d e x . h t m l.
Cu a n d o co n s t ru ya s u n a URL, p o n p rim e ro e l in d e n t ifica d o r d e p ro t o co lo , s e g u id o
p o r d o s p u n t o s ( : ) , s e g u id o p o r e l n o m b re d e l re cu rs o , d e e s t a fo rm a :
protocoloID:nombredeRescuros
El p a q u e t e ja va . n e t co n t ie n e u n a cla s e lla m a d a URL q u e u t iliza n lo s p ro g ra m a s
Ja va p a ra re p re s e n t a r u n a d ire cció n URL. Tu s p ro g ra m a s Ja va p u e d e n co n s t ru ir u n
o b je t o URL, a b rir u n a co n e xió n co n e l, le e r y e s crib ir d a t o s a t ra vé s d e e s a
co n e xió n . La s p á g in a s s ig u ie n t e s d e e s t a le cció n le e n s e ñ a n có m o t ra b a ja r co n
o b je t o s URL e n p ro g ra m a s Ja va .

También puedes ver


ja va . n e t . URL

N o t a s o b re la t e rm in ilo g ía : El t é rm in o URL p u e d e s e r a m b ig u o - - s e p u e d e
re fe rir a l co n ce p t o d e la d ire cció n d e a lg o e n In t e rn e t o a u n o b je t o URL e n t u s
p ro g ra m a s Ja va . No rm a lm e n t e e l s ig n ifica d o e s cla ro d e p e n d ie n d o d e l co n t e xt o d e
la s e n t e n cia , o s i n o im p o rt a q u e la s e n t e n cia s e a p liq u e a a m b o s . S in e m b a rg o ,
d o n d e lo s s ig n ifica d o s d e URL d e b a n d ife re n cia rs e u n o d e l o t ro , e s t e t e xt o u t iliza
Dire cció n URL p a ra in d ica r e l co n ce p t o d e u n a d ire cció n d e In t e rn e t y o b je t o URL
p a ra re fe rirs e a u n e je m p la r d e la cla s e URL e n t u p ro g ra m a .

Oz it o
Crear una URL
La fo rm a m á s s e n cilla d e cre a r u n o b je t o URL e s cre a rlo d e s d e u n a Ca d e n a q u e re p re s e n t e la
fo rm a "Le ib le " d e la d ire cció n URL. Es t a e s la fo rm a t íp ica q u e o t ra p e rs o n a u t iliza ría p a ra d e cirt e
u n a URL. Po r e je m p lo , p a ra d e cirle la d ire cció n d e Ga m e la n q u e co n t ie n e u n a lis t a d e s it io s s o b re
Ja va , p o d ría m o s d á rt e la d e la s ig u ie n t e fo rm a :
http://www.gamelan.com/
En t u p ro g rm a Ja va , p u e d e u t iliza r u n a ca d e n a q u e co n t e n g a e l t e xt o a n t e rio r p a ra cre a r u n
o b je t o URL:
URL gamelan = new URL("http://www.gamelan.com/");
El o b je t o URL a n t e rio r re p re s e n t a u n a URL a b s o lu t a . Un a URL a b s o lu t a co n t ie n e t o d a la
in fo rm a ció n n e ce s a ria p a ra a lca n za r e l re cu rs o e n cu e s t ió n . Ta m b ié n p u e d e s cre a r o b je t o s URL
d e s d e u n a d ire cció n URL re la t iv a .

Crear una URL relativa a otra


Un a URL re la t iva s ó lo co n t ie n e la in fo rm a ció n s u ficie n t e p a ra a lca n za r e l re cu rs o e n
re la ció n a ( o e n e l co n t e xt o d e ) o t ra URL.
La s e p e cifica cio n e s d e la s URL re la t iva s s e u t iliza n fre cu e n t e m e n t e e n fich e ro s HTML.
Po r e je m p lo , s u p o n q u e h a s e s crit o u n fich e ro HTML lla m a d o Ho m e P a g e . h t m l. De n t ro
d e e s t a p á g in a , h a y e n la ce s a o t ra s p á g in a s , g ra fic o s . h t m l y P re fe re n c ia s . h t m l, q u e
e s t á n e n la m is m a m á q u in a y e n e l m is m o d ire ct o rio q u e Ho m e P a g e . h t m l. Es t o s
e n la ce s a g ra fic o s . h t m l y P re fe re n c ia s . h t m l d e s d e Ho m e P a g e . h t m l p o d ría n
e s p e cifica rs e s ó lo co m o n o m b re s d e fich e ro s , d e la s ig u ie n t e fo rm a :
<a href="graficos.html">graficos</a>
<a href="preferencias.html">Preferencias</a>
Es t a s d ire cció n e s URL s o n URLs re la t iv a s . Es t o e s , la s URL e s t á s e s p e cifica d a s e n
re la ció n a l fich e ro e n e l q u e e s t á n co n t e n id a s Ho m e P a g e . h t m l.
En t u s p ro g ra m a s ja va , p u e d e s cre a r u n o b je t o URL d e s d e u n a e s p e cifica ció n URL
re la t iva . Po r e je m p lo , s u p o n q u e ya h a s cre a d o u n a URL p a ra
"h t t p : / / www. g a m e la n . co m / " e n t u p ro g ra m a , y q u e s a b e s lo s n o m b re s d e va rio s
fich e ro s e n e s a s it e ( Ga m e la n . n e t w o rk . h t m l, y Ga m e la n . a n im a t io n . h t m l) . Pu e d e s
cre a r URLs p a ra ca d a fich e ro d e Ga m e la n s im p le m e n t e e s p e cifica n d o e l n o m b re d e l
fich e ro e n e l co n t e xt o d e la URL o rig in a l d e Ga m e la n . Lo s n o m b re s d e fich e ro s s o n
URLs re la t iva s y e s t á n e n re la ció n a la URL o rig in a l d e Ga m e la n .
URL gamelan = new URL("http://www.gamelan.com/");
URL gamelanNetwork = new URL(gamelan, "Gamelan.network.html");
Es t e có d ig o u t iliza u n co n s t ru ct o r d e la cla s e URL q u e p e rm it e cre a r u n o b je t o URL
d e s d e u n o b je t o URL ( la b a s e ) y u n a URL re la t iva .
Es t e co n s t ru ct o r t a m b ié n e s ú t il p a ra cre a r URL lla m a d o s a n cla s ( t a m b ié n co n o cid o s
co m o re fe re n cia s ) d e n t ro d e u n fich e ro . Po r e je m p lo , s u p o n q u e e l fich e ro
"Ga m e la n . n e t wo rk. h t m l" t ie n e u n a re fe re n cia lla m a d a BOTTOM q u e e s t á a l fin a l d e l
fich e ro . Pu e d e s u t iliza r e l co n s t ru ct o r d e URL re la t iva p a ra cre a r u n a URL co m o e s t a :
URL gamelanNetworkBottom = new URL(gamelanNetwork, "#BOTTOM");
La fo rm a g e n e ra l d e e s t e co n s t ru ct o r d e URL e s :
URL(URL URLbase, String URLrelativa)
El p rim e r a rg u m e n t o e s u n o b je t o URL q u e e s p e cifica la b a s e d e la n e va URL, y e l
s e g u n d o a rg u m e n t o e s u n a ca d e n a q u e e s p e cifica e l re s t o d e l n o m b re d e l re cu rs o
re la t ivo a la b a s e . S i URLb a s e e s n u ll, e n t o n ce s e s t e co n s t ru ct o r t ra t a URLre la t iv a
co m o s i fu e ra u n a e s p e cifica ció n d e u n a URL a b s o lu t a . Y a l re vé s , s i re la t iv e URL e s u n a
e s p e cifica ció n d e URL a b s o lu t a , e n t o n ce s e l co n s t ru ct o r ig n o ra b a s e URL.

Otros Constructores de URL


La cla s e URL p ro p o rcio n a d o s co n s t ru ct o re s a d icio n a le s p a ra cre a r u n o b je t o URL. Es t o s
co n s t ru ct o re s s o n ú t ile s cu a n d o t ra b a ja n co n URLs co m o URLs HTTP, q u e t ie n e n lo s
co m p o n e n t e s d e l n o m b re d e l h o s t , e l n o m b re d e l fich e ro , e l n ú m e ro d e p u e rt o y u n a
re fe re n cia e n la p a rt e d e l n o m b re d e l re cu rs o d e la URL. Es t o s d o s co n s t ru ct o re s s o n
ú t ile s cu a n d o n o s e t ie n e u n a ca d e n a q u e co n t ie n e la e s p e cifica ció n co m p le t a d e la
URL, p e ro s i co n o ce n a lg u n o s co m p o n e n t e s d e la URL.
Po r e je m p lo , s i h a s d is e ñ a d o u n n a ve g a d o r co n u n p a n e l s im ila r a l e xp lo ra d o r d e
fich e ro s q u e le p e rm it e a l u s u a rio u t iliza r e l ra t ó n p a ra s e le ccio n a r e l p ro t o co lo , e l
n o m b re d e l h o s t , e l n ú m e ro d e l p u e rt o , e l n o m b re d e l fich e ro , p u e d e s co n s t ru ir u n a
URL a p a rt ir d e e s t o s co m p o n e n t e s . El p rim e r co n s t ru ct o r cre a u n a URL d e s d e u n
p ro t o co lo , u n n o m b re d e h o s t y u n n o m b re d e fich e ro . El s ig u ie n t e có d ig o cre a u n a URL
d e l fich e ro Ga m e la n . n e t w o rk . h t m l e n la s it e d e Ga m e la n :
URL gamelan = new URL("http", "www.gamelan.com", "/Gamelan.network.html");
Es t o e s e q u iva le n t e a
URL( "h t t p :/ / w w w . g a m e la n . c o m / Ga m e la n . n e t w o rk . h t m l") . El p rim e r a rg u m e n t o
e s e l p ro t o co lo , e l s e g u n d o e s e l n o m b re d e l h o s t y e l ú lt im o a rg u m e n t o e s e l p a t h d e l
fich e ro . Ob s e rva q u e e l n o m b re d e l fich e ro co n t ie n e la b a rra in clin a d a ( / ) a l p rin cip io .
Es t o in d ica q u e e l n o m b re d e fich e ro e s t á e s p e cifica d o d e s d e la ra íz d e l h o s t .
El ú lt im o co n s t ru ct o r d e URL a ñ a d e e l n ú m e ro d e p u e rt o a la lis t a d e lo s a rg u m e n t o s
u t iliza d o s p o r e l co n s t ru ct o r a n t e rio r.
URL gamelan = new URL("http", "www.gamelan.com", 80, "/Gamelan.network.html");
Es t o cre a u n o b je t o URL co n la s ig u ie n t e d ire cció n URL:
http://www.gamelan.com:80/Gamelan.network.html
S i co n s t ru ye s u n a URL u t iliza n d o u n o d e e s t o s co n s t ru ct o re s , p u e d e s o b t e n e r u n a
ca d e n a q u e co n t ie n e la d ire cció n URL co m p le t a , u t iliza n d o e l m é t o d o t o S t rin g ( ) d e la
cla s e URL o e l m é t o d o t o Ex t e rn a lFo rm ( ) e q u iva le n t e .

MalformedURLException
Ca d a u n o d e lo s cu a t ro co n s t ru ct o re s d e URL la n za u n a Ma lfo rm e d URLExce p t io n s i lo s
a rg u m e n t o s d e l co n s t ru ct o r s o n n u lo s o e l p ro t o co lo e s d e s co n o cid o . Típ ica m e n t e , s e
q u e rrá ca p t u ra r y m a n e ja r e s t a e xce p ció n . As í n o rm a lm e n t e d e b e ría s in t ro d u cir t u
co n s t ru ct o r d e URL e n u n p a r t ry/ ca t ch .
try {
URL myURL = new URL(. . .)
} catch (MalformedURLException e) {
. . .
// Aquí va el código del manejador de excepciones
. . .
}
Pu e d e ve r Ma n e ja r Erro re s Ut iliza n d o Exce p cio n e s p a ra o b t e n e r in fo rm a ció n s o b re e l
m a n e jo d e e xce p cio n e s .

N o t a : La s URLs s o n o b je t o s d e "u n a s ó la e s crit u ra ". Un a ve z q u e h a s cre a d o u n o b je t o URL n o s e


p u e d e ca m b ia r n in g u n o d e s u s a t rib u t o s ( p ro t o co lo , n o m b re d e l h o s t , n o m b re d e l fich e ro n i
n ú m e ro d e p u e rt o ) .

Oz it o
Analizar una URL
La cla s e URL p ro p o rcio n a va rio s m é t o d o s q u e p e rm it e n p re g u n t a r a lo s o b je t o s URL. Pu e d e o b t e n e r
e l p ro t o co lo , n o m b re d e h o s t , n ú m e ro d e p u e rt o , y n o m b re d e fich e ro d e u n a URL u t iliza n d o e s t o s
m é t o d o s a cce s o re s :
g e t P ro t o c o l( )
De vu e lve e l co m p o n e n t e id e n t ifica d o r d e p ro t o co lo d e la URL.
g e t Ho s t ( )
De vu e lve e l co m p o n e n t e n o m b re d e l h o s t d e la URL.
g e t P o rt ( )
De vu e lve e l co m p o n e n t e n ú m e ro d e l p u e rt o d e la URL. Es t e m é t o d o d e vu e lve u n e n t e ro q u e e s
e l n ú m e ro d e p u e rt o . S i e l p u e rt o n o e s t á s e lccio n a d o , d e vu e lve - 1 .
g e t File ( )
De vu e lve e l co m p o n e n t e n o m b re d e fich e ro d e la URL.
g e t Re f( )
Ob t ie n e e l co m p o n e n t e re fe re n cia d e la URL.
N o t a : Re cu e rd a q u e n o t o d a s la s d ire ccio n e s URL co n t ie n e n e s t o s co m p o n e n t e s . La cla s e URL
p ro p o rcio n a e s t o s m é t o d o s p o rq u e la s URLs d e HTTP co n t ie n e n e s t o s co m p o n e n t e s y q u izá s s o n la s
URLs m á s u t iliza d a s . La cla s e URL e s t á ce n t ra d a d e a lg u n a fo rm a s o b re HTTP.
S e p u e d e n u t iliza r e s t o s m é t o d o s g e t XXX( ) p a ra o b t e n e r in fo rm a ció n s o b re la URL s in im p o rt a r e l
co n s t ru ct o r q u e s e h a ya u t iliza d o p a ra cre a r e l o b je t o URL.
La cla s e URL, ju n t o co n e s t o s m é t o d o s a cce s o re s , lib e ra d e t e n e r q u e a n a liza r la URL d e n u e vo !
Da n d o a cu a lq u ie r ca d e n a la e s p e cifica ció n d e u n a URL, y s ó lo cre a n d o u n n u e vo o b je t o URL y
lla m a n a d o a u n o d e s u s m é t o d o s a cce s o re s p a ra la in fo rm a ció n q u e s e n e ce s it e . Es t e p e q u e ñ o
p ro g ra m a d e e je m p lo cre a u n a URL p a rt ie n d o d e u n a e s p e cifica ció n y lu e g o u t iliza lo s m é t o d o s
a cce s o re s d e l o b je t o URL p a ra a n a liza r la URL:
import java.net.*;
import java.io.*;

class ParseURL {
public static void main(String[] args) {
URL aURL = null;
try {
aURL = new URL("http://java.sun.com:80/tutorial/intro.html#DOWNLOADING");
System.out.println("protocol = " + aURL.getProtocol());
System.out.println("host = " + aURL.getHost());
System.out.println("filename = " + aURL.getFile());
System.out.println("port = " + aURL.getPort());
System.out.println("ref = " + aURL.getRef());
} catch (MalformedURLException e) {
System.out.println("MalformedURLException: " + e);
}
}
}
Aq u í t ie n e s la s a lid a m o s t ra d a p o r e l p ro g ra m a :
protocol = http
host = java.sun.com
filename = /tutorial/intro.html
port = 80
ref = DOWNLOADING
Oz it o
Leer Directamente desde una URL
De s p u é s d e h a b e r cre a d o s a t is fa ct o ria m e n t e u n a URL, s e p u e d e lla m a r a l m é t o d o
o p e n S t re a m ( ) d e la cla s e URL p a ra o b t e n e r u n ca n a l d e s d e e l q u e p o d e r le e r e l
co n t e n id o d e la URL. El m é t o d o re t o rn a u n o b je t o ja va . io . In p u t S t re a m p o r lo q u e s e
p u e d e le e r n o rm a lm e n t e d e la URL u t iliza n d o lo s m é t o d o s n o rm a le s d e In p u t S t re a m .
Ca n a le s d e En t ra d a y S a lid a d e s crib e la s cla s e s d e I/ O p ro p o rcio n a d a s p o r e l e n t o rn o
d e d e s a rro llo d e Ja va y e n s e ñ a có m o u t iliza rla s .
Le e r d e s d e u n a URL e s t a n s e n cillo co m o le e r d e u n ca n a l d e e n t ra d a . El s ig u ie n t e
p ro g ra m a u t iliza o p e n S t re a m ( ) p a ra o b t e n e r u n s t re a m d e e n t ra d a a la URL
"h t t p : / / www. ya h o o . co m / ". Le e e l co n t e n id o d e l ca n a l d e e n t ra d a y lo m u e s t ra e n la
p a n t a lla .
import java.net.*;
import java.io.*;

class OpenStreamTest {
public static void main(String[] args) {
try {
URL yahoo = new URL("http://www.yahoo.com/");
DataInputStream dis = new DataInputStream(yahoo.openStream());
String inputLine;

while ((inputLine = dis.readLine()) != null) {


System.out.println(inputLine);
}
dis.close();
} catch (MalformedURLException me) {
System.out.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.out.println("IOException: " + ioe);
}
}
}
Cu a n d o e je cu t e s e l p ro g ra m a , d e b e ró a s ve r lo s co m a n d o s HTML y e l co n t e n id o t e xt u a l
d e l fich e ro HTMl lo ca liza d o e n "h t t p : / / www. ya h o o . co m / " d e s p la zá n d o s e p o r s u ve n t a n a
d e co m a n d o s .
O p o d ría s ve r e l s ig u ie n t e m e n s a je d e e rro r:
IOException: java.net.UnknownHostException: www.yahoo.com
El m e n s a je a n t e rio r in d ica q u e s e p o d ría t e n e r s e le ccio n a d o u n p ro x y y p o r e s o e l
p ro g ra m a n o p u e d e e n co n t a r e l s e rvid o r www. ya h o o . co m . ( S i e s n e ce s a rio , p re g u n t a le
a t u a d m in is t a d o r p o r e l p ro xy d e s u s e rvid o r. )

Oz it o
Conectar con una URL
S i h a s cre a d o s a t is fa ct o ria m e n t e u n a URL, p u e d e s lla m a r a l m é t o d o
o p e n Co n n e c t io n ( ) d e la cla s e URL p a ra co n e ct a r co n e lla . Cu a n d o h a ya s
co n e ct a d o co n u n a URL h a b rá in icia liza d o u n e n la ce d e co m u n ica ció n e n t re u n
p ro g ra m a Ja va y la URL a t ra vé s d e la re d . Po r e je m p lo , p u e d e s a b rir u n a co n e xió n
co n e l m o t o r d e b ú s q u e d a d e Ya h o o co n e l có d ig o s ig u ie n t e :
try {
URL yahoo = new URL("http://www.yahoo.com/");
yahoo.openConnection();
} catch (MalformedURLException e) { // nueva URL() fallada
. . .
} catch (IOException e) { // openConnection() fallada
. . .
}
S i e s p o s ib le , e l m é t o d o o p e n Co n n e c t io n ( ) cre a u n a n u e vo o b je t o URLCo n n e ct io n
( s i n o e xis t e n in g u n o a p ro p ia d o ) , lo in icia liza , co n e ct a co n la URL y d e vu e lve e l
o b je t o URLCo n n e ct io n . S i a lg o va m a l - - p o r e je m p lo , e l s e rvid o r d e Ya h o o e s t á
a p a g a d o - - e l m é t o d o o p e n Co n n e c t io n ( ) la n za u n a IOExce p t io n .
Ah o ra q u e t e h a s co n e ct a d o s a t is fa ct o ria m e n t e co n la URL p u e d e s u t iliza r e l o b je t o
URLCo n n e ct io n p a ra re a liza r a lg u n a s a ccio n e s co m o le e r o e s crib ir a t ra vé s d e la
co n e xió n . La s ig u ie n t e s e cció n d e e s t a le cció n t e e n s e ñ a có m o le e r o e s crib ir a
t ra vé s d e u n o b je t o URLco n n e ct io n .

También puedes ver


ja va . n e t . URLCo n n e ct io n

Oz it o
Leer y Escribir a través de un objeto URLConnection
S i h a s u t iliza d o s a t is fa ct o ria m e n t e o p e n Co n n e c t io n ( ) p a ra in icia liza r co m u n ica cio n e s co n u n a URL,
t e n d rá s u n a re fe re n cia a u n o b je t o URLCo n n e ct io n . La cla s e URLCo n n e ct io n co n t ie n e m u ch o s m é t o d o s
q u e p e rm it e n co m u n ica rs e co n la URL a t ra vé s d e la re d . URLCo n n e ct io n e s u n a cla s e ce n t ra d a s o b re
HTTP - - m u ch o s d e s u s m é t o d o s s o n ú t ile s s ó lo cu a n d o t ra b a ja n co n URLs HTTP. S in e m b a rg o , la
m a yo ría d e lo s p ro t o co lo s URL p e rm it e le e r y e s crib ir d e s d e u n a co n e xió n p o r e s o e s t a p á g in a e n s e ñ a
co m o le e r y e s crib ir d e s d e u n a URL a t ra vé s d e u n o b je t o URLCo n n e ct io n .

Leer desde un objeto URLConnection


El s ig u ie n t e p ro g ra m a re a liza la m is m a fu n ció n q u e e l m o s t ra d o e n Le e r Dire ct a m e n t e
d e s d e u n a URL. S in e m b a rg o , m e jo r q u e a b rir d ire ct a m e n t e u n s t re a m d e s d e la URL, e s t e
p ro g ra m a a b re e xp lícit a m e n t e u n a co n e xió n co n la URL, o b t ie n e u n s t re a m d e e n t ra d a
s o b re la co n e xió n , y le e d e s d e e l s t re a m d e e n t ra d a :
import java.net.*;
import java.io.*;

class ConnectionTest {
public static void main(String[] args) {
try {
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yahooConnection = yahoo.openConnection();
DataInputStream dis = new
DataInputStream(yahooConnection.getInputStream());
String inputLine;

while ((inputLine = dis.readLine()) != null) {


System.out.println(inputLine);
}
dis.close();
} catch (MalformedURLException me) {
System.out.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.out.println("IOException: " + ioe);
}
}
}
La s a lid a d e e s t e p ro g ra m a d e b e ría s e r id é n t ica a la s a lid a d e l p ro g ra m a q u e a b ría
d ire ct a m e n t e e l s t re a m d e s d e la URL. Pu e d e s u t iliza r cu a lq u ie ra d e e s t a s d o s fo rm a s p a ra
le e r d e s d e u n a URL. S in e m b a rg o , a lg u n a s ve ce s le e r d e s d e u n a URLCo n n e ct io n e n ve z d e
le e r d ire ct a m e n t e d e s d e u n a URL p o d ría s e r m á s ú t il ya q u e s e p u e d e u t iliza r e l o b je t o
URLCo n n e ct io n p a ra o t ra s t a re a s ( co m o e s crib ir s o b re la co n e xió n URL) a l m is m o t ie m p o .
De n u e vo , s i e n ve z d e ve r la s a lid a d e l p ro g ra m a , s e vie ra e l s ig u ie n t e m e n s a je e rro r:
IOException: java.net.UnknownHostException: www.yahoo.com
Po d ría s t e n e r a ct iva d o u n p ro xy y e l p ro g ra m a n o p o d ría e n co n t ra r e l s e rvid o r d e
www. ya h o o . co m .

Escribir a una URLConnection


Mu ch a s p á g in a s HTML co n t ie n e n fo rm s - - ca m p o s d e t e xt o y o t ro s o b je t o GUI q u e le
p e rm it e n in t ro d u cir d a t o s e n e l s e rvid o r. De s p u é s d e t e cle a r la in fo rm a ció n re q u e rid a e
in icia r la p e t ició n p u ls a n d o u n b o t ó n , e l n a ve g a d o r q u e s e u t iliza e s crib e lo s d a t o s e n la URL
a t ra vé s d e la re d . De s p u é s d e q u e la o t ra p a rt e d e la co n e xió n ( n o rm a le m e n t e u n s crip t
cg i- b in ) e n e l s e rvid o r d e d a t o s , lo s p ro ce s a , y le e n vía d e vu e lt a u n a re s p u e s t a ,
n o rm a lm e n t e e n la fo rm a d e u n a n u e va p á g in a HTML. Es t e e s e n a rio e s e l u t iliza d o
n o rm a lm e n t e p o r lo s m o t o re s d e b ú s q u e d a .
Mu ch o s s crip t s cg i- b in u t iliza n e l POS T METHOD p a ra le e r lo s d a t o s d e s d e e l clie n t e . As í,
e s crib ir s o b re u n a URL fre cu e n t e m e n t e e s co n o cid o co m o p o s t in g a URL. Lo s s crip t s d e l la d o
d e l s e rvid o r u t iliza n e l m é t o d o POS T METHOD p a ra le e r d e s d e s u e n t ra d a e s t a n d a rd .

N o t a : Alg u n o s s crip t s cg i- b in d e l la d o d e l s e rvid o r u t iliza n e l m é t o d o GET METHOD p a ra


le e r s u s d a t o s . El m é t o d o POS T METHOD e s m á s rá p id o h a cie n d o q u e GET METHOD e s t é
o b s o le t o p o rq u e e s m á s ve rs á t il y n o t ie n e lim it a cio n e s s o b re lo s d a t o s q u e p u e d e n s e r
e n via d o s a t ra vé s d e la co n e xió n .

Tu s p ro g ra m a s Ja va t a m b ié n p u e d e n in t e ra ct u a r co n lo s s crip t s cg i- b in d e l la d o d e l
s e rvid o r. S ó lo d e b e n p o d e r e s crib ir a u n a URL, a s í p ro p o rcio n a n lo s d a t o s a l s e rvird o r. Tu
p ro g ra m a p u e d e h a ce r e s t o s ig u ie n d o lo s s ig u ie n t e s p a s o s :
1 . Cre a r u n a URL.
2 . Ab rir u n a co n e xió n co n la URL.
3 . Ob t e n e r u n s t re a m d e s a lid a s o b re la co n e xió n . Es t e ca n a l d e e n t ra d a e s t á co n e ct a d o
a l s t re a m d e e n t ra d a e s t a n d a rd d e l s crip t cg i- b in d e l s e rvid o r.
4 . Es crib ir e n e l s t re a m d e s a lid a .
5 . Ce rra r e l s t ra m d e s a lid a .
Ha s s a n S ch ro e d e r, u n m ie m b ro d e l e q u ip o d e Ja va , e s crib ió u n s crip t cg i- b in , lla m a d o
b a c k w a rd s , y e s t á d is p o n ib le e n la We b s it e d e , ja v a . s u n . c o m . Pu e d e s u t iliza r e s t e s crip t
p a ra p ro b a r e l s ig u ie n t e p ro g ra m a d e e je m p lo . S i p o r a lg u n a ra zó n n o p u e d e s o b t e n e rlo d e
n u e s t ra We b ; p u e d e s p o n e r e l s crip t e n cu a lq u ie r lu g a r d e la re d , lla m á n d o lo b a c k w a rd s , y
p ru e b a e l p ro g ra m a lo ca lm e n t e .
El s crip t d e n u e s t ra We b le e u n a ca d e n a d e la e n t ra d a e s t a n d a rd , in vie rt e la ca d e n a , y
e s crib e e l re s u lt a d o e n la s a lid a e s t a n d a rd . El s crip t re q u ie re u n a e n t ra d a d e la s ig u ie n t e
fo rm a : s t rin g = s t rin g _ t o _ re v e rs e , d o n d e s t rin g _ t o _ re v e rs e e s la ca d e n a cu yo s
ca ra ct e re s va n a m o s t ra rs e e n o rd e n in ve rs o .
Aq u í t ie n e w u n p ro g ra m a d e e je m p lo q u e e je cu t a e l s crip t b a c k w a rd s a t ra vé s d e la re d
u t iliza n d o u n URLCo n n e ct io n :
import java.io.*;
import java.net.*;

public class ReverseTest {


public static void main(String[] args) {
try {
if (args.length != 1) {
System.err.println("Usage: java ReverseTest string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[0]);

URL url = new URL("http://java.sun.com/cgi-bin/backwards");


URLConnection connection = url.openConnection();

PrintStream outStream = new PrintStream(connection.getOutputStream());


outStream.println("string=" + stringToReverse);
outStream.close();

DataInputStream inStream = new


DataInputStream(connection.getInputStream());
String inputLine;

while ((inputLine = inStream.readLine()) != null) {


System.out.println(inputLine);
}
inStream.close();
} catch (MalformedURLException me) {
System.err.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.err.println("IOException: " + ioe);
}
}
}
Exa m in e m o s e l p ro g ra m a y ve a m o s co m o t ra b a ja . Prim e ro , e l p ro g ra m a p ro ce s a lo s
a rg u m e n t o s d e la lín e a d e co m a n d o s :
if (args.length != 1) {
System.err.println("Usage: java ReverseTest string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[0]);
Es t a s lín e a s a s e g u ra n q u e e l u s u a rio p ro p o rcio n a u n o y s ó lo u n a rg u m e n t o d e la lín e a d e
co m a n d o s d e l p ro g ra m a y lo co d ifica . El a rg u m e n t o d e la lín e a d e co m a n d o s e s la ca d e n a a
in ve rt ir p o r e l s crip t cg i- b in b a c k w a rd s . El a rg u m e n t o d e la lín e a d e co m a n d o s p o d ría
t e n e r e s p a cio s u o t ro s ca ra ct e t e s n o a lfa n u m é rico s . Es t o s ca ra ct e re s d e b e n s e r co d ifica d o s
p o rq u e p o d ría n s u ce d e r va rio s p ro ce s o s e n la ca d e n a e n e l la d o d e l s e rvid o r. Es t o s e
co n s ig u e m e d ia n t e la cla s e URLEn co d e r.
Lu e g o e l p ro g ra m a cre a e l o b je t o URL - - la URL p a ra e l s crip t b a c k w a rd s e n ja va . s u n . co m .
URL url = new URL("http://java.sun.com/cgi-bin/backwards");
El p ro g ra m a cre a u n a URLCo n n e ct io n y a b re u n s t re a m d e s a lid a s o b re e s a co n e xió n . El
s t re a m d e s a lid a e s t á filt ra d o a t ra vé s d e u n Prin t S t re a m .
URLConnection connection = url.openConnection();
PrintStream outStream = new PrintStream(connection.getOutputStream());
La s e g u n d a lín e a a n t e rio r lla m a a l m é t o d o g e t Ou t p u t S t re a m ( ) s o b re la co n e xió n . S i n o
URL n o s o p o rt a s a lid a , e s t e m é t o d o la n za u n a Un kn o wn S e rvice Exce p t io n . S i la URL s o p o rt a
s a lid a , e s t e m é t o d o d e vu e lve u n s t re a m d e s a lid a q u e e s t á co n e ct a d o a l s t re a m d e e n t ra d a
e s t a n d a rd d e la URL e n e l la d o d e l s e rvid o r - - la s a lid a d e l clie n t e e s la e n t ra d a d e l s e rvid o r.
Lu e g o , e l p ro g ra m a e s crib e la in fo rm a ció n re q u e rid a a l s t re a m d e s a lid a y cie rra e l s t re a m :
outStream.println("string=" + stringToReverse);
outStream.close();
Es t a lín e a e s crib e e n e l ca n a l d e s a lid a u t iliza n d o e l m é t o d o p rin t ln ( ) . Co m o p u e d e s ve r,
e s crib ir d a t o s a u n a URL e s t a n s e n cillo co m o e s crib ir d a t o s e n u n s t re a m . Lo s d a t o s
e s crit o s e n e l s t re a m d e s a lid a e n e l la d o d e l clie n t e s o n la e n t ra d a p a ra e l s crip t
b a c k w a rd s e n e l la d o d e l s e rvid o r. El p ro g ra m a Re ve rs e Te s t co n s t ru ye la e n t ra d a e n la
fo rm a re q u irid a p o r e l s crip t m e d ia n t e la co n ca t e n a ció n s t rin g = p a ra co d ifica r la ca d e n a .
Fre cu e n t e m e n t e , co m o e n e s t e e je m p lo , cu a n d o e s crib e e n u n a URL e s t á p a s a n d o
in fo rm a ció n a l s crip t cg i- b in q u e le e la in fo rm a ció n q u e u s t e d e s crib e , re a liza a lg u n a a cció n
y lu e g o e n vía la in fo rm a ció n d e vu e lt a m e d ia n t e la m is m a URL. Po r lo q u e q u e rrá s le e r
d e s d e la URL d e s p u é s d e h a b e r e s crit o e n e lla . El p ro g ra m a Re ve rs e Te s t lo s h a ce d e e s t a
fo rm a :
DataInputStream inStream = new DataInputStream(connection.getInputStream());
String inputLine;
while (null != (inputLine = inStream.readLine())) {
System.out.println(inputLine);
}
inStream.close();
Cu a n d o e je cu t e s e l p ro g ra m a Re ve rs e Te s t u t iliza n d o I n v ie rt e m e co m o a rg u m e n t o ,
d e b e ría s ve r e s t a s a lid a :
Invierteme
reversed is:
emetreivnI

Oz it o
Todo sobre los Sockets
Ut iliza s URLS y URLCo n n e ct io n s p a ra co m u n ica rt e a t ra vé s d e la re d a u n n ive l
re la t iva m e n t a a lt o y p a ra u n p ro p ó s it o e s p e cífico : a cce d e r a lo s re cu ro s d e
In t e rn e t . Alg u n a s ve ce s t u s p ro g ra m a s re q u ie re n u n a co m u n ica ció n e n la re d a u n
n ive l m á s b a jo , p o r e je m p lo , cu a n d o q u ie ra s e s crib ir u n a a p lica ció n
clie n t e - s e rvid o r.
En a p lica cio n e s clie n t e - s e rvid o r, e l s e rvid o r p ro p o rcio n a a lg ú n s e rvicio , co m o
p ro ce s a r co n s u lt a s a b a s e s d e d a t o s o e n via r lo s p re cio s a ct u a liza d o s d e l s t o ck. El
clie n t e u t iliza e l s e rvicio p ro p o rcio n a d o p o r e l s e rvid o r p a ra a lg ú n fin , m o s t ra r lo s
re s u lt a d o s d e la co n s u lt a a la b a s e d e d a t o s , o h a ce r re co m e n d a cio n e s d e p e d id o s
a u n in ve rs o r. La co m u n ica ció n q u e o cu rre e n t re e l clie n t e y e l s e rvid o r d e b e s e r
fia b le - - lo s d a t o s n o p u e d e ca e rs e y d e b e n lle g a r a l la d o d e l clie n t e e n e l m is m o
o rd e n e n e l q u e fu e ro n e n via d o s .
TCP p ro p o rcio n a u n ca n a l d e co m u n ica ció n fia b le p u n t o a p u n t o , lo q u e u t iliza n
p a ra co m u n ica rs e la s a p lica cio n e s clie n t e - s e rvid o r e n In t e rn e t . La s cla s e s S o cke t y
S e rve rS o cke t d e l p a q u e t e ja va . n e t p ro p o rcio n a n u n ca n a l d e co m u n ica ció n
in d e p e n d ie n t e d e l s is t e m a u t iliza n d o TCP.

¿Qué es un Socket?
Un s o cke t e s u n p u n t o fin a l e n u n e n la ce d e co m u n ica ció n d e d o s vía s
e n t re d o s p ro g ra m a s q u e s e e je cu t a n e n la re d . La s cla s e s S o cke t s o n
u t iliza d a s p a ra re p re s e n t a r co n e xio n e s e n t re u n p ro g ra m a clie n t e y o t ro
p ro g ra m a s e rvid o r. El p a q u e t e ja va . n e t p ro p o rcio n a d o s cla s e s - - S o cke t
y S e rve rS o cke t - - q u e im p le m e n t a n lo s la d o s d e l clie n t e y d e l s e rvid o r d e
u n a co n e xió n , re s p e ct iva m e n t e .

Leer y Escribir a través de un Socket


Es t a p á g in a co n t ie n e u n p e q u e ñ o e je m p lo q u e ilu s t ra có m o u n p ro g ra m a
clie n t e p u e d e le e r y e s crib ir a t ra vé s d e u n s o cke t .

Escribir desde el Lado del Servidor a través de un Socket


La p á g in a a n t e rio r m o s t ró u n e je m p lo d e có m o e s crib ir e n u n p ro g ra m a
clie n t e q u e in t e ra ct u a co n s e rvid o r e xis t e n t e m e d ia n t e u n o b je t o S o cke t .
Es t a p á g in a m u e s t ra có m o s e p u e d e e s crib ir u n p ro g ra m a q u e
im p le m e n t e e l o t ro la d o d e la co n e xió n - - u n p ro g ra m a s e rvid o r.

Oz it o
¿Qué es un Socket?
Un a a p lica ció n s e rvid o r n o rm a lm e n t e e s cu ch a a u n p u e rt o e s p e cífico e s p e ra n d o
u n a p e t ició n d e co n e xió n d e u n clie n t e . Cu a n d o lle g a u n a p e t ició n d e co n e xió n , e l
clie n t e y e l s e rvid o r e s t a b le ce n u n a co n e xió n d e d ica d a s o b re la q u e p o d e r
co m u n ica rs e . Du ra n t e e l p ro ce s o d e co n e xió n , e l clie n t e e s a s ig n a d o a u n n ú m e ro
d e p u e rt o , y a t a u n s o c k e t a e lla . El clie n t e h a b la a l s e rvid o r e s crib ie n d o s o b re e l
s o cke t y o b t ie n e in fo rm a ció n d e l s e rvid o r cu a n d o le e d e é l. S im ila rm e n t e , e l
s e rvid o r o b t ie n e u n n u e vo n ú m e ro d e p u e rt o lo ca l ( n e ce s it a u n n u e vo p u e rt o p a ra
p o d e r co n t in u a r e s cu ch a n d o p a ra p e t ició n d e co n e xió n d e l p u e rt o o rig in a l. ) El
s e rvid o r t a m b ié n a t a u n s o cke t a e s t e p u e rt o lo ca l y co m u n ica co n é l m e d ia n t e la
le ct u ra y e s crit u ra s o b re é l.
El clie n t e y e l s e rvid o r d e b e n p o n e rs e d e a cu e rd o s o b re e l p ro t o co lo - - e s t o e s ,
d e b e p o n e rs e d e a cu e rd o e n e l le n g u a je p a ra t ra n s fe rir la in fo rm a ció n d e vu e lt a
a t ra vé s d e l s o cke t .

D e fin ic ió n : Un s o cke t e s u n p u n t o fin a l d e u n e n la ce d e co m u n ica ció n d e d o s vía s


e n t re d o s p ro g ra m a s q u e s e e je cu t a n a t ra vé s d e la re d .

El p a q u e t e ja va . n e t d e l e n t o rn o d e d e s a rro llo d e Ja va p ro p o rcio n a u n a cla s e - -


S o cke t - - q u e re p re s e n t a u n fin a l d e u n a co m u n ica ció n d e d o s vía s e n t re u n
p ro g ra m a ja va y o t ro p ro g ra m a d e la re d . La cla s e S o cke t im p le m e n t a e l la d o d e l
s e rvid o r d e u n e n la ce d e d o s vía s . S i e s t á s e s crib ie n d o s o ft wa re d e s e rvid o r,
t a m b ié n e s t a rá s in t e re s a d o e n la cla s e S e rve rS o cke t q u e im p le m e n t a e l la d o d e l
s e rvid o r e n u n e n la ce d e d o s vía s . Es t a le cció n m u e s t ra có m o u t iliza r la s cla s e s
S o cke t y S e rve rS o cke t .
S i e s t á s ; in t e n t a n d o co n e ct a r co n la Wo rld Wid e We b , la cla s e URL y la s cla s e s
re la cio n a d a s co n e s t a ( URLCo n n e ct io n , URLEn co d e r) s o n m á s in d ica d a s p a ra lo q u e
e s t á s h a cie n d o . La s URLs s o n co n e xio n e s d e n ive l re la t iva m e n t e a lt o p a ra la We b y
u t iliza n lo s s o cke t s co m o p a rt e d e s u im p le m e n t a ció n in t e rn a . Pu e d e s ve r Tra b a ja r
co n URLs p a ra m á s in fo rm a ció n s o b re co m o co n e ct a rs e co n la We b m e d ia n t e URLs .

También puedes ver


ja va . n e t . S e rve rS o cke t
ja va . n e t . S o cke t

Oz it o
Leer y Escribir a través de un Socket
El s ig u ie n t e p ro g ra m a e s u n e je m p lo s e n cillo d e có m o e s t a b le ce r u n a co n e xió n e n t re u n
p ro g ra m a clie n t e y o t ro s e rvid o r u t iliza n d o s o cke t s . La cla s e S o cke t d e l p a q u e t e ja va . n e t e s u n a
im p le m e n t a ció n in d e p e n d ie n t e d e la p la t a fo rm a d e u n clie n t e p a ra u n e n la ce d e co m u n ica ció n d e
d o s vía s e n t re u n clie n t e y u n s e rvid o r. La cla s e S o cke t s e s it ú a e n la p a rt e s u p e rio r d e u n a
im p le m e n t a ció n d e p e n d ie n t e d e la p la t a fo rm a , o cu lt a n d o lo s d e t a lle s d e lo s s is t e m a s p a rt icu la re s
a u n p ro g ra m a Ja va . Ut iliza n d o la cla s e ja va . n e t . S o cke t e n lu g a r d e t ra t a r co n có d ig o n a t ivo , lo s
p ro g ra m a s Ja va p u e d e n co m u n ica rs e a t ra vé s d e la re d d e u n a fo rm a in d e p e n d ie n t e d e la
p la t a fo rm a .
Es t e p ro g ra m a clie n t e , Ech o Te s t , co n e ct a co n e l Ech o d e l s e rvid o r ( e n e l p o rt 7 ) m e d ia n t e u n
s o cke t . El clie n t e le e y e s crib e a t ra vé s d e l s o cke t . Ech o Te s t e n vía t o d o e l t e xt o t e cle a d o e n s u
e n t ra d a e s t a n d a rd a l Ech o d e l s e rvid o r, e s crib ie n d o le e l t e xt o a l s o cke t . El s e rvid o r re p it e t o d o s
lo s ca ra ct e re s re cib id o s e n s u e n t ra d a d e s d e e l clie n t e d e vu e lt a a t ra vé s d e l s o cke t a l clie n t e . El
p ro g ra m a clie n t e le e y m u e s t ra lo s d a t o s p a s a d o s d e vu e lt a d e s d e e l s e rvid o r.
import java.io.*;
import java.net.*;

public class EchoTest {


public static void main(String[] args) {
Socket echoSocket = null;
DataOutputStream os = null;
DataInputStream is = null;
DataInputStream stdIn = new DataInputStream(System.in);

try {
echoSocket = new Socket("taranis", 7);
os = new DataOutputStream(echoSocket.getOutputStream());
is = new DataInputStream(echoSocket.getInputStream());
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: taranis");
}

if (echoSocket != null && os != null && is != null) {


try {
String userInput;

while ((userInput = stdIn.readLine()) != null) {


os.writeBytes(userInput);
os.writeByte('\n');
System.out.println("echo: " + is.readLine());
}
os.close();
is.close();
echoSocket.close();
} catch (IOException e) {
System.err.println("I/O failed on the connection to: taranis");
}
}
}
}
Pa s e e m o s a t ra vé s d e l p ro g ra m a e in ve s t ig u e m o s la s co s a s in t e re s a n t e s .
La s s ig u ie n t e s t re s lín e a s d e có d ig o d e n t ro d e l p rim e r b lo q u e t ry d e l m é t o d o m a in ( ) s o n crít ico s
- - e s t a b le ce n la co n e xió n d e l s o cke t e n t re e l clie n t e y e l s e rvid o r y a b re u n ca n a l d e e n t ra d a y u n
ca n a l d e s a lid a s o b re e l s o cke t :
echoSocket = new Socket("taranis", 7);
os = new DataOutputStream(echoSocket.getOutputStream());
is = new DataInputStream(echoSocket.getInputStream());
La p rim e ra lín e a d e e s t a s e cu e n cia cre a u n n u e vo o b je t o S o cke t y lo lla m a e c h o S o c k e t . El
co n s t ru ct o r S o cke t u t iliza d o a q u í ( h a y o t ro s t re s ) re q u ie re e l n o m b re d e la m á q u in a y e l n ú m e ro
d e p u e rt o a l q u e q u ie re co n e ct a rs e . El p ro g ra m a d e e je m p lo u t iliza e l h o s t t a ra n is , q u e e s e l
n o m b re d e u n a m á q u in a ( h ip o t é t ica ) d e n u e s t ra re d lo ca l. Cu a n d o t e cle e s y e je cu t e s e s t e
p ro g ra m a e n t u m á q u in a , d e b e ría s ca m b ia r e s t e n o m b re p o r u n a m á q u in a d e t u re d . As e g u ra t e
d e q u e e l n o m b re q u e u t iliza t ie n e s e l n o m b re IP t o t a lm e n t e cu a lifica d o d e la m á q u in a a la q u e
t e q u ie re s co n e ct a r. El s e g u n d o a rg u m e n t o e s e l n ú m e ro d e p u e rt o . El p u e rt o n ú m e ro 7 e s e l
p u e rt o p o r e l q u e e s cu ch a e l Ech o d e l s e rvid o r.
La s e g u n d a lín e a d e l có d ig o a n t e rio r a b re u n ca n a l d e e t n ra d a s o b re e l s o cke t , y la t e rce ra lín e a
a b re u n ca n a l d e s a lid a s o b re e l m is m o s o cke t . Ech o Te s t s ó lo n e ce s it a e s crib ir e n e l s t re a m d e
s a lid a y le e r d e l s t re a m d e e n t ra d a p a ra co m u n ica rs e a t ra vé s d e l s o cke t co n e l s e rvid o r. El re s t o
d e l p ro g ra m a h a ce e s t o . S i n o e s t á s fa m ilia riza d o co n lo s s t re a m s d e e n t ra d a y s a lid a , p o d ría s
q u e re r le e r S t re a m s d e En t ra d a y S a lid a .
La s ig u ie n t e s e cció n d e có d ig o le e d e s d e e l s t re a m d e e n t ra n d a e s t a n d a rd d e Ech o Te s t ( d o n d e e l
u s u a rio t e cle a lo s d a t o s ) u n a lín e a ca d a ve z. Ech o Te s t e s crib e in m e d ia t a m e n t e la e n t a d a s e g u id a
p o r u n ca rá ct e r d e n u e va lín e a e n e l s t re a m d e s a lid a co n e ct a d o a l s o cke t .
String userInput;

while ((userInput = stdIn.readLine()) != null) {


os.writeBytes(userInput);
os.writeByte('\n');
System.out.println("echo: " + is.readLine());
}
La ú lt im a lín e a d e l b u cle w h ile le e u n a lín e a d e in fo rm a ció n d e s d e e l s t re a m d e e n t ra d a
co n e ct a d o a l s o cke t . El m é t o d o re a d Lin e ( ) s e b lo q u e a h a s t a q u e e l s e rvid o r h a ya d e vu e lt o la
in fo rm a ció n a Ech o Te s t . Cu a n d o re a d lin e ( ) re t o rn a , Ech o Te s t im p rim e la in fo rm a ció n e n la
s a lid a e s t a n d a rd .
Es t e b lo q u e co n t in u a - - Ech o Te s t le e la e n t ra d a d e l u s u a iro , la e n vía a l s e rvid o r Ech o , o b t ie n e
u n a re s p u e s t a d e s d e e l s e rvid o r y la m u e s t ra - - h a s t a q u e e l u s u a rio t e cle e u n ca rá ct e r d e fin a l
d e e n t ra d a .
Cu a n d o e l u s u a rio t e cle a u n ca rá ct e r d e fin d e e n t ra d a , e l b u cle w h ile t e rm in a y e l p ro g ra m a
co n t in ú a e je cu t a n d o la s s ig u ie n t e s lín e a s d e có d ig o :
os.close();
is.close();
echoSocket.close();
Es t a s lín e a d e có d ig o ca e n e n la ca t e g o ría d e lim p ie za d e l h o g a r. Un p ro g ra m a co n b u e n
co m p o rt a m ie n t e o , s e lim p ia a s í m is m o y e s t e p ro g ra m a t ie n e b u e n co m p o rt a m ie n t o . Es t a s t re s
lín e a s d e có d ig o cie rra n la s s t re a m s d e e n t ra d a y s a lid a co n e ct a d o s a l s o cke t , y cie rra la
co n e xió n d e l s o cke t co n e l s e rvid o r. El o rd e n e s im p o rt a n t e - - d e b e ce rra r lo s s t re a m s
co n e ct a d o s a u n s o cke t a n t e s d e ce rra r é s t e .
Es t e p ro g ra m a clie n t e t ie n e u n co m p o rt a m ie n t o co rre ct o y s e n cillo p o rq u e e l s e rvid o r Ech o
im p le m e n t a u n p ro t o co lo s e n cillo . El clie n t e e n vía t e xt o a l s e rvid o r, y e l s e rvid o r lo d e vu e lve .
Cu a n d o t u s p ro g ra m a s clie n t e s h a b le n co n s e rvid o re s m á s co m p lica d o s co m o u n s e rvid o r h t t p , t u
p ro g ra m a clie n t e t a m b ié n s e rá m á s co m p lica d o . S i e m b a rg o , la s co s a s b á s ica s s o n la s q u e h a s
vis t o e n e s t e p ro g ra m a :
1 . Ab rir u n s o cke t .
2 . Ab rir u n s t re a m d e e n t ra d a y o t ro d e s a lid a h a cia e l s o cke t .
3 . Le e r y e s crib ir a t ra vé s d e l s o cke t d e a cu e rd o a l p ro t o co lo d e l s e rvid o r.
4 . Ce rra r lo s S t re a m s .
5 . Ce rra r e l s o cke t .
S ó lo e l p a s o 3 s e rá d ife re n t e d e u n clie n t e a o t ro , d e p e n d ie n d o d e l s e rvid o r. Lo s o t ro s p a s o s
p e rm a n e ce n in a lt e ra b le s .

También puede ver


ja va . n e t . S o cke t

Oz it o
Escribir el Lado del Servidor de un Socket
Es t a s e cció n le m u e s t ra có m o e s crib ir e l la d o d e l s e rvid o r d e u n a co n e xió n s o cke t , co n u n e je m p lo
co m p le t o clie n t e - s e rvid o r. El s e rvid o r e n e l p a re ja clie n t e / s e rvid o r s irve b ro m a s "Kn o ck Kn o ck". La s
b ro m a s Kn o ck Kn o ck s o n la s fa vo rit a s p o r lo s n iñ o s p e q u e ñ o s y q u e n o rm a lm e n t e s o n ve h ícu lo s p a ra
m a lo s ju e g o s d e p a la b ra s . S o n d e e s t a fo rm a :
S e rv id o r: "Kn o ck kn o ck!"
Clie n t e : "¿ Qu ié n e s ? "
S e rv id o r: "De xt e r. "
Clie n t e : "¿ Qu é De xt e r? "
S e rv id o r: "La e n t ra d a d e De xt e r co n ra m a s d e a ce b o . "
Clie n t e : "Ge m id o . "
El e je m p lo co n s is t e e n d o s p ro g ra m a s Ja va in d e p e n d ie n t e s e je cu t a n d o s e : e l p ro g ra m a clie n t e y e l
s e rvid o r. El p ro g ra m a clie n t e e s t á im p le m e n t a d o p o r u n a s ó la cla s e Kn o ckKn o ckClie n t , y e s t á b a s a d o e n
e l e je m p lo Ech o Te s t d e la p á g in a a n t e rio r. El p ro g ra m a s e rvid o r e s t á im p le m e n t a d o p o r d o s cla s e s :
Kn o ckKn o ckS e rve r y KKS t a t e . Kn o ckKn o ckS e rve r co n t ie n e e l m é t o d o m a in ( ) p a ra e l p ro g ra m s e rvid o r y
re a liza t o d o e l t ra b a jo d u ro , d e e s cu ch a r e l p u e rt o , e s t a b le ce r co n e xio n e s , y le e r y e s crib ir a t ra vé s d e l
s o cke t . KKS t a t e s irve la b ro m a s : s ig u e la p is t a d e la b ro m a a ct u a l, e l e s t a d o a ct u a l ( e n via r ko n ck kn o ck,
e n via r p is t a s , e t c. . . ) y s e rvir va ria s p ie za s d e t e xt o d e la b ro m a d e p e n d ie n d o d e l e s t a d o a ct u a l. Es t a
p á g in a e xp lica lo s d e t a lle s d e ca d a cla s e e n e s t o s p ro g ra m a s y fin a lm e n t e le m u e s t ra có m o e je cu t a rla s .

El servidor Knock Knock


Es t a s e cció n p a s a a t ra vé s d e l có d ig o q u e im p le m e n t e e l p ro g ra m a s e rvid o r Kn o ck Kn o ck,
Aq u í t ie n e s e l có d ig o fu e n t e co m p le t o d e la cla s e Kn o ckKn o ckS e rve r. cla s s . El p ro g ra m a
s e rvid o r e m p ie za cre a n d o u n n u e vo o b je t o S e rve rS o cke t p a ra e s cu ch a r e n u n p u e rt o
e s p e cífico . Cu a n d o e s crib a u n s e rvid o r, d e b e ría e le g ir u n p u e rt o q u e n o e s t u vie ra ya d e d ica d o
a o t ro s e rvicio , Kn o ckKn o ckS e rve r e s cu ch a e n e l p u e rt o 4 4 4 4 p o rq u e s u ce d e q u e e l 4 e s m i
n ú m e ro fa vo rit o y e l p u e rt o 4 4 4 4 n o e s t á s ie n d o u t iliza d o p o r n in g u n a o t ra co s a e n m i
e n t o rn o :
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port: " + 4444 + ", " + e);
System.exit(1);
}
S e rve rS o cke t e s u n a cla s e ja va . n e t q u e p ro p o rcio n a u n a im p le m e n t a ció n in d e p e n d ie n t e s d e l
s is t e m a d e l la d o d e l s e rvid o r d e u n a co n e xió n clie n t e / s e rvid o r. El co n s t ru ct o r d e S e rve rS o cke t
la n za u n a e xce p ció n p o r a lg u n a ra zó n ( có m o q u e e l p u e rt o ya e s t á s ie n d o u t iliza d o ) n o p u e d e
e s cu ch a r e n e l p u e rt o e s p e cifica d o . En e s t e ca s o , e l Kn o ckKn o ckS e rve r n o t ie n e e le cció n p e ro
s a le .
S i e l s e rvid o r s e co n e ct a co n é xit o co n s u p u e rt o , e l o b je t o S e rve rS o cke t s e cre a y e l s e rvid o r
co n t in u a co n e l s ig u ie n t e p a s o , q u e e s a ce p t a r u n a co n e xió n d e s d e e l clie n t e .
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: " + 4444 + ", " + e);
System.exit(1);
}
El m é t o d o a c c e p t ( ) s e b lo q u e a ( e s p e ra ) h a s t a q u e u n clie n t e e m p ie ce y p id a u n a co n e xió n e l
p u e rt o ( e n e s t e ca s o 4 4 4 4 ) q u e e l s e rvid o r e s t á e s cu ch a n d o . Cu a n d o e l m é t o d o a c c e p t ( )
e s t a b le ce la co n e xió n co n é xit o co n e l clie n t e , d e vu e lve u n o b je t o S o cke t q u e a p u n t a a u n
p u e rt o lo ca l n u e vo . El s e rvid o r p u e d e co n t in u a r co n e l clie n t e s o b re e s t e n u e vo S o cke t e n u n
p u e rt o d ife re n t e d e l q u e e s t a b a e s cu ch a n d o o rig in a lm e n t e p a ra la s co n e xio n e s . Po r e s o e l
s e rvid o r p u e d e co n t in u a r e s cu ch a n d o n u e va s p e t icio n e s d e clie n t e s a t ra vé s d e l p u e rt o
o rig in a l d e l S e rve rS o cke t . Es t a ve rs ió n d e l p ro g ra m a d e e je m p lo n o e s cu ch a m á s p e t icio n e s
d e clie n t e s . S in e m b a rg o , u n a ve rs ió n m o d ifica d a d e e s t e p ro g ra m a , p o rp o cio n a d a m á s
a d e la n t e , s i lo h a ce .

El có d ig o q u e h a y d e n t ro d e l s ig u ie n t e b lo q u e t ry im p le m e m t e e l la d o d e l s e rvid o r d e u n a
co m u n ica ció n co n e l clie n t e . Es t a s e cció n d e l s e rvid o r e s m u y s im ila r a l la d o d e l clie n t e ( q u e
vió e n e l e je m p lo d e la p á g in a a n t e rio r y q u e ve rá m á s a d e la n t e e n e l e je m p lo d e la cla s e
Kn o ckKn o ckClie n t ) :
● Ab re u n s t re a m d e e n t ra d a y o t ro d e s a lid a s o b re u n s o cke t .

● Le e y e s crib e a t ra vé s d e l s o cke t .

Em p e ce m o s co n la s p rim e ra s 6 lín e a s :
DataInputStream is = new DataInputStream(
new BufferedInputStream(clientSocket.getInputStream()));
PrintStream os = new PrintStream(
new BufferedOutputStream(clientSocket.getOutputStream(), 1024), false);
String inputLine, outputLine;
KKState kks = new KKState();
La s p rim e ra s d o s lín e a s d e l có d ig o a b re n u n s t re a m d e e n t ra d a s o b re e l s o cke t d e vu e lt o p o r e l
m é t o d o a c c e p t ( ) . La s s ig u ie n t e d o s lín e a s a b re n u n s t re a m d e s a lid a s o b re e l m is m o s o cke t .
La s ig u ie n t e lín e a d e cla ra y cre a u n p a r d e s t rin g s lo ca le s u t iliza d a s p a ra le e r y e s crib ir s o b re
e l s o cke t . Y fin a lm e n t e , la ú lt im a lín e a cre a u n o b je t o KKS t a t e . Es t e e s e l o b je t o q u e s ig u e la
p is t a d e la b ro m a a ct u a l, e l e s t a d o a ct u a l d e n t ro d e u n a b ro m a , e t c. . Es t e o b je t o im p le m e n t a
e l p ro t o co lo - - e l le n g u a je q u e e l clie n t e y e l s e rvid o r d e b e n u t iliza r p a ra co m u n ica rs e .
El s e rvid o r e s e l p rim e ro e n h a b la r, co n e s t a s lín e a s d e có d ig o :
outputLine = kks.processInput(null);
os.println(outputLine);
os.flush();
La p rim e ra lín e a d e có d ig o o b t ie n e d e l o b je t o KKS t a t e la p rim e ra lín e a q u e e l s e rvid o r le d ice
a l clie n t e . Po r e je m p lo lo p rim e ro q u e e l s e rvid o r d ice e s "Kn o ck! Kn o ck!".
La s s ig u ie n t e s d o s lín e a s e s crib e n e n e l s t re a m d e s a lid a co n e ct a d o a l s o cke t d e l clie n t e y
va cía e l s t re a m d e s a lid a . Es t a s e cu e n cia d e có d ig o in icia la co n ve rs a ció n e n t re e l clie n t e y e l
s e rvid o r.
La s ig u ie n t e s e cció n d e có d ig o e s u n b u cle q u e le e y e s crib e a t ra vé s d e l s o cke t e n via n d o y
re cib ie n d o m e n s a je s s e n t re e l clie n t e y e l s e rvid o r m ie n t ra s q u e t e n g a n q u e d e cirs e a lg o e l
u n o a l o t ro . Co m o e l s e rvid o r in icia la co n ve rs a ció n co n u n "Kn o ck! Kn o ck!", e l s e rvid o r d e b e
e s p e ra r la re s p u e s t a d e l clie n t e . As í e l b u cle w h ile it e ra y le e d e l s t re a m d e e n t ra d a . El
m é t o d o re a d Lin e ( ) e s p e ra h a s t a q u e e l clie n t e re s p o n d a n a lg o e s crib ie n d o a lg o e n e l s t re a m
d e s a lid a ( e l s t re a m d e e n t ra d a d e l s e rvid o r) . Cu a n d o e l clie n t e re s p o n d e , e l s e rvid o r p a s a la
re s p u e s t a a l o b je t o KKS t a t e y le p id e a é s t e u n a re s p u e s t a a d e cu a d a . El s e rvid o r
in m e d ia t a m e n t e e n vía la re s p u e s t a a l clie n t e m e d ia n t e e l s t re a m d e s a lid a co n e ct a d o a l
s o cke t , u t iliza n d o la s lla m a d a s a p rin t ln ( ) y flu s h ( ) . S i la re s p u e s t a d e l s e rvid o r g e n e ra d a
p o r e l o b je t o KKS t a t e e s "Bye . ", in d ica q u e e l clie n t e d ijo q u e n o q u e ría m á s b ro m a s y e l b u cle
t e rm in a .
while ((inputLine = is.readLine()) != null) {
outputLine = kks.processInput(inputLine);
os.println(outputLine);
os.flush();
if (outputLine.equals("Bye."))
break;
}
La cla s e Kn o ckKn o ckS e rve r e s u n s e rvid o r d e b u e n co m p o rt a m ie n t o , ya q u e la s ú lt im a s lín e a s
d e e s t a s e cció n re a liza n la lim p ie za ce rra n d o t o d a s lo s s t re a m s d e e n t ra d a y s a lid a , e l s o cke t
d e l clie n t e , y e l s o cke t d e l s e rvid o r.
os.close();
is.close();
clientSocket.close();
serverSocket.close();

El Protocolo Knock Knock


La cla s e KKS t a t e im p le m e n t a e l p ro t o co lo q u e d e b e n u t iliza r e l clie n t e y e l s e rvid o r p a ra
co m u n ica rs e . Es t a cla s e s ig u e la p is t a d e d ó n d e e s t á n e l clie n t e y e l s e rvid o r e n s u
co m u n ica ció n y s irve la s re s p u e s t a s d e l s e rvid o r a la s s e t e n cia s d e l clie n t e . El o b je t o KKS t a t e
co n t ie n e e l t e xt o d e t o d o s la s b ro m a s y s e a s e g u ra d e q u e e l s e rvid o r o fre ce la re s p u e s t a
a d e cu a d a a la s fra s e s d e l clie n t e . No d e b e ría d e cir e l clie n t e "¿ Qu é De xt e r? " cu a n d o e l
s e rvid o r d ice "Kn o ck! Kn o ck!".
To d o s la s p a re ja s clie n t e - s e rvid o r d e d e n t e n e r a lg ú n p ro t o co lo e n e l q u e h a b la r u n o co n o t ro ,
o e l s ig n ifica d o d e lo s d a t o s q u e s e p a s a n u n o s a o t ro . El p ro t o co lo q u e u t ilice n s u s clie n t e s y
s e rvid o re s d e p e n d e n e n t e ra m e n t e d e la co m u n ica ció n re q u e rid a p o r e llo s p a ra re a liza r s u
t a re a .

El Cliente Knock Knock


La cla s e Kn o ckKn o ckClie n t im p le m e n t a e l p ro g ra m a clie n t e q u e h a b la co n Kn o ckKn o ckS e rve r.
Kn o ckKn o ckClie n t e s t á b a s a d o e n e l p ro g ra m a Ech o Te s t d e la p á g in a a n t e rio r y d e b e ría s e rt e
fa m ilia r. Pe ro e ch e m o s u n vis t a zo d e t o d a s fo rm a s p a ra ve r lo q u e s u ce d e e n e l clie n t e ,
m ie n t ra s t e n e m o s e n m e n t e lo q u e s u ce d ía e n e l s e rvid o r.
Cu a n d o a rra n ca e l p ro g ra m clie n t e , e l s e rvid o r d e b e ría e s t a r ya e je cu t á n d o s e y e s cu ch a n d o e l
p u e rt o e s p e ra n d o u n p e t ició n d e co n e xió n p o r p a rt e d e l clie n t e .
kkSocket = new Socket("taranis", 4444);
os = new PrintStream(kkSocket.getOutputStream());
is = new DataInputStream(kkSocket.getInputStream());
As í, lo p rim e ro q u e h a ce e l p ro g ra m a clie n t e e s a b rir u n s o cke t s o b re e l p u e rt o e n e l q u e e s t á
e s cu ch a n d o e l s e rvid o r e n la m á q u in a e n la q u e s e e s t á e je cu t a n d o e l s e rvid o r. El p ro g ra m a
e je m p lo Kn o ckKn o ckClie n t a b re u n s o cke t s o b re e l p u e rt o 4 4 4 4 q u e e l m is m o p o r e l q u e e s t á
e s cu ch a n d o e l s e rvid o r. Kn o ckKn o ckClie n t u t iliza e l n o m b re d e h o s t t a ra n is , q u e e s e l n o m b re
d e u n a m á q u in a ( h ip o t é t ica ) e n t u re d lo ca l. Cu a n d o t e cle e s y e je cu t e s e s t e p ro g ra m a e n t u
m á q u in a , d e b e ría s ca m b ia r e s t e n o m b re p o r e l d e u n a m á q u in a d e t u re d . Es t a e s la m á q u in a
e n la e je cu t a rá Kn o ckKn o ckS e rve r.
Lu e g o e l clie n t e a b re u n s t re a m d e e n t ra d a y o t ro d e s a lid a s o b re e l s o cke t .
Lu e g o co m ie n za e l b u cle q u e im p le m e n t a la co m u n ica ció n e n t re e l clie n t e y e l s e rvid o r. El
s e rvid o r h a b la p rim e ro , p o r lo q u e e l clie n t e d e b e e s cu ch a r, lo q u e h a ce le ye n d o d e s d e e l
s t re a m d e e n t ra d a a d o s a d o a l s o cke t . Cu a n d o e l s e rvid o r h a b la , s i d ice "Bye , ", e l clie n t e s a le
d e l b u cle . De o t ra fo rm a m u e s t ra e l t e xt o e n la s a lid a e s t a n d a rd , y lu e g o le e la re s p u e s t a d e l
u s u a rio , q u e la t e cle a e n a l e n t ra d a e s t a n d a rd . De s p u é s d e q u e e l u s u a rio t e cle e e l re t o rn o d e
ca rro , e l clie n t e e n vía e l t e xt o a l s e rvid o r a t ra vé s d e l s t re a m d e s a lid a a d o s a d o a l s o cke t .
while ((fromServer = is.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye."))
break;
while ((c = System.in.read()) != '\n') {
buf.append((char)c);
}
System.out.println("Client: " + buf);
os.println(buf.toString());
os.flush();
buf.setLength(0);
}
La co m u n ica ció n t e rm in a cu a n d o e l s e rvid o r p re g u n t a s i e l clie n t e q u ie re e s cu ch a r o t ra b ro m a ,
s i e l u s u a rio d ice n o , e l s e rvid o r d ice "Bye . ".
En e l in t e ré s d e u n a b u e n a lim p ie za , e l clie n t e cie rra s u s s t re a m s d e e n t ra d a y s a lid a y e l
s o cke t :
os.close();
is.close();
kkSocket.close();

Ejecutar los Programas


Prim e ro s e d e b e a rra n ca r e l p ro g ra m a s e rvid o r. Ha z e s t o e je cu t a n d o e l p ro g ra m a s e rvid o r
u t iliza n d o e l in t é rp re t e d e Ja va , co m o lo h a ría co n cu a lq u ie r o t ro p ro g ra m a . Re cu e rd a q u e
d e b e s e je cu t a rlo e n la m á q u in a q u e e l p ro g ra m a clie n t e e s p e cifica cu a n d o cre a e l s o cke t .
Lu e g o e je cu t a s e l p ro g ra m a clie n t e . Ob s e rva q u e p u e d e s e je cu a rlo e n cu a lq u ie r m á q u in a d e t u
re d , n o t ie n e p o rq u e e je cu t a rs e e n la m is m a m á q u in a q u e e l s e rvid o r.
S i e s d e m a s ia d o rá p id o , p o d ría a rra n ca r e l clie n t e a n t e s d e q u e e l clie n t e t u vie ra la
o p o rt u n id a d d e in cia liza rs e y e m p e za r a e s cu ch a r e l p u e rt o . S i e s t o s u ce d e ve rá s e l s ig u ie n t e
m e n s a je d e e rro r cu a n d o in t e n t e s a rra n ca r e l p ro g ra m a clie n t e :
Exception: java.net.SocketException: Connection refused
S i e s t o s u ce d e , in t e n t a e je cu t a r e l p ro g ra m a clie n t e d e n u e vo .
Ve rá s e l s ig u ie n t e m e n s a je d e e rro r s i s e t e o lvid ó ca m b ia r e l n o m b re d e l h o s t e n e l có d ig o
fu e n t e d e l p ro g ra m a Kn o ckKn o ckClie n t .
Trying to connect to unknown host: java.net.UnknownHostException: taranis
Mo d ifica e l p ro g ra m a Kn o ckKn o ckClie n t y p ro p o rcio n a u n n o m b re d e h o s t vá lid o e n t u re d .
Re co m p ila e l p ro g ra m a clie n t e e in t e n t a lo d e n u e vo .
S i in t e n t a s a rra n ca r u n s e g u n d o clie n t e m ie n t ra s e l p rim e ro e s t á co n e ct a d o a l s e rvid o r, e l
s e g u n d o co lg a rá . La s ig u ie n t e s e cció n le cu e n t a co m o s o p o rt a r m ú lt ip le s clie n t e s .

Cu a n d o o b t e n g a s u n a co n e xió n e n t re e l clie n t e y e l s e rvid o r ve rá s e s t o e n t u p a n t a lla :


Server: Knock! Knock!
Ah o ra , d e b e rá s re s p o n d e r co n :
Who's there?
El clie n t e re p it e lo q u e h a s t e cle a d o y e n vía e l t e xt o a l s e rvid o r. El s e rvid o r re s p o n d e co n la
p rim e ra lín e a d e u n o d e s u s va ria s b ro m a s Kn o ck Kn o ck d e s u re p e rt o rio . Ah o ra t u p a n t a lla
d e b e ría co n t e n e r e s t o ( e l t e xt o q u e e s crib is t e ; e s t á e n n e g rit a ) :
Server: Knock! Knock!
Who's there?
Client: Who's there?
Server: Turnip
Ah o ra d e b e ría s re s p o n d e rle co n :
Turnip who?
De n u e vo , e l clie n t e re p it e lo q u e h a s t e cle a d o y e n vía e l t e xt o a l s e rvid o r. El s e rvid o r
re s p o n d e co n la lín e a g ra cio s a . Ah o ra t u p a n t a lla d e b e ría co n t e n e r e s t o ( e l t e xt o q u e
e s crib is t e ; e s t á e n n e g rit a ) :
Server: Knock! Knock!
Who's there?
Client: Who's there?
Server: Turnip
Turnip who?
Client: Turnip who?
Server: Turnip the heat, it's cold in here! Want another? (y/n)
S i q u ie re s o ir o t ra b o rm a t e cle a "y", s i n o , t e cle e "n ". S i t e cle a s "y", e l s e rvid o r e m p ie za d e
n u e vo co n "Kn o ck! Kn o ck!". S i t e cle a s "n " e l s e rvid o r d ice "Bye . ", h a cie n d o q u e t a n t o e l
clie n t e co m o e l s e rvid o r t e rm in e n .
S i e n cu a lq u ie r m o m e n t o co m e t e s u n e rro r a l t e cle a r, e l o b je t o KKS t a t e lo ca p t u ra , e l s e rvid o r
re s p o n d e co n u n m e n s a je s im ila r a e s t e , y e m p ie za la b ro m a o t ra ve z:
Server: You're supposed to say "Who's there?"! Try again. Knock! Knock!
El o b je t o KKS t a t e e s p a rt icu la r s o b re la o rt o g ra fía y la p u n t u a ció n , p e ro n o s o b re la s le t ra s
m a yú s cu la s y m in ú s cu la s .

Soportar Mútiples Clientes


El e je m p lo Kn o ckKn o ckS e rve r fu e d is e ñ a d o p a ra e s cu ch a r y m a n e ja r u n a s o la p e t ició n d e
co n e xió n . S in e m b a rg o , p u e d e n re cib irs e va ria s p e t icio n e s s o b re e l m is m o p u e rt o y
co n s e cu e n t e m e n t e s o b re e l m is m o S e rve S o cke t . La s p e t icio n e s d e co n e xio n e s d e clie n t e s s e
a lm e ce n a n e n e l p u e rt o , p a ra q u e e l s e rvid o r p u e d a a ce p t a rla s d e fo rm a s e cu e n cia l. S in
e m b a rg o , p u e d e s e rvirla s s im u lt a n e a m e n t e a t ra vé s d e l u s o d e t h re a d s - - u n t h re a d p a ra
p ro ce s a r ca d a co n e xió n d e clie n t e .
El flu jo ló g ico b á s ico e n e s t e s e rvid o r s e ría co m o e s t e :
while (true) {
aceptar un a conexión;
crear un thread para tratar a cada cliente;
end while
El t h re a d le e y e s crib e e n la co n e xió n d e l clie n t e cu a n d o s e a n e ce s a rio .
I n t e n t a e s t o : Mo d ifica e l Kn o ckKn o ckS e rve r p a ra q u e p u e d a s e rvir a va rio s clie n t e s a l m is m o
t ie m p o . Aq u í t ie n e s n u e s t ra s o lu ció n , q u e e s t á co m p u e s t a e n d o s cla s e s : KKMu lt iS e rve r y
KKMu lt iS e rve rTh re a d . KKMu lt iS e rve r h a ce u n b u cle co n t in ú o e s cu ch a n d o p e t icio n e s d e
co n e xió n d e s d e lo s clie n t e s e n u n S e rve rS o cke t . Cu a n d o lle g a u n a p e t ició n KKMu lt iS e rve r la
a cce p t a , cre a u n o b je t o KKMu lt iS e rve rTh re a d p a ra p ro ce s a rlo , m a n e ja n d o e l s o cke t d e vu e lt o
p o r a c c e p t ( ) , y a rra n ca e l t h re a d . Lu e g o e l s e rvid o r vu e lve a e s cu ch a r e n e l p u e rt o la s
p e t icio n e s d e co n e xió n . El o b je t o KKMu lt iS e rve rTh re a d co m u n ica co n e l clie n t e co n e l q u e e s t á
le ye n d o y e s crib ie n d o a t ra vé s d e l s o cke t . Eje cu t e e l n u e vo s e rvid o r Kn o ck Kn o ck y lu e g o
e je cu it e va rio s clie n t e s s u ce s iva m e n t e .

Oz it o
¿Qué es un Datagrama?
Lo s clie n t e s y s e rvid o re s q u e s e co m u n ica n m e d ia n t e u n ca n a l fia b le ( co m o u n a
URL o u n s o cke t ) t ie n e n u n ca n a l p u n t o a p u n t o d e d ica d o e n t re e llo s ( o a l m e n o s la
ilu s ió n d e u n o ) . Pa ra co m u n ica rs e , e s t a b le ce n u n a co n e xió n , t ra n s m it e n lo s d a t o s y
lu e g o cie rra n la co n e xió n . To d o s lo s d a t o s e n via d o s a t ra vé s d e l ca n a l s e re cib e n e n
e l m is m o o rd e n e n e l q u e fu e ro n e n via d o s . Es t o e s t á g a ra n t iza d o p o r e l ca n a l.
En co n t ra s t e , la s a p lica cio n e s q u e s e co m u n ica n m e d ia n t e d a t a g ra m a s e n vía n y
re cib e n p a q u e t e s d e in fo rm a ció n co m p le t a m e n t e in d e p e n d ie n t e s . Es t o s clie n t e s y
s e rvid o re s n o t ie n e n y n o n e ce s it a n u n ca n a l p u n t o a p u n t o d e d ica d o . El e n vío d e
lo s d a t o s a s u d e s t in o n o e s t á g a ra n t iza d o , n i s u o rd e n d e lle g a d a .

D e fin ic ió n : Un d a t a g ra m a e s u n m e n s a je a u t o co n t e n id o in d e p e n d ie n t e e n via d o a
t ra vé s d e la re d , cu ya lle g a d a , m o m e n t o d e lle g a d a y co n t e n id o n o e s t á
g a ra n t iza d o .

El p a q u e t e ja va . n e t co n t ie n e d o s cla s e s p a ra a yu d a rt e a e s crib ir p ro g ra m a s Ja va
q u e u t ilice n d a t a g ra m a s p a ra e n via r y re cib ir p a q u e t e s a t ra vé s d e la re d :
Da t a g ra m S o cke t y Da t a g ra m Pa cke t . S u a p lica ció n e n vía y re cib e Da t a g ra m Pa cke t s
a t ra vé s d e u n Da t a g ra m S o cke t .

También puedes ver


ja va . n e t . Da t a g ra m Pa cke t
ja va . n e t . Da t a g ra m S o cke t

Oz it o
Escribir un Datagrama Cliente y Servidor
El e je m p lo g e n e ra d o e n e s t a s e cció n e s t á co m p re n d id o p o r d o s a p lica cio n e s : u n clie n t e y
u n s e rvid o r. El s e rvid o r re cib e co n t in u a m e n t e p a q u e t e s d e d a t a g ra m a s a t ra vé s d e u n
s o cke t d a t a g ra m a s . Ca d a p a q u e t e re cib id o p o r e l s e rvid o r in d ica u n a p e t ició n d e l clie n t e d e
u n a cit a fa m o s a . Cu a n d o e l s e rvid o r re cib e u n d a t a g ra m a , le re s p o n d e e n via n d o u n
d a t a g ra m a q u e co n t ie n e u n t e xt o d e s ó lo u n a lín e a q u e co n t ie n e "la cit a d e l m o m e n t o " a l
clie n t e .
La a p lica ció n clie n t e d e e s t e e je m p lo e s m u y s e n cilla - - e n vía u n d a t a g ra m a a l s e rvid o r q u e
in d ica q u e le g u s t a ría re cib ir u n a cit a d e l m o m e n t o . En t o n ce s e l clie n t e e s p e ra a q u e e l
s e rvid o r le e n víe u n d a t a g ra m a e n re s p u e s t a .
Do s cla s e s im p le m e n t a n la a p lica ció n s e rvid o r: Qu o t e S e rve r y Qu o t e S e rve rTh re a d . Un a
s ó la cla s e im p le m e n t a la a p lica ció n clie n t e : Qu o t e Clie n t .
In ve s t ig u e m o s e s t a s cla s e s e m p e za n d o co n la cla s e q u e co n t ie n e e l m é t o d o m a in ( ) d e la
a p lica ció n s e rvid o r.
Co n t ie n e u n a ve rs ió n d e a p p le t d e la cla s e Qu o t e Clie n t .

La Clase QuoteServer
La cla s e Qu o t e S e rve r co n t ie n e u n s ó lo m é t o d o : e l m é t o d o m a in ( ) p a ra la
a p lica ció n s e rvid o r d e cit a s . El m é t o d o m a in ( ) s ó lo cre a n u n n u e vo o b je t o
Qu o t e S e rve rTh re a d y lo a rra n ca .
class QuoteServer {
public static void main(String[] args) {
new QuoteServerThread().start();
}
}
El o b je t o Qu o t e S e rve rTh re a d im p le m e n t a la ló g ica p rin cip a l d e l s e rvid o r d e cit a s .

La Clase QuoteServerThread
La cla s e Qu o t e S e rve rTh re a d e s u n Th re a d q u e s e e je cu t a co n t ín u a m e n t e
e s p e ra n d o p e t icio n e s a t ra vé s d e l u n s o cke t d e d a t a g ra m a s .
Qu o t e S e rve rTh re a d t ie n e d o s va ria b le s d e e je m p la r p riva d a s . La p rim e ra ,
lla m a d a s o c k e t , e s u n a re fe re n cia a u n o b je t o Da t a g ra m S o cke t o b je ct . Es t a
va ria b le s e in icia liza a n u ll. La s e g u n d a , q fs , e s u n o b je t o Da t a In p u t S t re a m q u e
s e h a a b ie rt o s o b re u n fich e ro d e t e xt o AS CII q u e co n t ie n e u n a lis t a d e cit a s .
Ca d a ve z q u e s e lle g u e a l s e rvid o r u n a p e t ició n d e cit a , e l s e rvid o r re cu p e ra la
s ig u e in t e lín e a d e s d e e l s t re a m d e e n t ra d a .
Cu a n d o e l p ro g ra m a p rin cip a l cre a e l Qu o t e S e rve rTh re a d q u e u t iliza e l ú n ico
co n s t ru ct o d is p o n ib le :
QuoteServerThread() {
super("QuoteServer");
try {
socket = new DatagramSocket();
System.out.println("QuoteServer listening on port: " +
socket.getLocalPort());
} catch (java.net.SocketException e) {
System.err.println("Could not create datagram socket.");
}
this.openInputFile();
}
La p rim e ra lín e a d e e s t e co s n t ru ct o r lla m a a l co n s t ru ct o r d e la s u p e rcla s e
( Th re a d ) p a ra in icia liza r e l t h re a d co n e l n o m b re "Qu o t e S e rve r". La s ig u ie n t e
s e cció n d e có d ig o e s la p a rt e crít ica d e l co n s t ru ct o r d e Qu o t e S e rve rTh re a d - -
cre a u n Da t a g ra m S o cke t . El Qu o t e S e rve rTh re a d u t iliza e s t e Da t a g ra m S o cke t
p a ra e s cu ch a r y re s p o n d e r la s p e t icio n e s d e cit a s d e lo s clie n t e s .
El s o cke t e s cre a d o u t iliza n d o e l co n s t ru ct o r d e Da t a g ra m S o cke t q u e n o re q u ie re
a rg u e m e n t o s :
socket = new DatagramSocket();
Un a ve z cre a d o u s a n d o e s t e co n s t ru ct o r, e l n u e vo Da t a g ra m S o cke t s e a s ig n a a
a lg ú n p u e rt o lo ca l d is p o n ib le . La cla s e Da t a g ra m S o cke t t ie n e o t ro co n s t ru ct o r
q u e p e rm it e e s p e cifica r e l p u e rt o q u e q u ie re u t iliza r p a ra a s ig n a rle e l n u e vo
o b je t o Da t a g ra m S o cke t . De b e ría s o b s e rva r q u e cie rt o s p u e rt o s e s t á s d e d ica d o s a
s e rvicio s "b ie n - co n o cid o s " y q u e n o p u e d e u t iliza d o s . S i s e e s p e cifica u n p u e rt o
q u e e s t á s ie n d o u t iliza d o , fa lla rá la cre a ció n d e l Da t a g ra m S o cke t .
De s p u é s d e cre a r co n é xit o e l Da t a g ra m S o cke t , e l Qu o t e S e rve rTh re a d m u e s t ra
u n m e n s a je in d ica n d o e l p u e rt o a l q u e s e h a a s ig n a d o e l Da t a g ra m S o cke t . El
Qu o t e Clie n t n e ce s it a e s t e n ú m e ro d e p u e rt o p a ra co n s t ru ir lo s p a q u e t e s d e
d a t a g ra m a s d e s t in a d o s a e s t e p u e rt o . Po r e s o , s e d e b e u t iliza r e s t e n ú m e ro d e
p u e rt o cu a n d o e je cu t e e l Qu o t e Clie n t .

La ú lt im a lín e a d e l co n s t ru ct o r d e Qu o t e S e rve rTh re a d lla m a a u n m é t o d o


p riva d o , o p e n I n p u t File ( ) , d e n t ro d e Qu o t e S e rve rTh re a d p a ra a b rir u n fich e ro
lla m a d o o n e - lin e rs . t x t q u e co n t ie n e u n a lis t a d e cit a s . Ca d a cit a d e l fich e ro
d e b e s e r u n lín e a e n s í m is m a .
Ah o ra la p a rt e in t e re s a n t e d e Qu o t e S e rve rTh re a d - - e s e l m é t o d o ru n ( ) . ( El
m é t o d o ru n ( ) s o b re e s crib e e l m é t o d o ru n ( ) d e la cla s e Th re a d y p ro p o rcio n a la
im p le m e n t a ció n d e l t h re a d . Pa ra in fo rm a ció n s o b re lo s Th re a d s , p u e d e ve r
Th re a d s d e Co n t ro l.
El m é t o d o ru n ( ) Qu o t e S e rve rTh re a d p rim e ro co m p ru e b a q u e s e h a cre a d o u n
o b je t o Da t a g ra m S o cke t vá lid o d u ra n t e s u co n s t ru cció n . S i s o c k e t e s n u ll,
e n t o n ce s e l Qu o t e S e rve rTh re a d n o p o d ría d e s via r e l Da t a g ra m S o cke t . S in e l
s o cke t , e l s e rvid o r n o p u e d e o p e ra r, y e l m é t o d o ru n ( ) re t o rn a .
De o t ra fo rm a , e l m é t o d o ru n ( ) e n t ra e n u n b u cle in fin it o . Es t e b u cle e s p e ra
co n t in u a m e n t e la s p e t icio n e s d e lo s clie n t e s y re s p o n d e e s t a s p e t icio n e s . Es t e
b u cle co n t ie n e d o s s e ccio n e s crít ica s d e có d ig o : la s e cció n q u e e s cu ch a la s
p e t icio n e s y la q u e la s re s p o n d e , p rim e ro ve re m o s la s e cció n q u e re cib e la
p e t icio n e s :
packet = new DatagramPacket(buf, 256);
socket.receive(packet);
address = packet.getAddress();
port = packet.getPort();
La p rim e ra lín e a d e có d ig o cre a u n n u e vo o b je t o Da t a g ra m Pa cke t e n ca rg a d o d e
re cib ir u n d a t a g ra m a a t ra vé s d e l s o cke t . S e p u e d e d e cir q u e e l n u e vo
Da t a g ra m Pa cke t e s t á e n ca rg a d o d e re cib ir d a t o s d e s d e e l s o cke t d e b id o a l
co n s t ru ct o r u t iliza d o p a ra cre a rlo . Es t e co n s t ru ct o r re q u ie re s ó lo d o s
a rg u m e n t o s , u n a rra y d e b yt e s q u e co n t ie n e lo s d a t o s e s p e cífico s d e l clie n t e , y la
lo n g it u d d e e s t e a rra y. Cu a n d o s e co n s t ru ye u n Da t a g ra m Pa cke t p a ra e n via rlo a
t ra vé s d e u n Da t a g ra m S o cke t , t a m b ié n d e b e s u m in is t ra r la d ire cció n d e in t e rn e t
y e l p u e rt o d e d e s t in o d e l p a q u e t e . Ve rá s e s t o m á s a d e la n t e cu a n d o e xp liq u e m o s
có m o re s p o n d e u n s e rvid o r a la s p e t icio n e s d e l clie n t e .
La s e g u n d a lín e a d e có d ig o re cib e u n d a t a g ra m a d e s d e e l s o cke t . La in fo rm a ció n
co n t e n id a d e n t ro d e l m e n s a je d e l d a t a g ra m a s e co p ia e n e l p a q u e t e cre a d o e n la
lín e a a n t e rio r. El m é t o d o re c e iv e ( ) s e b lo q u e a h a s t a q u e s e re cib a u n p a q u e t e .
S i n o s e re cib e n in g ú n p a q u e t e , e l s e rvid o r n o h a ce n in g ú n p ro g re s o y
s im p le m e n t e e s p e ra .
La s d o s lín e a s s ig u ie n t e s o b t ie n e n la d ire cció n d e in t e rn e t y e l n ú m e ro d e p u e rt o
d e s d e e l q u e s e h a re cib id o e l d a t a g ra m a . La d ire cció n In t e rn e t y e l n ú m e ro d e
p u e rt o in d ica d o d e d o n d e vin o e l p a q u e t e . Es t e e s d o n d e e l s e rvid o r d e b e
re s p o n d e r. En e s t e e je m p lo , e l a rra y d e b yt e s d e l d a t a g ra m a n o co n t ie n e
in fo rm a ció n re le va n t e . S ó lo la lle g a d a d e l p a q u e t e in d ica u n p e t ició n p o r p a rt e
d e l clie n t e q u e p u e d e s e r e n co n t ra d o e n la d ire cció n d e In t e rn e t y e l n ú m e ro d e
p u e rt o s in d ica d o s e n e l d a t a g ra m a .
En e s t e p u n t o , e l s e rvid o r h a re cib id o u n p e t ició n d e u n a cit a d e s d e u n clie n t e .
Ah o ra e l s e rvid o r d e b e re s p o n d e r. La s s e is lín e a s d e có d ig o s ig u ie n t e s co n s t ru ye n
la re s p u e s t a y la e n via n .
if (qfs == null)
dString = new Date().toString();
else
dString = getNextQuote();
dString.getBytes(0, dString.length(), buf, 0);
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
S i e l fich e ro d e cit a s n o s e p u e d e a b rir p o r a lg u n a ra zó n , q fs e s n u ll. En e s t e
ca s o , e l s e rvid o r d e cit a s s irve la h o ra d e l d ía e n s u lu g a r. De o t ra fo rm a , e l
s e rvid o r d e cit a s o b t ie n e la s ig u ie n t e cit a d e l fich e ro a b ie rt o . La lín e a d e có d ig o
d e la s e n t e n cia if co n vie rt e la ca d e n a e n u n a rra y d e b yt e s .
La t e rce ra lín e a d e có d ig o cre a u n n u e vo o b je t o Da t a g ra m Pa cke t u t iliza d o p a ra
e n via r e l m e n s a je a t ra vé s d e l s o cke t d e l d a t a g ra m a . . S e p u e d e d e cir q u e e l
n u e vo Da t a g ra m Pa cke t e s t á d e s t in a d o a e n via r lo s d a t o s a t ra vé s d e l s o cke t
p o rq u e e l co n s t ru ct o r lo u t iliza p a ra e s o . Es t e co s n t ru ct o r re q u ie re cu a t ro
a rg u m e n t o s . El p rim e r a rg u m e n t o e s e l m is m o q u e e l u t iliza d o p o r e l co n s t ru ct o r
u t iliza d o p a ra cre a r lo s d a t a g ra m a s re ce p t o re s : u n a rra y d e b yt e s q u e co n t ie n e e l
m e n s a je d e l e m is o r a l re ce p t o r y la lo n g it u d d e e s t e a rra y. Lo s d o s s ig u ie n t e s
a rg u m e n t o s s o n d ife re n t e s : u n a d ire cció n d e In t e rn e t y u n n ú m e ro d e p u e rt o .
Es t o s d o s a rg u m e n t o s s o n la d ire cció n co m p le t a d e l d e s t in o d e l d a t a g ra m a y
d e b e s e r s u m in is t ra d a p o r e l e m is o r d e l d a t a g ra m a .
La cu a rt a lín e a d e có d ig o e n vía e l Da t a g ra m Pa cke t d e e s t a fo rm a .
El ú lt im o m é t o d o d e in t e ré s d e Qu o t e S e rve rTh re a d e s e l m é t o d o fin a liz e ( ) . Es t e
m é t o d o h a ce la lim p ie za cu a n d o e l Qu o t e S e rve rTh re a d re co g e la b a s u ra ce rra n d o
e l Da t a g ra m S o cke t . Lo s p u e rt o s s o n re cu rs o s lim it a d o s y lo s s o cke t s a s ig n a d o s a
u n p u e rt o d e b e n ce rra rs e cu a n d o n o s e u t iliza n .

La Clase QuoteClient
La cla s e Qu o t e Clie n t im p le m e n t a u n a a p lica ció n clie n t e p a ra e l Qu o t e S e rve r. Es t a
a p lica ció n s ó lo e n vía u n a p e t ició n a l Qu o t e S e rve r, e s p e ra u n a re s p u e s t a , y
cu a n d o é s t a s e re cib e la m u e s t ra e n la s a lid a e s t a n d a rd . Ech e m o s u n vis t a zo a l
có d ig o .
La cla s e Qu o t e Clie n t co n t ie n e u n m é t o d o - - e l m é t o d o m a in ( ) p a ra la p lica ció n
clie n t e . La p a rt e s u p e rio r d e m a in ( ) d e cla ra va ria s va ria b le s lo ca le s p a ra s u
u t iliza ció n :
int port;
InetAddress address;
DatagramSocket socket = null;
DatagramPacket packet;
byte[] sendBuf = new byte[256];
La s ig u ie n t e s e cció n p ro ce s a lo s a rg u m e n t o s d e la lín e a d e co m a n d o s u t iliza d o s
p a ra in vo ca r la a p lica ció n Qu o t e Clie n t .
if (args.length != 2) {
System.out.println("Usage: java DatagramClient <hostname> <port#>");
return;
}
Es t a a p lica ció n re q u ie re d o s a rg u m e n t o s : e l n o m b re d e la m á q u in a e n la q u e s e
e s t á e je cu t a n d o Qu o t e S e rve r, y e l n ú m e ro d e p u e rt o p o r q u e e l Qu o t e S e rve r
e s t á e s cu ch a n d o . Cu a n d o a rra n ca e l Qu o t e S e rve r m u e s t ra u n n ú m e ro d e p u e rt o .
Es t e e s e l n ú m e ro d e p u e rt o q u e d e b e u t iliza r e n la lín e a d e co m a n d o s cu a n d o
a rra n q u e Qu o t e Clie n t .
Lu e g o , e l m é t o d o m a in ( ) co n t ie n e u n b lo q u e t ry q u e co n t ie n e la ló g ica p rin cip a l
d e l p ro g ra m a clie n t e . Es t e b lo q u e t ry co n t ie n e t re s s e cció n p rin cip a le s : u n a
s e cció n q u e cre a u n Da t a g ra m S o cke t , u n a s e cció n q u e e n vía u n a p e t ició n a l
s e rvid o r, y u n a s e cció n q u e o b t ie n e la re s p u e s t a d e l s e rvid o r.
Prim e ro ve re m o s e l có d ig o q u e cre a u n Da t a g ra m S o cke t :
socket = new DatagramSocket();
El clie n t e u t iliza e l m is m o co n s t ru ct o r p a ra cre a r u n Da t a g ra m S o cke t q u e e l
s e rvid o r. El Da t a g ra m S o cke t e s a s ig n a d o a cu a lq u ie r p u e rt o d is p o n ib le .
Lu e g o , e l p ro g ra m a Qu o t e Clie n t e n vía u n a p e t ició n a l s e rvid o r:
address = InetAddress.getByName(args[0]);
port = Integer.parseInt(args[1]);
packet = new DatagramPacket(sendBuf, 256, address, port);
socket.send(packet);
System.out.println("Client sent request packet.");
La p rim e ra lín e a d e có d ig o o b t ie n e la d ire cció n In t e rn e t d e l h o s t n o m b ra d o e n la
lín e a d e co m a n d o s . La s e g u n d a lín e a d e có d ig o o b t ie n e e l n ú m e ro d e p u e rt o d e
la lín e a d e co m a n d o s . Es t a s d o s p ie za s d e in fo rm a ció n s o n u t iliza d a s p a ra cre a r
u n Da t a g ra m Pa cke t d e s t in a d o a e s a d ire cció n d e In t e rn e t y e s e n ú m e ro d e
p u e rt o . La d ire cció n In t e rn e t y e l n ú m e ro d e p u e rt o s d e b e ría n in d ica r la m á q u in a
e n la q u e s e a rra n có e l s e rvid o r y e l p u e rt o p o r e l q u e e l s e rvid o r e s t á
e s cu ch a n d o .
La t e rce ra lín e a d e l có d ig o a n t e rio r cre a u n Da t a g ra m Pa cke t u t iliza d o p a ra e n vía r
d a t o s . El p a q u e t e e s t á co n s t ru id o co n u n a rra y d e b yt e s va cío s , s u lo n g it u d , y la
d ire cció n In t e rn e t y e l n ú m e ro d e p u e rt o d e d e s t in o d e l p a q u e t e . El a rra y d e
b yt e s e s t á va cío p o rq u e e s t e d a t a g ra m a s ó lo p id e la in fo rm a ció n d e l s e rvid o r.
To d o lo q u e e l s e rvid o r n e ce s it a s a b e r p a ra re s p o n d e r - - la d ire cció n y e l n ú m e ro
d e p u e rt o d o n d e re s p o n d e r - - e s u n a p a rt e a u t o m á t ica d e l p a q u e t e .
Lu e g o , e l clie n t e o b t ie n e u n a re s p u e s t a d e s d e e l s e rvid o r:
packet = new DatagramPacket(sendBuf, 256);
socket.receive(packet);
String received = new String(packet.getData(), 0);
System.out.println("Client received packet: " + received);
Pa ra o b t e n e r u n a re s p u e s t a d e l s e rvid o r, e l clie n t e cre a u n p a q u e t e re ce p t o r y
u t iliza e l m é t o d o re c e iv e ( ) d e l Da t a g ra m S o cke t p a ra re cib ir la re s p u e s t a d e l
s e rvid o r. El m é t o d o re c e iv e ( ) s e b lo q u e a h a s t a q u e u n d a t a g ra m a d e s t in a d o a l
clie n t e e n t re a t ra vé s d e l s o cke t . Ob s e rva q u e s i, p o r a lg u n a ra zó n , s e p ie rd e la
re s p u e s t a d e l s e rvid o r, e l clie n t e q u e d a rá b lo q u e a d o d é b id o a la p o lít ica d e n o
g a ra n t ía s d e l m o d e lo d e d a t a g ra m a . No rm a lm e n t e , u n clie n t e s e le ccio n a u n
t ie m p o p a ra n o e s t á r e s p e ra n d o e t e rn a m e n t e u n a re s p u e s t a - - s i la re s p u e s t a n o
lle g a , e l t e m p o riza d o r s e cu m p le , y e l s e rvid o r re t ra n s m it e la p e t ició n .
Cu a n d o e l clie n t e re cib e u n a re s p u e s t a d e l s e rvid o r, u t iliza e l m é t o d o g e t D a t a ( )
p a ra re cu p e ra r lo s d a t o s d e l p a q u e t e . El clie n t e co n vie rt e lo s d a t o s e n u n a
ca d e n a y lo s m u e s t ra .

Ejecutar el Servidor
De s p u é s d e h a b e r co m p ila d o co n é xit o lo s p ro g ra m a s clie n t e y s e rvid o r, p u e d e s
e je cu t a rlo s . Prim e ro d e b e s e je cu t a r e l s e rvid o r p o rq u e n e ce s it a s co n o ce r e l
n ú m e ro d e p u e rt o q u e m u e s t ra a n t e s d e p o d e r a rra n ca r e l clie n t e . Cu a n d o e l
s e rvid o r a s ig n a co n é xit o s u Da t a g ra m S o cke t , m u e s t ra u n m e n s a je s im ila r a
e ste :
QuoteServer listening on port: portNumber
p o r t N u m b e r e s e l n ú m e ro d e p u e rt o a l q u e e s t á a s ig n a d o e l Da t a g ra m S o cke t .
Ut iliza e s t e n ú m e ro p a ra a rra n ca r e l clie n t e .
Ejecutar el Cliente
Un a ve z q u e h a s a rra n ca d o e l s e rvid o r y m o s t ra d o e l m e n s a je q u e in d ica e l
p u e rt o e n e l q u e e s t á e s cu ch a n d o , p u e d e s e je cu t a r e l p ro g ra m a clie n t e .
Re cu e rd a e je cu t a r e l p ro g ra m a clie n t e co n d o s a rg u m e n t o s e n la lín e a d e
co m a n d o s : e l n o m b re d e l h o s t e n e l s e e s t á e je cu t a n d o e l Qu o t e S e rve r, y e l
n ú m e ro d e p u e rt o q u e m o s t ró a l a rra n ca r.
De s p u é s d e q u e e l clie n t e e n víe u n a p e t ició n y re cib a u n a re s p u e s t a d e s d e e l
s e rvid o r, d e b e ría s ve r u n a s a lid a s im ila r a é s t a :
Quote of the Moment: Life is wonderful. Without it we'd all be dead.

Oz it o
Proporcionar tu Propio Controlador de Seguridad
La s e g u rid a d s e co n vie rt e e n im p o rt a n t e cu a n d o s e e s crib e n p ro g ra m a s q u e
in t e ra ct ú a n co n In t e rn e t . ¿ Te g u s t a ría d e s ca rg a r a lg o q u e co rro m p ie ra t u s is t e m a
d e fich e ro s ? ¿ Es t a ría s a b ie rt o a u n a t a q u e d e viru s ? Es im p o s ib le q u e lo s
o rd e n a d o re s e n In t e rn e t e s t é n co m p le t a m e n t e s e g u ro s d e l a t a q u e d e u n o s p o co s
villa n o s e xt e rn o s . S in e m b a rg o , p u e d e s s e g u ir lo s p a s o s p a ra p ro p o rcio n a r u n n ive l
d e p ro t e cció n s ig n ifica n t e . Un a d e la s fo rm a s q u e p ro p o rcio n a Ja va fre n t e a lo s
a t a q u e s e s a t ra vé s d e l u s o d e lo s co n t ro la d o re s d e s e g u rid a d . Un co n t ro la d o r d e
s e g u rid a d im p le m e n t a e im p o n e u n a p o lít ica d e s e g u rid a d p a ra u n a a p lica ció n .

Introdución al Controlador de Seguridad


El co n t ro la d o r d e s e g u rid a d e s u n o b je t o d e l á m b it o d e la a p lica ció n q u e
d e t e rm in a q u é o p e ra cio n e s p o t e n cia le s d e b e ría n e s t a r p e rm it id a s . La s
cla s e s d e lo s p a q u e t e s Ja va co o p e ra n co n e l co n t ro la d o r d e s e g u rid a d
p id ié n d o le p e rm is o a l co n t ro la d o r d e s e g u rid a d d e la a p lica ció n p a ra
e je cu t a r cie rt a s o p e ra cio n e s .

Escribir un Controlador de Seguridad


Es t a s e cció n m u e s t ra u n im p le m e n t a ció n s e n cilla d e u n co n t ro la d o r d e
s e g u rid a d q u e re q u ie re q u e e l u s u a rio t e cle e u n a cla ve ca d a ve z q u e la
a p lica ció n t ra t a d e a b rir u n fich e ro p a ra le e r o e s crib ir.

Instalar tu Propio Controlador de Seguridad


Es t a p á g in a m u e s t ra có m o p o n e r a t ra b a ja r u n co n t ro la d o r d e s e g u rid a d
e n t u s a p lica cio n e s Ja va .
N o t a : El co n t ro la d o r d e s e g u rid a d d e u n a a p lica ció n s ó lo p u e d e s e r
s e le ccio n a d o u n a ve z. Típ ica m e n t e , u n n a ve g a d o r s e le ccio n a s u
co n t ro la d o r d e s e g u rid a d e n e l p ro ce d im ie n t o d e a rra n ca d a . Po r e s o , la
m a yo ría d e la s ve ce s , lo s a p p le t s n o p u e d e s e le ccio n a r u n co n t ro la d o r d e
s e g u rid a d p o r q u e ya h a s id o s e le ccio n a d o . Ocu rrirá u n a
S e cu rit yExce p t io n s i u n a p p le t in t e n t a s h a ce r e s t o . Pu e d e ve r En t e n d e r
la s Ca p a cid a d e s y la s Re s t riccio n e s d e lo s Ap p le t s p a ra m á s in fo rm a ció n .

Decidir los Métodos a Sobreescribir de la clase SecurityManager


Y fin a lm e n t e , e s t a p á g in a m ira la cla s e S e cu rit yMa n a g e r e n m a yo r
d e t a lle , m o s t rá n d o t e q u é m é t o d o s d e e s t a cla s e q u e a fe ct a n a lo s
d is t in t o s t ip o s d e o p e ra cio n e s y a yu d a a d e cid ir q u é m e t o d o s n e ce s it a rá
s o b re e s crib ir t u co n t ro la d o r d e s e g u rid a d .
Oz it o
Introdución a los Controladores de Seguridad
To d a a p lica ció n Ja va p u e d e t e n e r s u p ro p io o b je t o co n t ro la d o r d e s e g u rid a d q u e
a ct ú a co m o u n g u a rd ia d e s e g u rid a d a t ie m p o co m p le t o . La cla s e S e cu rit yMa n a g e r
d e l p a q u e t e ja va . la n g e s u n a cla s e a b s t ra ct a q u e p ro p o rcio n a e l in t e rfa ce d e
p ro g ra m a ció n y u n a im p le m e n t a ció n p a rcia l p a ra t o d o s lo s co n t ro la d o re s d e
s e g u rid a d d e Ja va .
Po r d e fe ct o u n a a p lica ció n n o t ie n e co n t ro la d o r d e s e g u rid a d . Es t o e s , e l s is t e m a d e
e je cu ció n d e Ja va n o cre a a u t o m á t ica m e n t e u n co n t ro la d o r d e s e g u rid a d p a ra ca d a
a p lica ció n . En t o n ce s , p o r d e fe ct o , u n a a p lica ció n p e rm it e t o d a s la s o p e ra cio n e s q u e
e s t á n s u je t a s a la s re s t riccio n e s d e s e g u rid a d .
Pa ra ca m b ia r e s t e co m p o rt a m ie n t o in d u lg e n t e , u n a a p lica ció n d e b e cre a r e in s t a la r
s u p ro p io co n t ro la d o r d e s e g u rid a d . Ap re n d e rá s co m o cre a r u n co n t ro la d o r d e
s e g u rid a d e n Es crib ir u n Co n t ro la d o r d e S e g u rid a d , y co m o in s t a la rlo e n In s t a la r u n
Co n t ro la d o r d e S e g u rid a d .

N o t a : Lo s n a ve g a d o re s e xis t e n t e s y lo s vis u a liza d o re s d e a p p le t s c re a n s u p ro p io


co n t ro la d o r d e s e g u rid a d cu a n d o a rra n ca n . As í, u n a p p le t e s t á s u je t o a la s
re s t riccio n e s d e a cce s o s ie m p re q u e s e a n im p u e s t a s p o r e l co n t ro la d o r d e
s e g u rid a d d e u n a a p lica ció n p a rt icu la r e n la q u e e l a p p le t s e e s t á e je cu t a n d o .

Pu e d e s o b t e n e r e l co n t ro la d o r d e s e g u rid a d a ct u a l d e u n a a p lica ció n u t iliza n d o e l


m é t o d o g e t S e c u rit y Ma n a g e r( ) d e la cla s e S ys t e m .
SecurityManager appsm = System.getSecurityManager();
Ob s e rva q u e g e t S e c u rit y Ma n a g e r( ) d e vu e lve n u ll s i n o h a y n in g ú n co n t ro la d o r
d e s e g u rid a d a ct u a l e n la a p lica ció n p o r lo q u e d e b e ría a s e g u ra rs e d e q u e t ie n e u n
o b je t o vá lid o a n t e s d e lla m a r a cu a lq u ie ra d e s u s m é t o d o s .
Un a ve z q u e t ie n e s e l co n t ro la d o r d e s e g u rid a d , p u e d e s p e d ir p e rm is o p a ra p e rm it ir
o p ro h ib ir cie rt a s o p e ra cio n e s . De h e ch o , m u ch a s d e la s cla s e s e n lo s p a q u e t e s d e
Ja va h a ce n e s t o . Po r e je m p lo , e l m é t o d o S y s t e m . e x it ( ) , q u e fin a liza e l in t e rp re t e
Ja va , u t iliza e l m é t o d o c h e c k Ex it ( ) d e l co n t ro la d o r d e s e g u rid a d p a ra a p ro b a r la
o p e ra ció n d e s a lid a :
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkExit(status);
}
. . .
// El código continúa aquí si checkedExit() retorna
S i e l co n t ro la d o r d e s e g u rid a d a p ru e b a la o p e ra ció n d e s a lid a , e l c h e c k Ex it ( )
re t o rn a n o rm a lm e n t e . S i e l co n t ro la d o r d e s e g u rid a d p ro h ib e la o p e ra ció n , e l
c h e c k Ex it ( ) la n za u n a S e cu rit yExce p t io n . De e s t a fo rm a , e l co n t ro la d o r d e
s e g u rid a d p e rm it e o p ro h ib e u n a o p e ra ció n p o t e cia lm e n t e d a ñ in a a n t e s d e q u e
p u e d a s e r co m p le t a d a .
La cla s e S e cu rit yMa n a g e r d e fin e m u ch o s o t ro s m é t o d o s u t iliza d o s p a ra ve rifica r
o t ra s cla s e s d e o p e ra cio n e s . Po r e je m p lo , e l m é t o d o c h e c k Ac c e s s ( ) ve rifica lo s
a cce s o s a lo s t h re a d s , y c h e c k P ro p e rt y Ac c e s s ( ) ve rifica e l a cce s o a la p ro p ie d a d
e s p e cifica d a . Ca d a o p e ra ció n o g ru p o d e o p e ra cio n e s t ie n e s u p ro p io m é t o d o
c h e c k XXX( ) .
Ad e m á s , e l co n ju n t o d e m é t o d o s c h e c k XXX( ) re p re s e n t a e l co n ju n t o d e
o p e ra cio n e s d e la s cla s e s d e lo s p a q u e t e s Ja va y e l s is t e m a d e e je cu ció n d e Ja va
q u e ya e s t á n s u je t o s a la p ro t e cció n d e l co n t ro la d o r d e s e g u rid a d . Po r e s o ,
n o rm a lm e n t e , s u s có d ig o n o t e n d rá q u e lla m a r a n in g ú n m é t o d o c h e c k XXX( ) - -
la s cla s e s d e lo s p a q u e t e s d e Ja va h a ce n e s t o p o r u s t e d a u n n ive l lo
s u ficie n t e m e n t e b a jo q u e cu a lq u ie r o p e ra ció n re p re s e n t a d a p o r u n m é t o d o
c h e c k XXX( ) ya e s t á p ro t e g id a . S in e m b a rg o , cu a n d o e s crib a s t u p ro p io
co n t ro la d o r d e s e g u rid a d , p o d ría s t e n e r q u e s o b re e s crib ir lo s m é t o d o s
c h e c k XXX( ) d e S e cu rit yMa n a g e r p a ra m o d ifica r la p o lít ica d e s e g u rid a d d e la s
o p e ra cio n e s e s p e cífica s , o p o d ría t e n e r q u e a ñ a d ir a lg u n o s p o r t i m is m o p a ra p o n e r
o t ra s cla s e s d e o p e ra cio n e s p a ra e l e s cu rt in io d e l co n t ro la d o r d e s e g u rid a d .
De cid ir lo s Mé t o d o s a S o b re e s crib ir d e S e cu rit yMa n a g e r e xp lica la s o p e ra cio n e s o
g ru p o s d e o p e ra cio n e s q u e ca d a m é t o d o c h e c k XXX( ) d e la cla s e S e cu rit yMa n a g e r
e s t á d is e ñ a d o p a ra p ro t e g e r.

Oz it o
Escribir un Controlador de Seguridad
Pa ra e s crib ir t u p ro p io co n t ro la d o r d e s e g u rid a d , d e b e s cre a r u n a s u b cla s e d e la
cla s e S e cu rit yMa n a g e r. Es t a s u b cla s e s o b re e s crib e va rio s m é t o d o d e
S e cu rit yMa n a g e r p a ra p e rs o n a liza r la s va rifica cio n e s y a p ro b a cio n e s n e ce s a ria s
p a ra u n a a p lica ció n Ja va .
Es t a p á g in a t e lle va a t ra vé s d e u n co n t ro la d o r d e s e g u rid a d d e e je m p lo q u e
re s t rin g e la le ct u ra y e s crit u ra e n e l s is t e m a d e fich e ro s . Pa ra o b t e n e r la
a p ro b a ció n d e l co n t ro la d o r d e s e g u rid a d , u n m é t o d o q u e a b ra u n fich e ro p a ra le e r
in vo ca u n o d e lo s m é t o d o s c h e c k Re a d ( ) d e S e cu rit yMa n a g e r, u n m é t o d o q u e a b re
u n fich e ro p a ra e s crib ir in vo ca a u n o d e lo s m é t o d o s c h e c k W rit e ( ) s e
S e cu rit yMa n a g e r. S i e l co n t ro la d o r d e s e g u rid a d a p ru e b a la o p e ra ció n e l m é t o d o
c h e c k XXX( ) re t o rn a n o m a lm e n t e , d e o t ra fo rm a c h e c k XXX( ) la n za u n a
S e cu rit yExce p t io n .
Pa ra im p o n e r u n a p o lñ it ica re s t rict iva e n lo s a cce s o s a l s is t e m a d e fich e ro s , n u e s t ro
e je m p lo d e b e s o b re e s crib ir lo s m é t o d o s c h e c k Re a d ( ) y c h e c k W rit e ( ) d e
S e cu rit yMa n a g e r. S e cu rit yMa n a g e r p ro p o rcio n a t re s ve rs io n e s d e c h e c k Re a d ( ) y
d o s ve rs io n e s d e c h e c k W rit e ( ) . Ca d a u n a d e e lla s d e b e ría ve rifica r s i la a p lica ció n
p u e d e a b rir u n fich e ro p a ra I/ O. Un a p o lít ica im p le m e n t a d a fre cu e n t e m e n t e e n lo s
n a ve g a d o re s p a ra q u e lo s a p p le t s ca rg a d o s a t ra vé s d e la re d n o p u e d a n le e r o
e s crib ir e n e l s is t e m a lo ca l d e fich e ro s a m e n o s q u e e l u s u a rio lo a p ru e b e ,
La p o lít ica im p le m e n t a d a p o r n u e s t ro e je m p lo le p id e a l u s u a rio u n a p a s s wo rd
cu a n d o la a p lica ció n in t e n t a a b rir u n fich e ro p a ra le e r o e s crib ir. S i la p a s s wo rd e s
co rre ct a s e p e rm it e e l a cce s o .
To d o s lo s co n t ro la d o re s d e s e g u rid a d d e b e n s e r u n a s u b cla s e d e S e cu rit yMa n a g e r.
As í, n u e s t ra Pa s s wo rd S e cu rit yMa n a g e r d e s cie n d e d e S e cu rit yMa n a g e r.
class PasswordSecurityManager extends SecurityManager {
. . .
}
Lu e g o , Pa s s wo rd S e cu rit yMa n a g e r d e cla ra u n e je m p la r d e la va ria b le p riva d a
p a s s w o rd p a ra co n t e n e r e l p a s s wo rd q u e e l u s u a rio d e b e in t ro d u cir p a ra p o d e r
p e rm it ir e l a cce s o a l s is t e m a d e fich e ro s re s t rin g id o . La p a s s wo rd s e s e le ccio n a
d u ra n t e la co n s t ru cció n :
PasswordSecurityManager(String password) {
super();
this.password = password;
}
El s ig u ie n t e m é t o d o e n la cla s e Pa s s wo rd S e cu rit yMa n a g e r e s u n m é t o d o d e a yu d a
p riva d o lla m a d o a c c e s s OK( ) . Es t e m é t o d o le p id e a l u s u a rio u n a p a s s wo rd y la
ve rifica . S i e l u s u a iro in t ro d u ce u n a p a s s wo rd vá lid a , e l m é t o d o d e vu e lve t ru e , d e
o t ra fo rm a d e vu e lve fa ls e .
private boolean accessOK() {
int c;
DataInputStream dis = new DataInputStream(System.in);
String response;

System.out.println("What's the secret password?");


try {
response = dis.readLine();
if (response.equals(password))
return true;
else
return false;
} catch (IOException e) {
return false;
}
}
Fin a lm e n t e a l fin a l d e la cla s e Pa s s wo rd S e cu rit yMa n a g e r h a y t re s m é t o d o s
c h e c k Re a d ( ) y d o s m é t o d o s c h e c k W rit e ( ) s o b re e s crit o s :
public void checkRead(FileDescriptor filedescriptor) {
if (!accessOK())
throw new SecurityException("Not a Chance!");
}
public void checkRead(String filename) {
if (!accessOK())
throw new SecurityException("No Way!");
}
public void checkRead(String filename, Object executionContext) {
if (!accessOK())
throw new SecurityException("Forget It!");
}
public void checkWrite(FileDescriptor filedescriptor) {
if (!accessOK())
throw new SecurityException("Not!");
}
public void checkWrite(String filename) {
if (!accessOK())
throw new SecurityException("Not Even!");
}
To d o s lo s m é t o d o s c h e c k XXX( ) lla m a n a a c c e s s OK( ) p a ra p e d irle a l u s u a rio la
p a s s wo rd . S i e l a cce s o n o e s OK, e n t o n ce s c h e c k XXX( ) la n za u n a
S e cu rit yExce p t io n . De o t ra fro m a , c h e c k XXX( ) re t u rn a n o rm a lm e n t e . Ob s e rva q u e
S e cu rit yExce p t io n e s u n a e xce p ció n e n t ie m p o d e e je cu ció n , y n o n e ce s it a s e r
d e cla ra d a e n la cla u s u la t h ro w s d e e s t o s m é t o d o s .
c h e c k Re a d ( ) y c h e c k W rit e ( ) s o n s ó lo u n o s p o co s d e lo s m u ch o s m é t o d o s
c h e c k XXX( ) d e S e cu rit yMa n a g e r q u e ve rifica n va ria s cla s e s d e o p e ra cio n e s .
Pu e d e s s o b re e s crib ir o a ñ a d ir cu a lq u ie r n ú m e ro d e m é t o d o c h e c k XXX( ) p a ra
im p le m e n t a r t u p ro p ia p o lít ica d e s e g u rid a d . No n e ce s it a s s o b re e s crib ir t o d o s lo s
m é t o d o s c h e c k XXX( ) d e S e cu rit yMa n a g e r, s ó lo a q u e llo s q u e q u ie ra s p e rs o n a liza r.
S in e m b a rg o , la im p le m e n t a ció n p o r d e fe ct o p ro p o rcio n a d a p o r la cla s e
S e cu rit yMa n a g e r p a ra t o d o s lo s m é t o d o s c h e c k XXX( ) la n za u n a
S e cu rit yExce p t io n . En o t ra s p a la b ra s , p o r d e fe ct o , la cla s e S e cu rit yMa n a g e r
p ro h ib e t o d a s la s o p e ra cio n e s q u e e s t á n s u je t a s a la s re s t riccio n e s d e s e g u rid a d .
Po r lo q u e p o d ría s e n co n t ra r q u e t ie n e s q u e s o b re e s crib ir m u ch o s m é t o d o s
c h e c k XXX( ) p a ra o b t e n e r e l co m p o rt a m ie n t o d e s e a d o .
To d o s lo s m é t o d o s c h e c k XXX( ) d e la cla s e S e cu rit yMa n a g e r o p e ra n d e la m is m a
fo rm a :
● S i e l a cce s o e s t á p e rm it id o , e l m é t o d o re t o rn a .

● S i e l a cce s o n o e s t á p e rm it id o , e l m é t o d o la n za u n a S e cu rit yExce p t io n .

As e g u ra t e d e q u e im p le m e n t a s d e e s t a fo rm a t u s m é t o d o s c h e c k XXX( )
s o b re e s crit o s .
Bie n , e s t a e s n u e s t ra s u b cla s e d e S e cu rit yMa n a g e r. Co m o p u e d e s ve r im p le m e n t a r
u n co n t ro la d o r d e s e g u rid a d e s s e n cillo , s ó lo :
● Cre a u n a s u b cla s e d e S e cu rit yMa n a g e r.

● S o b re e s crib e u n o s cu a n t o s m é t o d o s .

El t ru co e s t á e n d e t e rm in a r lo s m é t o d o s q u e s e d e b e n s o b re e s crib ir p a ra
im p le m e n t a r t u p o lít ica d e s e g u rid a d . De cid ir q u e Mé t o d o s S o b re e s crib ir d e
S e cu rit yMa n a g e r t e a yu d a rá a d e cid ir lo s m é t o d o s q u e d e b e rá s s o b re e s crib ir
d e p e n d ie n d o d e lo s t ip o s d e o p e ra cio n e s q u e q u ie ra s p ro t e g e r. La p á g in a s ig u ie n t e
t e e n s e ñ a co m o in s t a la r la cla s e Pa s s wo rd S e cu rit yMa n a g e r co m o e l co n t ro la d o r d e
s e g u rid a d d e s u a p lica ció n Ja va .

También puede ver


ja va . la n g . S e cu rit yMa n a g e r
ja va . la n g . S e cu rit yExce p t io n

Oz it o
Instalar un Controlador de Seguridad
Un a ve z q u e h a s t e rm in a d o d e e s crib ir t u s u b cla s e d e S e cu rit yMa n a g e r, p u e d e s in s t a la rla co m o e l
co n t ro la d o r d e s e g u rid a d a ct u a l d e t u a p lica icó n . Pu e d e s h a ce r e s t o u t iliza n d o e l m é t o d o
s e t S e c u rit y Ma n a g e r( ) d e la cla s e S ys t e m .
Aq u í t ie n e s u n a p e q u e ñ a a p lica ció n d e p ru e b a , S e cu rit yMa n a g e rTe s t , q u e in s t a la la cla s e
Pa s s wo rd S e cu rit yMa n a g e r d e la p á g in a a n t e rio r co m o e l co n t ro la d o r d e s e g u rid a d a ct u a l. Lu e g o ,
p a ra ve rifica r q u e e l co n t ro la d o r d e s e g u rid a d e s t á e n s u lu g a r y e s o p e ra cio n a l, e s t a a p lica ció n
a b re d o s fich e ro s - - u n o p a ra le e r y o t ro p a ra e s crib ir - - y co p ia e l co n t e n id o d e l p rim e ro e n e l
se gundo.
El m é t o d o m a in ( ) co m ie n za co n la in s t a la ció n d e n u e vo co n t ro la d o r d e s e g u rid a d :
try {
System.setSecurityManager(new PasswordSecurityManager("Booga Booga"));
} catch (SecurityException se) {
System.out.println("SecurityManager already set!");
}
La lín e a e n n e g rit a d e l có d ig o a n t e rio r cre a u n n u e vo e je m p la r d e la cla s e
Pa s s wo rd S e cu rit yMa n a g e r co n la p a s s wo rd "Bo o g a Bo o g a ". Es t e e je m p la r e s p a s a d o a l m é t o d o
s e t S e c u rit y Ma n a g e r( ) d e la cla s e S ys t e m , q u e in s t a la e l o b je t o co m o e l co n t ro la d o r d e
s e g u rid a d p o r d e fe ct o p a ra la a p lica ció n q u e s e e s t á e je cu t a n d o . Es t e co n t ro la d o r d e s e g u rid a d
p e rm a n e ce rá e fe ct ivo d u ra n t e e l la e je cu ció n d e e s t a a p lica ció n .
S ó lo s e p u e d e s e le ccio n a r u n ve z e l co n t ro la d o r d e s e g u rid a d d e u n a a p lica ció n . En o t ra s
p a la b ra s , u n a a p lica ció n Ja va s ó lo p u d e in vo ca r u n a ve z a S y s t e m . s e t S e c u rit y Ma n a g e r( )
d u ra n t e s u ciclo d e vid a . Cu a lq u ie r in t e n t o p o s t e rio r d e in s t a la r u n co n t ro la d o r d e s e g u rid a d
d e n t ro d e u n a a p lica ció n Ja va re s u lt a rá e n u n a S e cu rit yExce p t io n .
El re s t o d e l p ro g ra m a co p ia e l co n t e n id o d e e s t e fich e ro in p u t t e x t . t x t e n u n fich e ro d e s a lid a
lla m a d o o u t p u t t e x t . t x t . Es s ó lo u n t e xt o q u e ve rifica q u e Pa s s wo rd S e cu rit yMa n a g e r s e h a
in s t a la d o d e fo rm a a p ro p ia d a .
try {
DataInputStream fis = new DataInputStream(new FileInputStream("inputtext.txt"));
DataOutputStream fos = new DataOutputStream(new
FileOutputStream("outputtext.txt"));
String inputString;
while ((inputString = fis.readLine()) != null) {
fos.writeBytes(inputString);
fos.writeByte('\n');
}
fis.close();
fos.close();
} catch (IOException ioe) {
System.err.println("I/O failed for SecurityManagerTest.");
}
La s lín e a s e n n e g rit a d e l có d ig o a n t e rio r s o n lo s a cce s o s a l s is t e m a d e fich e ro s re s t rin g id o . Es t a s
lla m a d a s a m é t o d o re s u lt a n e n u n a lla m a d a a l m é t o d o c h e c k Ac c e s s ( ) d e l
Pa s s wo rd S e cu rit yMa n a g e r.
Ejecutar el Programa de Prueba
Cu a n d o e je cu t e s la a p lica ció n S e cu rit yMa n a g e rTe s t t e p e d irá d o s ve ce s la p a s s wo rd :
u n a cu a n d o la a p lica ció n a b re e l fich e ro d e e n t ra d a y o t ra cu a n d o a b re e l fich e ro d e
s a lid a . S i t e cle a s la p a s s wo rd co rre ct a , s e p e rm it e e l a cce s o - - e l o b je t o fich e ro - - y la
a p lica ció n p ro s ig u e co n la s ig u ie n t e s e n t e n cia . S i t e cle a s u n a p a s s wo rd in co rre ct a ,
c h e c k XXX( ) la n za u n a S e cu rit yExce p t io n , q u e la a p lica ció n n o in t e n t a ca p t u ra r p o r lo
q u e a p lica ció n t e rm in a .
Es t e e s u n e je m p lo d e la s a lid a d e a p lica ció n cu a n d o s e t e cle a la p a s s wo rd co rre ct a la
p rim e ra ve z, p e ro n o la s e g u n d a :
What's the secret password?
Booga Booga
What's the secret password?
Wrong password
java.lang.SecurityException: Not Even!
at PasswordSecurityManager.checkWrite(PasswordSecurityManager.java:46)
at java.io.FileOutputStream.(FileOutputStream.java)
at SecurityManagerTest.main(SecurityManagerTest.java:15)
Ob s e rva q u e e l m e n s a je d e e rro r q u e m u e s t ra la a p lica ció n e s e l m e n s a je co n t e n id o e n
e l m é t o d o c h e c k W rit e ( S t rin g ) .

También puede ver:


ja va . la n g . S ys t e m

Oz it o
Decidir los Métodos a Sobreescribir del
SecurityManager
Po d ría s t e n e r q u e s o b re e s crib ir va rio s m é t o d o s c h e c k XXX( ) d e l S e cu rit yMa n a g e r
d e p e n d ie n d o d e la s o p e ra cio n e s a la s q u e q u ie ra s q u e e l co n t ro la d o r d e s e g u rid a d
le s im p o n g a re s t rccio n e s .
La p rim e ra co lu m n a d e la s ig u ie n t e t a b la s o n o b je t o s s o b re lo s q u e s e p u e d e n
re a liza r va ria s o p e ra cio n e s . La s e g u n d a co lu m n a lis t a lo s m é t o d o s d e
S e cu rit yMa n a g e r q u e a p ru e b a n la s o p e ra cio n e s d e lo s o b je t o s d e la p rim e ra
co lu m n a .
Ope racione s sobre Aprovadas por
che ckAcce pt (S t r ing host , int por t )
che ckConne ct (S t r ing host , int por t )
socke t s
che ckConne ct (S t r ing host , int por t , Obj e ct e xe cut ionCont e xt )
che ckList e n(int por t )
che ckAcce ss(Thr e ad t hr e ad )
t hr e ads
che ckAcce ss(Thr e adGr oup t hr e adgr oup )
class loade r che ckCr e at e ClassLoade r ()
che ckDe le t e (S t r ing f ile name )
che ckLink(S t r ing libr ar y)
che ckRe ad(File De scr ipt or f ile de scr ipt or )
sist e ma de f iche r os che ckRe ad(S t r ing f ile name )
che ckRe ad(S t r ing f ile name , Obj e ct e xe cut ionCont e xt )
che ckWr it e (File De scr ipt or f ile de scr ipt or )
che ckWr it e (S t r ing f ile name )
comandos de l sist e ma che ckExe c(S t r ing command )
int e r pr e t e che ckExit (int st at us )
che ckPackage Acce ss(S t r ing package Name )
paque t e
che ckPackage De f init ion(S t r ing package Name )
che ckPr ope r t ie sAcce ss()
pr opie dade s che ckPr ope r t yAcce ss(S t r ing ke y)
che ckPr ope r t yAcce ss(S t r ing ke y, S t r ing de f )
ne t wor king che ckS e t Fact or y()
windows che ckTopLe ve lWindow(Obj e ct window)

De p e n d ie n d o d e t u p o lít ica d e s e g u rid a d , p u e d e s s o b re e s crib ir a lg u n o s o t o d o s


e s t o s m é t o d o s . Po r e je m p lo , s u p o n q u e e s t á s e s crib ie n d o u n Na ve g a d o r We b o u n
vis u a liza d o r d e a p p le t s y q u ie re s e vit a r q u e lo s a p p le t s u t ilice n s o cke t s . Pu e d e s
h a ce r e s t o s o b re e s crib ie n d o lo s cu a t ro m é t o d o s q u e a fe ct a n a l a cce s o a lo s
s o cke t s .
Mu ch o s d e lo s m é t o d o s c h e c k XXX( ) s o n lla m a d o s e n m ú lt ip le s s it u a cio n e s . Ya
vis t e e s t o cu a n d o e s crib im o s e l Pa s s wo rd S e cu rit yMa n a g e r e n Es crib ir u n
Co n t ro la d o r d e S e g u rid a d - - e l m é t o d o c h e c k Ac c e s s ( Th re a d Gro u p g ) e s lla m a d o
cu a n d o s e cre a u n Th re a d Gro u p , s e le ccio n a s u e s t a d o d e s e rvicio , lo p a ra , e t c.
Cu a n d o s o b re e s crib a s u n m é t o d o c h e c k XXX( ) a s e g u ra t e d e q u e co m p re n d e s
t o d a s la s s it u a cio n e s e n la s q u e p u e d e s e r lla m a d o .
La im p le m e n t a ció n p o r d e fe ct o s u m in is t ra d a p o r la cla s e S e cu rit yMa n a g e r p a ra
t o d o s lo s m é t o d o s c h e c k XXX( ) e s :
public void checkXXX(. . .) {
throw new SecurityException();
}
La m a yo ría d e la s ve ce s q u e rrá a q u e h a g a a lg o m á s s e le ct ivo q u e p ro h ib irlo t o d o !
Po r e s o p o d ría s e n co n t ra r q u e d e b e s s o b re s s crib ir t o d o s lo s m é t o d o s c h e c k XXX( )
d e S e cu rit yMa n a g e r.

Oz it o
Cambios en el JDK 1.1:
Trabajo en Red y Seguridad
En e l JDK 1 . 1 s e h a a u m e n t a d o e l re n d im ie n t o d e l p a q u e t e d e re d : s e h a a ñ a d id o
s o p o rt e p a ra o p cio n e s d e e s t ilo BS D e n lo s s o cke t s , la s cla s e s S o c k e t a n d
S e rv e rS o c k e t ya n o s o n fin a le s y s e p u e d e n e xt e n d e r, s e h a n a ñ a d id o n u e va s
s u b cla s e s d e S o c k e t Ex c e p t io n p a ra u n a m e jo r in fo rm e y m a n e jo d e e rro re s d e
re d , s e h a a ñ a d id o s o p o rt e p a ra m u lt it ip a d o . El JDK 1 . 1 t a m b ié n in clu ye u n
a u m e n t o d e re n d im ie n t o g e n e ra l y co rre cció n d e e rro re s .
Pa ra fin a liza r, s e h a n a ñ a d id o e s t a s cla s e s e in t e rfa ce s a l p a q u e t e ja v a . n e t :

Nuevas clases:
DatagramSocketImpl
HttpURLConnection
MulticastSocket

Nuevas Clases de Excepciones:


BindException
ConnectionException
NoRouteToHostException

Nuevo Interface:
FileNameMap
Pa ra m á s in fo rm a ció n s o b re lo s ca m b io s e n la s cla s e s e xis t e n t e p u e d e s ve r la s
n o t a s e n la s s ig u ie n t e s le ccio n e s :
Tra b a ja r co n URLs ( No t a s 1 . 1 )
S e h a h e ch o u n ca m b io m e n o r e n la cla s e URLCo n n e ct io n y s e h a n co rre g id o
a lg u n o s e rro re s q u e h a b ía e n e s t a cla s e .
To d o s o b re lo s S o cke t s ( No t a s 1 . 1 )
S e h a a u m e n t a d o e l re n d im e n t o d e l p a q u e t e d e re d .
To d o s o b re lo s Da t a g ra m a s ( No t a s 1 . 1 )
S e h a n a ñ a d id o va rio s m é t o d o s a D a t a g ra m P a c k e t y D a t a g ra m S o c k e t .
Pro p o rcio n a r t u p ro p io co n t ro la d o r d e S e g u rid a d
La ve rs ió n d e l JDK 1 . 1 co n t ie n e u n n u e vo co n u n t o d e APIs d e s e g u rid a d e n e l
p a q u e t e ja v a . s e c u rit y y s u s s u b - p a q u e t e s . Pu e d e s ve r u n a n u e va ru t a
S e g u rid a d Ja va 1 . 1 [ PENDIENTE] , p a ra m á s in fo ra m ció n s o b re lo s n u e vo s
APIs d e s e g u rid a d .

Oz it o
JavaBeans: Componentes de la Plataforma Java
Lo s Ja va Be a n s t ra e n la t e cn o lo g ía d e co m p o n e n t e s a la Pla t a fo rm a Ja va . S e p u e d e
u t iliza r e l API Ja va Be a n s p a ra e s crib ir cla s e s Ja va , co n o cid a s co m o Be a n s , q u e s e
p u e d e n m a n ip u la r vis u a lm e n t e co n h e rra m ie n t a s vis u a le s .
Ja va Be a n s e s u n a ca p a cid a d d e l JDK1 . 1 . Cu a lq u ie r n a ve g a d o r o
h e rra m ie n t a q u e s o p o rt e JDK1 . 1 s o p o rt a im p lícit a m e n t e lo s Ja va Be a n s .
Es t e d o cu m e n t o e s u n a g u ía d e m a n o p a ra co n o ce r lo s Ja va Be a n s y e l Kit d e
De s a rro llo d e Be a n s ( BDK) . La Es p e cifica ció n d e l API Ja va Be a n s p ro p o rcio n a u n a
d e s crip ció n co m p le t a d e lo s Ja va Be a n s . Im p rim e u n a co p ia d e e s t a e s p e cifica ció n ,
y m a n t e n la ce rca m ie n t ra s le e s e s t e d o cu m e n t o .
El s o ft wa re q u e s e n e ce s it a p a ra a p re n d e r s o b re lo s Ja va Be a n s e s t á d is p o n ib le e n
la we b . Ad e m á s d e l Kit d e De s a rro llo d e Be a n s ( BDK) , n e ce s it a re m o s e l Ja va
De ve lo p m e n t Kit ( JDK) .
Co n ce p t o s s o b re lo s Ja va Be a n s y e l BDK d e s crib e lo q u e h a ce u n Be a n , y q u e e s
BDK,
Ut iliza r e l Be a n Bo x d e s crib e la s o p e ra cio n e s b á s ica s d e Be a n Bo x, y e xp lica s u s
m enús.
Es crib ir u n Be a n S e n cillo e n s e ñ a co m o cre a r u n Be a n ru d im e n t a rio , co m o
g u a rd a rlo , co m o a ñ a d irlo a To o lBo x s it u a n d o e l Be a n d e n t ro d e Be a n Bo x, co m o
in s p e cio n a r la s p ro p ie d a d e s y lo s e ve n t o s d e l Be a n , y co m o g e n e ra r u n in fo rm e d e
in t ro s p e cció n d e u n Be a n .
Pro p ie d a d e s e xp lica có m o d a r p ro p ie d a d e s a lo s Be a n s : La s ca ra ct e rís t ica s d e
a p a rie n cia y co m p o rt a m ie n t o d e l Be a n p e rs o n a liz a b le s d u ra n t e e l d is e ñ o .
Ma n ip u la r Eve n t o s e n e l Be a n Bo x d e s crib e la s ca p a cid a d e s d e m a n ip u la ció n d e
e ve n t o s d e l Be a n Bo x. S i n o e s t á s fa m ilia riza d o co n e l m a n e jo d e e ve n t o s d e b e ría s
le e r Me ca n is m o d e e ve n t o s d e l JDK 1 . 1 p a ra p re p a ra r e s t e m a t e ria l.

El in t e rfa ce Be a n I n fo d e s crib e co m o e s crib ir cla s e s d e in fo rm a ció n d e Be a n s :


S e p a ra la s cla s e s q u e s e p u e d e n u t iliza r e xp lícit a m e n t e a vis a n d o d e la s
p ro p ie d a d e s , lo s m é t o d o s y lo s e ve n t o s d e l Be a n a la h e rra m ie n t a vis u a l.
Pe rs o n a liza r Be a n s p re s e n t a la s p ro p ie d a d e s d e e d it o r, y e l in t e rfa ce Cu s t o m iz e r .

Pe rs is t e n cia d e u n Be a n e xp lica co m o g u a rd a r y re s t a u ra r n u e s t ro s Be a n s , y s u s
e s t a d o s p e rs o n a liza d o s .
Nu e va s Ca ra ct e rís it ca s d e s crib e e l Ma rco d e Tra b a jo "Ja va Act iva t io n ",
Be a n Co n t e x t , y e l "d ra g a n d d ro p " n a t ivo .
Documentación Adicional
El d ire ct o rio b e a n s / d o c s d e l BDK co n t ie n e e s t a in fo rm a ció n :
● El API Be a n s

● El API Be a n Bo x

● Be a n s d e e je m p lo

● El API ja v a . u t il

● Fich e ro s ( JAR) y s u s m a n ifie s t o s

● Ma ke file s p a ra g n u m a ke ( Un ix) y n m a ke ( Win d o ws )

Un b u e n p u n t o d e e n t ra d a e s e l fich e ro b e a n s / READ ME. h t m l.


La p á g in a Do cu m e n t a ció n Ja va Be a n s co n t ie n e la s d e fin icio n e s a ct u a le s d e l API
Ja va Be a n s , in clu ye n d o la s d e s crip cio n e s d e la s ca ra ct e rís t ica s d e lo s Ja va Be a n s , y
d o cu m e n t a ció n re la cio n a d a co m o e l API Re fle ct io n , S e ria liza ció n d e l Ob je t o s ,
In vo ca ció n d e Mé t o d o s Re m o t o s ( RMI) , y u n a lis t a d e lib ro s d e Ja va Be a n s d e
t e rce ra s p a rt e s .

Oz it o
Conceptos sobre los JavaBeans
El API Ja va Be a n s p e rm it e e s crib ir co m p o n e n t e s s o ft wa re e n Ja va . Lo s co m p o n e n t e s
s o n u n id a d e s s o ft wa re re u t iliza b le s y a u t o - co n t e n id a s q u e p u e d e n s e r u n irs e
vis u a lm e n t e e n co m p o n e n t e s co m p u e s t o s , a p p le t s , a p lica cio n e s y s e rvle t s
u t iliza n d o h e rra m ie n t a s vis u a le s d e d e s a rro llo d e a p lica cio n e s .
Lo s co m p o n e n t e s Ja va Be a n s o n co n o cid o s co m o Be a n s . Un a h e rra m ie n t a d e
d e s a rro llo q u e s o p o rt e Ja va Be a n s , m a n t ie n e lo s Be a n s e n u n p a le t a o ca ja d e
h e rra m ie n t a s . S e p u e d e s e le ccio n a r u n Be a n d e la p a le t a , a rra s t a rlo d e n t ro d e u n
fo rm u la rio , m o d ifica r s u a p a rie n cia y s u co m p o rt a m ie n t o , d e fin ir s u in t e ra cció n co n
o t ro s Be a n s , y co m p o n e r u n a p p le t , u n a a p lica ció n , o u n n u e vo Be a n , ju n t o co n
o t ro s Be a n s . To d o e s t o s e p u e d e h a ce r s in e s crib ir u n a lín e a d e có d ig o .
La s ig u ie n t e lis t a d e s crib e b re ve m e n t e lo s co n ce p t o s cla ve d e lo s Be a n s :
● La s h e rra m ie n t a s d e d e s a rro llo d e s cu b re n la s ca ra ct e rís t ica s d e u n Be a n ( e s t o
e s , s u s p ro p ie d a d e s , s u s m é t o d o s y s u s e ve n t o s ) m e d ia n t e u n p ro ce s o
co n o cid o co m o in t ro s p e c c ió n . Lo s Be a n s s o p o rt a n la in t ro s p e cció n d e d o s
fo rm a s :
❍ Ad h e rie n d o s e a la s co n ve n cio n e s e s p e cífica s d e n o m b re s co n o cid a s co m o
p a t ro n e s d e n o m b ra d o , cu a n d o s e n o m b ra n la s ca ra ct e rís it ca s d e l
Be a n . La cla s e ja v a . b e a n s . I n t ro s p e c t o r e xa m in a e l Be a n b u s ca n d o
e s o s p a t ro n e s d e d is e ñ o p a ra d e s cu b rir la s ca ra ct e rís it ica s d e l Be a n . La
cla s e I n t ro s p e c t o r s e e n cu e n t ra e n e l API co re re fle ct io n .
❍ Pro p o rcio n a n d o e xp lícit a m e n t e in fo rm a ció n s o b re la p ro p ie d a d , e l
m é t o d o o e l e ve n t o co n u n a cla s e Be a n In fo rm a t io n re la cio n a d a . Es t a
cla s e im p le m e n t a e l in t e rfa ce Be a n I n fo . Un a cla s e Be a n I n fo lis t a
e xp lícit a m e n t e a q u e lla s ca ra ct e rís it ca s d e l Be a n q u e e s t á n e xp u e s t a s a la
h e rra m ie n t a d e d e s a rro llo .
Pu e d e s ve r e l ca p ít u lo 8 d e Es p e cifica cio n e s d e l API Ja va Be a n s p a ra u n a
e xp lica ció n s o b re la in t ro s p e cció n , lo s p a t ro n e s d e d is e ñ o y Be a n I n fo .
● Pro p ie d a d e s S o n la s ca ra ct e rís it ca s d e a p a rie n cia y co m p o rt a m ie n t o d e u n
Be a n q u e p u e d e n s e r m o d ifica d a s d u ra n t e e l d is e ñ o . La s p ro p ie d a d e s s e
e xp o n e n a la s h e rra m ie n t a s d e d e s a rro llo m e d ia n t e lo s p a t ro n e s d e d is e ñ o o
u n a cla s e Be a n I n fo . Pu e d e s ve r e l ca p ít u lo 7 d e la Es p e cifica ció n d e l API
Ja va Be a n s p a ra u n a co m p le t a e xp lica ció n .
● Lo s Be a n s e xp o n e n s u s p ro p ie d a d e s p a ra p o d e r s e r p e rs o n a liz a d o s d u ra n t e
e l d is e ñ o . La p e rs o n a liza ció n s e s o p o rt a d e d o s fo rm a s : u t iliza n d o e d it o re s d e
p ro p ie d a d e s , o u t iliza n d o p e rs o n a liza d o re s d e Be a n s m á s s o fis t ica d o s . Pu e d e s
ve r e l ca p ít u lo 9 d e la Es p e cifica ció n d e l API Ja va Be a n s p a ra u n a e xp lica ció n
co m p le t a .
● Lo s Be a n s u t iliza n lo s e v e n t o s p a ra co m u n ica rs e co n o t ro s Be a n s . Un Be a n
q u e q u ie re re cib ir e ve n t o s ( u n Be a n o ye n t e ) re g is t ra s u in t e ré s co n u n Be a n
q u e la n za e ve n t o s ( u n Be a n fu e n t e ) . La s h e rra m ie n t a s d e d e s a rro llo p u e d e n
e xa m in a r u n Be a n p a ra d e t e rm in a r q u e e ve n t o s p u e d e d is p a ra r ( e n via r) y
cu a le s p u e d e m a n e ja r ( re cib ir) . Pu e d e s ve r e l Ca p ít u lo 6 d e la Es p e cifica ció n
d e l API Ja va Be a n s p a ra u n a e xp lica ció n co m p le t a .
● La Pe rs is t e n cia p e rm it e a lo s Be a n s g u a rd a r s u e s t a d o , y re s t a u ra rlo
p o s t e rio rm e n t e . Un a ve z q u e s e h a n ca m b ia d o la s p ro p ie d a d e s d e Be a n , s e
p u e d e g u a rd a r s u e s t a d o y re s t a u ra r e l Be a n p o s t e rio rm e n t e . Lo s Ja va Be a n s
u t iliza n la S e ria liza ció n d e Ob je t o s Ja va p a ra s o p o rt a r la Pe rs is t e n cia . Pu e d e s
ve r e l ca p ít u lo 5 d e la Es p e cifica ció n d e l API Ja va Be a n s p a ra u n a e xp lica ció n
co m p le t a .
● Lo s m é t o d o s d e u n Be a n n o s o n d ife re n t e s d e lo s m é t o d o s Ja va , y p u e d e n s e r
lla m a d o s d e s d e o t ro s Be a n s o d e s d e u n e n t o rn o d e s crip t s . Po r d e fe ct o , t o d o s
lo s m é t o d o s p ú b lico s s o n e xp o rt a d o s .
Au n q u e lo s Be a n s h a n s id o d is e ñ a d o s p a ra s e r e n t e n d id o s p o r h e rra m ie n t a s d e
d e s a rro llo , t o d a s la s cla ve s d e l API, in clu ye n d o e l s o p o rt e p a ra e ve n t o s , la s
p ro p ie d a d e s y la p e rs is t e n cia , h a n s id o d is e ñ a d a s p a ra s e r fá cilm e n t e e n t e n d ib le s
p o r lo s p ro g ra m a d o re s h u m a n o s .

Oz it o
Contenidos del BDK
Aq u í t ie n e s u n a d e s crip ció n g e n e ra l d e lo s fich e ro s y d ire ct o rio s d e l BDK:
● READ ME. h t m l Co n t ie n e u n p u n t o d e e n t ra d a a la d o cu m e n t a ció n d e l BDK.

● LI CEN S E. h t m l Co n t ie n e la s co n d icio n e s d e lice n cia d e BDK.

● GN Um a k e file y Ma k e file s o n fich e ro s Ma ke Un ix y Win d o ws ( . g m k a n d . m k


s u ffixe s ) p a ra co n s t ru ir lo s d e m o s y e l Be a n Bo x y p a ra e je cu t a r e l Be a n Bo x
● b e a n s / a p is co n t ie n e

❍ ja v a u n d ire ct o rio q u e co n t ie n e fich e ro s fu e n t e s d e Ja va Be a n s .

❍ s u n u n d ire ct o rio q u e co n t ie n e fich e ro s fu e n t e d e l e d it o r d e p ro p ie d a d e s .

● b e a n s / b e a n b o x co n t ie n e

❍ m a ke file s p a ra co n s t ru ir e l Be a n Bo x

❍ s crip t s p a ra e je cu t a r Be a n Bo x

❍ c la s s e s u n d ire ct o rio q u e co n t ie n e la s cla s e d e Be a n Bo x

❍ lib u n d ire ct o rio q u e co n t ie n e fich e ro Ja r d e s o p o rt e d e Be a n Bo x u t ilza d o


p o r Ma ke Ap p le t p a ra p ro d u cir có d ig o .
❍ s u n y s u n w d ire ct o rio s q u e co n t ie n e n lo s fich e ro s fu e n t e d e Be a n Bo x.

❍ t m p u n d ire ct o rio q u e co n t ie n e fich e ro s d e cla s e s g e n e ra d o s


a u t o m á t ica m e n t e , y fich e ro s d e a p p le t s g e n e ra d o s a u t o m á t ica m e n t e p o r
Ma ke Ap p le t .
● b e a n s / d e m o s co n t ie n e

❍ m a ke file s p a ra co n s t ru ir lo s Be a n s d e e je m p lo

❍ u n d ire ct o rio h t m l q u e co n t ie n e d e m o s t ra cio n e s d e lo s a p p le t rs q u e


d e b e n s e r e je cu t a d a s e n a p p le t vie we r, Ho t Ja va , o n a ve g a d o re s q u e
s o p o rt e n JDK1 . .
❍ s u n w u n d ire ct o rio q u e co n t ie n e

■ w ra p p e r u n d ire ct o rio q u e co n t ie n e u n Be a n d e u n a p p le t

■ d e m o s u n d ire ct o rio q u e co n t ie n e lo s fich e ro s fu e n t e s d e la s d e m o s

● b e a n s / d o c co n t ie n e

❍ d o cu m e n t a ció n d e la s d e m o s

❍ u n d ire ct o rio ja va d o c q u e co n t ie n e Ja va Be a n s y cla s e s re la cio n a d a s y u n


in t e rfa ce d e d o cu m e n t a ció n .
❍ d o cu m e n t a ció n m is ce la n e a .

● b e a n s / ja rs co n t ie n e fich e ro s Ja r p a ra lo s Be a n s d e e je m p lo .

Oz it o
Utilizar BeanBox
El Be a n Bo x e s u n co n t e n d o r d e Be a n s . S e p u e d e n e s crib ir Be a n s , lu e g o a rra s t ra rlo s
d e n t ro d e Be a n Bo x p a ra ve r s i fu n cio n a n co m o s e e s p e ra b a . El Be a n Bo x t a m b ié n
s irve co m o u n a d e s m o s t ra ció n d e có m o d e b e n co m p o rt a rs e la s h e rra m ie n t a s d e
d e s a rro llo co m p a t ib le s co n lo s Ja va Be a n s . El Be a n Bo x t a m b ié n e s u n a b u e n a
h e rra m ie n t a p a ra a p re n d e r s o b re lo s Be a n s . En e s t a s e cció n a p re n d e rá s co m o
u t iliza r Be a n Bo x.
Arra n ca r y Ut iliza r Be a n Bo x e xp lica co m o a rra n ca r Be a n Bo x, y d e s crib e la ca ja d e
h e rra m ie n t a s y la h o ja d e p ro p ie d a d e s .
Lo s Me n ú s d e Be a n Bo x e xp lica ca d a u n o d e lo s ít e m s d e lo s m e n ú s d e Be a n Bo x.

Ut iliza r Be a n Bo x p a ra Ge n e ra r Ap p le t s d e m u e s t ra la fa cilid a d d e Be a n Bo x p a ra
g e n e ra r a p p le t s .

Oz it o
Arrancar y Utilizar BeanBox
El d ire ct o rio b e a n s / b e a n b o x co n t ie n e s crip t s p a ra Win d o ws ( ru n . b a t ) y Un ix ( ru n . s h ) q u e
a rra n ca n Be a n Bo x. S e p u e d e n u t iliza r e s t o s co m a n d o s p a ra a rra n ca rlo o u t iliza r:

gnumake run
O:

nmake run
Pu e d e s ve r lo s fich e ro s d e l BDK b e a n s / d o c / m a k e file s . h t m l y b e a n s / d o c / g n u . t x t p a ra
in fo rm a ció n s o b re có m o o b t e n e r co p ia s d e e s t a s h e rra m ie n t a s .
Cu a n d o s e a rra n ca , e l Be a n Bo x m u e s t ra t re s ve n t a n a s : Be a n Bo x, To o lBo x, y la Ho ja d e
Pro p ie d a d e s . Aq u í p u e d e s ve r s u a s p e ct o :

El To o lBo x co n t ie n e lo s Be a n s d is p o n ib le s p a ra u t iliza r co n e l Be a n Bo x. S e p u e d e n a ñ a d ir
Be a n s a l To o lBo x. El Be a n Bo x e s e l á re a d e t ra b a jo ; s e s e le ccio n a n lo s Be a n s d e To o lBo x y
s e a rra s t ra n h a cia e l Be a n Bo x p a ra p o d e r t ra b a ja r s o b re e llo s . La h o ja d e p ro p ie d a d e s
m u e s t ra la s p ro p ie d a d e s d e l Be a n s e le ccio n a d o a ct u a lm e n t e d e n t ro d e l Be a n Bo x.
La ilu s t ra ció n m u e s t ra e l Be a n Ju g g le r d e n t ro d e l Be a n Bo x. El re cu a d ro a lre d e d o r d e l Be a n
s ig n ifica q u e e s t á s e le ccio n a d o . S e s e le ccio n a p u ls a n d o s o b re e l Be a n d e n t ro d e l Be a n Bo x.
La h o ja d e p ro p ie d a d e s m u e s t ra la s p ro p ie d a d e s d e Ju g g le r.
Añadir un Bean a ToolBox
Cu a n d o Be a n Bo x a rra n ca , ca rg a a u t o m á t ica m e n t e e l To o lBo x co n lo s Be a n s q u e e n cu e n t re
d e n t ro d e lo s fich e ro s JAR co n t e n id o s e n e l d ire ct o rio b e a n s / ja rs . Mo ve r lo s fich e ro s JAR a
e s t e d ire ct o ria h a ce q u e s e a n ca rg a d o s a u t o m á t ica m e n t e cu a n d o a rra n ca Be a n Bo x. S e
p u e d e n ca rg a r lo s Be a n s d e s d e fich e ro s JAR lo ca liza d o s e n cu a lq u ie r d ire ct o rio u t iliza n d o e l
m é n u File | Lo a d Ja r. . . d e Be a n Bo x.

Arrastrar un Bean al BeanBox


Pu ls a r s o b re e l n o m b re d e u n Be a n d e n t ro d e To o lBo x lo e lig e p a ra s it u a rlo d e n t ro d e l
Be a n Bo x. Pa ra a rra s t a r u n e je m p la r d e Je lly Be a n a l Be a n Bo x:
1 . Pu ls a s o b re la p a la b ra Je lly Be a n e n To o lBo x. El cu rs o r ca m b ia a u n cru ce d e e je s .
2 . Pu ls a d e n t ro d e Be a n Bo x. El Je lly Be a n a p a re ce rá y s e rá s e le ccio n a d o .
Ob s e rva e l ca m b io e n la h o ja d e p ro p ie d a d e s cu a n d o p o n g a s Je lly Be a n e n e l Be a n Bo x.
An t e s d e s it u a r Je lly Be a n e n e l Be a n Bo x, s e m o s t ra b a la h o ja d e p ro p ie d a d e s d e Be a n Bo x;
d e s p u é s d e s it u a rlo , s e m o s t ra rá la h o ja d e p ro p ie d a d e s d e Je lly Be a n . S i n o h a s vis t o e l
ca m b io , p u ls a d e n t ro d e l Be a n Bo x, fu e ra d e Je lly Be a n . Es t o s e le ccio n a rá e l Be a n Bo x e n
ve x d e Je lly Be a n . La h o ja d e p ro p ie d a d e s m o s t ra rá e n t o n ce s la s p ro p ie d a d e s d e l Be a n Bo x.
De s p u é s d e a rra s t ra r u n e je m p la r d e Je lly Be a n a l Be a n Bo x, la h o ja d e p ro p ie d a d e s
m o s t ra rá la s p ro p ie d a d e s d e Je lly Be a n : co lo r, fo re g ro u n d , p rice In Ce n t s , b a ckg ro u n d , y
fo n t .

Editar las Propiedades de un Bean


La h o ja d e p ro p ie d a d e s m u e s t ra ca d a n o m b re d e p ro p ie d a d y s u va lo r a ct u a l. Lo s va lo re s s e
m u e s t ra n e n ca m p o s d e t e xt o e d it a b le s ( S t rin g s y n ú m e ro s ) , m e n ú s ch o cie ( Bo o le a n o s ) o
co m o va lo re s d e d ib u jo ( Co lo re s y Fu e n t e s ) . Ca d a p ro p ie d a d t ie n e u n e d it o r d e p ro p ie d a d
a s o cia d o . Pu ls a r s o b re u n a p ro p ie d a d e n la h o ja d e p ro p ie d a d e s a ct iva e l e d it o r d e e s a
p ro p ie d a d . La s p ro p ie d a d e s m o s t ra d a s e n ca m p o s d e t e xt o o m e n ú s ch o ice s e e d it a n d e n t ro
d e la h o ja d e p ro p ie d a d e s .
Co m o e d it a r s u s va lo re s n e ce s it a u n o s in t e rfa ce s d e u s u a rio m á s s o fs t ica d o s , lo s c o lo re s y
la s fu e n t e s u t iliza n u n e d it o r d e p ro p ie d a d e s p e rs o n a liz a d o . Cu a n d o s e p u ls a s o b re u n a
p ro p ie d a d d e co lo r o d e fu e n t e s e la n za u n p a n e l s e p a ra d o p a ra e d it a rlo . In t e n t a p u ls a r e n
t o d a s la s p ro p ie d a d e s d e Je lly Be a n .

Guardar y Estaurar Beans


El Be a n Bo x u t iliza S e ria liza ció n d e Ob je t o s Ja va p a ra g ra b a r y re s t a u ra r Be a n s y s u s
e s t a d o s . Lo s s ig u ie n t e s p a s o s d e m u e s t ra n co m o g ra b a r y re s t a u ra r u n Be a n :
1 . Arra s t ra u n Je lly Be a n a l Be a n Bo x.
2 . Ca m b ia la p ro p ie d a d c o lo r a l co lo r q u e q u ie ra s .
3 . S e le ccio n a e l m e n ú File | S a ve d e Be a n Bo x. Ap a re ce rá u n n a ve g a d o r d e fich e ro s ,
u t iliza la p a ra g ra b a r e l Be a n e n u n fich e ro .
4 . S e le ccio n a e l m e n ú File | Cle a r d e Be a n Bo x.
5 . S e le ccio n a e l m e n ú File | Lo a d d e Be a n Bo x. Ap a re ce rá d e n u e vo e l n a ve g a d o r d e
fich e ro s ; u t iliza lo p a ra re cu p e ra r e l Be a n s e ria liza d o .
Oz it o
Los menús de BeanBox
Es t a p á g in a e xp lica ca d a u n o d e lo s ít e m s d e lo s m e n ú s d e Be a n Bo x File , Ed it y
Vie w.
Me n ú File
Save
Gu a rd a lo s Be a n s q u e h a y e n e l Be a n Bo x, in clu ye n la p o s ició n , e l t a m a ñ o y e l
e s t a d o in t e rn o d e ca d a Be a n . El fich e ro g u a rd a d o p u e d e s e r ca rg a d o m e d ia n t e
File | Lo a d .
S e ria liz e Co m p o n e n t . . .
Gu a rd a lo s Be a n s q u e h a y e n e l Be a n Bo x e n u n fich e ro s e ria liza d o ( . s e r) . Es t e
fich e ro d e b e p o n e rs e e n u n fich e ro . ja r p a ra s e r u t iliza b le .
Ma k e Ap p le t . . .
Ge n e ra u n a p p le t a p a rt ir d e l co n t e n id o d e l Be a n Bo x.
Lo a d . . .
Ca rg a fich e ro s g u a rd a d o s e n e l Be a n Bo x. No ca rg a rá fich e ro s . s e r .
Lo a d Ja r. . .
Ca rg a e l co n t e n id o d e fich e ro s JAR e n e l To o lBo x.
P rin t
Im p rim e e l co n t e n id o d e l Be a n Bo x.
Cle a r
Elim in a e l co n t e n id o d e l Be a n Bo x.
Ex it
S a le d e Be a n Bo x s in o fre ce r e l g u a rd a d o d e lo s Be a n s .

Me n ú Ed it
Cu t
Elim in a e l Be a n s e le ccio n a d o e n e l Be a n Bo x. El Be a n co rt a d o e s s e ria liza d o , y
pue de se r pe ga do.
Co p y
Co p ia e l Be a n S e le ccio n a d o e n e l Be a n Bo x. El Be a n co p ia d o e s s e ria liza d o y p u e d e
se r pe ga do.
Pa s te
Pe g a e l ú lt im o Be a n co rt a d o o co p ia d o e n e l Be a n Bo x.
Re p o rt . . .
Ge n e ra u n in fo rm e d e in t ro s p e cció n s o b re e l Be a n s e le ccio n a d o .
Ev e n t s
Lis t a lo s e ve n t o s d is p a ra d o s p o r e l Be a n s e le ccio n a d o , a g ru p a d o s p o r in t e rfa ce s .
Bin d p ro p e rt y . . .
Lis t a t o d o s lo s m é t o d o s d e p ro p ie d a d e s e n co n t ra d o s e n e l Be a n s e le ccio n a d o .

Me n ú Vie w
D is a b le D e s ig n Mo d e
Elim in a d e la p a n t a lla la s ve n t a n a s d e l To o lBo x y la h o ja d e p ro p ie d a d e s . Elim in a
t o d o e l co m p o rt a m ie n t o d e d is e ñ o y p ru e b a d e l Be a n Bo x ( lo s b e a n s s e le ccio n a d o s )
y lo s co n vie rt e e n u n a a p lica ció n .
Hid e I n v is ib le Be a n s
Ocu lt a lo s Be a n s in vis ib le s .

Oz it o
Utilizar BeanBox para Generar Applets
S e p u e d e u t iliza r la o p ció n File | Ma ke Ap p le t . . . d e l m e n ú d e l Be a n Bo x p a ra g e n e ra r
u n a p p le t a p a rt ir d e lo s co n t e n id o s d e l Be a n Bo x. Al h a ce r e s t o s e cre a :
● Un fich e ro JAR q u e co n t ie n e lo s fich e ro s d e cla s e s y lo s d a t o s s e ria liza d o s .

● Un fich e ro d e p ru e b a HTML q u e u t iliza e l fich e ro JAR ( y cu a lq u ie r o t ro fich e ro


JAR n e ce s a rio ) :
● Un s u b d ire ct o rio co n lo s fich e ro s fu e n t e Ja va y Ma ke file .

● Un fich e ro re a d m e co n in fo rm a ció n co m p le t a s o b re e l a p p le t g e n e ra d o y lo s
fich e ro s in vo lu cra d o s .
S e g u ire m o s e s t o s p a s o s p a ra g e n e ra r u n a p p le t d e s d e Be a n Bo x:
1 . Ut iliza re m o s e l e je m p lo "Ju g g le r" q u e cre a m o s e n la p á g in a e ve n t o s . S i h e m o s
g u a rd a d o e l e je m p lo e n u n fich e ro , lo ca rg a re m o s e n e l Be a n Bo x u t iliza n d o e l
m e n ú File | Lo a d . S i n i lo g ra b a m o s , s e g u ire m o s lo s p a s o s d e la p á g in a d e
e ve n t o s p a ra co n s t ru ir e l e je m p lo . El a p p le t g e n e ra d o t ie n e e l m is m o t a m a ñ o
q u e e l m a rco d e l Be a n Bo x, p o r lo t a n t o d e b e ría m o s a ju s t a r e l t a m a ñ o d e l
Be a n Bo x a l t a m a ñ o q u e q u e ra m o s p a ra e l a p p le t .
2 . Ele g im o s File | Ma ke Ap p le t p a ra d is p a ra r la ve n t a n a d e d iá lo g o Ma ke Ap p le t :

Ut iliza re m o s e l n o m b re p a ra e l a p p le t y e l fich e ro JAR p o r d e fe ct o p a ra e s t e


e je m p lo . Pu ls a m o s e l b o t ó n OK.
Es t o e s t o d o . Lo s fich e ro s g e n e ra d o s s e h a n s it u a d o e n e l d ire ct o rio
b e a n b o x / t m p / m y Ap p le t . S e p u e d e in s p e ccio n a r n u e s t ro t ra b a jo lla m a n d o a l
a p p le t vie we r d e e s t a fo rm a :

appletviewer <BDKInstallation>/beanbox/tmp/myApplet.html.
Es t o e s lo q u e ve rá s :
No o lvid e s e ch a r u n vis t a zo a l fich e ro m y Ap p le t _ re a d m e , y a lo s o t ro s fich e ro s
g e n e ra d o s .
Lo s a p p le t s g e n e ra d o s p u e d e n u t iliza rs e e n cu a lq u ie r n a ve g a d o r co m p a t ib le co n
Ja va 1 . 1 . El Ap p le t Vie we r e s u n a b u e n a p la t a fo rm a d e p ru e b a . Ot ro n a ve g a d o r
co m p a t ib le e s e l Ho t Ja va . La ve rs ió n b e t a 3 d e l IE 4 . 0 n o s o p o rt a fich e ro s JAR, y
d e b e rá s e xp a n d ir lo s fich e ro s JAR y HTML g e n e ra d o s . Ta m b ié n , u n b u g e n la
d e s e ria liza ció n d e co m p o n e n t e s h a ce q u e e s t o s n o e s cu ch e n lo s e ve n t o s d e l ra t ó n .
Pu e d e s ve r e l fich e ro re a d m e n e ce s a rio p a ra m á s in fo rm a ció n . El a p p le t g e n e ra d o
n o fu n cio n a rá e n Ne t s ca p e Co m m u n ica t o r ve rs io n e s 4 . 0 y 4 . 1 .

Oz it o
Escribir un Bean Sencillo
En é s t a p á g in a a p re n d e re m o s a lg o m á s s o b re lo s Be a n s y Be a n Bo x:
● Cre a n d o u n Be a n s e n cillo .

● Co m p ila n d o y g u a rd a n d o e l Be a n e n u n a rch ivo JAR.

● Ca rg a a n d o e l Be a n e n e l To o lBo x

● Arra s t ra n d o u n e je m p la r d e l Be a n d e n t ro d e l Be a n Bo x.

● In s p e ccio n a n d o la s p ro p ie d a d e s d e l Be a n s , lo s m é t o d o s y lo s e ve n t o s .

● Ge n e ra n d o u n in fo rm e d e in t ro s p e cció n .

Nu e s t ro Be a n s e lla m a rá S im p le Be a n . Aq u í t ie n e s lo s p a s o s p a ra cre a rlo y ve rlo


e n e l Be a n Bo x:
1 . Es crib ir e l có d ig o d e S im p le Be a n . Po n e rlo e n u n fich e ro lla m a d o
S im p le Be a n . ja v a , e n cu a lq u ie r d ire ct o rio . Aq u í t ie n e s e l có d ig o :

import java.awt.*;
import java.io.Serializable;

public class SimpleBean extends Canvas


implements Serializable{

//Constructor sets inherited properties


public SimpleBean(){
setSize(60,40);
setBackground(Color.red);
}
}
S im p le Be a n d e s cie n d e d e l co m p o n e n t e ja v a . a w t . Ca n v a s . Ta m b ié n
im p le m e n t a e l in t e rfa ce ja va . io . S e ria liza b le , q u e e s re q u e rid o p o r t o d o s lo s
b e a n s . S e le ccio n a r e l co lo r d e l fo n d o y e l t a m a ñ o d e l co m p o n e n t e e s t o d o lo
q u e h a ce S im p le Be a n .
2 . As e g u ra t e d e q u e la va ria b le d e e n t o rn o CLAS S P ATH a p u n t a a t o d o s fich e ro s
. c la s s ( o . ja r) n e ce s a rio s .
3 . Co m p ila e l Be a n :

javac SimpleBean.java
Es t o p ro d u ce e l fich e ro d e cla s e S im p le Be a n . c la s s
4 . Cre a u n fich e ro d e m a n ifie s t o . Ut iliza t u e d it o r d e t e xt o fa vo rit o p a ra cre a r u n
fich e ro , q u e lla m a re m o s m a n ife s t . t m p , q u e co n t e n g a e l s ig u ie n t e t e xt o :

Name: SimpleBean.class
Java-Bean: True
5 . Cre a e l fich e ro JAR. Es t e fich e ro co n t e n d rá e l m a n ifie s t o y e l fich e ro d e cla s e
S im p le Be a n :

jar cfm SimpleBean.jar manifest.tmp SimpleBean.class


6 . Ca rg a e l fich e ro JAR e n e l To o lBo x. De s p lie g a e l m e n ú File | Lo a d Ja r. . . Es t o
t ra e rá u n n a ve g a d o r d e fich e ro s . Bu s ca la p o s ició n d e l fich e ro
S im p le Be a n . ja r y s e le ccio n a lo . S im p le Be a n a p a re ce rá e n la p a rt e in fe rio r
d e l To o lBo x. ( Ob s e rva q u e cu a n d o a rra n ca e l Be a n Bo x, t o d o s lo s b e a n s q u e
h a ya e n e l d ire ct o rio b e a n s / ja rs s e ca rg a n a u t o m á t ica m e n t e e n e l To o lBo x) .
7 . Arra s t ra u n e je m p la r d e S im p le Be a n d e n t ro d e l Be a n Bo x. Pu ls a s o b re la
p a la b ra S im p le Be a n e n e l To o lBo x. El cu rs o r ca m b ia a u n p u n t o d e m ira .
Mu e ve e l cu rs o r a l p u n t o d e l Be a n Bo x d o n d e q u ie re s s it u a r e l Be a n y p u ls a d e
n u e vo e l ra t ó n . S im p le Be a n a p a re ce rá co m o u n re ct á n g u lo p in t a d o co n u n
b o rd e m a rca d o . Es t o b o rd e s ig n ifica q u e e s t á s e le ccio n a d o . La s p ro p ie d a d e s
d e S im p le Be a n a p a re ce rá n e n la h o ja d e p ro p ie d a d e s .
S e p u e d e re d im e n s io n a r e l S im p le Be a n , ya q u e d e s cie n d e d e Ca n v a s ,
a rra s t ra n d o u n a e s q u in a d e la ve n t a n a . Ve ra s co m o e l cu rs o r ca m b ia a u n á n g u lo
re ct o cu a n d o p a s a s o b re u n a e s q u in a . Ta m b ié n s e p u e d e re p o s icio n a r d e n t ro d e l
Be a n Bo x, a rra s t a n d o d e s d e cu a lq u ie r p a rt e d e l b o rd e q u e n o s e a u n a e s q u in a .
Ve rá s q u e e l cu rs o r ca m b ia a u n a fle ch a s cru za d a s cu a n d o p a s a p o r e s t a s
p o s icio n e s .

Makefiles de SimpleBean
Ab a jo t ie n e s d o s Ma ke File s ( Un ix y Win d o ws ) co n fig u ra d o s p a ra cre a r
S im p le Be a n .

# gnumake file

CLASSFILES= SimpleBean.class

JARFILE= SimpleBean.jar

all: $(JARFILE)

# Create a JAR file with a suitable manifest.


$(JARFILE): $(CLASSFILES) $(DATAFILES)
echo "Name: SimpleBean.class" >> manifest.tmp
echo "Java-Bean: True" >> manifest.tmp
jar cfm $(JARFILE) manifest.tmp *.class
@/bin/rm manifest.tmp
# Compile the sources
%.class: %.java
export CLASSPATH; CLASSPATH=. ; \
javac $<

# make clean
clean:
/bin/rm -f *.class
/bin/rm -f $(JARFILE)

Aq u í t ie n e s la ve rs ió n Win d o ws d e n m a ke :

# nmake file
CLASSFILES= simplebean.class

JARFILE= simplebean.jar

all: $(JARFILE)

# Create a JAR file with a suitable manifest.

$(JARFILE): $(CLASSFILES) $(DATAFILES)


jar cfm $(JARFILE) << manifest.tmp *.class
Name: SimpleBean.class
Java-Bean: True
<<

.SUFFIXES: .java .class

{sunw\demo\simple}.java{sunw\demo\simple}.class :
set CLASSPATH=.
javac $<

clean:
-del sunw\demo\simple\*.class
-del $(JARFILE)

S e p u e d e n u t iliza r e s t o s m a ke file s co m o p la n t illa s p a ra cre a r lo s t u yo s p ro p io s . Lo s


m a ke file s d e e je m p lo , s it u a d o s e n e l d ire ct o rio b e a n s / d e m o t a m b ié n t e e n s e ñ a n
co m o u t iliza r lo s m a ke file s p a ra co n s t ru ir y m a n t e n e r t u s Be a n s .
Inspeccionar las Propiedades y Eventos de SimpleBean
La h o ja d e p ro p ie d a d e s m u e s t ra la s p ro p ie d a d e s d e l Be a n s e le ccio n a d o . S i
s e le ccio n a m o s S im p le Be a n , la h o ja d e p ro p ie d a d e s m o s t ra rá cu a t ro p ro p ie d a d e s :
fo re g ro u n d , b a c k g ro u n d , fo n t , y n a m e . No s o t ro s n o d e cla ra m o s p ro p ie d a d e s e n
S im p le Be a n ( lo ve rá s m á s a d e la n t e ) , p o r e s o e s t a s p ro p ie d a d e s s o n h e re d a d a s d e
Ca n v a s . Pu ls a n d o s o b re ca d a p ro p ie d a d s e la n za u n e d it o r d e p ro p ie d a d . El
Be a n Bo x p ro p o rcio n a r e d it o re s p o r d e fe ct o p a ra lo s t ip o s p rim it ivo s , a d e m á s d e lo s
t ip o s Fo n t y Co lo r. Pu e d e s e n co n t ra r lo s fu e n t e s p a ra e s t o s e d it o re s d e
p ro p ie d a d e s e n b e a n s / a p is / s u n / b e a n s / e d it o rs .
Lo s Be a n s s e co m u n ica n u n o s co n o t ro s e n via n d o y re cib ie n d o n o t ifica cio n e s d e
e ve n t o s . Pa ra ve r lo s e ve n t o s q u e S im p le Be a n p u e d e e n via r, e lig e e l m e n ú
Ed it | Eve n t s . S e m o s t ra rá u n a lis t a d e e ve n t o s a g ru p a d o s p o r in t e rfa ce s . Ba jo ca d a
g ru p o d e in t e rfa ce h a y u n a lis t a d e m é t o d o s d e e ve n t o . To d o s e s t o s s o n h e re d a d o s
d e Ca n va s .
Po d rá s a p re n d e r m á s s o b re p ro p ie d a d e s y e ve n t o s e n p ró xim a s s e ccio n e s .

Generar un Informe de Introspección del Bean


La in t ro s p e cció n e s e l p ro ce s o d e d e s cu b rir la s ca ra ct e rís t ica s d e u n Be a n e n
t ie m p o d e d is e ñ o p o r u n o d e e s t o s d o s m é t o d o s :
● Re fle xió n d e b a jo n ive l, q u e u t iliza p a t ro n e s d e d is e ñ o p a ra d e s cu b rir la s
ca ra ct e rís t ica s d e l Be a n .
● Exa m in a n d o u n a cla s e a s o cia d d d e in fo rm a ció n d e l Be a n q u e d e s crib e
e xp lícit a m e n t e la s ca ra ct e rís t ica s d e l Be a n .
S e p u e d e g e n e ra r u n in fo rm e d e in t ro s p e cció n e le g ie n d o e l m e n ú Ed it | Re p o rt . El
in fo rm e lis t a lo s e ve n t o s , la s p ro p ie d a d e s y lo s m é t o d o s d e l Be a n a d e m á s d e s u s
ca ra ct e rís t ica s .
Po r d e fe ct o lo s in fo rm e s s o n e n via d o s a la s a lid a e s t á n d a rd d e l in t é rp re t e Ja va , q u e
e s la ve n t a n a d o n d e h a s a rra n ca d o Be a n Bo x. S e p u e d e re d ire ccio n a r e l in fo rm e a
u n fich e ro ca m b ia n d o e l co m a n d o d e l in t é rp re t e Ja va e n b e a n b o x/ ru n . s h o ru n . b a t :

java sun.beanbox.BeanBoxFrame > beanreport.txt

Oz it o
Propiedades
En la s s ig u ie n t e s p á g in a s a p re n d e re m o s có m o im p le m e n t a r la s p ro p ie d a d e s d e lo s
Be a n s .
Ah o ra e s u n b u e n m o m e n t o p a ra le e r y re vis a r la Es p e cifica ció n d e l API d e lo s
Ja va Be a n s . El Ca p ít u lo 7 d e s crib e la s p ro p ie d a d e s .
● Pro p ie d a d e s S e n cilla s e xp lica co m o d a r p ro p ie d a d e s a u n Be a n : la s
ca ra ct e rís it ca s d e a p a rie n cia y co m p o rt a m ie n t o d e u n Be a n e n t ie m p o d e
d is e ñ o .
● Pro p ie d a d e s Lím it e d e s crib e co m o u n ca m b io e n u n a p ro p ie d a d p u e d e
p ro p o rcio n a r u n a n o t ifica ció n d e ca m b io a o t ro s o b je t o s .
● Pro p ie d a d e s Re s t rin g id a s d e s crib e co m o lo s ca m b io s e n a lg u n a s p ro p ie d a d e s
p u e d e n s e r o cu lt a d o s p a ra o t ro s o b je t o s .
● Pro p ie d a d e s In d e xa d a s d e s crib e la s p ro p ie d a d e s m u lt i- va lo r.

Oz it o
Propiedades Sencillas
Pa ra o b t e n e r e l m e jo r re s u lt a d o d e e s t a s e cció n , d e b e ría s le e r p rim e ro
lo s ca p ít u lo s 7 y 8 , d e la Es p e cifica ció n d e l API Ja va Be a n .

S i cre a m o s u n a cla s e Be a n , le d a m o s u n a va ria b le d e e je m p la r lla m a d a c o lo r, y


a cce d e m o s a c o lo r a t ra vé s d e u n m é t o d o o b t n e d o r lla m a d o g e t Co lo r y u n
m é t o d o s e le ccio n a d o r lla m a d o s e t Co lo r, e n t o n ce s h e m o s cre a d o u n a p ro p ie d a d .
La s p ro p ie d a d e s s o n a s p e ct o s d e la a p a rie n cia o co m p o rt a m ie n t o d e u n Be a n q u e
p u e d e n s e r m o d ifica d o s e n e l m o m e n t o d e l d is e ñ o .
Lo s n o m b re s d e lo s m é t o d o s p a ra o b t e n e r o s e le ccio n a r p ro p ie d a d e s d e b e n s e g u ir
u n a s re g la s e s p e cífica s , lla m a d a s p a t ro n e s d e d is e ñ o . Ut iliza n d o e s t o s n o m b re s d e
m é t o d o s b a s a d o s e n p a t ro n e s d e d is e ñ o , la s h e rra m ie n t a s co m p a t ib le s co n
Ja va Be a n s ( y e l Be a n Bo x) p u e d e n :
● De s cu b rir la s p ro p ie d a d e s d e u n Be a n .

● De t e rm in a r lo s a t rib u t o s d e le ct u ra / e s crit u ra d e la s p ro p ie d a d e s .

● De t e rm in a r lo s t ip o s d e p ro p ie d a d e s .

● Lo ca liza r u n e d it o r a p ro p ia d o p a ra ca d a t ip o d e p ro p ie d a d .

● Mo s t ra r la s p ro p ie d a d e s ( n o rm a lm e n t e e n u n a h o ja d e p ro p ie d a d e s ) .

● Mo d ifica r e s a s p ro p ie d a d e s ( e n t ie m p o d e d is e ñ o ) .

Po r e je m p lo , u n a h e rra m ie n t a d e co n s t ru cció n m cu a n d o in t ro s p e ccio n e n u e s t ro


Be a n , d e s cu b rirá d o s m é t o d o s :

public Color getColor() { ... }


public void setColor(Color c) { ... }
A p a rt ir d e e s t o la h e rra m ie n t a p u e d e a s e g u ra r q u e e xis t e u n a p ro p ie d a d lla m a d a
co lo r, q u e s e p u e d e le e r y re e s crib ir, y q u e s u t ip o e s Co lo r. Ad e m á s , la
h e rra m ie n t a p u e d e in t e n t a r lo ca liza r u n e d it o r d e p ro p ie d a d p a ra e s e t ip o , y
m o s t ra r la p ro p ie d a d p a ra q u e p u e d a s e r e d it a d a .

Añadir la propiedad Color a SimpleBean


Ha re m o s lo s s ig u ie n t e s ca m b io s e n S im p le Be a n . ja v a p a ra a ñ a d ir la p ro p ie d a d
co lo r:
1 . Cre a r e in icia liza r u n a va ria b le d e e je m p la r p riva d a :

private Color color = Color.green;


2 . Es crib ir u n m é t o d o p a ra o b t e n e r la p ro p ie d a d :
public Color getColor(){
return color;
}
3 . Es crib ir u n m é t o d o p a ra s e le ccio n a r la p ro p ie d a d :

public void setColor(Color newColor){


color = newColor;
repaint();
}
4 . S o b re e s crib ir e l m é t o d o p a in t ( ) . Es t o e s n e ce s a rio p a ra t o d a s la s s u b cla s e s
d e Ca n va s .

public void paint(Graphics g) {


g.setColor(color);
g.fillRect(20, 5, 20, 30);
}
5 . Co m p ila r e l Be a n , ca rg a rlo e n e l To o lBo x, y cre a r u n e je m p la r e n e l Be a n Bo x.
Lo s re s u lt a d o s s o n :
● S im p le Be a n s e m o s t ra rá co n u n re ct á n g u lo ve rd e ce n t ra d o .

● La h o ja d e p ro p ie d a d e s co n t e n d rá u n a n u e va p ro p ie d a d Co lo r. El m e ca n is m o
d e in t ro s p e cció n t a m b ié n b u s ca rá u n e d it o r p a ra la p ro p ie d a d co lo r. El e d it o r
d e la p ro p ie d a d Co lo r e s u n o d e lo s e d it o re s p o r d e fe ct o s u m in is t ra d o s co n e l
Be a n Bo x. Es t e e d it o r s e a s ig n a co m o e d it o r d e la p ro p ie d a d Co lo r d e
S im p le Be a n . Pu ls a s o b re la p ro p ie d a d co lo r e n la h o ja d e p ro p ie d a d e s p a ra
la n za r e s t e e d it o r.
Aq u í t ie n e s u n a ilu s t ra ció n d e l Be a n Bo x q u e m u e s t ra e l e je m p la r re vis a d o d e
S im p le Be a n d e n t ro d e l Be a n Bo x, la n u e va p ro p ie d a d co lo r e n la h o ja d e
p ro p ie d a d e s d e S im p le Be a n y u n e d it o r d e la p ro p ie d a d co lo r. Re cu e rd a , p u ls a n d o
s o b re la p ro p ie d a d co lo r e n la h o ja d e p ro p ie d a d e s s e la n za rá e s t e e d it o r.
Aq u í t e n e m o s e l có d ig o fu e n t e co m p le t o d e S im p le Be a n re vis a d o p a ra la
p ro p ie d a d c o lo r.

package sunw.demo.simple;

import java.awt.*;
import java.io.Serializable;

public class SimpleBean extends Canvas


implements Serializable{

private Color color = Color.green;

//property getter method


public Color getColor(){
return color;
}

//property setter method. Sets new SimpleBean


//color and repaints.
public void setColor(Color newColor){
color = newColor;
repaint();
}

public void paint(Graphics g) {


g.setColor(color);
g.fillRect(20, 5, 20, 30);
}

//Constructor sets inherited properties


public SimpleBean(){
setSize(60,40);
setBackground(Color.red);
}
}

Oz it o
Propiedades Compartidas
Alg u n a s ve ce s cu a n d o ca m b ia u n a p ro p ie d a d d e u n Be a n , o t ro s o b je t o s p o d ría n q u e re r s e r
n o t ifica d o s d e l ca m b io y t o m a r a lg u n a a cció n b a s á n d o s e e n e s e ca m b io . Cu a n d o u n a p ro p ie d a d
co m p a rt id a ca m b ia , la n o t ifica ció n d e l ca m b io s e e n vía a lo s o ye n t e s in t e re s a d o s .
Un Be a n q u e co n t ie n e u n a p ro p ie d a d co m p a rt id a s d e b e m a n t e n e r u n a lis t a d e lo s o ye n t e s d e la
p ro p ie d a d , y a le rt a r a d ich o s o ye n t e s cu a n d o ca m b ie la p ro p ie d a d . La cla s e
P ro p e rt y Ch a n g e S u p p o rt im p le m e n t a m é t o d o s p a ra a ñ a d ir y e lim in a r o b je t o s
P ro p e rt y Ch a n g e Lis t e n e r d e u n a lis t a , y p a ra la n za r o b je t o s P ro p e rt y Ch a n g e Ev e n t a d ich o s
o ye n t e s cu a n d o ca m b ia la p ro p ie d a d co m p a rt id a . Nu e s t ro s Be a n s p u e d e n d e s ce n d e r d e e s t a
cla s e , o u t iliza r u n a cla s e in t e rn a .
Un o b je t o q u e q u ie ra e s cu ch a r lo s ca m b io s d e u n a p ro p ie d a d d e b e p o d e r a ñ a d irs e o e lim in a rs e
d e la lis t a d e o ye n t e s d e l Be a n q u e co n t ie n e la p ro p ie d a d , y re s p o n d e r a l m é t o d o d e n o t ifica ció n
d e l e ve n t o q u e s e ñ a la q u e la p ro p ie d a d h a ca m b ia d o . Im p le m e n t a n d o e l in t e rfa ce
P ro p e rt y Ch a n g e Lis t e n e r e l o ye n t e p u e d e s e r a ñ a d id o a la lis t a m a n t e n id a p o r e l Be a n d e la
p ro p ie d a d co m p a rt id a , y co m o im p le m e n t a e l m é t o d o
P ro p e rt y Ch a n g e Lis t e n e r. p ro p e rt y Ch a n g e ( ) , e l o ye n t e p u e d e re s p o n d e r a la s n o t ifica cio n e s
d e ca m b io d e la p ro p ie d a d .
La cla s e P ro p e rt y Ch a n g e Ev e n t e n ca p s u la la in fo rm a ció n d e l ca m b io d e la p ro p ie d a d , y e s
e n via d a d e s d e la fu e n t e d e l e ve n t o d e ca m b io d e p ro p ie d a d a ca d a o b je t o d e la lis t a d e o ye n t e s
m e d ia n t e e l m é t o d o p ro p e rt y Ch a n g e ( ) .
La s s ig u ie n t e s s e ccio n e s p ro p o rcio n a n lo s d e t a lle s d e la im p le m e n t a ció n d e p ro p ie d a d e s
co m p a rt id a s .

Implementar Propiedades Compartidas dentro de un Bean


Co m o ya h a b rá s le íd o , u n Be a n q u e co n t e n g a p ro p ie d a d e s co m p a rt id a s d e b e rá :
● Pe rm it ir a s u s o ye n t e s re g is t ra r o e lim in a r s u in t e ré s e n re cib ir e ve n t o s d e ca m b io d e
p ro p ie d a d .
● Dis p a ra r e ve n t o s d e ca m b io d e p ro p ie d a d a lo s o ye n t e s in t e re s a d o s .

La cla s e P ro p e rt y Ch a n g e S u p p o rt im p le m e n t a d o s m é t o d o s p a ra a ñ a d ir y e lim in a r o b je t o s
P ro p e rt y Ch a n g e Lis t e n e r d e u n a lis t a d e o ye n t e s , e im p le m e n t a u n m é t o d o q u e d is p a ra
e ve n t o s d e ca m b io s d e p ro p ie d a d a ca d a u n o d e lo s o ye n t e s d e la lis t a . Nu e s t ro Be a n p u e d e
d e s ce n ce r d e P ro p e rt y Ch a n g e S u p p o rt , o u t iliza rla co m o cla s e in t e rn a .
Pa ra im p le m e n t a r u n a p ro p ie d a d co m p a rt id a , s e g u ire m o s e s t o s p a s o s :
1 . Im p o rt a re m o s e l p a q u e t e ja v a . b e a n s , e s t o n o s d a a cce s o a la cla s e
P ro p e rt y Ch a n g e S u p p o rt .
2 . Eje m p la riza r u n o b je t o Pro p e rt yCh a n g e S u p p o rt :

private PropertyChangeSupport changes = new PropertyChangeSupport(this);


Es t e o b je t o m a n t ie n e u n a lis t a d e o ye n t e s d e l ca m b io d e p ro p ie d a d y la n za e ve n t o s d e
ca m b io d e p ro p ie d a d .
3 . Im p le m e n t a r m é t o d o s p a ra m a n t e n e r la lis t a d e o ye n t e s . Co m o P ro p e rt y Ch a n g e S u p p o rt
im p le m e n t a e s t o m é t o d o s s ó lo t e n e m o s q u e e n vo lve r la s lla m a d a s a lo s m é t o d o s d e l o b je t o
s o p o rt a d o :

public void addPropertyChangeListener(PropertyChangeListener l) {


changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
4 . Mo d ifica r u n m é t o d o d e s e le cció n d e la p ro p ie d a d p a ra q u e la n ce u n e ve n t o d e ca m b io d e
p ro p ie d a d :

public void setLabel(String newLabel) {


String oldLabel = label;
label = newLabel;
sizeToFit();
changes.firePropertyChange("label", oldLabel, newLabel);
}
Ob s e rva q u e s e t La b e l( ) a lm a ce n a e l va lo r a n t ig u o d e la b e l, p o rq u e lo s d o s va lo re s , e l
n u e vo y e l a n t ig u o d e b e n s e r p a s a d o s a fire P ro p e rt y Ch a n g e ( ) .

public void firePropertyChange(String propertyName,


Object oldValue, Object newValue)
fire P ro p e rt y Ch a n g e ( ) co n vie rt e s u s p a rá m e t ro s e n u n o b je t o P ro p e rt y Ch a n g e Ev e n t , y
lla m a a p ro p e rt y Ch a n g e ( P ro p e rt y Ch a n g e Ev e n t p c e ) d e ca d a o ye n t e re g is t ra d o .
Ob s e rva q u e lo s va lo re s n u e vo y a n t ig u o s o n t ra t a d o s co m o va lo re s Ob je c t , p o r e s o s i lo s
va lo re s d e la p ro p ie d a d s o n t ip o s p rim it ivo s co m o in t , s e d e b e u t iliza r la ve rs ió n d e l o b je t o
ja v a . la n g . I n t e g e r. Ob s e rva t a m b ié n q u e e l e ve n t o d e ca m b io d e p ro p ie d a d s e d is p a ra
d e s p u é s d e q u e la p ro p ie d a d h a ya ca m b ia d o .
Cu a n d o e l Be a n Bo x re co n o ce e l p a t ró n d e d is e ñ o d e u n a p ro p ie d a d co m p a rt id a d e n t ro d e u n
Be a n , s e ve rá u n in t e rfa ce p ro p e rt y Ch a n g e cu a n d o s e d e s p lie g e e l m e n ú Ed it | Eve n t s .
Ah o ra q u e h e m o s d a d a a n u e s t ro Be a n la h a b ilid a d d e la n za r e ve n t o s cu a n d o ca m b ia u n a
p ro p ie d a d , e l s ig u ie n t e p a s o e s cre a r u n o ye n t e .

Implementar Oyentes de Propiedades Compartida


Pa ra o ir lo s e ve n t o s d e ca m b io d e p ro p ie d a d , n u e s t ro Be a n o ye n t e d e b e im p le m e n t a r e l in t e rfa ce
P ro p e rt y Ch a n g e Lis t e n e r. Es t e in t e rfa ce co n t ie n e u n m é t o d o :

public abstract void propertyChange(PropertyChangeEvent evt)


El Be a n fu e n t e lla m a a e s t e m é t o d o d e n o t ifica ció n d e t o d o s lo s o ye n t e s d e s u lis t a d e o ye n t e s .
Po r e s o p a ra h a ce r q u e n u e s t ra cla s e p u e d a o ir y re s p o n d e r a lo s e ve n t o s d e ca m b io d e
p ro p ie d a d , d e b e :
1 . Im p le m e n t a r e l in t e rfa ce P ro p e rt y Ch a n g e Lis t e n e r.

public class MyClass implements java.beans.PropertyChangeListener,


java.io.Serializable {
2 . Im p le m e n t a r e l m é t o d o p ro p e rt y Ch a n g e ( ) e n e l o ye n t e . Es t e m é t o d o n e ce s it a co n t e n e r e l
có d ig o q u e m a n e ja lo q u e s e n e ce s it a h a ce r cu a n d o e l o ye n t e re cib e e l e ve n t o d e ca m b io d e
p ro p ie d a d . Po r e je m p lo , u n a lla m a d a a u n m é t o d o d e s e le cció n d e la cla s e o ye n t e : u n
ca m b io e n u n a p ro p ie d a d d e l Be a n fu e n t e s e p ro p a g a a u n a p ro p ie d a d d e l Be a n o ye n t e .
Pa ra re g is t ra r e l in t e ré s e n re cib ir n o t ifica cio n e s s o b re lo s ca m b io s e n u n a p ro p ie d a d d e u n Be a n ,
e l Be a n o ye n t e lla m a a l m é t o d o d e re g is t ro d e o ye n t e s d e l Be a n fu e n t e , p o r e je m p lo :
button.addPropertyChangeListener(aButtonListener);
O s e p u e d e u t iliza r u n a cla s e a d a p t a d o r p a ra ca p t u ra r e l e ve n t o d e ca m b io d e p ro p ie d a d , y
s u b s e cu e n t e m e n t e lla m a r a l m é t o d o co rre ct o d e n t ro d e l o b je t o o ye n t e . Aq u í t ie n e s u n e je m p lo
t o m a d o d e lo s e je m p lo s co m e n t a d o s d e l fich e ro
b e a n s / d e m o / s u n w / d e m o / m is c / Ch a n g e Re p o rt e r. ja v a .

OurButton button = new OurButton();


...
PropertyChangeAdapter adapter = new PropertyChangeAdapter();
...
button.addPropertyChangeListener(adapter);
...
class PropertyChangeAdapter implements PropertyChangeListener
{
public void propertyChange(PropertyChangeEvent e)
{
reporter.reportChange(e);
}
}

Propiedades Compartida en el BeanBox


El Be a n Bo x m a n e ja la s p ro p ie d a d e s co m p a rt id a u t iliza n d o u n a cla s e a d a p t a d o r. Lo s Be a n s
Ou rBu t t o n y Ch a n g e Re p o rt e r p u e d e n s e r u t iliza d o s p a ra ilu s t ra r e s t a t é cn ica . Pa ra ve r co m o
fu n cio n a , s e g u ire m o s e s t o s p a s o s :
1 . Arra s t a r e je m p la re s d e Ou rBu t t o n y d e Ch a n g e Re p o rt e r a l Be a n Bo x.
2 . S e le ccio n a r e l e je m p la r d e Ou rBu t t o n y e le g ir e l m e n ú
Ed it | Eve n t s | p ro p e rt yCh a n g e | p ro p e rt yCh a n g e .
3 . Co n e ct a r la lín e a q u e a p a re ce a l e je m p la r d e Ch a n g e Re p o rt e r. S e m o s t ra rá e l cu a d ro d e
d iá lo g o Eve n t Ta rg e t Dia lo g .
4 . Ele g ir re p o rt Ch a n g e d e s d e Eve n t Ta rg e t Dia lo g . S e g e n e ra rá y co m p ila rá la cla s e a d a p t a d o r
d e e ve n t o s .
5 . S e le ccio n a r Ou rBu t t o n y ca m b ia r a lg u n a d e s u s p ro p ie d a d e s . Ve ra s in fo rm e s d e ca m b io s e n
Ch a n g e Re p o rt e r.
De t rá s d e la e s ce n a , e l Be a n Bo x g e n e ra e l a d a p t a d o r d e e ve n t o s . Es t e a d a p t a d o r im p le m e n t a e l
in t e rfa ce P ro p e rt y Ch a n g e Lis t e n e r, y t a m b ié n g e n e ra u n a im p le m e n t a ció n d e l m é t o d o
p ro p e rt y Ch a n g e ( ) q u e lla m a e l m é t o d o Ch a n g e Re p o rt e r. re p o rt Ch a n g e ( ) . Aq u í t ie n e s e l
có d ig o fu e n t e d e l a d a p t a d o r g e n e ra d o :

// Automatically generated event hookup file.

package tmp.sunw.beanbox;
import sunw.demo.misc.ChangeReporter;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

public class ___Hookup_14636f1560 implements


java.beans.PropertyChangeListener, java.io.Serializable {

public void setTarget(sunw.demo.misc.ChangeReporter t) {


target = t;
}

public void propertyChange(java.beans.PropertyChangeEvent arg0) {


target.reportChange(arg0);
}

private sunw.demo.misc.ChangeReporter target;


}
El Be a n Ch a n g e Re p o rt e r n o n e ce s it a im p le m e n t a r e l in t e rfa ce P ro p e rt y Ch a n g e Lis t e n e r; e n
s u lu g a r, la cla s e a d a p t a d o r g e n e ra d a p o r e l Be a n Bo x im p le m e n t a P ro p e rt y Ch a n g e Lis t e n e r, y
e l m é t o d o p ro p e rt y Ch a n g e ( ) d e l a d a p t a d o r lla m a a l m é t o d o a p ro p ia d o d e l o b je t o fu e n t e
( Ch a n g e Re p o rt e r) .
El Be a n Bo x p o n e la s cla s e s d e lo s a d a p t a d o re s d e e ve n t o s e n e l d ire ct o rio
be a ns / be a nbo x / tm p/ s unw / be a nbo x .

Oz it o
Propiedades Restringidas
Un a p ro p ie d a d d e u n Be a n e s t á Re s t rin g id a cu a n d o cu a lq u ie r ca m b io e n e s a p ro p ie d a d p u e d e
s e r ve t a d o , No rm a lm e n t e e s u n o b je t o e xt e rio r e l q u e e je rce s u d e re ch o a ve t o , p e ro e l
p ro p io Be a n p u e d e ve t a r u n ca m b io e n u n a p ro p ie d a d .
El API d e Ja va Be a n s p ro p o rcio n a u n m e ca n is m o d e e ve n t o s s im ila r a l m e ca n is m o d e la s
p ro p ie d a d e s co m p a rt id a s , q u e p e rm it e a lo s o b je t o s ve t a r lo s ca m b io s d e u n a p ro p ie d a d d e
u n Be a n .
Exis t e n t re s p a rt e s e n la im p le m e n t a ció n d e u n a p ro p ie d a d Re s t rin g id a :
● Un Be a n fu e n t e q u e co n t ie n e u n a o m á s p ro p ie d a d e s re s t rin g id a s .

● Ob je t o s o y e n t e s q u e im p le m e n t a n e l in t e rfa ce Ve t o a b le Ch a n g e Lis t e n e r. Es t o s o b je t o s
a ce p t a n o re ch a za n la p ro p o s ció n d e u n ca m b io e n la p ro p ie d a d re s t rin g id a d e l Be a n
fu e n t e .
● Un o b je t o P ro p e rt y Ch a n g e Ev e n t q u e co n t ie n e e l n o m b re d e la p ro p ie d a d , y s u s
va lo re s n u e vo y a n t ig u o . Es t a e s la m is m a cla s e u t iliza d a p o r la s p ro p ie d a d e s
co m p a rt id a s .

Implementar Propiedades Restringidas dentro de un Bean.


Un Be a n q u e co n t e n g a p ro p ie d a d e s re s t rin g id a s d e b e :
● Pe rm it ir q u e o b je t o s Ve t o a b le Ch a n g e Lis t e n e r re g is t re n s u in t e ré s e n re cib ir
n o t ifica cio n e s d e p ro p o s icio n e s d e ca m b io d e u n a p ro p ie d a d .
● Dis p a ra r e ve n t o s d e ca m b io d e p ro p ie d a d h a cia a q u e llo s o ye n t e s in t e re s a d o s , cu a n d o s e
p ro p o n g a u n ca m b io d e p ro p ie d a d . El e ve n t o d e b e ría s e r d is p a ra d o a n t e s d e q u e e l
ca m b io re a l d e la p ro p ie d a d t e n g a lu g a r. El P ro p e rt y Ch a n g e Ev e n t e s d is p a ra d o p o r
u n a lla m a d a a l m é t o d o v e t o a b le Ch a n g e ( ) d e t o d o s lo s o ye n t e s .
● S i u n o ye n t e ve t a e l ca m b io , d e b e a s e g u ra rs e q u e t o d o s lo s d e m á s o ye n t e s p u e d e n
vo lve r a l va lo r a n t ig u o . Es t o s ig n ifica vo lve r a lla m a r a l m é t o d o v e t o a b le Ch a n g e ( ) d e
t o d o s lo s o ye n t e s , co n u n P ro p e rt y Ch a n g e Ev e n t q u e co n t e n g a e l va lo r a n t ig u o .
La cla s e Ve t o a b le Ch a n g e S u p p o rt s e p ro p o rcio n a p a ra im p le m e n t a r e s t a s ca p a cid a d e s . Es t a
cla s e im p le m e n t a m é t o d o s p a ra a ñ a d ir y e lim in a r o b je t o s Ve t o a b le Ch a n g e Lis t e n e r a u n a
lis t a d e o ye n t e s , y u n m é t o d o q u e d is p a ra e ve n t o s d e ca m b io d e p ro p ie d a d a t o d o s lo s
o ye n t e s d e la lis t a cu a n d o s e p ro p o n e u n ca m b io d e p ro p ie d a d . Es t e m é t o d o t a m b ié n
ca p t u ra rá cu a lq u ie r ve t o , y re - e n via rá e l e ve n t o d e ca m b io d e p ro p ie d a d co n e l va lo r o rig in a l
d e la p ro p ie d a d . Nu e s t ro Be a n p u e d e d e s ce n ce r d e la cla s e Ve t o a b le Ch a n g e S u p p o rt , o
u t iliza r u n e je m p la r d e e lla .
Ob s e rva q u e , e n g e n e ra l, la s p ro p ie d a d e s re s t rin g id a s t a m b ié n d e b e ría n s e r p ro p ie d a d e s
co m p a rt id a s . Cu a n d o o cu rre u n ca m b io e n u n a p ro p ie d a d re s t rin g id a , p u e d e s e r e n via d o u n
P ro p e rt y Ch a n g e Ev e n t m e d ia n t e P ro p e rt y Ch a n g e Lis t e n e r. p ro p e rt y Ch a n g e ( ) p a ra
in d ica r a t o d o s lo s Be a n s Ve t o a b le Ch a n g e Lis t e n e r q u e e l ca m b io a t e n id o e fe ct o .
El Be a n Je lly Be a n t ie n e u n a p ro p ie d a d re s t rin g id a . Ve re m o s s u có d ig o p a ra ilu s t ra r lo s p a s o s
e im p le m e n t a r p ro p ie d a d e s re s t rin g id a s :
1 . Im p o rt a r e l p a q u e t e ja v a . b e a n s , e s t o n o s d a a cce s o a la cla s e
Ve t o a b le Ch a n g e S u p p o rt .
2 . Eje m p la riza r u n o b je t o Ve t o a b le Ch a n g e S u p p o rt d e n t ro d e n u e s t ro Be a n :
private VetoableChangeSupport vetos =
new VetoableChangeSupport(this);
Ve t o a b le Ch a n g e S u p p o rt m a n e ja u n a lis t a d e o b je t o s Ve t o a b le Ch a n g e Lis t e n e r, y
d is p a ra e ve n t o s d e ca m b io d e p ro p ie d a d a ca d a o b je t o d e la lis t a cu a n d o o cu rre u n
ca m b io e n u n a p ro p ie d a d re s t rin g id a .
3 . Im p le m e n t a r m é t o d o s p a ra m a n t e n e r la lis t a d e o ye n t e s d e ca m b io d e p ro p ie d a d . Es t o
s ó lo e n vu e lve la lla m a d a a lo s m é t o d o s d e l o b je t o Ve t o a b le Ch a n g e S u p p o rt :

public void addVetoableChangeListener(VetoableChangeListener l) {


vetos.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l) {
vetos.removeVetoableChangeListener(l);
}
4 . Es crib ir u n m é t o d o s e le ccio n a d o r d e p ro p ie d a d e s q u e d is p a re u n e ve n t o d e ca m b io d e
p ro p ie d a d cu a n d o la p ro p ie d a d h a ca m b ia d o . Es t o in clu ye a ñ a d ir u n a cla u s u la t h ro w s a
la firm a d e l m é t o d o . El m é t o d o s e t P ric e I n Ce n t s ( ) d e Je llyBe a n s e p a re ce a e s t o :

public void setPriceInCents(int newPriceInCents)


throws PropertyVetoException {
int oldPriceInCents = ourPriceInCents;

// First tell the vetoers about the change. If anyone objects, we


// don't catch the exception but just let if pass on to our caller.
vetos.fireVetoableChange("priceInCents",
new Integer(oldPriceInCents),
new Integer(newPriceInCents));
// No-one vetoed, so go ahead and make the change.
ourPriceInCents = newPriceInCents;
changes.firePropertyChange("priceInCents",
new Integer(oldPriceInCents),
new Integer(newPriceInCents));
}
Ob s e rva q u e s e t P ric e I n Ce n t s ( ) a lm a ce n a e l va lo r a n t ig u o d e p ric e , p o rq u e lo s d o s
va lo re s , e l n u e vo y e l a n t ig u o , d e b e n s e r p a s a d o s a fire Ve t o a b le Ch a n g e ( ) . Ta m b ié n
o b s e rva q u e lo s p re cio s p rim it ivo s in t s e h a n co n ve rt id o a o b je t o s I n t e g e r.

public void fireVetoableChange(String propertyName,


Object oldValue,
Object newValue)
throws PropertyVetoException
Es t o s va lo re s s e h a n e m p a q u e t a d o e n u n o b je t o P ro p e rt y Ch a n g e Ev e n t e n via d o a ca d a
o ye n t e . Lo s va lo re s n u e vo y a n t ig u o s o n t ra t a d o s co m o va lo re s Ob je c t , p o r e s o s i s o n
t ip o s p rim it ivo s co m o in t , d e b e n u t iliza rs e s u s ve rs io n e s o b je t o s co m o
ja v a . la n g . I n t e g e r.
Ah o ra n e ce s it a m o s im p le m e n t a r u n Be a n q u e e s cu ch e lo s ca m b io s e n la s p ro p ie d a d e s
re s t rin g id a s .
Implementar Oyentes de Propiedades Restringidas
Pa ra e s cu ch a r lo s e ve n t o s d e ca m b io d e p ro p ie d a d , n u e s t ro Be a n o ye n t e d e b e im p le m e n t a r e l
in t e rfa ce Ve t o a b le Ch a n g e Lis t e n e r. El in t e rfa ce co n t ie n e u n m é t o d o :

void vetoableChange(PropertyChangeEvent evt)


throws PropertyVetoException;
Po r e s o p a ra h a ce r q u e n u e s t ra cla s e p u e d a e s cu ch a r y re s p o n d e r a lo s e ve n t o s d e ca m b io d e
p ro p ie d a d d e b e :
1 . Im p le m e n t a r e l in t e rfa ce Ve t o a b le Ch a n g e Lis t e n e r.
2 . Im p le m e n t a r e l m é t o d o v e t o a b le Ch a n g e ( ) . Es t e e s e l m é t o d o a l q u e lla m a rá e l Be a n
fu e n t e e n ca d a o b je t o d e la lis t a d e o ye n t e s ( m a n t e n id a p o r e l o b je t o
Ve t o a b le Ch a n g e S u p p o rt ) . Es t e t a m b ié n e s e l m é t o d o q u e e je rce e l p o d e r d e l ve t o . Un
ca m b io d e p ro p ie d a d e s ve t a d o la n za n d o u n a P ro p e rt y Ve t o Ex c e p t io n .
Ob s e rva q u e e l o b je t o Ve t o a b le Ch a n g e Lis t e n e r fre cu e n t e m e n t e e s u n a cla s e a d a p t a d o r. La
cla s e a d a p t a d o r im p le m e n t a e l in t e rfa ce Ve t o a b le Ch a n g e Lis t e n e r y e l m é t o d o
v e t o a b le Ch a n g e ( ) . Es t e a d a p t a d o r e s a ñ a d id o a la lis t a d e o ye n t e s d e l Be a n re s t rin g id o ,
in t e rce p t a la lla m a d a a v e t o a b le Ch a n g e ( ) , y lla m a a l m é t o d o d e l Be a n fu e n t e q u e e je rce e l
p o d e r d e l ve t o .

Propiedades Restringidas en el BeanBox


Cu a n d o e l Be a n Bo x re co n o ce e l p a t ró n d e d is e ñ o d e u n a p ro p ie d a d re s t rin g id a d e n t ro d e u n
Be a n , s e ve rá u n ít e m d e u n in t e rfa ce v e t o a b le Ch a n g e a l d e s p le g a r e l m e n ú Ed it | Eve n t s .
El Be a n Bo x g e n e ra u n a cla s e a d a p t a d o r cu a n d o s e co n e ct a u n Be a n q u e t ie n e u n a p ro p ie d a d
re s t rin g id a co n o t ro Be a n . Pa ra ve r co m o fu n cio n a e s t o , s ig u e e s t o s p a s o s :
1 . Arra s t ra e je m p la re s d e Vo t e r y d e Je lly Be a n a l Be a n Bo x.
2 . S e le ccio n a e l e je m p la r d e Je lly Be a n y e lig e e l m e n ú
Ed it | Eve n t s | ve t o a b le Ch a n g e | ve t o a b le Ch a n g e .
3 . Co n e ct a la lín e a q u e a p a re ce co n e l Be a n Vo t e r. Es t o m o s t ra rá e l p a n e l
Ev e n t Ta rg e t D ia lo g .
4 . Elig e e l m é t o d o v e t o a b le Ch a n g e d e l Be a n Vo t e r, y p u ls a s o b re e l b o t ó n OK. Es t o
g e n e ra u n a d a p t a d o r d e e ve n t o s q u e p u e d e s ve r e n e l d ire ct o rio
be a ns / be a nbo x / tm p/ s unw / be a nbo x .
5 . Pru e b a la p ro p ie d a d re s t rin g id a . S e le ccio n a e l Je lly Be a n y e d it a s u s p ro p ie d a d e s
p ric e I n Ce n t s e n la h o ja d e p ro p ie d a d e s . S e la n za rá u n a P ro p e rt y Ve t o Ex c e p t io n , y s e
m o s t ra rá u n d ia lo g o d e e rro r.
De t rá s d e la e s ce n a e l Be a n Bo x g e n e ra e l a d a p t a d o r d e e ve n t o . Es t e a d a p t a d o r im p le m e n t a e l
in t e rfa ce , Ve t o a b le Ch a n g e Lis t e n e r, y t a m b ié n g e n e ra u n m é t o d o v e t o a b le Ch a n g e ( ) q u e
lla m a a l m é t o d o Vo t e r. v e t o a b le Ch a n g e ( ) . Aq u í t ie n e s e l có d ig o g e n e ra d o p a ra e l
a d a p t a d o r:

// Automatically generated event hookup file.

package tmp.sunw.beanbox;
import sunw.demo.misc.Voter;
import java.beans.VetoableChangeListener;
import java.beans.PropertyChangeEvent;

public class ___Hookup_1475dd3cb5 implements


java.beans.VetoableChangeListener, java.io.Serializable {

public void setTarget(sunw.demo.misc.Voter t) {


target = t;
}

public void vetoableChange(java.beans.PropertyChangeEvent arg0)


throws java.beans.PropertyVeto Exception {
target.vetoableChange(arg0);
}

private sunw.demo.misc.Voter target;


}
El Be a n Vo t e r n o n e ce s it a im p le m e n t a r e l in t e rfa ce Ve t o a b le Ch a n g e Lis t e n e r; e n s u lu g a r,
la cla s e a d a p t a d o r g e n e ra d a im p le m e n t a Ve t o a b le Ch a n g e Lis t e n e r. El m é t o d o
v e t o a b le Ch a n g e ( ) d e l a d a p t a d o r lla m a a l m é t o d o a p ro p ia d o e n e l o b je t o fu e n t e ( Vo t e r) .

Para Propiedades Restringidas


Al ig u a l q u e la s p ro p ie d a d e s co m p a rt id a s , e xis t e u n p a t ró n d e d is e ñ o s o p o rt a d o p a ra a ñ a d ir y
e lim in a r o b je t o s Ve t o a b le Ch a n g e Lis t e n e r q u e s e h a n u n id o a u n n o m b re d e p ro p ie d a d
e s p e cífico :

void addVetoableChangeListener(String propertyName,


VetoableChangeListener listener);
void removeVetoableChangeListener(String propertyName,
VetoableChangeListener listener);
Co m o a lt e rn a t iva , p o r ca d a p ro p ie d a d re s t in g id a d e u n Be a n s e p u e d e n p ro p o rcio n a r m é t o d o s
co n la s ig u ie n t e firm a p a ra re g is t ra r y e lim in a r o ye n t e s d e u n a p ro p ie d a d b á s ica :

void add<PropertyName>Listener(VetoableChangeListener p);


void remove<PropertyName>Listener(VetoableChangeListener p);

Oz it o
Propiedades Indexadas
La s p ro p ie d a d e s in d e xa d a s re p re n s e n t a n co le cio n e s d e va lo re s a lo s q u e s e a cce d e p o r
ín d ice s co m o e n lo s a rra ys . Lo s p a t ro n e s d e d is e ñ o d e la s p ro p ie d a d e s in d e xa d a s s o n

//Métodos para acceder al array de propiedades completo


public <PropertyType>[] get();
public void set<PropertyName>([] value);

//Métodos para acceder a valores individuales


public <PropertyType> get(int index);
public void set<PropertyName>(int index, value);
De a cu e rd o co n e s t o s p a t ro n e s la s h e rra m ie n t a s d e p ro g ra m a ció n s a b e n q u e n u e s t ro Be a n
co n t ie n e u n a p ro p ie d a d in d e xa d a .
El Be a n Ou rLis t Bo x ilu s t ra co m o u t iliza r la s p ro p ie d a d e s in d e xa d a s . Ou rLis t Bo x d e s cie n d e d e
la cla s e Lis t p a ra p ro p o rcio n a r u n Be a n q u e p re s e n t a a l u s u a rio u n a lis t a d e e le ccio n e s :
Ch o ice s q u e s e p u e d e p ro p o rcio n a r y d is e ñ a r d u ra n t e e l d is e ñ ó . Aq u í t ie n e s u n a ilu s t ra ció n d e
u n e je m p la r d e Ou rLis t Bo x :

Ou rLis t Bo x e xp o n e e l it e m in d e xa d o co n lo s s ig u ie n t e s m é t o d o s a cce s o re s :

public void setItems(String[] indexprop) {


String[] oldValue=fieldIndexprop;
fieldIndexprop=indexprop;
populateListBox();
support.firePropertyChange("items",oldValue, indexprop);
}

public void setItems(int index, String indexprop) {


String[] oldValue=fieldIndexprop;
fieldIndexprop[index]=indexprop;
populateListBox();
support.firePropertyChange("Items",oldValue, fieldIndexprop);
}

public String[] getItems() {


return fieldIndexprop;
}

public String getItems(int index) {


return getItems()[index];
}
Cu a n d o u n it e m e s s e le ccio n a d o p o r u n o d e lo s m é t o d o s s e t I t e m s ( ) , Ou rLis t Bo x s e p u e b la
co n e l co n t e n id o d e u n a rra y S t rin g .
La e xp o s ició n d e la s p ro p ie d a d e s in d e xa d a s e s ca s i t a n fá cil co m o la d e la s p ro p ie d a d e s
s e n cilla s . S in e m b a rg o , e s crib ir u n e d it o r d e p ro p ie d a d e s in d e xa d a s re q u ie re e s crib ir u n e d it o r
d e p ro p ie d a d e s p e rs o n a liza d o .

Editores de Propiedades Indexadas


El Be a n Ou rLis t Bo x p ro p o rcio n a u n I n d e x P ro p e rt y Ed it o r a s o cia d o q u e e s u n b u e n e je m p lo
d e có m o im p le m e n t a r u n e d it o r d e p ro p ie d a d e s in d e xa d a s . La s ig u ie n t e ilu s t ra ció n m u e s t ra
u n e je m p la r d e Ou rLis t Bo x e n e l Be a n Bo x, la h o ja d e p ro p ie d a d e s q u e co n t ie n e u n a e n t ra d a
p a ra lo s it e m s d e la p ro p ie d a d in d e xa d a , y e l I n d e x P ro p e rt y Ed it o r q u e s a le cu a n d o s e p u ls a
s o b re lo s ít e m s d e la p ro p ie d a d :

Im p le m e n t a r I n d e x P ro p e rt y Ed it o r e s lo m is m o q u e im p le m e n t a r cu a lq u ie r e d it o r d e
p ro p ie d a d e s p e rs o n a liza d o :
1 . Im p le m e n t a r e l in t e rfa ce P ro p e rt y Ed it o r:
public class IndexPropertyEditor extends Panel
implements PropertyEditor, Action Listener {

S e p u e d e u t iliza r la cla s e P ro p e rt y Ed it o rS u p p o rt , u t iliza n d o u n a s u b cla s e o co m o cla s e


in t e rn a .
2 . De n o t a r e l e d it o r p e rs o n a liza d o e n u n a cla s e Be a n In fo re la cio n a d a . Ou rLis t Bo x t ie n e
u n a cla s e Ou rLis t Bo x Be a n I n fo re la cio n a d a q u e co n t ie n e e l s ig u ie n t e có d ig o :

itemsprop.setPropertyEditorClass(IndexPropertyEditor.class);

3 . Ha ce r q u e e l e d it o r d e p ro p ie d a d e s s e a u n a fu e n t e d e e ve n t o s co m p a rt id o s . El e d it o r d e
p ro p ie d a d e s re g is t ra rá lo s o ye n t e s d e la p ro p ie d a d y d is p a ra rá lo s e ve n t o s d e ca m b io d e
p ro p ie d a d a e s o s o ye n t e s . As í e s co m o lo s ca m b io s e n la p ro p ie d a d s e p ro p a g a n h a cia e l
Be a n ( m e d ia n t e la h o ja d e p ro p ie d a d e s ) . Po r e s o I n d e x P ro p e rt y Ed it o r e je m p la riza u n a
cla s e in t e rn a P ro p e rt y Ch a n g e S u p p o rt :

private PropertyChangeSupport support =


new PropertyChangeSupport(this);

Pro p o rcio n a la h a b ilid a d d e q u e lo s o b je t o s re g is t re n s u in t e ré s e n s e r n o t ifica d o s cu a n d o


u n a p ro p ie d a d e s e d it a d a :

public void addPropertyChangeListener(PropertyChangeListener l) {


support.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l) {


support.removePropertyChangeListener(l);
}

Y d is p a ra u n e ve n t o d e ca m b io d e p ro p ie d a d a d ich o s o ye n t e s :

public void actionPerformed(ActionEvent evt) {


if (evt.getSource() == addButton) {
listBox.addItem(textBox.getText());
textBox.setText("");
support.firePropertyChange("", null, null);
}
else if (evt.getSource()== textBox) {
listBox.addItem(textBox.getText());
textBox.setText("");
support.firePropertyChange("",null,null);
}
...
}

I n d e x P ro p e rt y Ed it o r m a n t ie n e lis t b o x co m o u n a co p ia d e Ou rLis t Bo x. Cu a n d o s e h a ce u n
ca m b io e n lis t b o x , s e d is p a ra u n e ve n t o d e ca m b io d e p ro p ie d a d a t o d o s lo s o ye n t e s .
Cu a n d o u n a h o ja d e p ro p ie d a d e s , q u e e s t á re g is t ra d a co m o u n o ye n t e d e
I n d e x P ro p e rt y Ed it o r, re cib e u n e ve n t o d e ca m b io d e p ro p ie d a d d e s d e
I n d e x P ro p e rt y Ed it o r, lla m a a I n d e x P ro p e rt y Ed it o r. g e t Va lu e ( ) p a ra re cu p e ra r lo s ít e m s
n u e vo s o ca m b ia d o s p a ra a ct u a liza r e l Be a n .

Oz it o
Manipular Eventos en el BeanBox
Lo s Be a n s u t iliza n e l m e ca n is m o d e e ve n t o s im p le m e n t a d o e n e l JDK 1 . 1 , p o r e s o
im p le m e n t a r e ve n t o s e n lo s Be a n s e s ig u a l q u e im p le m e n t a r e ve n t o s e n cu a lq u ie r
co m p o n e n t e d e l JDK 1 . 1 . Es t a s e cció n d e s crib e co m o s e u t iliza e s t e m e ca n is m o d e
e ve n t o s e n lo s Be a n s y e n e l Be a n Bo x.

Cómo descubre el BeanBox las capacidades de Eventos de un


Beans
El Be a n Bo x u t iliza la in t ro s p e cció n d e p a t ro n e s d e d is e ñ o o u n a cla s e Be a n I n fo
p a ra d e s cu b ir lo s e ve n t o s q u e p u e d e d is p a ra r u n Be a n .

Utilizar la Introspección para Descubrir los Eventos Lanzados por un Bean

Lo s Ja va Be a n s p ro p o rcio n a n p a t ro n e s d e d is e ñ o o rie n t a d o s a e ve n t o s p a ra d a r a
la s h e rra m ie n t a s d e in t ro s p e cció n la p o s ib ilid a d d e d e s cu b ir lo s e ve n t o s q u e p u e d e
la n za r u n Be a n .
Pa ra q u e u n Be a n s e a la fu e n t e d e u n e ve n t o , d e b e im p le m e n t a r m é t o d o s q u e
a ñ a d a n y e lim in e n o ye n t e s p a ra e l t ip o d e l o b je t o . Lo s p a t ro n e s d e d is e ñ o p a ra
e sos m é todos son

public void add<EventListenerType>(<EventListenerType> a)


public void remove<EventListenerType>(<EventListenerType> a)
Es t o s m é t o d o s le p e rm it e n a u n Be a n fu e n t e s a b e r d o n d e la n za r lo s e ve n t o s .
En t o n ce s e l Be a n fu e n t e la n za lo s e ve n t o s a a q u e llo s Be a n s o ye n t e s q u e u t ilice n lo s
m é t o d o s p a ra a q u e llo s in t e rfa ce s p a rt icu la re s . Po r e je m p lo , s i u n Be a n fu e n t e
re g is t ra o b je t o s Ac t io n Lis t e n e r, la n za rá e ve n t o s a d ich o s o b je t o s lla m a n d o a l
m é t o d o a c t io n P e rfo rm e d ( ) d e d ich o s o ye n t e s .
Pa ra ve r lo s e ve n t o s d e s cu b ie rt o s u t iliza n d o p a t ro n e s d e d is e ñ o , a rra s t ra u n
e je m p la r d e Ou rBu t t o n d e n t ro d e l Be a n Bo x y d e s p lie g a e l m e n ú Ed it | Eve n t s . Es t o
m u e s t ra u n a lis t a d e in t e rfa ce d e e ve n t o s q u e Ou rBu t t o n p u e d e d is p a ra r. Ob s e rva
q u e e l p ro p io Ou rBu t t o n s ó lo a ñ a d e d o s d e e s o s in t e rfa ce s ; e l re s t o s o n
h e re d a d o s d e la cla s e b a s e .

Utilizar BeanInfo para Definir los Eventos Lanzados por el Bean

S e p u e d e n "p u b lica r" e xp lícit a m e n t e lo s e ve n t o s la n za d o s p o r u n Be a n , u t iliza n d o


u n a cla s e q u e im p le m e n t a e l in t e rfa ce Be a n I n fo . El Be a n Ex p lic it Bu t t o n
s u b cla s ifica Ou rBu t t o n , y p ro p o rcio n a u n a cla s e Ex p lic it Bu t t o n Be a n I n fo
a s o cia d a . Ex p lic it Bu t t o n Be a n I n fo im p le m e n t a e l s ig u ie n t e m é t o d o p a ra d e fin ir
e xp lícit a m e n t e lo s in t e rfa ce s q u e Ex p lic it Bu t t o n u t iliza p a ra la n za r e ve n t o s .
public EventSetDescriptor[] getEventSetDescriptors() {
try {
EventSetDescriptor push = new EventSetDescriptor(beanClass,
"actionPerformed",
java.awt.event.ActionListener.class,
"actionPerformed");

EventSetDescriptor changed = new EventSetDescriptor(beanClass,


"propertyChange",
java.beans.PropertyChangeListener.class,
"propertyChange");

push.setDisplayName("button push");
changed.setDisplayName("bound property change");

EventSetDescriptor[] rv = { push, changed};


return rv;
} catch (IntrospectionException e) {
throw new Error(e.toString());
}
}
Arra s t ra u n e je m p la r d e Ex p lic it Bu t t o n a l Be a n Bo x, y d e s p lie g a e l m e n ú
Ed it | Eve n t s . Ob s e rva q u e s ó lo s e lis t a n a q u e llo s in t e rfa ce s e xp u e s t o s
e xp lícit a m e n t e e n la cla s e Ex p lic it Bu t t o n Be a n I n fo . No s e e xp o n e n la s
ca p a cid a d e s h e re d a d a s . Pu e d e s ve r la p á g in a El In t e rfa ce Be a n In fo p a ra m á s
in fo rm a ció n s o b re e s t e in t e rfa ce .

Ver los Eventos de un Bean en el BeanBox

S i h a s s e le ccio n a d o u n Be a n Ou rBu t t o n e n e l Be a n Bo x, d e s p lie g a e l m e n ú


Ed it | Eve n t s , ve rá s u n a lis t a d e in t e rfa ce s a lo s q u e Ou rBu t t o n p u e d e la n za r
e ve n t o s . Cu a n d o s e s e le ccio n a a lg ú n in t e rfa ce , s e m u e s t ra n lo s m é t o d o s q u e
la n za n d ife re n t e s e ve n t o s a d ich o s in t e rfa ce s . Es t o s co rre s p o n d e n a t o d o s lo s
e ve n t o s q u e Ou rBu t t o n p u e d e la n za r

Capturando Eventos en el BeanBox


En e s t e e je m p lo u t iliza re m o s d o s e je m p la re s d e l Be a n Ou rBu t t o n p a ra a rra n ca r y
p a ra r u n e je m p la r d e l Be a n Ju g g le r a n im a d o . Et iq u e t a re m o s e s t o b o t o n e s co m o
"s t a rt " y "s t o p "; h a re m o s q u e cu a n d o s e p u ls e e l b o t ó n "s t a rt " s e lla m e a l m é t o d o
s t a rt Ju g g lin g d e l Be a n Ju g g le r; y q u e cu a n d o s e p u ls e e l b o t ó n "s t o p ", s e lla m e a l
m é t o d o s t o p Ju g g lin g d e l Be a n Ju g g le r.
1 . Arra n ca r e l Be a n Bo x.
2 . Arra s t ra u n Be a n Ju g g le r y d o s e je m p la re s d e Ou rBu t t o n e n e l Be a n Bo x.
3 . S e le ccio n a u n e je m p la r d e Ou rBu t t o n . En la h o ja d e p ro p ie d a d e s , ca m b ia la
e t iq u e t a a "s t a rt ".
4 . S e le ccio n a e l s e g u n d o e je m p la r d e Ou rBu t t o n y ca m b ia s u e t iq u e t a a "s t o p ".
5 . S e le cio n a e l b o t ó n s t a rt . e lig e e l m e n ú Ed it | Eve n t s | a ct io n | a ct io n Pe rfo rm e d .
Es t o h a ce q u e a p a re zca u n a lin e a m a rca d a e n t re e l b o t ó n s t a rt y e l cu rs o r.
Pu ls a r s o b re e l e je m p la r d e Ju g g le r. Es t o t ra e e l Ev e n t Ta rg e t D ia lo g :

Es t a lis t a co n t ie n e lo s m é t o d o s d e Ju g g le r q u e n o t o m a n a rg u m e n t o s , o
a rg u m e n t o s d e l t ip o a c t io n P e rfo rm e d .
6 . S e le ccio n a e l m é t o d o s t a rt Ju g g lin g y p u ls a OK. Ve rá s u n m e n s a je in d ica n d o
q u e e l Be a n Bo x e s t á g e n e ra n d o u n a cla s e a d a p t a d o r.
7 . re p it e lo s d o s ú lt im o s p a s o s s o b re e l b o t ó n s t o p , e xce p t o e n e le g ir e l m é t o d o
s t o p Ju g g lin g e n e l Ev e n t Ta rg e t D ia lo g .
S i p u ls a s a h o ra s o b re lo s b o t o n e s s t a rt y s t o p s e a rra n ca rá y p a ra rá la e je cu ció n d e
Ju g g le r. Aq u í t ie n e s u n a d e s crip ció n g e n e ra l d e lo q u e h a s u ce d id o :
● Lo s b o t o n e s s t a rt y s t o p s o n fu e n t e s d e e v e n t o s . La s fu e n t e s d e e ve n t o s
la n z a n e v e n t o s a lo s d e s t in o s d e e ve n t o s . En e s t e e je m p lo e l Be a n Ju g g le r e s
e l De s t in o d e l Eve n t o .
● Cu a n d o s e s e le ccio n a e l b o t ó n s t a rt y s e e lig e u n m é t o d o d e e ve n t o ( m e d ia n t e
e l m e n ú Ed it | Eve n t ) , s e e s t á e lig ie n d o e l t ip o d e e ve n t o q u e la n za rá la fu e n t e
d e l e ve n t o .
● cu a n d o s e co n e ct a la lín e a co n o t ro Be a n , e s t á s s e le ccio n a n d o e l Be a n De s t in o
d e l e ve n t o .
● El Ev e n t Ta rg e t D ia lo g lis t a lo s m é t o d o s q u e p u e d e n a ce p t a r e s e t ip o d e
e ve n t o s o q u e n o t o m e n p a rá m e t ro s . Cu a n d o s e e lig e u n m é t o d o e n e l
Ev e n t Ta rg e t D ia lo g , s e e s t á e lig ie n d o e l m é t o d o q u e re cib irá e l e ve n t o
la n za d o , y a ct u a rá s o b re é l.
Ut iliza e l m e n ú File | S a ve p a rá g ra b a r e s t e e je m p lo e n u n fich e ro d e t u e le cció n .

Clases Adpatadoras de Eventos


El Be a n Bo x g e n e ra u n a cla s e a d p a t a d o r q u e s e in t e rp o n e e n t re la fu e n t e y e l
d e s t in o d e l e ve n t o . La cla s e a d a p t a d o r im p le m e n t a e l in t e rfa ce d e l o ye n t e d e
e ve n t o a p ro p ia d o ( co m o e l o ye n t e re a l) , ca p t u ra e l e ve n t o la n za d o p o r e l b o t ó n , y
lla m a a l m é t o d o s e le ccio n a d o d e l b e a n d e s t in o . Aq u í t ie n e s la cla s e a d p a t a d o r
g e n e ra d a p o r e l Be a n Bo x q u e s e in t e rp o n e e n t re e l b o t ó n s t a rt y e l Ju g g le rBe a n :

// Automatically generated event hookup file.

package tmp.sunw.beanbox;
import sunw.demo.juggler.Juggler;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ___Hookup_1474c0159e implements


java.awt.event.ActionListener, java.io.Serializable {

public void setTarget(sunw.demo.juggler.Juggler t) {


target = t;
}

public void actionPerformed(java.awt.event.ActionEvent arg0) {


target.startJuggling(arg0);
}

private sunw.demo.juggler.Juggler target;


}
El a d a p t a d o r im p le m e n t a e l in t e rfa ce Ac t io n Lis t e n e r q u e s e h a s e le ccio n a d o e n e l
m e n ú Ed it | Eve n t s d e l Be a n Bo x. Ac t io n Lis t e n e r d e cla re u n m é t o d o ,
a c t io n P e rfo rm e d ( ) , q u e e s im p le m e n t a d o p o r e l a d a p t a d o r p a ra lla m a r a l m é t o d o
d e l Be a n d e s t in o ( s t a rt Ju g g lin g ( ) ) q u e s e h a s e le ccio n a d o . El m é t o d o
s e t Ta rg e t ( ) d e l a d a p t a d o r e s lla m a d o p o r e l Be a n Bo x p a ra s e le ccio n a r e l Be a n
d e s t in o re a l, e n e s t e ca s o Ju g g le r.

El Bean EventMonitor
El Be a n Ev e n t Mo n it o r ( b e a n s / d e m o / s u n w / d e m o / e n c a p s u la t e d Ev e n t s )
im p rim e in fo rm e s d e lo s e ve n t o s d e l Be a n fu e n t e , e n u n lis t b o x. Pa ra ve r co m o
fu n cio n a e s t o , s ig u e e s t o s p a s o s :
1 . Arra s t ra e je m p la re s d e Ou rBu t t o n y Ev e n t Mo n it o r h a s t a e l Be a n Bo x.
Po d ría s re d im e n s io n a r e l Ev e n t Mo n it o r ( y e l Be a n Bo x) p a ra a co m o d a r la
vis ió n d e lo s in fo rm e s d e e ve n t o s .
2 . S e le ccio n a e l e je m p la r d e Ou rBu t t o n , y e lig e cu a lq u ie r m é t o d o e n e l m e n ú
Ed it | Eve n t s .
3 . Co n e ct a la lín e a q u e a p a re ce co n e l Ev e n t Mo n it o r, y e lig e s u
in it ia t e Ev e n t S o u rc Mo n it o rin g e n e l Ev e n t Ta rg e t D ia lo g .
4 . S e le ccio n a e l Be a n Ou rBu t t o n . Es t a rá s vie n d o u n in fo rm e d e e ve n t o s e n e l
Ev e n t Mo n it o r
Cu a n d o e l p rim e r e ve n t o e s e n via d o , Ev e n t Mo n it o r a n a liza e l Be a n fu e n t e p a ra
d e s cu b rir t o d o s lo s e ve n t o s q u e la n za , cre a y re g is t ra o ye n t e s d e e ve n t o s p a ra
ca d a t ip o d e e ve n t o , y lu e g o in fo rm a s ie m p re q u e s e la n ce u n e ve n t o . Es t o e s ú t il
p a ra d e p u ra ció n , In t e n t a co n e ct a r o t ro s Be a n s a Ev e n t Mo n it o r p a ra o b s e rva r s u s
e ve n t o s .

Eventos para Propiedades Compartidas y Restringidas


La s p á g in a s s o b re p ro p ie d a d e s Co m p a rt id a s y Re s t rin g id a s d e s crib e n d o s in t e rfa ce s
d e o ye n t e s d e e ve n t o s e s p e cífico s .

Oz it o
El Interface BeanInfo
¿ Có lo e xa m in a n la s h e rra m ie n t a s d e d e s a rro llo a u n Be a n p a ra e xp o n e r s u s ca ra ct e rís it ca s
( p ro p ie d a d e s , e ve n t o s y m é t o d o s ) e n u n h o ja d e p ro p ie d a d e s ? Ut iliza n d o la cla s e
ja v a . b e a n s . I n t ro s p e c t o r. Es t a cla s e u t iliza e l co ra z ó n d e re fle x ió n d e l API d e l JDK p a ra
d e s cu b rir lo s m é t o d o s d e l Be a n , y lu e g o a p lica lo s p a t ro n e s d e d is e ñ o d e lo s Ja va Be a n s p a ra
d e s cu b rir s u s ca ra ct e rís it ca s . Es t e p ro ce s o d e d e s cu b rim ie n t o s e lla m a in t ro s p e cció n .
De fo rm a a lt e rn a t iva , s e p u e d e n e xp o n e r e x p lícit a m e n t e la s ca ra ct e rica s d e l Be a n e n u n a cla s e
a s o cia d a s e p a ra d a q u e im p le m e n t e e l in t e rfa ce Be a n I n fo . As o cia n d o u n a cla s e Be a n I n fo co n
u n Be a n s e p u e d e :
● Exp o n e r s o lo a q u e lla s ca ra ct e rís t ica s q u e q u e re m o s e xp o n e r.

● Re le g a r e n Be a n I n fo la e xp o s ició n d e a lg u n a s ca ra ct e rís it ca s d e l Be a n , m ie n t ra s s e d e ja
e l re s t o p a ra la re fle xió n d e b a jo n ive l.
● As o cia r u n ico n o co n e l Be a n fu e n t e .

● Es p e cifica r u n a cla s e p e rs o n a liza .

● S e g re g a r la s ca ra ct e rís it ca s e n t re n o rm a le s y e xp e rt a s .

● Pro p o rcio n a r u n n o m b re m á s d e s crip t ivo , in fo rm a ció n a d icio n a l s o b re la ca ra ct e rís it ca d e l


Be a n .
Be a n I n fo d e fin e m é t o d o s q u e d e vu e lve n d e s crip t o re s p a ra ca d a p ro p ie d a d , m é t o d o o e ve n t o
q u e s e q u ie re e xp o n e r. Aq u í t ie n e s lo s p ro t o t ip o s d e e s t o s m é t o d o s :

PropertyDescriptor[] getPropertyDescriptors();
MethodDescriptor[] getMethodDescriptors();
EventSetDescriptor[] getEventSetDescriptors();
Ca d a u n o d e e s t o s m é t o d o s d e vu e lve u n a rra y d e d e s crip t o re s p a ra ca d a ca ra ct e rís it ca .

Descriptores de Caracterisitcas

La s cla s e s Be a n I n fo co n t ie n e n d e s crip t o re s q u e p re cis a m e n t e d e s crib e n la s ca ra ct e rís t ica s d e l


Be a n fu e n t e . El BDK im p le m e n t a la s s ig u ie n t e s cla s e s :
● Fe a t u re D e s c rip t o r e s la cla s e b a s e p a ra la s o t ra s cla s e s d e d e s crip t o re s . De cla ra lo s
a s p e ct o s co m u n e s a t o d o s lo s t ip o s d e d e s crip t o re s .
● Be a n D e s c rip t o r d e s crib e e l t ip o d e la cla s e y e l n o m b re d e l Be a n fu e n t e y d e s crib e la
cla s e p e rs o n a liza d a d e l Be a n fu e n t e s i e xis t e .
● P ro p e rt y D e s c rip t o r d e s crib e la s p ro p ie d a d e s d e l Be a n fu e n t e .

● I n d e x e d P ro p e rt y D e s c rip t o r e s u n a s u b cla s e d e P ro p e rt y D e s c rip t o r, y d e s crib e la s


p ro p ie d a d e s in d e xa d a s d e l Be a n fu e n t e .
● Ev e n t S e t D e s c rip t o r d e s crib e lo s e ve n t o s la n za d o s p o r e l Be a n fu e n t e .

● Me t h o d D e s c rip t o r d e s crib e lo s m é t o d o s d e l Be a n fu e n t e .

● P a ra m e t e rD e s c rip t o r d e s crib e lo s p a rá m e t ro s d e m é t o d o s .

El in t e rfa ce Be a n I n fo d e cla ra m é t o d o s q u e d e vu e lve n a rra ys d e lo s d e s crip t o re s a n t e rio re s .

Crear una Clase BeanInfo

Ut iliza re m o s la cla s e Ex p lic it Bu t t o n Be a n I n fo p a ra ilu s t ra r la cre a ció n d e u n a cla s e


Be a n I n fo . Aq u í e s t á n lo s p a s o s g e n e ra le s p a ra cre a r u n a cla s e Be a n I n fo :
1 . N o m b ra r la c la s e Be a n I n fo . S e d e b e a ñ a d ir e l e s t rin g "Be a n In fo " a l n o m b re d e la cla s e
fu e n t e . S i e l n o m b re d e la cla s e fu e n t e e s Ex p lic it Bu t t o n , la cla s e Be a n In fo a s o cia d a s e
d e b e lla m a r Ex p lic it Bu t t o n Be a n I n fo
2 . S u b c la s ific a r S im p le Be a n I n fo . Es t a e s u n a cla s e d e co n ve n ie n cia q u e im p le m e n t a lo s
m é t o d o s d e Be a n I n fo p a ra q u e d e vu e lva n n u ll o u n va lo r n u lo e q u iva le n t e .

public class ExplicitButtonBeanInfo extends SimpleBeanInfo {

Ut iliza n d o S im p le Be a n I n fo n o s a h o rra m o s t e n e r q u e im p le m e n t a r t o d o s lo s m é t o d o s d e
Be a n I n fo ; s o lo t e n e m o s q u e s o b re e s crib ir a q u e llo s m é t o d o s q u e n e ce s it e m o s .
3 . S o b re e s c rib ir lo s m é t o d o s a p ro p ia d o s p a ra d e v o lv e r la s p ro p ie d a d e s , lo s
m é t o d o s o lo s e v e n t o s q u e q u e re m o s e x p o n e r. Ex p lic it Bu t t o n Be a n I n fo
s o b re e s crib e e l m é t o d o g e t P ro p e rt y D e s c rip t o rs ( ) p a ra d e vo lve r cu a t ro p ro p ie d a d e s :

public PropertyDescriptor[] getPropertyDescriptors() {


try {
PropertyDescriptor background =
new PropertyDescriptor("background", beanClass);
PropertyDescriptor foreground =
new PropertyDescriptor("foreground", beanClass);
PropertyDescriptor font =
new PropertyDescriptor("font", beanClass);
PropertyDescriptor label =
new PropertyDescriptor("label", beanClass);

background.setBound(true);
foreground.setBound(true);
font.setBound(true);
label.setBound(true);

PropertyDescriptor rv[] =
{background, foreground, font, label};
return rv;
} catch (IntrospectionException e) {
throw new Error(e.toString());
}
}

Exis t e n d o s co s a s im p o rt a n t e s q u e o b s e rva r a q u í:
❍ S i s e d e ja fu e ra a lg ú n d e s crip t o r, la p ro p ie d a d , e ve n t o o m é t o d o n o d e s crit o n o s e
e xp o n d rá . En o t ra s p a la b ra s , s e p u e d e e xp o n e r s e le ct iva m e n t e la s p ro p ie d a d e s ,
e ve n t o s o m é t o d o s , d e ja n d o fu e ra la s q u e n o q u e ra m o s e xp o n e r.
❍ S i u n m é t o d o o b t e n e d o r d e ca ra ct e rís t ica s ( p o r e je m p lo g e t Me t h o d D e s c rip t o r( ) )
d e vu e lve Nu ll, s e u t iliza rá la re fle xió n d e b a jo n ive l p a ra e s a ca ra ct e rís it ca . Es t o
s ig n ifica , p o r e je m p lo , q u e s e p u e d e n e xp e cifica r e xp licit a m e n t e p ro p ie d a d e s , y
d e ja r q u e la re fle xió n d e b a jo n ive l d e s cu b ra lo s m é t o d o s . S i n o s e s o b re e s crib e e l
m é t o d o p o r d e fe ct o d e S im p le Be a n I n fo q u e d e vu e lve n u ll, la re fle xió n d e b a jo
n ive l s e u t iliza rá p a ra e s t a ca ra ct e rís t ica .
4 . Op t io n a lm e n t e , a s o c ia r u n ic o n o c o n e l Be a n fu e n t e .
public java.awt.Image getIcon(int iconKind) {
if (iconKind == BeanInfo.ICON_MONO_16x16 ||
iconKind == BeanInfo.ICON_COLOR_16x16 ) {
java.awt.Image img = loadImage("ExplicitButtonIcon16.gif");
return img;
}
if (iconKind == BeanInfo.ICON_MONO_32x32 ||
iconKind == BeanInfo.ICON_COLOR_32x32 ) {
java.awt.Image img = loadImage("ExplicitButtonIcon32.gif");
return img;
}
return null;
}

El Be a n Bo x m u e s t ra e l ico n o ju n t o a l n o m b re d e l Be a n e n e l To o lBo x. S e p u e d e e s p e ra r
q u e la s h e rra m ie n t a s d e d e s a rro llo h a g a n a lg o s im ila r.
5 . Es p e c ific a r la c la s e d e l Be a n fu e n t e , y , s i e l Be a n e s t á p e rs o n a liz a d o ,
e s p e c ific a rlo t a m b ié n .

public BeanDescriptor getBeanDescriptor() {


return new BeanDescriptor(beanClass, customizerClass);
}
...
private final static Class beanClass = ExplicitButton.class;
private final static Class customizerClass = OurButtonCustomizer.class;

Gu a rd a la cla s e Be a n I n fo e n e l m is m o d ire ct o rio q u e la cla s e fu e n t e . El Be a n Bo x b u s ca


p rim e ro la cla s e Be a n I n fo d e u n Be a n e n e l p a t h d e l p a q u e t e d e l Be a n . S i n o s e e n cu e n t ra e l
Be a n I n fo , e n t o n ce s la in fo rm a ció n d e l Be a n b u s ca e n e l p a t h ( m a n t e n id o p o r e l
I n t ro s p e c t o r) . La in fo rm a ció n d e l Be a n s e b u s ca p o r d e fe ct o e n e l p a t h s u n . b e a n s . in fo s . S i
n o s e e n cu e n t ra la cla s e Be a n I n fo , s e u t iliza la re fle xió n d e b a jo n ive l p a ra d e s cru b rir la s
ca ra ct e rís t ica s d e l Be a n .

Utilizar BeanInfo para Controlar las Características a Exponer

S i re le g a m o s e n la re fle xió n d e l b a jo n ive l p a ra d e s cu b rir la s ca ra ct e rís t ica s d e l Be a n , t o d a s


a q u e lla s p ro p ie d a d e s , m é t o d o s y e ve n t o s q u e co n fo rm e n e l p a t ró n d e d is e ñ o a p ro p ia d o s e rá n
e xp u e s t a s e n u n a h e rra m ie n t a d e d e s a rro llo . Es t o in clu ye cu a lq u ie r ca ra ct e rís t ica d e la cla s e
b a s e . S i e l Be a n Bo x e n cu e n t ra u n a cla s e Be a n I n fo a s o cia d a , e n t o n ce s la in fo rm a ció n e s
u t iliza e n s u lu g a r, y n o s e e xa m in a n m á s cla s e s b a s e u t iliza n d o la re fle xió n . En o t ra s p a la b ra s ,
la in fo rm a ció n d e l Be a n I n fo s o b re e s crib e la in fo rm a ció n d e la re fle xió n d e b a jo n ive l, y e vit a
e l e xa m e n d e la cla s e b a s e .
Me d ia n t e la u t iliza ció n d e u n a cla s e Be a n I n fo , s e p u e d e n e xp o n e r s u b co n ju n t o s d e u n a
ca ra ct e rís t ica p a rt icu la r d e l Be a n . Po r e je m p lo , m e d ia n t e la n o d e vo lu ció n d e u n m é t o d o
d e s crip t o r p a ra u n m é t o d o p a rt icu la r, e s e m é t o d o n o s e rá e xp u e s t o e n u n a h e rra m ie n t a d e
d e s a rro llo .
Cu a n d o s e u t iliza la cla s e Be a n I n fo
● La s ca ra ct e rís t ica s d e la cla s e b a s e n o s e rá n e xp u e s t a s . S e p u e d e n re cu p e ra r la s
ca ra ct e rís t ica s d e la cla s e b a s e u t iliza n d o e l m é t o d o
Be a n I n fo . g e t Ad d it io n a lBe a n I n fo ( ) .
● La s p ro p ie d a d e s , e ve n t o s o m é t o d o s q u e n o t e n g a n d e s crip t o r n o s e rá n e xp u e s t o s . Pa ra
u n a ca ra ct e rís t ica p a rt icu la r, s ó lo a q u e llo s ít e m s d e vu e lt o s e n e l a rra y d e d e s crip t o re s
s e rá n e xp u e s t o s . Po r e je m p lo , s i d e vo lve m o s d e s crip t o re s p a ra t o d o s lo s m é t o d o s d e u n
Be a n e xce p t o fo o ( ) , e n t o n ce s fo o ( ) n o s e rá e xp u e s t o .
● La re fle xió n d e b a jo n ive l s e rá u t iliza d a p a ra la s ca ra ct e rís t ica s cu yo s m e t o d o s
o b t e n e d o re s d e vu e lva n n u ll. Po r e je m p lo s u n u e s t ra cla s e Be a n I n fo co n t ie n e e s t a
im p le m e n t a ció n d e m é t o d o s :

public MethodDescriptor[] getMethodDescriptors() {


return null;
}

En t o n ce s la re fle xió n d e b a jo n ive l s e u t iliza rá p a ra d e s cu b rir lo s m é t o d o s p ú b lico s d e l


Be a n .

Localizar las clases BeanInfo

An t e s d e e xa m in a r u n Be a n , e l I n t ro s p e c t o r in t e n t a rá e n co n t ra r u n a cla s e Be a n I n fo
a s o cia d a co n e l b e a n . Po r d e fe ct o , e l I n t ro s p e c t o r t o m a e l n o m b re d e l p a q u e t e d e l Be a n
t o t a lm e n t e cu a lifica d o , y le a ñ a d e "Be a n In fo " p a ra fo rm a r u n n u e vo n o m b re d e cla s e . Po r
e je m p lo , s i e l Be a n fu e n t e e s s u n w . d e m o . b u t t o n s . Ex p lic it Bu t t o n , e l I n t ro s p e c t o r
in t e n t a rá lo ca liza r s u n w . d e m o . b u t t o n s . Ex p lic it Bu t t o n Be a n I n fo .
S i e s t o fa lla , s e b u s ca rá e n t o d o s lo s p a q u e t e s e n e l p a t h d e Be a n I n fo . El p a t h d e b ú s q u e d a
d e Be a n I n fo e s m a n t e n id o p o r I n t ro s p e c t o r. s e t Be a n I n fo S e a rc h P a t h ( ) y
I n t ro s p e c t o r. g e t Be a n I n fo S e a rc h P a t h ( ) .

Oz it o
Personalización de Beans
La a p a rie n cia y e l co m p o rt a m ie n t o d e u n Be a n p u e d e n s e r p e rs o n a liza d o s e n e l
m o m e n t o d e l d is e ñ o d e n t ro d e la s h e rra m ie n t a s d e d e s a rro llo co m p a t ib le s co n lo s
Be a n s . Aq u í p o d e m o s ve r la s d o s fo rm a s m á s t íp ica s d e p e rs o n a liza r u n Be a n :
● Ut iliza n d o u n e d it o r d e p ro p ie d a d e s . Ca d a p ro p ie d a d d e l Be a n t ie n e s u p ro p io
e d it o r. No rm a lm e n t e la s h e rra m ie n t a s d e d e s a rro llo m u e s t ra n lo s e d it o re s d e
p ro p ie d a d e s d e u n Be a n e n u n a h o ja d e p ro p ie d a d e s . Un e d it o r d e p ro p ie d a d e s
e s t á a s o cia d o y e d it a u n t ip o d e p ro p ie d a d p a rt icu la r.
● Ut iliza n d o p e rs o n a liz a d o re s . Lo s p e rs o n a liza d o re s o fre ce n u n co m p le t o co n t ro l
GUI s o b re la p e rs o n a liza ció n d e l Be a n . Es t o s p e rs o n a liza d o re s s e u t iliza n a llí
d o n d e lo s e d it o re s d e p ro p ie d a d e s n o s o n p rá ct ico s o n o s e p u e d e n a p lica r. Al
co n t ra rio q u e u n e d it o r d e p ro p ie d a d , q u e e s t á a s o cia d o co n u n a p ro p ie d a d , u n
p e rs o n a liza d o r e s t á a s o cia d o co n u n Be a n .

Editores de Propiedades
Un e d it o r d e p ro p ie d a d e s u n a h e rra m ie n t a p a ra p e rs o n a liza r u n t ip o d e p ro p ie d a d
p a rt icu la r. Lo s e d it o re s d e p ro p ie d a d e s s e m u e s t ra n , o s e a ct iva n d e s d e la h o ja d e
p ro p ie d a d e s . Un a h o ja d e p ro p ie d a d e s d e t e rm in a rá e l t ip o d e la p ro p id a d , b u s ca rá
u n e d it o r d e p ro p ie d a d a d e cu a d o , y m o s t ra rá e l va lo r a ct u a l d e la p ro p ie d a d d e u n a
fo rm a a d e cu a d a .
Lo s e d it o re s d e p ro p ie d a d e s d e b e n im p le m e n t a r e l in t e rfa ce P ro p e rt y Ed it o r. Es t e
in t e rfa ce p ro p o rcio n a m é t o d o s q u e e s p e cifica n cu a n d o u n a p ro p ie d a d d e b e s e r
m o s t ra d a e n u n a h o ja d e p ro p ie d a d e s .
Aq u í t ie n e s la h o ja d e p ro p ie d a d e s d e l Be a n Bo x co n t ie n d o la s p ro p ie d a d e s d e
Ou rBu t t o n :
S e e m p ie za e l p ro ce s o d e e d ició n d e e s t a s p ro p ie d a d e s p u ls a n d o s o b re la e n t ra d a
d e la p ro p ie d a d e n la h o ja .
● La s p ro p ie d a d e s la b e l y fo n t S iz e s e m u e s t ra n e n u n ca m p o d e t e xt o e d it a b le .
Lo s ca m b io s s e re a liza n a llí m is m o .
● La s p ro p ie d a d e s la rg e Fo n t y d e b u g s o n ca ja s d e s e le cció n co n e le ccio n e s
d is cre t a s .
● Pu ls a n d o s o b re la s e n t ra d a s fo re g ro u n d , b a c k g ro u n d , y fo n t s e d e s p le g a rá n
p a n e le s s e p a ra d o s .
Ca d a u n o d e e llo s s e m u e s t ra d e p e n d ie n d o d e lo s m é t o d o s d e P ro p e rt y Ed it o r q u e
h a ya m o s im p le m e n t a d o p a ra q u e d e vu e lva n va lo re s d is t in t o s d e n u ll.
Po r e je m p lo , e l e d it o r d e p ro p ie d a d in t im p le m e n t a e l m é t o d o s e t As Te x t ( ) . Es t o
in d ica a la h o ja d e p ro p ie d a d e s q u e la p ro p ie d a d p u e d e s e r m o s t ra d a co m o u n
S t rin g , y lo h a ce e n u n ca m p o d e t e xt o e d it a b le .
Lo s e d it o re s d e p ro p ie d a d e s Co lo r y Fo n t u t iliza n u n p a n e l s e p a ra d o , y s ó lo u t iliza n
la h o ja d e p ro p ie d a d e s p a ra m o s t ra r e l va lo r a ct u a l d e la p ro p ie d a d . Es t e e d it o r s e
m u e s t ra p u ls a n d o s o b re e s e va lo r.
Pa ra m o s t a r e l va lo r a ct u a l d e la p ro p ie d a d d e n t ro d e la h o ja d e p ro p ie d a d e s ,
n e ce s it a m o s s o b re e s cirib r is P a in t a b le ( ) p a ra q u e d e vu e lva t ru e , y p a in t Va lu e ( )
p a ra q u e d ib u je e l n u e vo va lo r d e la p ro p ie d a d e n u n re ct á n g u lo e n la h o ja d e
p ro p ie d a d e s . Aq u í t ie n e s co m o Co lo rEd it o r im p le m e n t a p a in t Va lu e ( ) :

public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) {


Color oldColor = gfx.getColor();
gfx.setColor(Color.black);
gfx.drawRect(box.x, box.y, box.width-3, box.height-3);
gfx.setColor(color);
gfx.fillRect(box.x+1, box.y+1, box.width-4, box.height-4);
gfx.setColor(oldColor);
}
Pa ra s o p o rt a r e l e d it o r d e p ro p ie d a d e s p e rs o n a liza d o , n e ce s it a m o s s o b re e s crib ir d o s
m é t o d o s m á s : s u p p o rt s Cu s t o m Ed it o r( ) p a ra q u e d e vu e lva t ru e , y
g e t Cu s t o m Ed it o r( ) p a ra q u e d e vu e lve u n e je m p la r d e l e d it o r p e rs o n a liza d o .
Co lo rEd it o r. g e t Cu s t o m Ed it o r( ) d e vu e lve t h is .
Ad e m á s , la cla s e P ro p e rt y Ed it o rS u p p o rt m a n t ie n e u n a lis t a d e
P ro p e rt y Ch a n g e Lis t e n e r y la n za n o t ifica cio n e s d e e ve n t o s d e ca m b io d e
p ro p ie d a d a d ich o s o ye n t e s cu a n d o u n a p ro p ie d a d co m p a rt id a h a ca m b ia d o .

Como se Asocian los Editores de Propiedades con las Propiedades


Lo s e d it o re s d e p ro p ie d a d e s s o n d e s cu b ie rt o s y a s o cia d o s co n u n a p ro p ie d a d d a d a
m e d ia n t e :
● La a s o cia ció n e xp lícit a m e d ia n t e u n o b je t o Be a n I n fo . El Be a n Mo le c u le u t iliza
e s t a t é cn ica . De n t ro d e la cla s e Mo le c u le Be a n I n fo , e l e d it o r d e p ro p ie d a d e s
d e l Be a n Mo le c u le s e s e le ccio n a co n la s ig u ie n t e lín e a d e có d ig o :

pd.setPropertyEditorClass(MoleculeNameEditor.class);

● Re g is t ro e xp lícit o m e d ia n t e
ja v a . Be a n s . P ro p e rt y Ed it o rMa n a g e r. re g is t e rEd it o r( ) . Es t e m é t o d o t o m a
u n p a r d e a rg u m e n t o s : e l t ip o d e la cla s e , y e l e d it o r a s o cia d o co n e s e t ip o .
● Bu s q u e d a p o r n o m b re . S i u n a cla s e n o t ie n e a s o cia d o e xp lícit a m e n t e u n e d it o r
d e p ro p ie d a d e s , e n t o n ce s e l P ro p e rt y Ed it o rMa n a g e r b u s ca la cla s e d e l
e d it o r d e p ro p ie d a d m e d ia n t e :
❍ Añ a d ie n d o "Ed it o r" a l n o m b re t o t a lm e n t e cu a lifica d o d e la cla s e . Po r
e je m p lo , p a ra la cla s e ja v a . b e a n s . Co m p le x N u m b e r, e l m a n e ja d o r d e l
e d it o r d e p ro p ie d a d e s b u s ca rá la cla s e
ja v a . b e a n s . Co m p le x N u m b e rEd it o r cla s s .
❍ Añ a d ie n d o "Ed it o r" a l n o m b re d e la cla s e y b u s ca n d o la cla s e e n e l p a t h
d e b ú s q u e d a . El p a t h d e b ú s q u e d a p o r d e fe ct o d e l Be a n Bo x e s t á e n
s u n . b e a n s . e d it o rs .

Los Editores de Propiedades del BDK

El DBK p ro p o rcio n a e d it o re s p a ra t ip o s d e d a t o s p rim it ivo s co m o in t , b o o l, flo a t , y


p a ra lo s t ip o s d e cla s e s co m o Co lo r y Fo n t . El có d ig o fu e n t e p a ra e s t o s e d it o re s
e s t á e n b e a n s / a p is / s u n / b e a n s / e d it o rs . Es t o s fu e n t e s s o n u n b u e n p u n t o d e
e n t ra d a p a ra e s crib ir t u s p ro p io s e d it o re s . Alg u n a s co s a s a o b s e rva r s o b re lo s
e d it o re s d e p ro p ie d a d e s d e l BDK:
● To d a s la s p ro p ie d a d e s "n u m é rica s " e s t á n re p re s e n t a d a s co m o o b je t o s S t rin g .
El I n t Ed it o r s o b re e s crib e P ro p e rt y Ed it o rS u p p o rt . s e t As Te x t ( ) .
● El e d it o r d e p ro p ie d a d e s b o o l e s u n m e n ú d e e le ccio n e s d is cre t a s .
S o b re e s crib ie n d o e l m é t o d o P ro p e rt y Ed it o rS u p p o rt . g e t Ta g s ( ) p a ra q u e
d e vu e lva u n S t rin g [ ] q u e co n t e n g a "Tru e " y "Fa ls e ":

public String[] getTags() {


String result[] = { "True", "False" };
return result;
}

● Lo s e d it o re s d e p ro p ie d a d e s Co lo r y Fo n t im p le m e n t a n u n e d it o r
p e rs o n a liz a d o . Po rq u e e s t o s o b je t o s re q u ie re n u n in t e rfa ce m á s s o fis t ica d o
p a ra s e r fá cilm e n t e e d it a d o s e n u n co m p o n e n t e s e p a ra d o q u e s e d e s p lie g a
p a ra h a ce r la e d ició n d e la p ro p ie d a d . S o b re e s cib ir s u p p o rt s Cu s t o m Ed it o r( )
p a ra q u e d e vu e lva t ru e in d ica a la h o ja d e p ro p ie d a d e s q u e e s t e e d it o r d e
p ro p ie d a d e s u n co m p o n e n t e p e rs o n a liza d o . Lo s m é t o d o s is P a in t a b le ( ) y
p a in t Va lu e ( ) t a m b ié n s o n s o b re e s crit o s p a ra p ro p o rcio n a r e l co lo r y la fu e n t e
e n la s á re a s d e e je m p lo d e la h o ja d e p ro p ie d a d e s .
El có d ig o fu e n t e d e e s t o s e d it o re s d e p ro p ie d a d e s e s t á e n
b e a n s / a p is / s u n / b e a n s / e d it o rs .
Ob s e rva q u e s i n o s e e n cu e n t ra u n e d it o r d e p ro p ie d a d e s p a ra u n a p ro p ie d a d , e l
Be a n Bo x n o m o s t ra rá e s a p ro p ie d a d e n la h o ja d e p ro p ie d a d e s .

Personalizadores
Cu a n d o s e u t iliza u n Pe rs o n a liz a d o r d e Be a n , s e o b t ie n e e l co n t ro l co m p le t o s o b re la
co n fig u ra ció n o e d ició n d e l Be a n . Un p e rs o n a liza d o r e s co m o u n a a p lica ció n q u e
e s p e cífica m e n t e co n t ie n e la p e rs o n a liza ció n d e u n Be a n . Alg u n a s ve ce s la s
p ro p ie d a d e s s o n in s u ficie n t e s p a ra re p re s e n t a r lo s a t rib u t o s co n fig u ra b le s d e u n
Be a n . Lo s Pe rs o n a liza d o re s s e u s a n cu a n d o s e n e ce s it a u t iliza r in s t ru ccio n e s
s o fis t ica d a s p a ra m o d ifica r u n Be a n , y cu a n d o lo s e d it o re s d e p ro p ie d a d e s s o n
d e m a s ia d o s p rim it ivo s p a ra co n s e g u ir la p e rs o n a liza ció n d e l Be a n .
To d o s lo s p e rs o n a liza d o re s d e b e n :
● De s ce n d e r d e ja v a . a w t . Co m p o n e n t o d e u n a d e s u s s u b cla s e s .

● Im p le m e n t a r e l in t e rfa ce ja v a . b e a n s . Cu s t o m iz e r. Es t o s ig n ifica la
im p le m e n t a ció n d e m é t o d o s p a ra re g is t ra r o b je t o s P ro p e rt y Ch a n g e Lis t e n e r,
y la n za r e ve n t o s d e ca m b io d e p ro p ie d a d a d ich o s o ye n t e s cu a n d o o cu rre u n
ca m b io e n e l Be a n fu e n t e .
● Im p le m e n t a r u n co n s t ru ct o r p o r d e fe ct o .

● As o cia r e l p e rs o n a liza d o r co n la cla s e fu e n t e m e d ia n t e


Be a n I n fo . g e t Be a n D e s c rip t o r( ) .
S i u n Be a n a s o cia d o co n u n Pe rs o n a liza d o r e s a rra s t ra d o d e n t ro d e l Be a n Bo x,
p o d rá s ve r u n ít e m "Cu s t o m ize . . . " e n e l m e n ú Ed it .

Personalizadores del BDK

El Ou rBu t t o n Cu s t o m iz e r s irve co m o e je m p lo p a ra d e m o s t ra r e l m e ca n is m o d e
co n s t ru cció n d e u n p e rs o n a liza d o r. Ou rBu t t o n Cu s t o m iz e r:
● De s cie n d e d e ja v a . a w t . P a n e l ( u n a s u b cla s e d e Co m p o n e n t ) .

● Im p le m e n t a e l in t e rfa ce Cu s t o m iz e r, y u t iliza u n o b je t o
P ro p e rt y Ch a n g e S u p p o rt p a ra m a n e ja r e l re g is t ro y n o t ifica ció n d e
P ro p e rt y Ch a n g e Lis t e n e r. Pu e d e s ve r la p á g in a Pro p ie d a d e s Co m p a rt id a s
p a ra u n a d e s crip ció n d e P ro p e rt y Ch a n g e S u p p o rt .
● Im p le m e n t a u n co n s t ru ct o r p o r d e fe ct o :

public OurButtonCustomizer() {
setLayout(null);
}

● Es t a a s o cia d o co n s u cla s e fu e n t e , Ex p lic it Bu t t o n , m e d ia n t e


Ex p lic it Bu t t o n Be a n I n fo . Aq u í ie n e s la s s e n t e n cia s d e
Ex p lic it Bu t t o n Be a n I n fo q u e h a ce n la a s o cia ció n :

public BeanDescriptor getBeanDescriptor() {


return new BeanDescriptor(beanClass, customizerClass);
}
...
private final static Class customizerClass =
OurButtonCustomizer.class;

Lo s Be a n s Brid g e Te s t e r y JD BC S e le c t t a m b ié n t ie n e n p e rs o n a liza d o re s .

Oz it o
Persistencia de un Bean
Un Be a n p e rs is t e cu a n d o t ie n e s u s p ro p ie d a d e s , ca m p o s e in fo rm a ció n d e e s t a d o
a lm a ce n a d a s y re s t a u ra d a s d e s d e u n fich e ro . El m e ca n is m o q u e h a ce p o s ib le la
p e rs is t e n cia s e lla m a s e ria liz a ció n . Cu a n d o u n e je m p la r d e b e a n e s s e ria liza d o s e
co n vie rt e e n u n a ca n a l d e d a t o s p a ra s e r e s crit o s . Cu a lq u ie r Ap p le t , a p lica ció n o
h e rra m ie n t a q u e u t ilice e l Be a n p u e d e "re co n t is t u irlo " m e d ia n t e la d e s e ria liz a ció n . Lo s
Ja va Be a n s u t iliza n e l API Ob je ct S e ria liza t io n d e l JDK p a ra s u s n e ce s id a d e s d e
s e ria liza ció n .
S ie m p re q u e u n a cla s e e n e l á rb o l d e h e re n cia im p le m e n t e lo s in t e rfa ce s S e ria liza b le o
Ext e rn a liza b le , e s a cla s e s e rá s e ria liza b le .
To d o s lo s Be a n d e b e n p e rs is it ir. Pa ra p e rs is t ir, n u e s t ro s Be a n s d e b e n s o p o rt a r la
s e ria liza ció n im p le m e n t a n d o lo s in t e rfa ce s ja va . io . S e ria liza b le o ja va . io . Ext e rn a liza b le .
Es t o s in t e rfa ce s t e o fre ce n la e le cció n e n t re s e ria liza ció n a u t o m á t ica y "h a zlo t u m is m o ".

Controlar la Serialización
S e p u e d e co n t ro la r e l n ive l d e s e ria liza ció n d e n u e s t ro Be a n :
● Au t o m á t ico : im p le m e n t a n d o S e ria liz a b le . To d o e s s e ria liza d o .

● Exclu ye n d o lo s ca m p o s q u e n o s e q u ie ra n s e ria liza r m a rcá n d o lo s co n e l m o d ifica d o r


t ra n s ie n t ( o s t a t ic ) .
● Es crib ir lo s Be a n s a u n fich e ro d e fo rm a t o e s p e cífico : im p le m e n t a n d o
Ex t e rn a liz a b le , y s u s d o s m é t o d o s .

Serialización por Defecto: El Interface Serializable


El in t e rfa ce S e ria liz a b le p ro p o rcio n a s e ria liza ció n a u t o m á t ica m e d ia n t e la u t iliza ció n d e
la s h e rra m ie n t a s d e Ja va Ob je ct S e ria liza t io n . S e ria liz a b le n o d e cla ra m é t o d o s ; a ct ú a
co m o u n m a rca d o r, d icié n d o le a la s h e rra m ie n t a s d e S e ria liza ció n d e Ob je t o s q u e
n u e s t ra cla s e Be a n e s s e ria liza b le . Ma rca r la s cla s e s co n S e ria liz a b le s ig n ifica q u e le
e s t a m o s d icie n d o a la Má q u in a Virt u a l Ja va ( JVM) q u e e s t a m o s s e g u ro s d e q u e n u e s t ra
cla s e fu n cio n a rá co n la s e ria liza ció n p o r d e fe ct o . Aq u í t e n e m o s a lg u n o s p u n t o s
im p o rt a n t e s p a ra e l t ra b a jo co n e l in t e rfa ce S e ria liz a b le :
● La s cla s e s q u e im p le m e n t a n S e ria liz a b le d e b e n t e n e r u n co n s t ru ct o r s in
a rg u m e n t o s . Es t e co n s t ru ct o r s e rá lla m a d o cu a n d o u n o b je t o s e a "re co n s t it u id o "
d e s d e u n fich e ro . s e r.
● No e s n e ce s a rio im p le m e n t a r S e ria liz a b le e n n u e s t ra s u b cla s e s i ya e s t á
im p le m e n t a d o e n u n a s u p e rcla s e .
● To d o s lo s ca m p o s e x ce p t o s t a t ic y t ra n s ie n t s o n s e ria liza d o s . Ut iliza re m o s e l
m o d ifica d o r t ra n s ie n t p a ra e s p e cifica r lo s ca m p o s q u e n o q u e re m o s s e ria liza r, y
p a ra e s p e cifica r la s cla s e s q u e n o s o n s e ria liza b le s .
El Be a n Bo x e s crib e lo s Be a n s s e ria liza b le s a u n fich e ro co n la e xt e n s ió n . s e r.
El Be a n Ou rBu t t o n u t iliza la s e ria liza ció n p o r d e fe ct o p a ra co n s e g u ir la p e rs is t e n cia d e
s u s p ro p ie d a d e s . Ou rBu t t o n s ó lo a ñ a d e S e ria liz a b le a s u d e fin ició n d e cla s e p a ra h a ce r
u s o d e la s e ria liza ció n p o r d e fe ct o :

public class OurButton extends Component implements Serializable,...


S i a rra s t ra m o s u n e je m p la r d e Ou rBu t t o n a l Be a n Bo x, la h o ja d e p ro p ie d a d e s m u e s t ra
la s p ro p ie d a d e s d e Ou rBu t t o n . Lo q u e n o s a s e g u ra q u e la s e ria liza ció n e s t á fu n cio n a n d o .
1 . Ca m b ia a lg u n a s d e la s p ro p ie d a d e s d e Ou rBu t t o n . Po r e je m p lo ca m b ia e l t a m a ñ o
d e la fu e n t e y lo s co lo re s .
2 . S e ria liza e l e je m p la r d e Ou rBu t t o n m o d ifica d o s e le ccio n a n d o e l m e n ú
File | S e ria lize Co m p o n e n t . . . d e l Be a n Bo x. Ap a re ce za u n d ia lo g o p a ra g u a rd a r e l
fich e ro .
3 . Po n e l fich e ro . s e r e n u n fich e ro JAR co n u n m a n ifie s t o a d e cu a d o .
4 . Lim p ia e l Be a n Bo x s e le ccio n a n d o e l m e n ú File | Cle a r.
5 . Re ca rg a e l e je m p la r s e ria liza d o e l m e n ú File | Lo a d Ja r.
El e je m p la r Ou rBu t t o n a p a re ce rá e n e l Be a n Bo x co n la s p ro p ie d a d e s m o d ifica d a s
in t a ct a s . Im p le m e n t a n d o S e ria liz a b le e n n u e s t ra cla s e , la s p ro p ie d a d e s p rim it iva s y lo s
ca m p o s p u e d e n s e r s e ria liza d o s . Pa ra m ie m b ro s d e la cla s e m á s co m p le jo s s e n e ce s it a
u t iliza r t é cn ica s d ife re n t e s .

Serialización Selectiva Utilizando el Modificador transient


Pa ra e xclu ir ca m p o s d e la s e ria liza ció n d e u n o b je t o S e ria liz a b le , m a rca re m o s lo s
ca m p o s co n e l m o d ifica d o r t ra n s ie n t :

transient int Status;


La s e ria liza ció n p o r d e fe ct o n o s e ria liza lo s ca m p o s t ra n s ie n t y s t a t ic .

Serialización Selectiva: writeObject y readObject()


S i n u e s t ra cla s e s e ria liza b le co n t ie n e a lg u n o d e lo s s ig u ie n t e s m é t o d o s ( la s firm a s d e b e n
s e r e xa ct a s ) , e l s e ria liza ció n p o r d e fe ct o n o t e n d rá lu g a r:

private void writeObject(java.io.ObjectOutputStream out)


throws IOException;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
S e p u e d e co n t ro la r có m o s e s e ria liza rá n lo s o b je t o s m á s co m p le jo s , e s crib ie n d o n u e s t ra s
p ro p ia s im p le m e n t a ció n d e lo s m é t o d o s w rit e Ob je c t ( ) y re a d Ob je c t ( ) .
Im p le m e n t a re m o s w rit e Ob je c t cu a n d o n e ce s it e s e je rce r m a yo r co n t ro l s o b re la
s e ria liza ció n , cu a n d o n e ce s it e m o s s e ria liza r o b je t o s q u e la s e ria liza ció n p o r d e fe ct o n o
p u e d e m a n e ja r, o cu a n d o n e ce s it a m o s a ñ a d ir d a t o s a u n ca n a l d e s e ria liza ció n q u e n o
s o n m ie m b ro s d e l o b je t o . Im p le m e n t a re m o s re a d Ob je c t ( ) p a ra re cro n s t ru ir e l ca n a l d e
d a t o s p a ra e s crib ir co n w rit e Ob je c t ( ) .

Ejemplo: el Bean Molecule


El Be a n Mo le c u le m a n t ie n e u n n ú m e ro d e ve rs ió n e n u n ca m p o e s t á t ico . Co m o lo s
ca m p o s e s t á t ico s n o s o n s e ria liza b le s p o r d e fe ct o , w rit e Ob je c t ( ) y re a d Ob je c t ( ) s o n
im p le m e n t a d o s p a ra s e ria liza r e s t e ca m p o . Aq u í e s t á n la s im p le m e n t a cio n e s d e
w rit e Ob je c t ( ) y re a d Ob je c t ( ) d e Mo le c u le . ja v a :

private void writeObject(java.io.ObjectOutputStream s)


throws java.io.IOException {
s.writeInt(ourVersion);
s.writeObject(moleculeName);
}

private void readObject(java.io.ObjectInputStream s)


throws java.lang.ClassNotFoundException,
java.io.IOException {
// Compensate for missing constructor.
reset();
if (s.readInt() != ourVersion) {
throw new IOException("Molecule.readObject: version mismatch");
}
moleculeName = (String) s.readObject();
}
Es t a s im p le m e n t a cio n e s lím it a n lo s ca m p o s s e ria liza d o s a o u rVe rs io n y
m o le c u le N a m e . Nin g ú n o t ro d a t o d e la cla s e s e rá s e ria liza d o .
Es m e jo r u t iliza r lo s m é t o d o s d e fa u lt W rit e Ob je c t ( ) y d e fa u lt Re a d Ob je c t d e
Ob je c t I n p u t S t re a m a n t e s d e h a ce r n u e s t ra s p ro p ia s e s p e cifica cio n e s e n e l ca n a l d e
e s crit u ra . Po r e je m p lo :

private void writeObject(java.io.ObjectOutputStream s)


throws java.io.IOException {
//First write out defaults
s.defaultWriteObject();
//...
}

private void readObject(java.io.ObjectInputStream s)


throws java.lang.ClassNotFoundException,
java.io.IOException {
//First read in defaults
s.defaultReadObject();
//...
}

El Interface Externalizable
Es t e in t e rfa ce s e u t iliza cu a n d o n e ce s it a m o s u n co m p le t o co n t ro l s o b re la s e ria liza ció n
d e n u e s t ro Be a n ( p o r e je m p lo , cu a n d o lo e s crib im o s y le e m o s e n u n fo rm a t o d e fich e ro
e s p e cífico ) . Ne ce s it a m o s im p le m e n t a r d o s m é t o d o s : re a d Ex t e rn a l( ) y
w rit e Ex t e rn a l( ) . La s cla s e s Ex t e rn a liz a b le t a m b ié n d e b e n t e n e r u n co n s t ru ct o r s in
a rg u m e n t o s .

Ejemplo: Los Beans BlueButton y OrangeButton

Cu a n d o e je cu t a m o s Be a n Bo x, p o d e m o s ve r d o s Be a n s lla m a d o s Blu e Bu t t o n y
Ora n g e Bu t t o n e n e l To o lBo x. Es t o s d o s Be a n s s o n re a lm e n t e d o s e je m p la re s
s e ria liza d o s d e la cla s e Ex t e rn a liz a b le Bu t t o n .
Ex t e rn a liz a b le Bu t t o n im p le m e n t a e l in t e rfa ce Ex t e rn a liz a b le . Es t o s ig n ifica q u e h a ce
t o d a s u p ro p ia s e ria liza ció n , m e d ia n t e la im p le m e n t a ció n d e
Ex t e rn a liz a b le . re a d Ex t e rn a l( ) y Ex t e rn a liz a b le . w rit e Ex t e rn a l( ) .
El p ro g ra m a Blu e Bu t t o n W rit e r e s u t iliza d o p o r lo s m a ke file d e lo s b o t o n e s p a ra cre a r
u n e je m p la r d e Ex t e rn a liz a b le Bu t t o n , ca m b ia r s u p ro p ie d a d b a c k g ro u n d a a zu l,
e s crib ir e l Be a n e n u n fich e ro Blu e Bu t t o n . s e r. Ora n g e Bu t t o n s e cre a d e la m is m a
m a n e ra , u t iliza n d o Ora n g e Bu t t o n W rit e r. El m a ke file p o n e e s t o s fich e ro s . s e r e n
b u t t o n s . ja r, d o n d e e l To o lBo x p u e d e e n co n t ra rlo s y re co n t is t u irlo s .

Oz it o
Nuevas Caracterísiticas de JavaBeans
Gla s g o w e s u n a ve rs ió n d e l BDK, cu ya s ca ra ct e rís it ca s s o n :
● El Ja va Act iva t io n Fra m e wo rk ( JAF) . El JAF e s u n t ip o d e d a t o s y u n API d e
re g is t ro d e co m a n d o s . Co n e l JAF s e p u e d e d e s cu b rir e l t ip o d e d a t o s d e u n
o b je t o a rb it ra rio , y b u s ca r co m a n d o s , a p lica cio n e s o Be a n s q u e p u e d a n
p ro ce s a r e s e t ip o d e d a t o s , y a ct iva r e l co m a n d o a p ro p ia d o a la g e s t ió n d e l
u s u a rio . Po r e je m p lo , u n n a ve g a d o r p u e d e id e n t ifica r e l t ip o d e lo s d a t o s d e
u n fich e ro , y la n za r e l p lu g - in a d e cu a d o p a ra ve r o e d it a r e l fich e ro . El JAF e s
u n a e xt e n s ió n d e l e s t á n d a rd d e Ja va . S e p u e d e o b t e n e r u n a co p ia d e s d e e l
s it e d e Gla s g o w we b .
● El Pro t o co lo d e Co n t e n id o s y S e rvicio s , t a m b ié n co n o cid o co m o b e a n c o n t e x t .
An t e s d e e s t e p ro t o co lo u n Be a n s o lo co n o cia y t e n ia a cce s o a la Má q u in a
Virt u a l Ja va ( JVM) e n la q u e e l Be a n s e e je cu t a b a , y a l co ra zó n d e l API Ja va .
Es t e p ro t o co lo p re s e n t a u n a fo rm a e s t á n d a rd p a ra q u e lo s Be a n s p u e d a n
d e s cu b rir y a cce d e r a lo s a t rib u t o s o s e rvicio s p ro p o rcio n a d o s p o r u n e n t o rn o
d e l Be a n , p a ra d e s cu b rir y a cce d e r a lo s a t rib u t o s y s e rvicio s d e l Be a n .
El API ja v a . b e a n s . b e a n c o n t e x t p re s e n t a la p o s ib ilid a d d e a n id a r Be a n s y
co n t e x t o s d e Be a n s e n u n a e s t ru ct u ra d e á rb o l. En e l m o m e n t o d e la
e je cu ció n , u n Be a n p u e d e o b t e n e r s e rvicio s d e s d e s u e n t o rn o co n t e n e d o r; e l
Be a n p u e d e a s e g u ra rs e e s t o s s e rvicio s , o p ro p a g a r e s t o s s e rvicio s a cu a lq u ie r
Be a n q u e é l co n t e n g a .
● S o p o rt e d e "Dra g a n d Dro p " . El API ja v a . a w t . d n d p ro p o rcio n a s o p o rt e p a ra
"Arra s t ra r y S o lt a r" e n t re a p lica cio n e s Ja va y a p lica cio n e s n a t iva s d e la
p la t a fo rm a .

Oz it o
Introducción a los Servlets
Lo s S e rvle t s s o n m ó d u lo s q u e e xt ie n d e n lo s s e rvid o re s o rie n t a d o s a
p e t ició n - re s p u e s t a , co m o lo s s e rvid o re s we b co m p a t ib le s co n Ja va . Po r e je m p lo , u n
s e rvle t p o d ría s e r re s p o n s a b le d e t o m a r lo s d a t o s d e u n fo rm u la rio d e e n t ra d a d e
p e d id o s e n HTML y a p lica rle la ló g ica d e n e g o cio s u t iliza d a p a ra a ct u a liza r la b a s e
d e d a t o s d e p e d id o s d e la co m p a ñ ia .

Lo s S e rvle t s s o n p a ra lo s s e rvid o re s lo q u e lo s a p p le t s s o n p a ra lo s n a ve g a d o re s .
S in e m b a rg o , a l co n t ra rio q u e lo s a p p le t s , lo s s e rvle t s n o t ie n e n in t e rfa ce g rá fico
d e u s u a rio .
Lo s s e rve lt s p u e d e n s e r in clu id o s e n m u ch o s s e rvid o re s d ife re n t e s p o rq u e e l API
S e rvle t , e l q u e s e u t iliza p a ra e s crib ir S e rvle t s , n o a s u m e n a d a s o b re e l e n t o rn o o
p ro t o co lo d e l s e rvid o r. Lo s s e rvle t s s e e s t á n u t iliza n d o a m p lia m e n t e d e n t ro d e
s e rvid o re s HTTP; m u ch o s s e rvid o re s We b s o p o rt a n e l API S e rvle t .

Utilizar Servlets en lugar de Scripts CGI!


Lo s S e rvle t s s o n u n re e m p la zo e fe ct ivo p a ra lo s s crip t s CGI. Pro p o rcio n a n u n a
fo rm a d e g e n e ra r d o cu m e n t o s d in á m ico s q u e s o n fá cile s d e e s crib ir y rá p id o s e n
e je cu t a rs e . Lo s S e rvle t s t a m b ié n s o lu cio n a n e l p ro b le m a d e h a ce r la p ro g ra m a ció n
d e l la d o d e l s e rvid o r co n APIs e s p e cífico s d e la p la t a fo rm a : e s t á n d e s a rro lla d o s co n
e l API Ja va S e rvle t , u n a e xt e n s ió n e s t á n d a rd d e Ja va .
Po r e s o s e u t iliza n lo s s e rvle t s p a ra m a n e ja r p e t icio n e s d e clie n t e HTTP. Po r
e je m p lo , t e n e r u n s e rvle t p ro ce s a n d o d a t o s POS Te a d o s s o b re HTTP u t iliza n d o u n
fo rm u la rio HTML, in clu ye n d o d a t o s d e l p e d id o o d e la t a rje t a d e cré d it o . Un s e rvle t
co m o e s t e p o d ría s e r p a rt e d e u n s is t e m a d e p ro ce s a m ie n t o d e p e d id o s , t ra b a ja n d o
co n b a s e s d e d a t o s d e p ro d u ct o s e in ve n t a rio s , y q u iza s u n s is t e m a d e p a g o
o n - lin e .

Otros usos de los Servlets


● Pe rm it ir la co la b o ra ció n e n t re la g e n t e . Un s e rvle t p u e d e m a n e ja r m ú lt ip le s
p e t icio n e s co n cu rre n t e s , y p u e d e s in cro n iza rla s . Es t o p e rm it e a lo s s e rvle t s
s o p o rt a r s is t e m a s co m o co n fe re n cia s o n - lin e
● Re e n via r p e t icio n e s . Lo s S e rvle t s p u e d e n re e n via r p e t icio n e s a o t ro s
s e rvid o re s y s e rvle t s . Co n e s t o lo s s e rvle t s p u e d e n s e r u t iliza d o s p a ra ca rg a r
b a la n ce s d e s d e va rio s s e rvid o re s q u e re fle ja n e l m is m o co n t e n id o , y p a ra
p a rt icio n a r u n ú n ico s e rvicio ló g ico e n va rio s s e rvid o re s , d e a cu e rd o co n lo s
t ip o s d e t a re a s o la o rg a n iza ció n co m p a rt id a .

Listo para Escribir


Pa ra p re p a ra rt e a e s crib ir S e rvle t s , e s t a s e cció n e xp lica :

Arquitectura del Paquete Servlet

Exp lica lo s p ro p ó s it o s d e lo s p rin cip a le s o b je t o s e in t e rfa ce s d e l p a q u e t e


S e rvle t .

Un Servlet Sencillo

Mu e s t ra la a p a rie n cia d e l có d ig o d e u n s e rvle t s e n cillo .

Ejemplos de Servlets

Mu s t ra lo s e je m p lo s d e S e rve lt s u t iliza d o s e n e l re s t o d e la le cció n .

Oz it o
Arquitectura del Paquete Servlet
El p a q u e t e ja v a x . s e rv le t p ro p o rcio n a cla s e s e in t e rfa ce s p a ra e s crib ir s e rvle t s . La
a rq u it e ct u ra d e e s t e p a q u e t e s e d e s crib e a co n t in u a ció n :

El Interface Servlet
La a b s t ra ció n ce n t ra l e n e l API S e rvle t e s e l in t e rfa ce S e rv le t . To d o s lo s s e rvle t s
im p le m e n t a n e s t e in t e rfa ce , b ie n d ire ct a m e n t e o , m á s co m u n m e n t e , e xt e n d ie n d o
u n a cla s e q u e lo im p le m e n t e co m o Ht t p S e rv le t

El in t e rfa ce S e rv le t d e cla ra , p e ro n o im p le m e n t a , m é t o d o s q u e m a n e ja n e l S e rvle t


y s u co m u n ica ció n co n lo s clie n t e s . Lo s e s crit o re s d e S e rvle t s p ro p o rcio n a n a lg u n o s
d e e s o s m é t o d o s cu a n d o d e s a rro lla n u n s e rvle t .

Interación con el Cliente


Cu a n d o u n s e rvle t a ce p t a u n a lla m a d a d e u n clie n t e , re cib e d o s o b je t o s :
● Un S e rv le t Re q u e s t , q u e e n ca p s u la la co m u n ica ció n d e s d e e l clie n t e a l
s e rvid o r.
● Un S e rv le t Re s p o n s e , q u e e n ca p s u la la co m u n ica ció n d e vu e lt a d e s d e e l
s e rvle t h a cia e l clie n t e .
S e rv le t Re q u e s t y S e rv le t Re s p o n s e s o n in t e rfa ce s d e fin id o s e n e l p a q u e t e
ja v a x . s e rv le t .

El Interface ServletRequest

El In t e rfa ce S e rv le t Re q u e s t p e rm it e a l s e rvle t a ce d e r a :
● In fo rm a ció n co m o lo s n o m b re s d e lo s p a rá m e t ro s p a s a d o s p o r e l clie n t e , e l
p ro t o co lo ( e s q u e m a ) q u e e s t á s ie n d o u t iliza d o p o r e l clie n t e , y lo s n o m b re s
d e l h o s t re m o t e q u e h a re a liza d o la p e t ició n y la d e l s e rve r q u e la h a re cib id o .
● El s t re a m d e e n t ra d a , S e rv le t I n p u t S t re a m . Lo s S e rvle t s u t iliza n e s t e s t re a m
p a ra o b t e n e r lo s d a t o s d e s d e lo s clie n t e s q u e u t iliza n p ro t o co lo s co m o lo s
m é t o d o s POS T y PUT d e l HTTP.
Lo s in t e rfa ce s q u e e xt ie n d e n e l in t e rfa ce S e rv le t Re q u e s t p e rm it e n a l s e rvle t
re cib ir m á s d a t o s e s p e cífico s d e l p ro t o co lo . Po r e je m p lo , e l in t e rfa ce
Ht t p S e rv le t Re q u e s t co n t ie n e m é t o d o s p a ra a cce d e r a in fo rm a ció n d e ca b e ce ra
e s p e cífica HTTP.

El Interface ServletResponse

El In t e rfa ce S e rv le t Re s p o n s e le d a a l s e rvle t lo s m é t o d o s p a ra re s p o n d e r a l
clie n t e .
● Pe rm it e a l s e rvle t s e le ccio n a r la lo n g it u d d e l co n t e n id o y e l t ip o MIME d e la
re s p u e s t a .
● Pro p o rcio n a u n s t re a m d e s a lid a , S e rv le t Ou t p u t S t re a m , y u n W rit e r a
t ra vé s d e l cu a l e l s e rvle t p u e d e re s p o n d e r d a t o s .
Lo s in t e rfa ce s q u e e xt ie n d e n e l in t e rfa ce S e rv le t Re s p o n s e le d a n a lo s s e rvle t s
m á s ca p a cid a d e s e s p e cífica s d e l p ro t o co lo . Po r e je m p lo , e l in t e rfa ce
Ht t p S e rv le t Re s p o n s e co n t ie n e m é t o d o s q u e p e rm it e n a l s e rvle t m a n ip u la r
in fo rm a ció n d e ca b e ce ra e s p e cífica HTTP.

Capacidades Adicionales de los Servlets HTTP


La s cla s e s e in t e rfa ce s d e s crit o s a n t e rio rm e n t e co n s t ru ye n u n s e rvle t b á s ico . Lo s
s e rvle t s HTTP t ie n e n a lg u n o s o b je t o s a d icio n a le s q u e p ro p o rcio n a n ca p a cid a d e s d e
s e g u im ie n t o d e s e s ió n . El e s crit o r s e s e rvle t s p u e d e n u t iliza r e s o s APIs p a ra
m a n t e n e r e l e s t a d o e n t re e l s e rvle t y e l clie n t e p e rs is t e a t ra vé s d e m ú lt ip le s
co n e xio n e s d u ra n t e u n p e rio d o d e t ie m p o . Lo s s e rvle t s HTTP t a m b ié n t ie n e n
o b je t o s q u e p ro p o rcio n a n co o kie s . El API co o kie s e u t iliza p a ra g u a rd a r d a t o s
d e n t ro d e l clie n t e y re cu p e ra r e s o s d a t o s .

Oz it o
Un Servlet Sencillo
La s ig u ie n t e cla s e d e fin e co m p le t a m e n t e u n s e rvle t :

public class SimpleServlet extends HttpServlet


{
/**
* Maneja el método GET de HTPP para construir una sencilla página Web.
*/
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter out;
String title = "Simple Servlet Output";

// primero selecciona el tipo de contenidos y otros campos de cabecera de


la respuesta
response.setContentType("text/html");

// Luego escribe los datos de la respuesta


out = response.getWriter();

out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>This is output from SimpleServlet.");
out.println("</BODY></HTML>");
out.close();
}
}

Es t o e s t o d o !
La s cla s e s m e n cio n a d a s e n la p á g in a Arq u it e ct u ra d e l Pa q u e t e S e rvle t s e h a n m o s t ra d o e n n e g rit a :
● S im p le S e rv le t e xt ie n d e la cla s e Ht t p S e rv le t , q u e im p le m e n t a e l in t e rfa ce S e rv le t .
● S im p le S e rv le t s o b re e s crib e e l m é t o d o d o Ge t d e la cla s e Ht t p S e rv le t . Es t e m é t o d o e s
lla m a d o cu a n d o u n clie n t e h a ce u n p e t ició n GET ( e l m é t o d o d e p e t ició n p o r d e fe ct o d e HTTP) , y
re s u lt a e n u n a s e n cilla p á g in a HTML d e vu e lt a a l clie n t e .
● De n t ro d e l m é t o d o d o Ge t
❍ La p e t ició n d e l u s u a rio e s t á re p re s e n t a d a p o r u n o b je t o Ht t p S e rv le t Re q u e s t .

❍ La re s p u e s t a a l u s u a rio e s t a re p re s e n t a d a p o r u n o b je t o Ht t p S e rv le t Re s p o n s e .

❍ Co m o e l t e xt o e s d e vu e lt o a l clie n t e , e l re s p u e s t a s e e n vía u t iliza n d o e l o b je t o W rit e r


o b t e n id o d e s d e e l o b je t o Ht t p S e rv le t Re s p o n s e .

Oz it o
Ejemplos de Servlets

La s p á g in a s re s t a n t e s d e e s t a s e cció n m u e s t ra n co m o e s crib ir s e rvle t s HTTP. S e


a s u m e a lg ú n co n o cim ie n t o d e l p ro t o co lo HTTP; p a ra a p re n d e r m á s s o b re e s t e
p ro t o co lo p o d ría s e ch a r u n vis t a zo a l RFC d e l HTTP/ 1 . 1 .

La s p á g in a s u t iliza n u n e je m p lo lla m a d o Lib re ría d e D u k e , u n s e n cilla lib re ría


o n - lin e q u e p e rm it e a lo s clie n t e s re a liza r va ria s fu n cio n e s . Ca d a fu n ció n e s t á
p ro p o rcio n a d a p o r u n S e rvle t :
Función Servlet
Na ve g a r p o r lo s lib ro s d e o fe rt a Ca t a lo g S e rv le t
Co m p ra r u n lib ro s it u á n d o lo e n u n "t a je t a d e ve n t a " Ca t a lo g S e rv le t
Ob t e n e r m á s in fo rm a ció n s o b re u n lib ro e s p e cífico Bo o k D e t a ilS e rv le t
Ma n e ja r la b a s e d e d a t o s d e la lib re ría Bo o k D BS e rv le t
Ve r lo s lib ro s q u e h a n s id o s e le ccio n a d o s p a ra co m p ra r S h o w Ca rt S e rv le t
Elim in a r u n o o m á s lib ro s d e la t a rje t a d e co m p ra . S h o w Ca rt S e rv le t
Co m p ra r lo s lib ro s d e la t a rje t a d e co m p ra Ca s h ie rS e rv le t
Re cib ir u n Ag ra d e cim ie n t o p o r la co m p ra Re c e ip t S e rv le t

La s p á g in a s u t iliza n s e rvle t s p a ra ilu s t ra r va ria s t a re a s . Po r e je m p lo , e l


Bo o kDe t a ilS e rvle t s e u t iliza p a ra m o s t ra r có m o m a n e ja r p e t icio n e s GET d e HTTP, e l
Bo o kDBS e rvle t s e u t iliza p a ra m o s t ra r có m o in icia liza r u n s e rvle t , y e l
Ca t a lo g S e rvle t s e u t iliza p a ra m o s t ra r e l s e g u im ie n t o d e s e s ió n .

El e je m p lo D u k e 's Bo o k s t o re e s t á co m p u e s t o p o r va rio s fich e ro s fu e n t e . Pa ra t u


co n ve n ie n cia p u e d e s b a ja rt e lo s e n u n fich e ro zip p a ra e je cu t a r e l e je m p lo , d e s d e la
s it e d e S UN.
Ba ja rs e e l fich e ro ZIP

Pa ra e je cu t a r e l e je m p lo , n e ce s it a s a rra n ca r s e rv le t ru n n e r o u n s e rvid o r we b , y
lla m a r a l s e rvle t d e s d e u n n a ve d a d o r

Oz it o
Interactuar con los Clientes
Un S e rvle t HTTP m a n e ja p e t icio n e s d e l clie n t e a t ra vé s d e s u m é t o d o s e rv ic e . Es t e
m é t o d o s o p o rt a p e t icio n e s e s t á n d a rd d e clie n t e HTTP d e s p a ch a n d o ca d a p e t ició n a
u n m é t o d o d e s ig n a d o p a ra m a n e ja r e s a p e t ició n . Po r e je m p lo , e l m é t o d o s e rv ic e
lla m a a l m é t o d o d o Ge t m o s t ra d o a n t e rio rm e n t e e n e l e je m p lo d e l s e rvle t s e n cillo .

Peticiones y Respuestas

Es t a p á g in a e xp lica la u t iliza ció n d e lo s o b je t o s q u e re p re s e n t a n


p e t icio n e s d e clie n t e s ( u n o b je t o Ht t p S e rv le t Re q u e s t ) y la s re s p u e s t a s
d e l s e rvle t ( u n o b je t o Ht t p S e rv le t Re s p o n s e ) . Es t o s o b je t o s s e
p ro p o rcio n a n a l m é t o d o s e rv ic e y a lo s m é t o d o s q u e s e rv ic e lla m a p a ra
m e n e ja r p e t icio n e s HTTP.

Manejar Peticiones GET y POST

Lo s m é t o d o s e n lo s q u e d e le g a e l m é t o d o s e rv ic e la s p e t icio n e s HTTP,
in clu ye n
● d o Ge t , p a ra m a n e ja r GET, GET co n d icio n a l, y p e t icio n e s d e HEAD

● d o P o s t , p a ra m e n a ja r p e t icio n e s POS T

● d o P u t , p a ra m a n e ja r p e t icio n e s PUT

● d o D e le t e , p a ra m a n e ja r p e t icio n e s DELETE

Po r d e fe ct o , e s t o s m é t o d o s d e vu e lve n u n e rro r BAD _ REQUES T ( 4 0 0 ) .


Nu e s t ro s e rvle t d e b e ría s o b re s crib ir e l m é t o d o o m é t o d o s d is e ñ a d o s p a ra
m a n e ja r la s in t e ra ccio n e s HTTP q u e s o p o rt a . Es t a s e cció n m u e s t ra có m o
im p le m e n t a r m é t o d o p a ra m a n e ja r la s p e t icio n e s HTTP m á s co m u n e s :
GET y POS T.
El m é t o d o s e rv ic e d e Ht t p S e rv le t t a m b ié n lla m a a l m é t o d o d o Op t io n s
cu a n d o e l s e rvle t re cib e u n a p e t ició n OPTIONS , y a d o Tra c e cu a n d o
re cib e u n a p e t ició n TRACE. La im p le m e n t a ció n p o r d e fe ct o d e d o Op t io n s
d e t e rm in a a u t o m á t ica m e n t e q u e o p cio n e s HTTP s o n s o p o rt a d a s y
d e vu e lve e s a in fo rm a ció n . La im p le m e n t a ció n p o r d e fe ct o d e d o Tra c e
re a liza u n a re s p u e s t a co n u n m e n s a je q u e co n t ie n e t o d a s la s ca b e ce ra s
e n via d a s e n la p e t ició n t ra ce . Es t o s m é t o d o s n o s e s o b re e s crib e n
n o rm a lm e n t e .

Problemas con los Threads

Lo s S e rvle t s HTTP n o rm a lm e n t e p u e d e n s e rvir a m ú lt ip le s clie n t e s


co n cu rre n t e s . S i lo s m é t o d o s d e n u e s t ro S e rvle t n o fu n cio n a n co n
clie n t e s q u e a cce d e n a re cu rs o s co m p a rt id o s , d e b e re m o s :
● S in cro n iza r e l a cce s o a e s t o s re cu rs o s , o
● Cre a r u n s e rvle t q u e m a n e je s ó lo u n a p e t ició n d e clie n t e a la ve z.
Es t a le cció n t e m u e s t ra có m o im p le m e n t a r la s e g u n d a o p ció n . ( la
p rim e ra e s t á cu b ie rt a e n la p á g in a Th re a d s d e Co n t ro l. )

Descripciones de Servlets

Ad e m á s d e m a n e ja r p e t icio n e s d e clie n t e HTTP, lo s s e rvle t s t a m b ié n s o n


lla m a d o s p a ra s u m in is t ra r d e s crip ció n d e e llo s m is m o s . Es t a p á g in a
m u e s t ra co m o p ro p o rcio n a r u n a d e s crip ció n s o b re e s crib ie n d o e l m é t o d o
g e t S e rv le t I n fo , q u e s u m in is t ra u n a d e s crip ció n d e l s e rvle t .

Oz it o
Peticiones y Respuestas
Lo s m é t o d o s d e la cla s e Ht t p S e rv le t q u e m a n e ja n p e t icio n e s d e clie n t e t o m a n d o s
a rg u m e n t o s :
1 . Un o b je t o Ht t p S e rv le t Re q u e s t , q u e e n ca p s u la lo s d a t o s d e s d e e l clie n t e .
2 . Un o b je t o Ht t p S e rv le t Re s p o n s e , q u e e n ca p s u la la re s p u e s t a h a cia e l clie n t e .

Objetos HttpServletRequest
Un o b je t o Ht t p S e rv le t Re q u e s t p ro p o rcio n a a cce s o a lo s d a t o s d e ca b e ce ra HTTP,
co m o cu a lq u ie r co o kie e n co n t ra d a e n la p e t ició n , y e l m é t o d o HTTP co n e l q u e s e
h a re a liza d o la p e t ició n . El o b je t o Ht t p S e rv le t Re q u e s t t a m b ié n p e rm it e o b t e n e r
lo s a rg u m e n t o s q u e e l clie n t e e n vía co m o p a rt e d e la p e t ició n .
Pa ra a cce d e r a lo s d a t o s d e l clie n t e
● El m é t o d o g e t P a ra m e t e r d e vu e lve e l va lo r d e u n p a rá m e t ro n o m b ra d o . S i
n u e s t ro p a rá m e t ro p u d ie ra t e n e r m á s d e u n va lo r, d e b e ría m o s u t iliza r
g e t P a ra m e t e rVa lu e s e n s u lu g a r. El m é t o d o g e t P a ra m e t e rVa lu e s
d e vu e lve u n a rra y d e va lo re s d e l p a rá m e t ro n o m b ra d o . ( El m é t o d o
g e t P a ra m e t e rN a m e s p ro p o rcio n a lo s n o m b re s d e lo s p a rá m e t ro s .
● Pa ra p e t icio n e s GET d e HTTP, e l m é t o d o g e t Qu e ry S t rin g d e vu e lve e n u n
S t rin g u n a lín e a d e d a t o s d e s d e e l clie n t e . De b e m o s a n a liza r e s t o s d a t o s
n o s o t ro s m is m o s p a ra o b t e n e r lo s p a rá m e t ro s y lo s va lo re s .
● Pa ra p e t ico n e s POS T, PUT, y DELETE d e HTTP:

❍ S i e s p e ra m o s lo s d a t o s e n fo rm a t o t e xt o , e l m é t o d o g e t Re a d e r
d e vu e lve u n Bu ffe re d Re a d e r u t iliza d o p a ra le e r la lín e a d e d a t o s .
❍ S i e s p e ra m o s d a t o s b in a rio s , e l m é t o d o g e t I n p u t S t re a m d e vu e lve u n
S e rv le t I n p u t S t re a m u t iliza d o p a ra le e r la lín e a d e d a t o s .

N o t a : S e d e b e u t iliza r e l m é t o d o g e t P a ra m e t e r[ Va lu e s ] o u n o d e lo s
m é t o d o s q u e p e rm it a n a n a liza r lo s d a t o s . No p u e d e n u t iliza rs e ju n t o s e n
u n a ú n ica p e t ició n .

Objetos HttpServletResponse
Un o b je t o Ht t p S e rv le t Re s p o n s e p ro p o rcio n a d o s fo rm a s d e d e vo lve r d a t o s a l
u s u a rio :
● El m é t o d o g e t W rit e r d e vu e lve u n W rit e r

● El m é t o d o g e t Ou t p u t S t re a m d e vu e lve u n S e rv le t Ou t p u t S t re a m

S e u t iliza e l m é t o d o g e t W rit e r p a ra d e vo lve r d a t o s e n fo rm a t o t e xt o a l u s u a rio y


e l m é t o d o g e t Ou t p u t S t re a m p a ra d e vo lve r d a t o s b in a rio s .
S i ce rra m o s e l W rit e r o e l S e rv le t Ou t p u t S t re a m d e s p u é s d e h a b e r e n via d o la
re s p u e s t a , p e rm it im o s a l s e rvid o r s a b e r cu a n d o la re s p u e s t a s e h a co m p le t a d o .

Cabecera de Datos HTTP

De b e m o s s e le ccio n a r la ca b e ce ra d e d a t o s HTTP a n t e s d e a cce d e r a W rit e r o a


Ou t p u t S t re a m . La cla s e Ht t p S e rv le t Re s p o n s e p ro p o rcio n a m é t o d o s p a ra
a cce d e r a lo s d a t o s d e la ca b e ce ra . Po r e je m p lo , e l m é t o d o s e t Co n t e n t Ty p e
s e le ccio n a e l t ip o d e l co n t e n id o . ( No rm a lm e n t e e s t a e s la ú n ica ca b e ce ra q u e s e
s e le ccio n a m a n u a lm e n t e ) .

Oz it o
Manejar Peticiones GET y POST
Pa ra m a n e ja r p e t icio n e s HTTP e n u n s e rvle t , e xt e n d e m o s la cla s e Ht t p S e rv le t y s o b re e s crib im o s
lo s m é t o d o s d e l s e rvle t q u e m a n e ja n la s p e t icio n e s HTTP q u e q u e re m o s s o p o rt a r. Es t a p á g in a
ilu s t ra e l m a n e jo d e p e t icio n e s GET y POS T. Lo s m é t o d o s q u e m a n e ja n e s t a s p e t icio n e s s o n
d o Ge t y d o P o s t .

Manejar Peticiones GET


Ma n e ja r p e t icio n e s GET im p lica s o b re e s crib ir e l m é t o d o d o Ge t . El s ig u ie n t e e je m p lo m u e s t ra a
Bo o kDe t a ilS e rvle t h a cie n d o e s t o . Lo s m é t o d o s e xp lica d o s e n Pe t icio n e s y Re s p u e s t a s s e m u e s t ra n
e n n e g rit a :

public class BookDetailServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
// selecciona el tipo de contenido en la cabecera antes de acceder a Writer
response.setContentType("text/html");
PrintWriter out = response.getWriter();

// Luego escribe la respuesta


out.println("<html>" +
"<head><title>Book Description</title></head>" +
...);

//Obtiene el identificador del libro a mostrar


String bookId = request.getParameter("bookId");
if (bookId != null) {
// Y la información sobre el libro y la imprime
...
}
out.println("</body></html>");
out.close();
}
...
}
El s e rvle t e xt ie n d e la cla s e Ht t p S e rv le t y s o b re e s crib e e l m é t o d o d o Ge t . De n t ro d e l m é t o d o
d o Ge t , e l m é t o d o g e t P a ra m e t e r o b t ie n e lo s a rg u m e n t o s e s p e ra d o s p o r e l s e rvle t .
Pa ra re s p o n d e r a l clie n t e , e l m é t o d o d o Ge t u t iliza u n W rit e r d e l o b je t o Ht t p S e rv le t Re s p o n s e
p a ra d e vo lve r d a t o s e n fo rm a t o t e xt o a l clie n t e . An t e s d e a cce d e r a l writ e r, e l e je m p lo s e le ccio n a
la ca b e ce ra d e l t ip o d e l co n t e n id o . Al fin a l d e l m é t o d o d o Ge t , d e s p u é s d e h a b e r e n via d o la
re s p u e s t a , e l W rit e r s e cie rra .

Manejar Peticiones POST


Ma n e ja r p e t icio n e s POS T im p lica s o b re e s crib ir e l m é t o d o d o P o s t . El s ig u ie n t e e je m p lo m u e s t ra a
Re ce ip t S e rvle t h a cie n d o e s t o . De n u e vo , lo s m é t o d o s e xp lica d o s e n Pe t icio n e s y Re s p u e s t a s s e
m u e s t ra n e n n e g rit a :
public class ReceiptServlet extends HttpServlet {

public void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
// selecciona la cabecera de tipo de contenido antes de acceder a Writer
response.setContentType("text/html");
PrintWriter out = response.getWriter();

// Luego escribe la respuesta


out.println("<html>" +
"<head><title> Receipt </title>" +
...);

out.println("<h3>Thank you for purchasing your books from us " +


request.getParameter("cardname") +
...);
out.close();
}
...
}
El s e rvle t e xt ie n d e la cla s e Ht t p S e rv le t y s o b re e s crib e e l m é t o d o d o P o s t . De n t ro d e l m é t o d o
d o P o s t , e l m é t o d o g e t P a ra m e t e r o b t ie n e lo s a rg u m e n t o s e s p e ra d o s p o r e l s e rvle t .
Pa ra re s p o n d e r a l clie n t e , e l m é t o d o d o P o s t u t iliza u n W rit e r d e l o b je t o Ht t p S e rv le t Re s p o n s e
p a ra d e vo lve r d a t o s e n fo rm a t o t e xt o a l clie n t e . An t e s d e a cce d e r a l writ e r, e l e je m p lo s e le ccio n a
la ca b e ce ra d e l t ip o d e co n t e n id o . Al fin a l d e l m é t o d o d o P o s t , d e s p u é s d e h a b e r e n via d o la
re s p u e s t a , e l W rit e r s e cie rra .

Oz it o
Problemas con los Threads
Lo s s e rvle t s HTTP n o rm a lm e n t e p u e d e n s e rvir a m ú lt ip le s clie n t e s
co n cu rre n t e m e n t e . S i lo s m é t o d o s d e n u e s t ro s e rvle t t ra b a ja n co n clie n t e s q u e
a cce d e n a re cu rs o s co m p a rt id o s , p o d e m o s m a n e ja r la co n cu rre n cia cre a n d o u n
s e rvle t q u e m a n e je s ó lo u n a p e t ició n d e clie n t e a la ve z. ( Ta m b ié n s e p u e d e
s in cro n iza r e l a cce s o a lo s re cu rs o s , u n p u n t o q u e s e cu b re e n a l s e cció n Th re a d s
d e Co n t ro l d e e s t e t u t o ria l) .

Pa ra h a ce r q u e e l s e rvle t m a n e je s ó lo u n clie n t e a la ve z, t ie n e q u e im p le m e n t a r e l
in t e rfa ce S in g le Th re a d Mo d e l a d e m á s d e e xt e n d e r la cla s e Ht t p S e rv le t .

Im p le m e n t a r e l in t e rfa ce S in g le Th re a d Mo d e l n o im p lica e s crib ir n in g ú n m é t o d o


e xt ra . S ó lo s e d e cla ra q u e e l s e rvle t im p le m e n t a e l in t e rfa ce , y e l s e rvid o r s e
a s e g u ra d e q u e n u e s t ro s e rvle t s ó lo e je cu t e u n m é t o d o s e rv ic e ca d a ve z.
Po r e je m p lo , e l Re ce ip t S e rvle t a ce p t a u n n o m b re d e u s u a rio y u n n ú m e ro d e
t a rje t a d e cre d it o , y le a g ra d e ce a l u s u a rio s u p e d id o . S i e s t e s e rvle t a ct u a liza ra
re a lm e n t e u n a b a s e d e d a t o s , p o r e je m p lo , u n a q u e s ig a la p is t a d e l in ve n t a rio ,
e n t o n ce s la co n e xió n co n la b a s e d e d a t o s p o d ría s e r u n re cu rs o co m p a rt id o . El
s e rvle t p o d ría s in cro n iza r e l a cce s o a e s e re cu rs o , o im p le m e n t a r e l in t e rfa ce
S in g le Th re a d Mo d e l. S i e l s e rvle t im p le m e n t a e s t e in t e rfa ce , e l ú n ico ca m b io e n e l
có d ig o d e la p á g in a a n t e rio r e s la lín e a m o s t ra d a e n n e g rit a :

public class ReceiptServlet extends HttpServlet


implements SingleThreadModel {

public void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {
...
}
...
}

Oz it o
Proporcionar una Descripción de Servlet
Alg u n a s a p lica cio n e s , co m o La He rra m ie n t a d e Ad m in is t ra ció n d e l Ja va We b
S e rve r, o b t ie n e n in fo rm a ció n s o b re e l s e rvle t y la m u e s t ra n . La d e s crip ció n d e l
s e rvle t e s u n s t rin g q u e p u e d e d e s crib ir e l p ro p o s it o d e l s e rvle t , s u a u t o r, s u
n ú m e ro d e ve rs ió n , o a q u e llo q u e e l a u t o r d e l s e rvle t co n s id e re im p o rt a n t e .
El m é t o d o q u e d e vu e lve e s t a in fo rm a ció n e s g e t S e rv le t I n fo , q u e p o r d e fe ct o
d e vu e lve n u ll. No e s n e ce s a rio s o b re e s crib ir e s t e m é t o d o , p e ro la s a p lica cio n e s n o
p u e d e n s u m in is t ra r d e s crip ció n d e n u e s t ro s e rvle t a m e n o s q u e n o s o t ro s lo
ha ga m os.
El s ig u ie n t e e je m p lo m u e s t ra la d e s crip ció n d e Bo o kS t o re S e rvle t :

public class BookStoreServlet extends HttpServlet {


...
public String getServletInfo() {
return "The BookStore servlet returns the " +
"main web page for Duke's Bookstore.";
}
}

Oz it o
El Ciclo de Vida de un Servlet
Ca d a s e rvle t t ie n e e l m is m o ciclo d e vid a :
● Un s e rvid o r ca rg a e in icia liza e l s e rvle t .

● El s e rvle t m a n e ja ce ro o m á s p e t icio n e s d e clie n t e .

● El s e rvid o r e lim in a e l s e rvle t . ( Alg u n o s s e rvid o re s s ó lo cu m p le n e s t e p a s o


cu a n d o s e d e s co n e ct a n ) .

Inicializar un Servlet

Cu a n d o u n s e rvid o r ca rg a u n s e rvle t , e je cu t a e l m é t o d o in it d e l s e rvle t . La


in icia liza ció n s e co m p le t a a n t e s d e m a n e ja r p e t icio n e s d e clie n t e s y a n t e s d e q u e e l
s e rvle t s e a d e s t ru id o .
Au n q u e m u ch o s s e rvle t s s e e je cu t a n e n s e rvid o re s m u lt i- t h re a d , lo s s e rvle t s n o
t ie n e n p ro b le m a s d e co n cu rre n cia d u ra n t e s u in icia liza ció n . El s e rvid o r lla m a s ó lo
u n a ve z a l m é t o d o in it , cu a n d o ca rg a e l s e rvle t , y n o lo lla m a rá d e n u e vo a m e n o s
q u e vu e lva a re ca rg a r e l s e rvle t . El s e rvid o r n o p u e d e re ca rg a r u n s e rvle t s in
p rim e ro h a b e r d e s t ru id o e l s e rvle t lla m a n d o a l m é t o d o d e s t ro y .

Interactuar con Clientes

De s p u é s d e la in icia liza ció n , e l s e rvle t p u e d e m a n e ja r p e t icio n e s d e clie n t e s . Es t a


p a rt e d e l ciclo d e vid a d e u n s e rvle t s e p u d o ve r e n la s e cció n a n t e rio r.

Destruir un Servlet

Lo s s e rvle t s s e e je cu t a n h a s t a q u e e l s e rvid o r lo s d e s t ru ye , p o r e je m p lo , a p e t ició n


d e l a d m in is t ra d o r d e l s is t e m a . Cu a n d o u n s e rvid o r d e s t ru ye u n s e rvle t , e je cu t a e l
m é t o d o d e s t ro y d e l p ro p io s e rvle t . Es t e m é t o d o s ó lo s e e je cu t a u n a ve z. El
s e rvid o r n o e je cu t a rá d e n u e vo e l s e rvle t , h a s t a h a b e rlo ca rg a d o e in icia liza d o d e
n u e vo .
Mie n t ra s s e e je cu t a e l m é t o d o d e s t ro y , o t ro t h re a d p o d ría e s t á r e je cu t a n d o u n a
p e t ició n d e s e rvicio . La p á g in a Ma n e ja r Th re a d s d e S e rvicio a la Te rm in a ció n d e u n
Th re a d m u e s t ra co m o p ro p o rcio n a r lim p ie za cu a n d o t h re a d s d e la rg a e je cu ció n
p o d ría n e s t a r e je cu t a n d o p e t icio n e s d e s e rvicio .

Oz it o
Inicializar un Servlet
El m é t o d o in it p ro p o rcio n a d o p o r la cla s e Ht t p S e rv le t in icia liza e l s e rvle t y g ra b a la
in icia liza ció n . Pa ra h a ce r u n a in icia liza ció n e s p e cífica d e n u e s t ro s e rvle t , d e b e m o s
s o b re e s crib ir e l m é t o d o in it s ig u ie n d o e s t a s re g la s :
● S i o cu rre u n e rro r q u e h a g a q u e e l s e rvle t n o p u e d a m a n e ja r p e t icio n e s d e
clie n t e , la n za r u n a Un a v a ila b le Ex c e p t io n .
Un je m p lo d e e s t e t ip o d e e rro r e s la im p o s ib ilid a d d e e s t a b le ce r u n a co n e xió n
re q u e rid a .
● No lla m a r a l m é t o d o S y s t e m . e x it .
● Gu a rd a r e l p a rá m e t ro S e rv le t Co n fig p a ra q u e e l m é t o d o g e t S e rv le t Co n fig
p u e d a d e vo lve r s u va lo r.
La fo rm a m á s s e n cilla d e h a ce r e s t o e s h a ce r q u e e l n u e vo m é t o d o in it lla m e a
s u p e r. in it . S i g ra b a m o s e l o b je t o n o s o t ro s m is m o s , d e b e m o s s o b re e s crib ir e l
m é t o d o g e t S e rv le t Co n fig p a ra d e vo lve r e l o b je t o d e s d e s u n u e va p o s ició n .
Aq u í h a y u n e je m p lo d e l m é t o d o in it :

public class BookDBServlet ... {

private BookstoreDB books;

public void init(ServletConfig config) throws ServletException {

// Store the ServletConfig object and log the initialization


super.init(config);

// Load the database to prepare for requests


books = new BookstoreDB();
}
...
}
El m é t o d o in it e s b a s t a n t e s e n cillo : lla m a a l m é t o d o s u p e r. in it p a ra m a n e ja r e l
o b je t o S e rvle t Co n fig y g ra b a r la in icia liza ció n , y s e le ccio n a r u n ca m p o p riva d o .
S i e l Bo o kDBS e rvle t u t iliza rá u n a b a s e d e d a t o s re a l, e n ve z d e s im ila rla co n u n
o b je t o , e l m é t o d o in it s e ría m á s co m p le jo . Aq u í p u e d e s ve r e l p s e u d o - có d ig o d e co m o
p o d ría s e r e s e m é t o d o in it :

public class BookDBServlet ... {

public void init(ServletConfig config) throws ServletException {

// Store the ServletConfig object and log the initialization


super.init(config);
// Open a database connection to prepare for requests
try {
databaseUrl = getInitParameter("databaseUrl");
... // get user and password parameters the same way
connection = DriverManager.getConnection(databaseUrl,
user, password);
} catch(Exception e) {
throw new UnavailableException (this,
"Could not open a connection to the database");
}
}
...
}

Parámetros de Inicialización
Le s e g u n d a ve rs ió n d e l m é t o d o in it lla m a a l m é t o d o g e t I n it P a ra m e t e r. Es t e m é t o d o
t o m a e l n o m b re d e l p a rá m e t ro co m o a rg u m e n t o y d e vu e lve u n S t rin g q u e re p re s e n t a
s u va lo r.
( La e s p e cifica ció n d e p a rá m e t ro s d e in icia liza ció n e s e s p e cífica d e l s e rvid o r. Po r
e je m p lo , lo s p a rá m e t ro s s o n e s p e cífica d o s co m o u n a p ro p ie d a d cu a n d o u n s e rvle t s e
e je cu t a co n e l S e rvle t Ru n n e r. La p á g in a La Ut ilid a d s e rv le t ru n n e r co n t ie n e u n a
e xp lica ció n g e n e ra l d e la s p ro p ie d a d e s y có m o cre a rla s ) .
S i p o r a lg u n a ra zó n , n e ce s it a m o s o b t e n e r lo s n o m b re s d e lo s p a rá m e t ro s , p o d e m o s
u t iliza r e l m é t o d o g e t P a ra m e t e rN a m e s .

Oz it o
Destruir un Servlet
El m é t o d o d e s t ro y p ro p o rcio n a d o p o r la cla s e Ht t p S e rv le t d e s t ru ye e l s e rvle t y
g ra b a s u d e s t ru cció n . Pa ra d e s t ru ir cu a lq u ie r re cu rs o e s p e cífico d e n u e s t ro s e rvle t ,
d e b e m o s s o b re e s crib ir e l m é t o d o d e s t ro y . Es t e m é t o d o d e b e ría d e s h a ce r cu a lq u ie r
t ra b a jo d e in icia liza ció n y cu a lq u ie r e s t a d o d e p e rs is t e n cia s in cro n iza d o co n e l
e s t a d o d e m e m o ria a ct u a l.
El s ig u ie n t e e je m p lo m u e s t ra e l m é t o d o d e s t ro y q u e a co m p a ñ a e l m é t o d o in it d e
la p á g in a a n t e rio r:

public class BookDBServlet extends GenericServlet {

private BookstoreDB books;

... // the init method

public void destroy() {


// Allow the database to be garbage collected
books = null;
}
}
Un s e rvid o r lla m a a l m é t o d o d e s t ro y d e s p u é s d e q u e s e h a ya n co m p le t a d o t o d a s
la s lla m a d a s d e s e rvid o r, o e n u n s e rvid o r e s p e cífico h a ya n p a s a d o u n n ú m e ro d e
s e g u n d o s , lo q u e o cu rra p rim e ro . S i n u e s t ro s e rvle t m a n e ja r o p e ra cio n e s d e la rg a
e je cu ció n , lo s m é t o d o s s e rv ic e s e p o d ría n e s t a r e je cu t a n d o cu a n d o e l s e rvid o r
lla m e a l m é t o d o d e s t ro y . S o m o s re s p o n s a b le s d e a s e g u ra rn o s d e q u e t o d o s lo s
t h re a d s h a n t e rm in a d o . La p á g in a s ig u e in t e m u e s t ra có m o .

El m é t o d o d e s t ro y m o s t ra d o a rrib a e s p e ra a q u e t o d a s la s in t e ra ccio n e s d e clie n t e


s e h a ya n co m p le t a d o cu a n d o s e lla m a a l m é t o d o d e s t ro y , p o rq u e e l s e rvle t n o
t ie n e o p e ra cio n e s d e la rg a e je cu ció n .

Oz it o
Grabar el Estado del Cliente
El API S e rvle t p ro p o rcio n a d o s fo rm a s d e s e g u ir la p is t a a l e s t a d o d e u n clie n t e :

Seguimiento de Sesión

El s e g u im ie n t o d e s e s ió n e s u n m e ca n is m o q u e lo s s e rvle t s u t iliza n p a ra m a n t e n e r
e l e s t a d o s o b re la s e rie d e p e t icio n e s d e s d e u n m is m o u s u a rio ( e s t o e s , p e t icio n e s
o rig in a d a s d e s d e e l m is m o n a ve g a d o r) d u ra n t e a lg ú n p e rio d o d e t ie m p o , .

Cookies

La s Co o kie s s o n u n m e ca n is m o q u e e l s e rvle t u t iliza p a ra m a n t e n e r e n e l clie n t e


u n a p e q u e ñ a ca n t id a d d e in fo rm a ció n a s o cia d a co n e l u s u a rio . Lo s s e rvle t s p u e d e n
u t iliza r la in fo rm a ció n d e l co o kie co m o la s e n t ra d a s d e l u s u a rio e n la s it e ( co m o
u n a firm a d e s e g u rid a d d e b a jo n ive l, p o r e je m p lo ) , m ie n t ra s e l u s u a rio n a ve g a a
t a vé s d e la s it e ( o co m o e xp o s it o r d e la s p re fe re n cia s d e l u s u a rio , p o r e je m p lo ) o
am bas.

Oz it o
Seguimiento de Sesión
El s e g u im ie n t o d e s e s ió n e s u n m e ca n is m o q u e lo s s e rvle t s u t iliza n p a ra m a n t e n e r e l
e s t a d o s o b re la s e rie d e p e t icio n e s d e s d e u n m is m o u s u a rio ( e s t o e s , p e t icio n e s
o rig in a d a s d e s d e e l m is m o n a ve g a d o r) d u ra n t e u n p e rio d o d e t ie m p o .
La s s e s io n e s s o n co m p a rt id a s p o r lo s s e rvle t s a lo s q u e a cce d e e l clie n t e . Es t o e s
co n ve n ie n t e p a ra a p lica cio n e s co m p u e s t a s p o r va rio s s e rvle t s . Po r e je m p lo , D u k e 's
Bo o k s t o re u t iliza s e g u im ie n t o d e s e s ió n p a ra s e g u ir la p is t a d e lo s lib ro s p e d id o s p o r e l
u s u a rio . To d o s lo s s e rvle t s d e l e je m p lo t ie n e n a cce s o a la s e s ió n d e l u s u a rio .
Pa ra u t iliza r e l s e g u im ie n t o d e s e s ió n d e b e m o s :
● Ob t e n e r u n a s e s ió n ( u n o b je t o Ht t p S e s s io n ) p a ra u n u s u a rio .

● Alm a ce n a r u o b t e n e r d a t o s d e s d e e l o b je t o Ht t p S e s s io n .
● In va lid a r la s e s ió n ( o p cio n a l) .

Obtener una Sesión


El m é t o d o g e t S e s s io n d e l o b je t o Ht t p S e rv le t Re q u e s t d e vu e lve u n a s e s ió n d e u s u a rio .
Cu a n d o lla m a m o s a l m é t o d o co n s u a rg u m e n t o c re a t e co m o t ru e , la im p le m e n t a ció n
cre a rá u n a s e s ió n s i e s n e ce s a rio .
Pa ra m a n t e n e r la s e s ió n a p ro p ia d a m e n t e , d e b e m o s la m a r a g e t S e s s io n a n t e s d e e s crib ir
cu a lq u ie r re s p u e s t a . ( S i re s p o n d e m o s u t iliza n d o u n W rit e r, e n t o n ce s d e b e m o s lla m a r a
g e t S e s s io n a n t e s d e a cce d e r a l W rit e r, n o s ó lo a n t e s d e e n via r cu a lq u ie r re s p u e s t a ) .
El e je m p lo D u k e 's Bo o k s t o re u t iliza s e g u im ie n t o d e s e s ió n p a ra s e g u ir la p is t a d e lo s
lib ro s q u e h a y e n la h o ja d e p e d id o d e l u s u a rio . Aq u í t e n e m o s u n e je m p lo d e
Ca t a lo g S e rv le t o b t e n ie n d o u n a s e s ió n d e u s u a rio :

public class CatalogServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
// Get the user's session and shopping cart
HttpSession session = request.getSession(true);
...
out = response.getWriter();
...
}
}

Almacenar y Obtener Datos desde la Sesión


El In t e rfa ce Ht t p S e s s io n p ro p o rcio n a m é t o d o s q u e a lm a ce n a n y re cu p e ra n :
● Pro p ie d a d e s d e S e s ió n Es t á n d a rd , co m o u n id e n t ifica d o r d e s e s ió n .
● Da t o s d e la a p lica ció n , q u e s o n a lm a ce n a d o s co m o p a re ja s n o m b re - va lo r, d o n d e e l
n o m b re e s u n s t rin g y lo s va lo re s s o n o b je t o s d e l le n g u a je d e p ro g ra m a ció n Ja va .
Co m o va rio s s e rvle t s p u e d e n a cce d e r a la s e s ió n d e u s u a rio , d e b e re m o s a d o p t a r u n a
co n ve n ció n d e n o m b ra d o p a ra o rg a n iza r lo s n o m b re s co n lo s d a t o s d e la a p lica ció n .
Es t o e vit a rá q u e lo s s e rvle t s s o b re e s crib a n a ccid e n t a lm e n t e o t ro s va lo re s d e la
s e s ió n . Un a d e e s a s co n ve n cio n e s e s s e r v le t n a m e . n a m e d o n d e s e r v le t n a m e e s e l
n o m b re co m p le t o d e l s e rvle t , in clu ye n d o s u s p a q u e t e s . Po r e je m p lo ,
c o m . a c m e . W id g e t S e rv le t . s t a t e e s u n co o kie co n e l s e rv le t n a m e
c o m . a c m e . W id g e t S e rv le t y e l n a m e s t a t e .
El e je m p lo D u k e 's Bo o k s t o re u t iliza s e g u im ie n t o d e s e s ió n p a ra s e g u ir la p is t a d e lo s
lib ro s d e la h o ja d e p e d id o d e l u s u a rio . Aq u í h a y u n e je m p lo d e Ca t a lo g S e rv le t
o b t e n ie n d o u n id e n t ifica d o r d e s e s ió n d e u s u a rio , y o b t e n ie n d o y s e le ccio n a n d o d a t o s d e
la a p lica ció n a s o cia d a co n la s e s ió n d e u s u a rio :

public class CatalogServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
// Get the user's session and shopping cart
HttpSession session = request.getSession(true);
ShoppingCart cart =
(ShoppingCart)session.getValue(session.getId());

// If the user has no cart, create a new one


if (cart == null) {
cart = new ShoppingCart();
session.putValue(session.getId(), cart);
}
...
}
}
Co m o u n o b je t o p u e d e s e r a s o cia d o co n u n a s e s ió n , e l e je m p lo D u k e 's Bo o k s t o re s ig u e
la p is t a d e lo s lib ro s q u e e l u s u a rio h a p e d id o d e n t ro d e u n o b je t o . El t ip o d e l o b je t o e s
S h o p p in g Ca rt y ca d a lib ro q u e e l u s u a rio a s e le ccio n a d o e s a lm a ce n a d o e n la h o ja d e
p e d id o s co m o u n o b je t o S h o p p in g Ca rt I t e m . Po r e je m p lo , e l s ig u ie n t e có d ig o p ro ce d e
d e l m é t o d o d o Ge t d e Ca t a lo g S e rv le t :

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
HttpSession session = request.getSession(true);
ShoppingCart cart = (ShoppingCart)session.getValue(session.getId());
...
// Check for pending adds to the shopping cart
String bookId = request.getParameter("Buy");
//If the user wants to add a book, add it and print the result
String bookToAdd = request.getParameter("Buy");
if (bookToAdd != null) {
BookDetails book = database.getBookDetails(bookToAdd);

cart.add(bookToAdd, book);
out.println("<p><h3>" + ...);
}
}
Fin a lm e n t e , o b s e rva q u e u n a s e s ió n p u e d e s e r d e s ig n a d a co m o n u e v a . Un a s e s ió n n u e va
h a ce q u e e l m é t o d o is N e w d e la cla s e Ht t p S e s s io n d e vu e lva t ru e , in d ica n d o q u e , p o r
e je m p lo , e l clie n t e , t o d a vía n o s a b e n a d a d e la s e s ió n . Un a n u e va s e s ió n n o t ie n e d a t o s
a s o cia d o s .
Po d e m o s t ra t a r co n s it u a cio n e s q u e in vo lu cra n n u e va s s e s is o n e s . En e l e je m p lo Du ke 's
Bo o ks t o re , s i e l u s u a rio n o t ie n e h o ja d e p e d id o ( e l ú n ico d a t o a s o cia d o co n u n a s e s ió n ) ,
e l s e rvle t cre a u n a n u e va . Alt e rn a t iva m e n t e , s i n e ce s it a m o s in fo rm a ció n s o b re e l u s u a rio
a l in icia r u n a s e s ió n ( co m o e l n o m b re d e u s u a rio ) , p o d ría m o s q u e re r re d ire ccio n a r a l
u s u a rio a u n "p á g in a d e e n t ra d a " d o n d e re co le ct a m o s la in fo rm a ció n n e ce s a ria .

Invalidar la Sesión
Un a s e s ió n d e u s u a rio p u e d e s e r in va lid a d a m a n u a l o a u t o m á t ica m e n t e , d e p e n d ie n d o d e
d o n d e s e e s t é e je cu t a n d o e l s e rvle t . ( Po r e je m p lo , e l Ja va We b S e rve r, in va lid a u n a
s e s ió n cu a n d o n o h a y p e t icio n e s d e p á g in a p o r u n p e rio d o d e t ie m p o , u n o s 3 0 m in u t o s
p o r d e fe ct o ) . In va lid a r u n a s e s ió n s ig n ifica e lim in a r e l o b je t o Ht t p S e s s io n y t o d o s s u s
va lo re s d e l s is t e m a .
Pa ra in va lid a r m a n u a lm e n t e u n a s e s ió n , s e u t iliza e l m é t o d o in v a lid a t e d e "s e s s io n ".
Alg u n a s a p lica cio n e s t ie n e n u n p u n t o n a t u ra l e n e l q u e in va lid a r la s e s ió n . El e je m p lo
D u k e 's Bo o k s t o re in va lid a u n a s e s ió n d e u s u a rio d e s p u é s d e q u e e l u s u a rio h a ya
co m p ra d o lo s lib ro s . Es t o s u ce d e e n e l Re c e ip t S e rv le t :

public class ReceiptServlet extends HttpServlet {

public void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {

...
scart = (ShoppingCart)session.getValue(session.getId());
...
// Clear out shopping cart by invalidating the session
session.invalidate();

// set content type header before accessing the Writer


response.setContentType("text/html");
out = response.getWriter();
...
}
}

Manejar todos los Navegadores


Po r d e fe ct o , e l s e g u im ie n t o d e s e s ió n u t iliza co o kie s p a ra a s o cia r u n id e n t ifica d o r d e
s e s ió n co n u n u s u a rio . Pa ra s o p o rt a r t a m b ié n a lo s u s u a rio s q u e a cce d e n a l s e rvle t co n u n
n a ve g a d o r q u e n o s o p o rt a co o kie s , o s i e s t e e s t á p ro g ra m a d o p a ra n o a ce p t a rla s .
d e b e m o s u t iliza r re e s crit u ra d e URL e n s u lu g a r.
Cu a n d o s e u t iliza la re e s crit u ra d e URL s e lla m a a lo s m é t o d o s q u e , cu a n d o e s n e ce s a rio ,
in clu ye n e l ID d e s e s ió n e n u n e n la ce . De b e m o s lla m a r a e s o s m é t o d o s p o r ca d a e n la ce
e n la re s p u e s t a d e l s e rvle t .
El m é t o d o q u e a s o cia u n ID d e s e s ió n co n u n a URL e s
Ht t p S e rv le t Re s p o n s e . e n c o d e Url. S i re d ire cio n a m o s a l u s u a rio a o t ra p á g in a , e l
m é t o d o p a ra a s o cia r e l ID d e s e s ió n co n la URL re d ire cio n a d a s e lla m a
Ht t p S e rv le t Re s p o n s e . e n c o d e Re d ire c t Url.
Lo s m é t o d o s e n c o d e Url y e n c o d e Re d ire c t Url d e cid e n s i la s URL n e ce s it a n s e r
re e s crit a s , y d e vo lve r la URL ca m b ia d a o s in ca m b ia r. ( La s re g la s p a ra la s URLs y la s
URLs re d ire ccio n a d a s s o n d ife re n t e s , p e ro e n g e n e ra l s i e l s e rvid o r d e t e ct a q u e e l
n a ve g a d o r s o p o rt a co o kie s , e n t o n ce s la URL n o s e re e s crib irá ) .
El e je m p lo D u k e 's Bo o k s t o re u t iliza re e s crit u ra d e URL p a ra t o d o s lo s e n la ce s q u e
d e vu e lve a s u s u s u a rio s . Po r e je m p lo , e l Ca t a lo g S e rv le t d e vu e lve u n ca t a lo g o co n d o s
e n la ce s p a ra ca d a lib ro . Un e n la ce o fre ce d e t a lle s s o b re e l lib ro y e l o t ro o fre ce a l u s u a rio
a ñ a d ir e l lib ro a s u h o ja d e p e d id o s . Am b a s URLs s o n re e s crit a s :

public class CatalogServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
// Get the user's session and shopping cart, the Writer, etc.
...
// then write the data of the response
out.println("<html>" + ...);
...
// Get the catalog and send it, nicely formatted
BookDetails[] books = database.getBooksSortedByTitle();
...
for(int i=0; i < numBooks; i++) {
...
//Print out info on each book in its own two rows
out.println("<tr>" + ...

"<a href=\"" +
response.encodeUrl("/servlet/bookdetails?bookId=" +
bookId) +
"\"> <strong>" + books[i].getTitle() +
" </strong></a></td>" + ...

"<a href=\"" +
response.encodeUrl("/servlet/catalog?Buy=" + bookId)
+ "\"> Add to Cart </a></td></tr>" +

}
}
}
S i e l u s u a rio p u ls a s o b re u n e n la ce co n u n a URL re - e s crit a , e l s e rvle t re co n o ce y e xt ra e e l
ID d e s e s ió n . Lu e g o e l m é t o d o g e t S e s s io n u t iliza e l ID d e s e s ió n p a ra o b t e n e r e l o b je t o
Ht t p S e s s io n d e l u s u a rio .
Po r o t ro la d o , s i e l n a ve g a d o r d e l u s u a rio n o s o p o rt a co o kie s y e l u s u a rio p u ls a s o b re u n a
URL n o re - e s crit a . S e p ie rd e la s e s ió n d e u s u a rio . El s e rvle t co n t a ct a d o a t ra vé s d e e s e
e n la ce cre a u n a n u e va s e s ió n , p e ro la n u e va s e s ió n n o t ie n e d a t o s a s o cia d o s co n la s e s ió n
a n t e rio r. Un a ve z q u e u n s e rvle t p ie rd e lo s d a t o s d e u n a s e s ió n , lo s d a t o s s e p ie rd e n p a ra
t o d o s lo s s e rvle t s q u e co m p a rt e n la s e s ió n . De b e m o s u t iliza r la re - e s crit u ra d e URLs
co n s is t e n t e m e n t e p a ra q u e n u e s t ro s e rvle t s o p o rt e clie n t e s q u e n o s o p o rt a n o a ce p t a n
co o kie s .

Oz it o
Utilizar Cookies
La s Co o kie s s o n u n a fo rm a p a ra q u e u n s e rvid o r ( o u n s e rvle t , co m o p a rt e d e u n
s e rvid o r) e n víe in fo rm a ció n a l clie n t e p a ra a lm a ce n a rla , y p a ra q u e e l s e rvid o r p u e d a
p o s t e rio rm e n t e re cu p e ra r e s o s d a t o s d e s d e e l clie n t e . Lo s s e rvle t e n vía n co o kie s a l
clie n t e a ñ a d ie n d o ca m p o s a la s ca b e ce ra s d e re s p u e s t a HTTP. Lo s clie n t e s d e vu e lve n la s
co o kie s a u t o m á t ica m e n t e a ñ a d ie n d o ca m p o s a la s ca b e ce ra s d e p e t icio n e s HTTP.
Ca d a ca b e ce ra d e p e t ició n o re s p u e s t a HTTP e s n o m b ra d a co m o u n s ó lo va lo r. Po r
e je m p lo , u n a co o kie p o d ría t e n e r u n n o m b re d e ca b e ce ra Bo o k To Bu y co n u n va lo r
3 0 4 q t y 1 , in d ica n d o a la a p lica ció n lla m a n t e q u e e l u s u a rio q u ie re co m p ra r u n a co p ia d e l
lib ro co n e l n ú m e ro 3 0 4 e n e l in ve n t a rio . ( La s co o kie s y s u s va lo re s s o n e s p e cífico s d e la
a p lica ció n ) .
Va ria s co o kie s p u e d e n t e n e r e l m is m o n o m b re . Po r e je m p lo , u n s e rvle t p o d ría e n via r d o s
ca b e ce ra s lla m a d a s Bo o k To Bu y ; u n a p o d ría t e n e r e l va lo r a n t e rio r, 3 0 4 q t y 1 , m ie n t ra s
q u e la o t ra p o d ría t e n e r e l va lo r 3 0 1 q t y 3 . Es t a s co o kie s p o d ría n in d ica r q u e e l u s u a rio
q u ie re co m p ra r u n a co p ia d e l lib ro co n e l n ú m e ro 3 0 4 e n e l in ve n t a rio y t re s co p ia s d e l
lib ro co n e l n ú m e ro 3 0 1 d e l in ve n t a rio .
Ad e m á s d e u n n o m b re y u n va lo r, t a m b ié n s e p u e d e n p ro p o rcio n a r a t rib u t o s o p cio n a le s
co m o co m e n t a rio s . Lo s n a ve g a d o re s a ct u a le s n o s ie m p re t ra t a n co rre ct a m e n t e a lo s
a t rib u t o s o p cio n a le s , p o r e s o t e n cu id a d o co n e llo s .
Un s e rvid o r p u e d e p ro p o rcio n a r u n a o m á s co o kie s a u n clie n t e . El s o ft wa re d e l clie n t e ,
co m o u n n a ve g a d o r, s e e s p e ra q u e p u e d a s o p o rt a r ve in t e co o kie s p o r h o s t d e a l m e n o s
4 kb ca d a u n a .
Cu a n d o s e e n vía u n a co o kie a l clie n t e , e l e s t á n d a rd HTTP/ 1 . 0 ca p t u ra la p á g in a q u e n o
e s t á e n la ca ch é . Act u a lm e n t e , e l ja v a x . s e rv le t . h t t p . Co o k ie n o s o p o rt a lo s co n t ro le s
d e ca ch é d e l HTTP/ 1 . 1 .
La s co o kie s q u e u n clie n t e a lm a ce n a p a ra u n s e rvid o r s ó lo p u e d e n s e r d e vu e lt a s a e s e
m is m o s e rvid o r. Un s e rvid o r p u e d e co n t e n e r m ú lt ip le s s e rvle t s ; e l e je m p lo D u k e 's
Bo o k s t o re e s t á co m p u e s t o p o r va rio s s e rvle t s e je cu t á n d o s e e n u n s ó lo s e rvid o r. Co m o
la s co o kie s s o n d e vu e lt a s a l s e rv id o r, lo s s e rvle t s q u e s e e je cu t a n d e n t ro d e u n s e rvid o r
co m p a rt e n la s co o kie s . Lo s e je m p lo s d e e s t a p á g in a ilu s t ra n e s t o m o s t ra n d o co m o lo s
s e rvle t s Ca t a lo g S e rv le t y S h o w Ca rt t ra b a ja n co n lo s m is m o s co o kie s .

N o t a : Es t a p á g in a t ie n e có d ig o q u e n o fo rm a p a rt e d e l e je m p lo D u k e 's
Bo o k s t o re . D u k e 's Bo o k s t o re u t iliza ría có d ig o co m o e l d e e s t a p á g in a s i
u t iliza rá co o kie s e n ve z d e s e g u im ie n t o d e s e s ió n p a ra lo s p e d id o s d e lo s
clie n t e s . Có m o la s co o kie s n o fo rm a n p a rt e d e D u k e 's Bo o k s t o re , p ie n s a e n
lo s e je m p lo s d e e s t a p á g in a co m o p s e u d o - có d ig o .

Pa ra e n via r u n a co o kie :
1 . Eje m p la riza u n o b je t o Co o k ie .
2 . S e le ccio n a cu a lq u ie r a t rib u t o .
3 . En via e l co o kie
Pa ra o b t e n e r in fo rm a ció n d e u n co o kie :
1 . Re cu p e ra t o d o s lo s co o kie s d e la p e t ició n d e l u s u a rio .
2 . Bu s ca e l co o kie o co o kie s co n e l n o m b re q u e t e in t e re s a , u t iliza la s t é cn ica s d e
p ro g ra m a ció n e s t á n d a rd .
3 . Ob t é n lo s b a lo re s d e la s co o kie s q u e h a ya s e n co n t ra d o .

Crear un Cookie
El co n s t ru ct o r d e la cla s e ja v a x . s e rv le t . h t t p . Co o k ie cre a u n co o kie co n u n n o m b re
in icia l y u n va lo r. S e p u e d e ca m b ia r e l va lo r p o s t e rio rm e n t e u t iliza n d o e l m é t o d o
s e t Va lu e .
El n o m b re d e l co o kie d e b e s e r u n t o k e n HTTP/ 1 . 1 . Lo s t o ke n s s o n s t rin g s q u e co n t ie n e n
u n o d e lo s ca ra ct e re s e s p e cia le s lie s t a d o s e n RFC 2 0 6 8 . ( S t rin g s a lfa n u m é rico s
cu a lifica d o s co m o t o ke n s . ) Ad e m á s , lo s n o m b re s q u e e m p ie za n co n e l ca rá ct e r d o lla r
( "$ ") e s t á n re s e rva d o s p o r RFC 2 1 0 9 .

El va lo r d e l co o kie p u e d e s e r cu a lq u ie r s t rin g , a u n q u e n o e s t á g a ra n t iza d o q u e lo s


va lo re s n u ll fu n cio n e n e n t o d o s lo s n a ve g a d o re s . Ad e m á s , s i e n via m o s u n a co o kie q u e
cu m p la co n la s e s p e cifica cio n e s o rig in a le s d e la s co o kie s d e Ne t s ca p e , n o s e d e b e n
u t iliza r ca rá ct e re s b la n co s n i n in g u n o d e e s t o s ca ra ct e re s :
[ ] ( ) = , "" / ? @ : ;
S i n u e s t ro s e rvle t d e vu e lve u n a re s p u e s t a a l u s u a rio co n u n W rit e r, d e b e m o s cre a r la
co o kie a n t e s d e a cce d e r a W rit e r. ( Po rq u e la s co o kie s s e e n vía n a l clie n t e co m o u n a
ca b e ce ra , y la s ca b e ce ra s d e b e n e s crib irs e a n t e s d e a cce d e r a l W rit e r. )
S i e l Ca t a lo g S e rv le t u t iliza rá co o kie s p a ra s e g u ir la p is t a d e u n a h o ja d e p e d id o , e l
s e rvle t p o d ría cre a r la s co o kie s d e e s t a fo rm a :

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
BookDBServlet database = (BookDBServlet)
getServletConfig().getServletContext().getServlet("bookdb");

// Check for pending adds to the shopping cart


String bookId = request.getParameter("Buy");

//If the user wants to add a book, remember it by adding a cookie


if (bookId != null) {
Cookie getBook = new Cookie("Buy", bookId);
...
}

// set content-type header before accessing the Writer


response.setContentType("text/html");
// now get the writer and write the data of the response
PrintWriter out = response.getWriter();
out.println("<html>" +
"<head><title> Book Catalog </title></head>" + ...);
...
}

Seleccionar los Atributos de un Cookie


La cla s e Co o k ie p ro p o rcio n a va rio s m é t o d o s p a ra s e le ccio n a r lo s va lo re s d e l co o kie y
s u s a t rib u t o s . La u t iliza ció n d e e s t o s m é t o d o s e s co rre ct a , e s t á n e xp lica d o s e n e l ja va d o c
p a ra la cla s e Co o k ie .
El s ig u ie n t e e je m p lo s e le ccio n a e l ca m p o co m m e n t d e l co o kie Ca t a lo g S e rv le t . Es t e
ca m p o d e s crib e e l p ro p ó s it o d e l co o kie .

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
//If the user wants to add a book, remember it by adding a cookie
if (values != null) {
bookId = values[0];
Cookie getBook = new Cookie("Buy", bookId);
getBook.setComment("User wants to buy this book " +
"from the bookstore.");
}
...
}
Ta m b ié n s e p u e d e s e le ccio n a r la ca d u cid a d d e l co o kie . Es t e a t rib u t o e s ú t il, p o r e je m p lo ,
p a ra b o rra r u n co o kie . De n u e vo , s i D u k e 's Bo o k s t o re u t iliza rá co o kie s p a ra s u h o ja d e
p e d id o s , e l e je m p lo p o d ría u t iliza r e s t e a t rib u t o p a ra b o rra r u n lib ro d e la h o ja d e
p e d id o . El u s u a rio b o rra u n lib ro d e la h o ja d e p e d id o s e n e l S h o w Ca rt S e rv le t ; s u
có d ig o s e p o d ría p a re ce r a e s t o :

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
/* Handle any pending deletes from the shopping cart */
String bookId = request.getParameter("Remove");
...
if (bookId != null) {
// Find the cookie that pertains to the book to remove
...
// Delete the cookie by setting its maximum age to zero
thisCookie.setMaxAge(0);
...
}

// also set content type header before accessing the Writer


response.setContentType("text/html");
PrintWriter out = response.getWriter();

//Print out the response


out.println("<html> <head>" +
"<title>Your Shopping Cart</title>" + ...);

Enviar Cookies
La s co o kie s s e e n vía n co m o ca b e ce ra s e n la re s p u e s t a a l clie n t e , s e a ñ a d e n co n e l
m é t o d o a d d Co o k ie d e la cla s e Ht t p S e rv le t Re s p o n s e . S i e s t a m o s u t iliza n d o u n W rit e r
p a ra d e vo lve r t e xt o , d e b e m o s lla m a r a a d d Co o k ie a n t e s d e lla m a r a l m é t o d o
g e t W rit e r d e Ht t p S e rv le t Re s p o n s e .
Co n t in u a n d o co n e l e je m p lo d e Ca t a lo g S e rv le t , a q u í e s t á e l có d ig o p a ra e n via r la
co o kie :

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
//If the user wants to add a book, remember it by adding a cookie
if (values != null) {
bookId = values[0];
Cookie getBook = new Cookie("Buy", bookId);
getBook.setComment("User has indicated a desire " +
"to buy this book from the bookstore.");
response.addCookie(getBook);
}
...
}

Recuperar Cookies
Lo s clie n t e s d e vu e lve n la s co o kie s co m o ca m p o s a ñ a d id o s a la s ca b e ce ra s d e p e t ició n
HTTP. Pa ra re cu p e ra r u n a co o kie , d e b e m o s re cu p e ra r t o d a s la s co o kie s u t iliza n d o e l
m é t o d o g e t Co o k ie s d e la cla s e Ht t p S e rv le t Re q u e s t .
El m é t o d o g e t Co o k ie s d e vu e lve u n a rra y d e o b je t o s Co o k ie , e n e l q u e p o d e m o s b u s ca r
la co o kie o co o kie s q u e q u e rra m o s . ( Re cu e rd a q u e d is t in t a s co o kie s p u e d e n t e n e r e l
m is m o n o m b re , p a ra o b t e n e r e l n o m b re d e u n a co o kie , u t iliza s u m é t o d o g e t N a m e . )
Pa ra co n t in u a r co n e l e je m p lo S h o w Ca rt S e rv le t :

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...

/* Handle any pending deletes from the shopping cart */


String bookId = request.getParameter("Remove");
...
if (bookId != null) {

// Find the cookie that pertains to the book to remove


Cookie[] cookies = request.getCookies();
...

// Delete the book's cookie by setting its maximum age to zero


thisCookie.setMaxAge(0);
}

// also set content type header before accessing the Writer


response.setContentType("text/html");
PrintWriter out = response.getWriter();

//Print out the response


out.println("<html> <head>" +
"<title>Your Shopping Cart</title>" + ...);

Obtener el valor de una Cookie


Pa ra o b t e n e r e l va lo r d e u n a co o kie , s e u t iliza e l m é t o d o g e t Va lu e .

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
/* Handle any pending deletes from the shopping cart */
String bookId = request.getParameter("Remove");
...
if (bookId != null) {
// Find the cookie that pertains to that book
Cookie[] cookies = request.getCookies();
for(i=0; i < cookies.length; i++) {
Cookie thisCookie = cookie[i];
if (thisCookie.getName().equals("Buy") &&
thisCookie.getValue().equals(bookId)) {
// Delete the cookie by setting its maximum age to zero
thisCookie.setMaxAge(0);
}
}
}

// also set content type header before accessing the Writer


response.setContentType("text/html");
PrintWriter out = response.getWriter();

//Print out the response


out.println("<html> <head>" +
"<title>Your Shopping Cart</title>" + ...);

Oz it o
La utilidad servletrunner
Un a ve z q u e h e m o s e s crit o e l s e rvle t , p o d e m o s p ro b a rlo e n la u t ilid a d
s e rv le t ru n n e r
El s e rv le t ru n n e r e s u n p e q u e ñ o , p ro ce s o m u lt i- t h re a d q u e m a n e ja p e t icio n e s d e
s e rvle t s . Co m o s e rv le t ru n n e r e s m u lt i- t h re a d , p u e d e u t iliza rs e p a ra e je cu t a r
va rio s s e rvle t s s im u lt á n e a m e n t e , o p a ra p ro b a r u n s e rvle t q u e lla m a a o t ro s
s e rvle t s p a ra s a t is fa ce r la s p e t icio n e s d e clie n t e s .
Al co n t ra rio q u e a lg u n o s n a ve g a d o re s , s e rv le t ru n n e r n o re ca rg a a u t o m á t ica m e n t e
lo s s e rvle t s a ct u a liza d o s . S in e m b a rg o , p o d e m o s p a ra r y re n icia r s e rv le t ru n n e r
co n u n a p e q u e ñ a s o b re ca rg a d e a p ila p a ra e je cu t a r u n a n u e va ve rs ió n d e u n
s e rvle t .

Seleccionar las Propiedades de un Servlet

Po d ría m o s t e n e r q u e e s p e cifica r a lg u n o s d a t o s p a ra e je cu t a r u n s e rvle t . Po r


e je m p lo , s i u n s e rvle t n e ce s it a p a rá m e t ro s d e in icia liza ció n , d e b e m o s co n fig u ra r
e s t o s d a t o s a n t e s d e a rra n ca r s e rv le t ru n n e r.

Arrancar servletrunner

De s p u é s d e co n fig u ra r e l fich e ro d e p ro p ie d a d e s , p o d e m o s e je cu t a r la u t ilid a d


s e rv le t ru n n e r. Es t a p á g in a e xp lica có m o .

Oz it o
Seleccionar Propiedades de un Servlet
La s p ro p ie d a d e s s o n p a re ja s d e cla ve - va lo r u t iliza d a s p a ra la co n fig u ra ció n , cre a ció n e
in cia liza ció n d e u n s e rvle t . Po r e je m p lo , s e rv le t . c a t a lo g . c o d e = Ca t a lo g S e rv le t e s
u n a p ro p ie d a d cu ya cla ve e s s e rv le t . c a t a lo g . c o d e y cu yo va lo r e s Ca t a lo g S e rv le t .
La u t ilid a d s e rv le t ru n n e r t ie n e d o s p ro p ie d a d e s p a ra lo s s e rvle t s :
● s e rv le t . n o m b r e . c o d e

● s e rv le t . n o m b r e . in it a rg s

La propiedad code
El va lo r d e la p ro p ie d a d s e rv le t . n o m b r e . c o d e e s e l n o m b re co m p le t o d e la cla s e d e l
s e rvle t , in clu id o s u p a q u e t e . Po r e je m p lo :

servlet.bookdb.code=database.BookDBServlet
La p ro p ie d a d s e rv le t . n o m b r e . c o d e lla m a a n u e s t ro s e rvle t a s o cia n d o u n n o m b re ( e n
e l e je m p lo , b o o k d b ) co n u n a cla s e ( e n e l e je m p lo , d a t a b a s e . Bo o k D BS e rv le t ) .

La propiedad initargs
El va lo r d e la p ro p ie d a d s e rv le t . n o m b r e . in it Arg s co n t ie n e lo s p a rá m e t ro s d e
in icia liza ció n d e l s e rvle t . La s ín t a xis d e e s t e p a rá m e t ro e s
p a r a m e t e r N a m e = p a r a m e t e r Va lu e . La p ro p ie d a d co m p le t a ( la p a re ja co m p le t a
cla ve - va lo r) d e b e s e r u n a s ó la lín e a ló g ica . Pa ra m e jo ra r la le ct u ra , s e p u e d e u t iliza r la
b a rra in ve rt id a p a ra d ivid ir la lín e a ló g ica e n va ria s lín e a s d e t e xt o . Po r e je m p lo , s i e l
s e rvle t d a t a b a s e le ye ra d a t o s d e s d e u n fich e ro , e l a rg u m e n t o in icia l d e l s e rvle t p o d ría
p a re ce rs e a e s t o :

servlet.bookdb.initArgs=\
dbfile=servlets/DatabaseData
Lo s p a rá m e t ro s d e in icia liza ció n m ú lt ip le s s e e s p e cifica n s e p a ra d o s p o r co m a s . Po r
e je m p lo , s i e l s e rvle t d a t a b a s e s e co n e ct a rá a u n a b a s e d e d a t o s re a l, s u s a rg u m e n t o s
in icia le s p o d ría n p a re ce rs e a e s t o :

servlet.bookdb.initArgs=\
user=duke,\
password=dukes_password,\
url=fill_in_the_database_url

El fichero de Propiedades
La s p ro p ie d a d e s s e a lm a ce n a n e n u n fich e ro d e t e xt o co n u n n o m b re p o r d e fe ct o d e
s e rv le t . p ro p e rt ie s . ( S e p u e d e e s p e cifica r o t ro n o m b re cu a n d o s e a rra n ca
s e rv le t ru n n e r. ) El fich e ro g u a rd a la s p ro p ie d a d e s p a ra t o d o s lo s s e rvle t s q u e s e
e je cu t e n e n e l s e rv le t ru n n e r. Aq u í p u e d e s ve r e l fich e ro d e p ro p ie d a d e s p a ra e l
e je m p lo Du ke 's Bo o ks t o re :

# This file contains the properties for the Duke's Bookstore servlets.

# Duke's Book Store -- main page


servlet.bookstore.code=BookStoreServlet

# The servlet that manages the database of books


servlet.bookdb.code=database.BookDBServlet

# View all the books in the bookstore


servlet.catalog.code=CatalogServlet

# Show information about a specific book


servlet.bookdetails.code=BookDetailServlet

# See the books that you've chosen to buy


servlet.showcart.code=ShowCartServlet

# Collects information for buying the chosen books


servlet.cashier.code=CashierServlet

# Provide a receipt to the user who's bought books


servlet.receipt.code=ReceiptServlet

Oz it o
Arrancar servletrunner
El s e rv le t ru n n e r e s t á e n e l d ire ct o rio < js d k > / b in . S e p o d rá e je cu t a r m á s
fa cilm e n t e s i lo p o n e m o s e n e l p a t h . Po r e je m p lo :

% setenv PATH /usr/local/jsdk/bin: (para UNIX)

C> set PATH=C:\jsdk\bin;%PATH% (para Win32)


Lla m a r a s e rv le t ru n n e r co n la o p ció n - h e lp m u e s t ra u n a a yu d a s in e je cu t a rlo :

% servletrunner -help
Usage: servletrunner [options]
Options:
-p port the port number to listen on
-b backlog the listen backlog
-m max maximum number of connection handlers
-t timeout connection timeout in milliseconds
-d dir servlet directory
-r root document root directory
-s filename servlet property file name
-v verbose output
%
Pa ra ve r lo s va lo re s p o r d e fe ct o d e e s t a s o p cio n e s , p o d e m o s lla m a r a
s e rv le t ru n n e r co n la o p ció n - v . Es t o a rra n ca la u t ilid a d , s e d e b e p a ra r
in m e d ia t a m e n t e s i u n a ve z o b t e n id a la in fo rm a ció n n o e s t a m o s lis t o s p a ra
e je cu t a rlo . o s i q u e re m o s e je cu t a r a lg o d is t in t o d e lo s va lo re s p o r d e fe ct o . Po r
e je m p lo , e n Un ix, u t iliza n d o e l co m a n d o k ill p a ra p a ra r s e rv le t ru n n e r.

% servletrunner -v
Server settings:
port = 8080
backlog = 50
max handlers = 100
timeout = 5000
servlet dir = ./examples
document dir = ./examples
servlet propfile = ./examples/servlet.properties

N o t a : En lo s va lo re s p o r d e fe ct o m o s t ra d o s a rrib a . s e rv le t d ir,
d o c u m e n t d ir y e l d ire ct o rio s e rv le t p ro p file co n t ie n e n u n p u n t o ( ". ") .
El p u n t o d e s ig n a e l d ire ct o rio d e t ra b a jo a ct u a l. No rm a lm e n t e e s t e
d ire ct o rio e s d e s d e d o n d e s e a rra n ca e l e je cu t a b le . S in e m b a rg o , e n e s t e
ca s o , e l p u n t o s e re fie re a l d ire ct o rio d o n d e e s t á in s t a la d o e l "s e rvle t
d e ve lo p m e n t kit ".
S i a rra n ca m o s s e rv le t ru n n e r d e s d e u n d ire ct o rio d is t in t o a l d e
in s t a la ció n , s e rv le t ru n n e r p rim e ro ca m b ia s u d ire ct o rio d e t ra b a jo ( y,
p o r lo t a n t o , lo q u e p o d ría s p e n s a r co m o e l va lo r d e ". ") .

Un a ve z q u e s e rv le t ru n n e r e s t á e n e je cu ció n , p o d e m o s u t iliza rlo p a ra p ro b ra r


n u e s t ro s s e rvle t s .

Oz it o
Ejecutar Servlets
Es t a le cció n m u e s t ra u n a s cu a n t a s fo rm a s d e lla m a r a lo s s e rvle t s :

Tecleando la URL del servlet en un Navegador Web

Lo s s e rvle t s p u e d e n s e r lla m a d o s d ire ct a m e n t e t e cle a n d o s u URL e n u n n a ve g a d o r


We b . As í e s co m o s e a cce d e a la p á g in a p rin cip a l d e l e je m p lo D u k e 's Bo o k s t o re .
Es t a p á g in a m u e s t ra la fo rm a g e n e ra l d e la URL d e u n s e rvle t .

Llamar a un Servlet desde dentro de una página HTML

La s URLs d e lo s s e rvle t s p u e d e n u t iliza rs e e n e t iq u e t a s HTML, d o n d e s e p o d ría


e n co n t ra r u n a URL d e u n s crip t CGI- b in o u n a URL d e fich e ro . Es t a p á g in a m u e s t ra
co m o u t iliza r la URL d e u n s e rvle t co m o d e s t in o d e u n e n la ce , co m o la a cció n d e u n
fo rm u la rio , y co m o la lo ca liza ció n a u t iliza r cu a n d o META t a g d ice q u e la p á g in a s e a
re fre s ca d a . Es t a s e cció n a s u m e co n o cim ie n t o s d e HTML.

Desde otro servlet

Lo s S e rvle t s p u e d e n lla m a r a o t ro s s e rvle t s . S i lo s d o s s e rvle t s e s t á n e n d is t in t o


s e rvid o r, u n o p u e d e h a ce r p e t icio n e s HTTP a l o t ro . S i lo s d o s s e e je cu t a n e n e l
m is m o s e rvid o r, e n t o n ce s u n s e rvle t p u e d e lla m a r a lo s m é t o d o s p ú b lico s d e l o t ro
d ire ct a m e n t e .
Es t a s p á g in a s a s u m e n q u e :
● Nu e s t ra m á q u in a , lo c a lh o s t , e s t á e je cu t a n d o s e rvle t ru n n e r o u n s e rvid o r co n
s o p o rt e p a ra s e rve t s , co m o Ja va We b S e rve r e n e l p u e rt o 8 0 8 0 .
● El e je m p lo , D u k e 's Bo o k s t o re , e s t á lo ca liza d o e n e l n ive l s u p e rio r d e l
d ire ct o rio d e p ro ce s o s p a ra lo s s e rve rls . Pa ra s e rv le t ru n n e r, e s t o s ig n ifica
q u e lo s fich e ro s cla s s e s t á n e n e l d ire ct o rio s e rvle t e s p e cifica d o p o r la o p ció n
-d.
S i e s t a s d o s co n d icio n e s s e cu m p le m , p o d re m o s e je cu t a r e l s e rvle t d e e je m p lo
t e cle a n d o la s URLs d a d a s e n e l e je m p lo .

Oz it o
Llamar a Servlets desde un Navegador
La URL d e u n s e rvle t t ie n e la s ig u ie n t e fo rm a g e n e ra l, d o n d e n o m b re - s e rv le t
co rre s p o n d e a l n o m b re q u e le h e m o s d a d o a n u e s t ro s e rvle t :

http://nombre-de-máquina:puerto/servlet/nombre-servlet
Po r e je m p lo , e l s e rvle t q u e la n za la p á g in a p rin cip a l d e D u k e 's Bo o k s t o re t ie n e la
p ro p ie d a d s e rv le t . b o o k s t o re . c o d e = Bo o k S t o re S e rv le t . Pa ra ve r la p á g in a
p rin cip a l, t e cle a re m o s e s t a URL e n n u e s t ro n a ve g a d o r:

http://localhost:8080/servlet/bookstore
La s URLs d e s e rvle t s p u e d e n co n t e n e r p re g u n t a s , co m o la s p e t icio n e s GET d e
HTTP. Po r e je m p lo , e l s e rvle t q u e s irve lo s d e t a lle s s o b re u n lib ro p a rt icu la r t o m a e l
n ú m e ro d e in ve n t a rio d e l lib ro co m o p re g u n t a . El n o m b re d e l s e rvle t e s
b o o k d e t a ils ; la URL d e l s e rvle t p a ra o b t e n e r ( GET) y m o s t ra r t o d a la in fo rm a ció n
s o b re la s ca ra ct e rís it ca s d e u n lib ro :

http://localhost:8080/servlet/bookdetails?bookId=203

Oz it o
Llamar a Servlets desde una Página HTML
Pa ra in vo ca r u n s e rvle t d e s d e d e n t ro d e u n a p á g in a HTML s e u t iliza la URL d e l s e rvle t
e n la e t iq u e t a HTML a p ro p ia d a .
Es t a p á g in a u t iliza lo s s e rvle s S h o w Ca rt , Ca s h ie r, y Re c e ip t d e D u k e 's Bo o k s t o re .
Afo rt u n a d a m e n t e e s t e e s e l o rd e n e n q u e s e ve rá n lo s s e rvle t s cu a n d o m ire m o s
n u e s t ra h o ja y co m p re m o s n u e s t ro s lib ro s .
Pa ra u n a cce s o m á s d ire ct o a l s e rvle t S h o wCa rt s e rvle t , p u ls a e l e n la ce S h o w Ca rt q u e
h a y e n la p á g in a p rin cip a l d e l D u k e 's Bo o k s t o re . S i t e n e m o s s e rv le t ru n n e r o u n
s e rvid o r we b co n fig u ra d o s p a ra e je cu t a r e l e je m p lo , va ya m o s a la p á g in a p rin cip a l d e la
lib re ría m o s t ra d a e n la p á g in a a n t e rio r. S ó lo p o r d ive rs ió n , p o d ría m o s a ñ a d ir u n lib ro a
n u e s t ra h o ja d e p e d id o a n t e s d e a cce d e r a l s e rvle t S h o w Ca rt .

Ejemplos de URLs de Servlets en etiquetas HTML

La p á g in a d e vu e lt a p o r S h o wCa rt S e rvle t t ie n e va rio s e n la ce s , ca d a u n o d e lo s cu a le s


t ie n e u n s e rvle t co m o d e s t in o . Aq u í p o d e m o s ve r e l có d ig o d e e s o s e n la ce s :

public class ShowCartServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
out.println(... +
"<a href=\"" +
response.encodeUrl("/servlet/cashier") +
"\">Check Out</a> " +
...);
...
}
...
}
Es t e có d ig o re s u lt a e n u n a p á g in a HTML q u e t ie n e e l s ig u ie n t e e n la ce :

<a href="http://localhost:8080/servlet/cashier>Check Out</a">


S i lla m a m o s a la p á g in a d e l s h o wca rt , p o d re m o s ve r e l e n la ce co m o s i vie ra m o s e l
fu e n t e d e la p á g in a . Lu e g o p u ls a m o s s o b re e l e n la ce . El s e rvle t ca s h ie r d e vo lve rá la
p á g in a q u e co n t ie n e e l s ig u ie n t e e je m p lo .
La p á g in a m o s t ra d a p o r e l s e rve r ca s h ie r p re s e n t a u n fo rm u la rio q u e p id e e l n o m b re
d e l u s u a rio y e l n ú m e ro d e la t a rje t a d e cré d it o . El có d ig o q u e im p rim e e l fo rm u la rio s e
p a re ce a e s t o :
public class CashierServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
out.println(... +
"<form action=\"" +
response.encodeUrl("/servlet/receipt") +
"\" method=\"post\">" +
...
"<td><input type=\"text\" name=\"cardname\"" +
"value=\"Gwen Canigetit\" size=\"19\"></td>" +
...
"<td><input type=\"submit\"" +
"value=\"Submit Information\"></td>" +
...
"</form>" +
...);
out.close();
}
...
}
Es t e có d ig o re s u lt a e n u n a p á g in a HTML q u e t ie n e la s ig u ie n t e e t iq u e t a p a ra in icia r e l
fo rm u la rio :

<form action="http://localhost:8080/servlet/receipt" method="post">


S i ca rg a m o s la p á g in a d e l s e rvle t ca s h ie r e n n u e s t ro n a ve g a d o r p o d re m o s ve r la
e t iq u e t a q u e in icia e l fo rm u la rio co m o s i vie ra m o s e l fu e n t e d e la p á g in a . Lu e g o
e n via m o s e l fo rm u la rio . El s e rvle t re ce ip t d e vo lve rá u n a p á g in a q u e co n t ie n e e l
s ig u ie n t e e je m p lo . La p á g in a d e l s e rvle t re ce ip t s e re s e t e a a s í m is m a , p o r e s o s i
q u e re m o s ve rla , t e n e m o s q u e h a ce rlo r á p id o !.
La p á g in a d e vu e lt a p o r e l s e rvle t re ce ip t t ie n e u n a "m e t a t a g " q u e u t iliza u n a URL d e
s e rvle t co m o p a rt e d e l va lo r d e l a t rib u t o h t t p - e q u iv . Es p e cífica m e n t e , la e t iq u e t a
re d ire ccio n a la p á g in a h a cia a la p á g in a p rin cip a l d e l D u k e 's Bo o k s t o re d e s p u e s d e
d a r la s g ra cia s a l u s u a rio p o r s u p e d id o . Aq u í p o d e m o s ve r e l có d ig o d e e s t a e t iq u e t a :

public class ReceiptServlet extends HttpServlet {

public void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
out.println("<html>" +
"<head><title> Receipt </title>" +
"<meta http-equiv=\"refresh\" content=\"4; url=" +
"http://" + request.getHeader("Host") +
"/servlet/bookstore;\">" +
"</head>" +
...
}
...
}
Es t e có d ig o re s u lt a e n u n a p á g in a HTML q u e t ie n e la s ig u ie n t e e t iq u e t a :

<meta http-equiv="refresh"
content="4; url=http://localhost:8080/servlet/bookstore;">

Oz it o
Llamar a un Servlet desde otro Servlet
Pa ra h a ce r q u e n u e s t ro s e rvle t lla m e a o t ro s e rvle t , p o d e m o s :
● Un s e rvle t p u e d e h a ce r p e t icio n e s HTTP a o t ro s e rvle t . La a p e rt u ra d e u n a co n e xió n
URL s e e xp lica e n la s p á g in a s d e la s e cció n Tra b a ja r co n URLs .
● Un s e rvle t p u e d e lla m a r d ire ct a m e n t e a lo s m é t o d o s p ú b lico s d e o t ro s s e rvle t , s i lo s
d o s s e e s t á n e je cu t a n d o d e n t ro d e l m is m o s e rvid o r.
Es t a p á g in a e xp lica la s e g u n d a o p ció n . Pa ra lla m a r d ire ct a m e n t e a lo s m é t o d o s p ú b lico s
d e o t ro s e rvle t , d e b e m o s :
● Co n o ce r e l n o m b re d e l s e rvle t a l q u e q u e re m o s lla m a r.

● Ob t e n e r e l a cce s o a l o b je t o S e rv le t d e l s e rvle t .
● Lla m a r a l m é t o d o p ú b lico d e l s e rvle t .
Pa ra o b t e n e r e l a cce s o a l o b je t o S e rv le t , u t iliza m o s e l m é t o d o g e t S e rv le t d e l o b je t o
S e rv le t Co n t e x t . Ob t e n e r e l o b je t o S e rv le t Co n t e x t d e s d e e l o b je t o S e rv le t Co n fig
a lm a ce n a d o e n e l o b je t o S e rv le t . Un e je m p lo a cla ra rá e s t o . Cu a n d o e l s e rvle t
Bo o k D e t a il lla m a a l s e rvle t Bo o k D B, e l s e rvle t Bo o k D e t a il o b t ie n e e l o b je t o S e rv le t
d e l Bo o k D B S e rv le t d e e s t a fo rm a :

public class BookDetailServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
BookDBServlet database = (BookDBServlet)
getServletConfig().getServletContext().getServlet("bookdb");
...
}
}
Un a ve z q u e t e n e m o s e l o b je t o S e rvle t , p o d e m o s lla m a r a cu a lq u ie ra d e lo s m é t o d o s
p ú b lico s d e l s e rvle t . Po r e je m p lo , e l s e rvle t Bo o k D e t a il lla m a a l m é t o d o g e t Bo o k D e t a ils
d e l s e rvle t Bo o k D B:

public class BookDetailServlet extends HttpServlet {

public void doGet (HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
{
...
BookDBServlet database = (BookDBServlet)
getServletConfig().getServletContext().getServlet("bookdb");
BookDetails bd = database.getBookDetails(bookId);
...
}
}
De b e m o s t e n e r p re ca u ció n cu a n d o lla m e m o s a m é t o d o s d e o t ro s e rvle t . S i e l s e rvle t a l
q u e q u e re m o s lla m a r im p le m e n t a e l in t e rfa ce S in g le Th re a d Mo d e l, n u e s t ra lla m a d a
p o d ría vio la r la n a t u ra le za m o n o - t h re a d d e l s e rvle t . ( El s e rvid o r n o t ie n e fo rm a d e
in t e rve n ir y a s e g u ra rs e d e q u e n u e s t ra lla m a d a s u ce d a cu a n d o e l s e rvle t n o e s t á
in t e ra ct u a n d o co n o t ro clie n t e ) . En e s t e ca s o , n u e s t ro s e rvle t d e b e ría h a ce r u n a p e t ició n
HTTP a l o t ro s e rvle t e n ve z d e lla m a r d ire ct a m e n t e a s u s m é t o d o s .

Oz it o
Mercados Globales
Lo s m e rca d o s g lo b a le s s o n lu cra t ivo s . Ve n d e r t u s a p lica cio n e s e n t o d o e l m u n d o
g e n e ra m u ch a s re n t a s e in cre m e n t a la cu o t a d e m e rca d o . Pa ra t e n e r é xit o e n e l
m e rca d o in t e rn a cio n a l t u s a p lica cio n e s d e b e n s o p o rt a r id io m a s lo ca le s y
co n ve n cio n e s p a ra e l fo rm a t e o d e d a t o s . Tu s clie n t e s n o e s p e ra rá n m e n o s d e t í.
Po r e je m p lo , lo s No rt e a m e rica m o s e s p e ra n s u s m e n s a je s e n In g lé s , la s fe ch a s e n
e l fo rm a t o m m / d d / y y , y la m o n e d a e xp re s a d a e n d ó la re s ( $ ) . Lo s Ale m a n e s
q u e rrá n s u s m e n s a je s e n Ale m á n , la s fe ch a s e n e l fo rm a t o d d . m m . y y y y , y la
m o n e d a e xp re s a d a e n Ma rco s a le m a n e s ( DM) .
La s co m p a ñ ía s d e s o ft wa re u t iliza b a n la s fo rm a m á s d u ra p a ra p e rs o n a liza r s u s
p ro g ra m a s . En la p rim e ra ve rs ió n d e u n p ro d u ct o , co d ifica b a n d e n t ro d e l p ro g ra m a
lo s d a t o s d e p e n d ie n t e s d e la cu lt u ra co m o lo s t e xt o s o la s fe ch a s . Cu a n d o q u e ría n
s o p o rt a r u n n u e vo id io m a , t e n ía n q u e h a ce r u n a co p ia d e l có d ig o fu e n t e , ca m b ia r
t o d o s lo s e le m e n t o s n e ce s a rio s y re co m p ila r, Pa ra lib e ra r u n a n u e va ve rs ió n ,
t e n ía n q u e a ct u a liza r lo s d ife re n t e s fich e ro s d e có d ig o fu e n t e y lu e g o la n za r u n
n u e vo co n ju n t o d e e je cu t a b le s . Es t e p ro ce s o n o s ó lo e ra t e d io s o , t a m b ié n e ra
p ro p e n s o a e rro re s y co s t o s o . Afo rt u n a d a m e n t e , h a n e m e rg id o n u e va s t é cn ica s
p a ra a yu d a r a d e s a rro lla r s o ft wa re g lo b a l: la In t e rn a cio n a liza ció n y la Lo ca liza ció n .

Internationalización

Es t a s e cció n d e s crib e la s ve n t a ja s y p ro p ie d a d e s d e la
In t e rn a cio n a liza ció n . Cu a n d o s e in t e rn a cio n a liza u n p ro g ra m a s e h a ce
m á s fá cil e l p o d e r p o rt a rlo e n t re id io m a s y re g io n e s .

Localización

De s p u é s d e q u e u n p ro g ra m a h a s id o in t e rn a cio n a lzia d o , p u e d e s e r
a d a p t a d o , o lo ca liza d o , p a ra u n id io m a o re g ió n e s p e cífica . Es t a s e cció n
d e s crib e b re ve m e n t e e l p ro ce s o d e lo ca liza ció n .

Datos Sensibles a la Cultura

Lo s d a t o s s e n s ib le s a la cu lt u ra s o n la ra zó n q u e t e n e m o s p a ra
in t e rn a cio n a liza r y lo ca liza r n u e s t ro s p ro g ra m a s . Es t a s e cció n d e s crib e
lo s d ife re n t e s t ip o s d e d a t o s s e n s ib le s a la cu lt u ra q u e n o s p o d ría m o s
e n co n t ra r.

Oz it o
Internationalización
In t e rn a t io n a liz a ció n e s e l p ro ce s o d e d is e ñ a r u n a a p lica ció n p a ra q u e p u e d a s e r
a d a p t a d a a d ife re n t e s id io m a s y re g io n e s , s in n e ce s it a d d e ca m b io s d e in g e n ie ría .
Alg u n a s ve ce s e l t é rm in o in t e rn a cio n a liza ció n s e a b re via i1 8 n , p o rq u e e n e l id io m a
in g lé s h a y 1 8 le t ra s e n t re la "i" y la "n " d e In t e rn a cio n a liza ció n .
Un p ro g ra m a in t e rn a cio n a liza d o t ie n e la s s ig u ie n t e s ca ra ct e rís t ica s :
● Co n la a d ició n d e d a t o s d e lo ca liza ció n , e l m is m o e je cu t a b le p u e d e s e r
e je cu t a d o e n cu a lq u ie r lu g a r d e l m u n d o .
● El t e xt o m o s t ra d o p o r e l p ro g ra m a e s t á e n e l id io m a n a t ivo d e l u s u a rio fin a l.

● Lo s e le m e n t o s t e xt u a le s co m o m e n s a je s d e e s t a d o y e t iq u e t a s d e e le m e n t o s
GUI n o e s t á n co d ifica d a s d e n t ro d e l p ro g ra m a . S o n a lm a ce n a d o s fu e ra d e l
có d ig o fu e n t e y re cu p e ra d o s d e fo rm a d in á m ica .
● El s o p o rt e d e n u e vo s id io m a s n o re q u ie re re - co m p ila ció n .

● Ot ro s d a t o s d e p e n d ie n t e s d e la cu lt u ra , co m o fe ch a s y m o n e d a s , a p a re ce n e n
e l fo rm a t o e id o m a d e la re g ió n d e l u s u a rio fin a l.
● Pu e d e s e r lo ca liza d o rá p id a m e n t e .

S i h a s in t e rn a cio n a liza d o t u p ro d u ct o , ya e s t á lis t o p a ra la lo ca liza ció n .

Oz it o
Localización
Lo ca liz a ció n e s e l p ro ce s o d e a d a p t a r s o ft wa re p a ra u n a re g ió n o id io m a e s p e cífico
a ñ a d ie n d o co m p o n e n t e s e s p e cífico s d e la lo ca lid a d y t ra d u cie n d o e l t e xt o . El
t é rm in o Lo ca liza ció n n o rm a lm e n t e s e co n t ra e co m o "l1 0 n " p o rq u e e n id io m a in g lé s
h a y 1 0 le t ra s e n t re la "L" y la "n ".
La t ra d u cció n d e l t e xt o e s u n a im p o rt a n t e t a re a d e lo ca liza ció n . Du ra n t e la
in t e rn a cio n a liza ció n , lo s t e xt o s co m o la s e t iq u e t a s d e lo s co m p o n e n t e s GUI y lo s
m e n s a je s d e e rro r s o n a lm a ce n a d p s fu e ra d e l có d ig o fu e n t e p a ra s e r re cu p e ra d o s
e n t ie m p o d e e je cu ció n . An t e s d e q u e e l t e xt o p u e d a re cu p e ra rs e d e b e s e r
t ra d u cid o . Co m o e l t e xt o n o e s t á d e n t ro d e l có d ig o fu e n t e , e l p ro g ra m a n o re q u ie re
n in g u n a m o d ifica ció n . Lo s t ra d u ct o re s t ra b a ja n co n fich e ro s d e t e xt o q u e s o n le id o s
p o r e l p ro g ra m a , n o e s t á n d e n t ro d e é l. As í, e l m is m o e je cu t a b le fu n cio n a e n
cu a lq u ie r p a rt e d e l m u n d o .
La s co n ve n cio n e s d e fo rm a t e o d e fe ch a s , n ú m e ro s y m o n e d a s va ría n co n e l id io m a
y la re g ió n . Lo s lo ca liza d o re s p o d ría n n e ce s it a r e s p e cifica r a lg u n o s p a t ro n e s d e
fo rm a t e o . O, e l p ro g ra m a p o d ría p ro p o rcio n a lo s a u t o m á t ica m e n t e . En cu a lq u ie r
ca s o , lo s lo ca liza d o re s d e b e n p ro b a r e l s o ft wa re p a ra ve rifica r q u e la s co n ve n cio n e s
d e fo rm a t e o e s t á n s e g ú n lo s re q u e rim ie n t o s lo ca le s .
Ot ro s t ip o s d e d a t s o , co m o s o n id o s e im á g e n e s t a m b ié n re q u e ire n lo ca liza ció n
s e n s ib le a la cu lt u ra .

Oz it o
Datos Sensibles a la Cultura
Texto

Au n q u e la s a p lica cio n e s m u lt i- m e d ia e xis t e n d e s d e h a ce a ñ o s , ca s i t o d o s lo s


p ro g ra m a s p rim a rio s u t iliza n t e xt o p a ra co m u n ica rs e co n e l u s u a rio fin a l. Es t o e s
e s p e cia lm e n t e cie rt o e n la co m u n id a d d e n e g o cio s . S i e s t á s le ye n d o e s t o o n - lin e ,
m ira la ca n t id a d d e t e xt o m o s t ra d o p o r la s o t ra s a p lica cio n e s q u e s e e s t á n
e je cu t a n d o e n t u s is t e m a . ¿ Ha s vis t o t o d o s e s o s b o t o n e s y m e n ú s ? To d o s
n e ce s it a n s e r t ra d u cid o s s i la s a p lica cio n e s va n a s e r ve n d id a s e n t o d o e l m u n d o .
No s o lo e s t o , t a m b ié n lo s m e n s a je s d e e s t a d o , la s in fo rm e s im p re s o s y la s
p a n t a lla s d e a yu d a e n lín e a re q u ie re n t ra d u cció n . Co m o la s a p lica cio n e s m u e s t ra n
y g e n e ra n t a n t o t e xt o , la s cu e n t a s d e t ra d u cció n fo rm a n la m a yo r p a rt e d e l co s t o
d e la lo ca liza ció n .
S i m a n e ja s a d e cu a d a m e n t e lo s e le m e n t o s t e xt u a le s d e t u p ro g ra m a , p o d rá s
re d u cir e l co s t e d e la t ra d u cció n . De b e ría s m o ve r e l t e xt o t ra d u cib le a fich e ro s d e
p ro p ie d a d e s , d o n d e p u e d a n s e r ca rg a d o s e n o b je t o s Re s o u rc e Bu n d le .
Ap e re n d e rá s co m o h a ce r e s t o e n la s e cció n : Ut iliza r fich e ro s d e Pro p ie d a d e s .

Números

La s co n ve n cio n e s d e fo rm a t e o d e n ú m e ro s va ría co n e l p a ís . S e p o d ría n u t iliza r


d ife re n t e s ca ra ct e re s p a ra m a rca r e l p u n t o d e cim a l y p a ra s e p a ra r lo s m illa re s . La
s ig u ie n t e t a b la m u e s t ra s ó lo u n a s p o ca s fo rm a s d ife re n t e s d e fo rm a t e a r u n n ú m e ro
p a rt icu la r:
País Número Formateado
Fra n cia 123 456,78
Ale m a n ia 123.456,78
U. S . A. 123,456.78
La le cció n Fo rm a t e o d e Nú m e ro s y Mo n e d a t e m u e s t ra co m o cre a r fo rm a t o s d e
n ú m e ro s e s p e cífico s d e la lo ca lid a d .

Moneda

La s u n id a d e s d e m o n e d a va ría n co n e l p a ís . y t a m b ié n e l fo rm a t o d e la ca n t id a d . La
s ig u ie n t e t a b la ilu s t ra a lg u n o s e je m p lo s :
País Moneda Ejemplo
Es p a ñ a Pe s e t a 1 . 2 3 4 , 5 6 Pt s
It a lia Lira L. 1 . 2 3 4 , 5 6
U. S . A. Do lla r $ 1 , 2 3 4 . 5 6
Pu e d e s ve r Fo rm a t e o d e Nú m e ro s y Mo n e d a p a ra m á s in fo rm a ció n .
Fechas y Horas

El fo rm a t e o d e fe ch a s y h o ra s va ría co n e l p a ís . La s ig u ie n t e t a b la m u e s t ra a lg u n o s
e je m p lo s :
País Fecha Hora
Ca n a d a 3 0 / 4 / 9 8 20:15
Ale m a n ia 3 0 . 4 . 1 9 9 8 2 0 : 1 5 Uh r
U. S . A. 4/30/98 1 0 : 1 5 PM
Fo rm a t e o d e Fe ch a s y Ho ra s e xp lica có m o re a liza r u n fo rm a t e o d e a cu e rd o a va ria s
co n ve n cio n e s cu lt u ra le s .

Imágenes

Co n e l a d ve n im ie n t o d e la s a p lica cio n e s GUI, la s im á g e n e s a p a re ce n e n cu a lq u ie r


lu g a r d e n u e s t ra s p a n t a lla s . La s e n co n t ra m o s e n ico n o s , g rá fico s , fo t o g ra fía s ,
d ib u jo s y b a n n e rs . Au n q u e la u t iliza ció n d e im á g e n e s e s u n ive rs a l, s u s ig n ifica d o
n o lo é s . Po r e je m p lo , p o d ría s e s t a r t e n t a d o a u t iliza r s e ñ a le s d e t rá fico p a ra
a yu d a r a lo s u s u a rio s fin a le s a n a ve g a r a t ra vé s d e la a p lica ció n . Pe ro co m o la s
s e ñ a le s d e t rá fico va ría n d e u n p a ís a o t ro , t u p ro g ra m a d e b e ría m o s t ra r d ife re n t e s
ve rs io n e s d e lo s ico n o s e n d ife re n t e s p a is e s . Afo rt u n a d a m e n t e , p u e d e s m a n e ja r
o b je t o s I m a g e p a ra la s d ife re n t e s re g io n e s y a is la rlo s e n u n
Lis t Re s o u rc e Bu n d le . Es t e p ro ce s o s e d e s crib e e n la le cció n Ut iliza r u n
Lis t Re s o u rce Bu n d le .

Colores

Lo s co lo re s t ie n e n d ife re n t e s s ig n ifica d o s a lo la rg o d e l m u n d o . En U. S . A. e l co lo r
b la n co s ig n ifica p u re za , p e ro e n Ja p ó n s ig n ifica m u e rt e . En Eg ip t o , e l co lo r ro jo
re p re s e n t a la m u e rt e , p e ro e n Ch in a s u g ie re fe licid a d . Al ig u a l q u e lo s o b je t o s
I m a g e , lo s o b je t o s Co lo r d e p e n d e n t ie s d e la cu lt u ra p u e d e n s e r m a n e ja d o s s i s o n
a lm a ce n a d o s e n u n Lis t Re s o u rc e Bu n d le .

Sonidos

S i t u s a p lica cio n e s g e n e ra n s o n id o s , d e b e s t e n e r e n cu e n t a q u e e l m is m o s o n id o
p o d ría n o s e r re co n o cid o e n t o d o e l m u n d o . Po r e je m p lo , la s s ire n a s d e p o licía s o n
d ife re n t e s e n U. S . A y e n Ale m a n ia . Po r s u p u e s t o , s i t u a p lica ció n d a in s t ru ccio n e s
ve rb a le s , la s in s t ru ccio n e s d e b e n s e r t ra d u cid a s . Pu e d e s s e g u ir la p is t a d e d e
o b je t o s Au d io Clip d e p e n d ie n t e s d e la cu lt u ra s i lo s a lm a ce n a s e n o b je t o s
Lis t Re s o u rc e Bu n d le .

Oz it o
Un ejemplo Rápido
S i e re s n u e vo in t e rn a cio n a liza n d o s o ft wa re , e s t a le cció n e s p a ra t í. Ut iliza n d o u n
e je m p lo s e n cillo , ve re m o s co m o in t e rn a cio n a liza r u n p ro g ra m a q u e m u e s t ra
m e n s a je s d e t e xt o e n e l id io m a a p ro p ia d o . En e s t a le cció n a p re n d e rá s có m o
t ra b a ja n ju n t o s lo s o b je t o s Lo c a le y Re s o u rc e Bu n d le , y có m o u t iliza r lo s fich e ro s
d e p ro p ie d a d e s .

Antes de la Internacionalización

En la p rim e ra ve rs ió n d e l có d ig o fu e n t e , co d ifica m o s la s ve rs io n e s
in g le s a s d e lo s m e n s a je s q u e q u e ria m o s m o s t ra r. Es t a N O e s la fo rm a d e
e s crib ir s o ft wa re in t e rn a cio n a liza d o .

Después de la Internacionalización

Un a p e q u e ñ a vis ió n d e lo q u e s e rá n u e s t ro có d ig o fu e n t e d e s p u é s d e la
in t e rn a cio n a liza ció n .

Ejecutar el programa de Ejemplo

Pa ra e je cu t a r e l p ro g ra m a d e e je m p lo , s e e s p e cifica e l id io m a y e l p a ís
e n la lín e a d e co m a n d o s . Es t a s e cció n m u e s t ra va rio s e je m p lo s .

Cómo hemos internacionalizado el programa de Ejemplo

In t e rn a cio n a liza r e l p ro g ra m a d e e je m p lo s ó lo re q u ie re u n o s p o co s
p a s o s . Te s o rp re n d e rá s d e lo fá cil q u e e s .

Oz it o
Antes de la Internacionalización
S u p o n g a m o s q u e h e m o s e s crit o u n p ro g ra m a q u e m u e s t ra t re s m e n s a je s :

System.out.println("Hello.");
System.out.println("How are we?");
System.out.println("Goodbye.");
He m o s d e cid id o q u e e s t e p ro g ra m a n e ce s it a m o s t ra r e s t o s t re s m e n s a je s p a ra la
g e n t e q u e vive e n Fra n cia y e n Ale m a n ia . De s a fo rt u n a d a m e n t e t u p e rs o n a l d e
p ro g ra m a ció n n o e s m u lt i- lin g ü e . , p o r e s o n e ce s it a s a yu d a p a ra t ra d u cir lo s
m e n s a je s a l Fra n cé s y a l Ale m á m . Có m o lo s t ra d u ct o re s n o s o n p ro g ra m a d o re s ,
t e n e m o s q u e s a ca r lo s m e n s a je s fu e ra d e l có d ig o fu e n t e a fich e ro s d e t e xt o q u e
p u e d a n s e r e d it a d o s p o r lo s t ra d u ct o re s . Ta m b ié n q u e re m o s q u e e l p ro g ra m a s e a
lo s u ficie n t e m e n t e fle xib e p a ra p o d e r m o s t ra r lo s m e n s a je s e n o t ro s id io m a s , p e ro
a h o ra m is m o n o s a b e m o s q u é id io m a s . Po r lo t a n t o , q u e re m o s q u e e l u s u a rio fin a l
e s p e cifiq u e s u id io m a e n e l m o m e n t o d e la e je cu ció n .
Pa re ce q u e e s t e p ro g ra m a n e ce s it a s e r in t e rn a cio n a liza d o .

Oz it o
Después de la Internacionalización
Ab a jo p u e d e s ve r e l có d ig o fu e n t e d e l p ro g ra m a in t e rn a cio n a liza d o . Ob s e rva q u e e l t e xt o
d e lo s m e n s a je s n o e s t á co d ifica d o .

import java.util.*;

public class I18NSample {

static public void main(String[] args) {

if (args.length != 2) {
System.out.println("Please specify language and country codes.");
System.out.println("For example: java I18NSample fr FR");
System.exit(-1);
}

Locale currentLocale;
ResourceBundle messages;
String language = new String(args[0]);
String country = new String(args[1]);

currentLocale = new Locale(language, country);

messages =
ResourceBundle.getBundle("MessagesBundle",currentLocale);

System.out.println(messages.getString("greetings"));
System.out.println(messages.getString("inquiry"));
System.out.println(messages.getString("farewell"));
}
}

Oz it o
Ejecutar el Programa de Ejemplo
Nu e s t ro p ro g ra m a in t e rn a cio n a liza d o e s fle xib le , p o rq u e p e rm it e q u e e l u s u a rio
fin a l p u e d a e s p e cifica r e l id io m a y e l p a ís e n la lín e a d e co m a n d o s . En e l s ig u ie n t e
e je m p lo , e l p ro g ra m a m u e s t ra lo s m e n s a je s e n Fa n cé s , p o rq u e e l có d ig o d e
le n g u a je e s fr ( Fra n cé s ) , y e l có d ig o d e p a ís e s FR ( Frá n cia ) :

% java I18NSample fr FR
Bonjour.
Comment allez-vous?
Au revoir.
En e l s ig u ie n t e e je m p lo , e l có d ig o d e id io m a e s e n ( In g lé s ) y e l có d ig o d e p a ís e s
US ( Es t a d o s Un id o s ) :

% java I18NSample en US
Hello.
How are you?
Goodbye.

Oz it o
¿Cómo hemos internacionalizado el programa de
ejemplo?
S i e ch a s t e u n vis t a zo a l có d ig o fu e n t e in t e rn a cio n a liza d o , o b s e rva ría s q u e lo s
m e n s a je s e n in g lé s d e n t ro d e l có d ig o h a n d e s a p a re cid o . Co m o e s t o s m e n s a je s ya
n o e s t á n d e n t ro d e l có d ig o , y co m o e l co d ig o d e l id io m a s e e s p e cifica e n e l
m o m e n t o d e la e je cu ció n , e l m is m o e je cu t a b le p u e d e s e r d is t rib u id o p o r t o d o e l
m u n d o . No s e re q u ie re n re co m p ila cio n e s p a ra s u lo ca liza ció n , Nu e s t ro p ro g ra m a h a
s id o in t e rn a cio n a liza d o .
Te p o d ría s p re g u n t a r q u e h a s u ce d id o co n e l t e xt o d e lo s m e n s a je s , o q u e
e n t e n d e m o s p o r lo s có d ig o s d e id io m a y d e p a ís . No t e p re o cu p e s . Te e xp lica re m o s
t o d o s e s t o s co n ce p t o s cu a n d o p a s e m o s a t ra vé s d e l p ro ce s o d e in t e rn a cio n a liza ció n
d e l p ro g ra m a d e e je m p lo :
Cre a r e l Fich e ro d e Pro p ie d a d e s

De fin ir la Lo ca lid a d

Cre a r u n o b je t o Re s o u rce Bu n d le

Re cu p e ra r e l t e xt o d e l Re s o u rce Bu n d le

Oz it o
Crear el Fichero de Propiedades
Un fich e ro d e p ro p ie d a d e s a lm a ce n a in fo rm a ció n s o b re la s ca ra ct e rís t ica s d e u n
p ro g ra m a o u n e n t o rn o . Es t o s fich e ro s d e p ro p ie d a d e s t ie n e n fo rm a t o d e t e xt o
p la n o . S e p u e d e n cre a r co n cu a lq u ie r e d it o r d e t e xt o s .
En n u e s t ro e je m p lo , e l fich e ro d e p ro p ie d a d e s a lm a ce n a lo s t e xt o s t ra d u cib le s d e
lo s m e n s a je s q u e d e s e a m o s m o s t ra r. An t e s d e q u e n u e s t ro p ro g ra m a fu e ra
in t e rn a cio n a liza d o , la s ve rs io n e s in g le s a s d e lo s m e n s a je s fu e ro n co d ifica d a s
d e n t ro d e s e n t e n cia s S y s t e m . o u t . p rin t ln . Nu e s t ro fich e ro d e p ro p ie d a d e s p o r
d e fe ct o , q u e s e lla m a Me s s a g e s Bu n d le . p ro p e rt ie s , co n t ie n e la s s ig u ie n t e s
lín e a s :

greetings = Hello
farewell = Goodbye
inquiry = How are you?
Ah o ra q u e lo s m e n s a je s e s t á n e n u n fich e ro d e p ro p ie d a d e s , p o d e m o s t ra d u cirlo s a
va rio s id io m a s . No s e n e ce s it a m o d ifica r e l có d ig o fu e n t e . Nu e s t ro t ra d u ct o r d e
Fra n cé s , h a cre a d o u n fich e ro d e p ro p ie d a d e s lla m a d o
Me s s a g e s Bu n d le _ fr_ FR. p ro p e rt ie s , q u e co n t ie n e e s t a s lín e a s :

greetings = Bonjour.
farewell = Au revoir.
inquiry = Comment allez-vous?
Ob s e rva q u e lo s va lo re s s it u a d o s a la d e re ch a d e lo s s ig n o s ig u a l "= " h a n s id o
t ra d u cid o s , p e ro la s cla ve s d e l la d o izq u ie rd o d e l s ig n o n o h a n ca m b ia d o . Es t a s
cla ve s n o d e b e n ca m b ia r, p o rq u e e l p ro g ra m a s e re fe rirá a e lla s cu a n d o re cu p e re e l
t e xt o t ra d u cid o .
El n o m b re d e l fich e ro d e p ro p ie d a d e s e s im p o rt a n t e . El n o m b re d e l fich e ro
Me s s a g e s Bu n d le _ fr_ FR. p ro p e rt ie s co n t ie n e e l có d ig o d e l id io m a fr y e l có d ig o
d e l p a ís FR. Es t o s có d ig o s t a m b ié n s e u t iliza n cu a n d o s e cre a u n o b je t o Lo c a le .

Oz it o
Definir la Localidad
Un o b je t o Lo c a le d e fin e u n id io m a p a rt icu la r y u n p a ís . La s ig u ie n t e s e n t e n cia
d e fin e u n o b je t o Lo ca le p a ra e l id io m a In g lé s y e l p a ís d e Es t a d o s Un id o s .

aLocale = new Locale("en","US");


El s ig u ie n t e e je m p lo cre a o b je t o s Lo c a le p a ra e l id io m a fra n cé s e n Ca n a d a y
Frá n cia :

caLocale = new Locale("fr","CA");


frLocale = new Locale("fr","FR");
Qu e re m o s m a n t e n e r fle xib le e l p ro g ra m a d e e je m p lo , p o r e llo , e n ve z d e co d ifica r
lo s có d ig o s d e id io m a y d e p a ís e n e l có d ig o fu e n t e , lo s o b t e n e m o s d e la lín e a d e
co m a n d o s e n e l m o m e n t o d e la e je cu ció n :

String language = new String(args[0]);


String country = new String(args[1]);
currentLocale = new Locale(language, country);
Lo s o b je t o s Lo c a le s o n s ó lo id e n t ifica d o re s . De s p u é s d e d e fin ir u n o b je t o Lo c a le ,
s e lo p a s a s a o t ro o b je t o q u e re a liza la s t a re a s ú t ile s , co m o fo rm a t e a r fe ch a s y
n ú m e ro s . Es t o s o b je t o s s e lla m a n s e n s ib le s a la lo ca lid a d , p o rq u e s u
co m p o rt a m ie n t o va ría d e a cu e rd o a la lo ca lid a d . Un Re s o u rc e Bu n d le e s u n
e je m p lo d e o b je t o s e n s ib le a la lo ca lid a d .

Oz it o
Crear el objeto ResourceBundle
Lo s o b je t o s Re s o u rc e Bu n d le co n t ie n e n o b je t o s e s p e cífico s d e u n a lo ca lid a d . Es t o s
o b je t o s Re s o u rc e Bu n d le s e u t iliza n p a ra a is la r lo s d a t o s s e n s ib le s a la lo ca lid a d ,
co m o t e xt o t ra d u cib le , e t c. En n u e s t ro p ro g ra m a d e e je m p lo , e l Re s o u rc e Bu n d le
e s t á co n s t it u id o p o r lo s fich e ro s d e p ro p ie d a d e s q u e co n t ie n e n lo s m e n s a je s q u e
q u e re m o s m o s t ra r.
Nu e s t ro o b je t o Re s o u rc e Bu n d le s e cre a d e e s t a fo rm a :

message = ResourceBundle.getBundle("MessagesBundle",currentLocale)
Lo s a rg u m e n t o s p a s a d o s a l m é t o d o g e t Bu n d le id e n t ifica n a lo s fich e ro s d e
p ro p ie d a d e s a lo s q u e q u e re m o s a cce d e r. El p rim e r a rg u m e n t o , Me s s a g e s Bu n d le ,
s e re fie re a e s t a fa m ilia d e fich e ro s d e p ro p ie d a d e s :

MessagesBundle_en_US.properties
MessagesBundle_fr_FR.properties
MessagesBundle_de_DE.properties
El o b je t o Lo c a le , q u e e s e l s e g u n d o a rg u m e n t o d e g e t Bu n d le , e s p e cífica e l fich e ro
e le g id o d e Me s s a g e s Bu n d le . Cu a n d o s e cre ó e l o b je t o Lo c a le , s e le p a s a ro n a l
co n s t ru ct o r lo s có d ig o s d e l id io m a y d e l p a ís . Ob s e rva q u e e s t o s có d ig o s fo rm a n
p a rt e d e l n o m b re d e lo s fich e ro s d e p ro p ie d a d e s d e Me s s a g e s Bu n d le .
Ah o ra , t o d o lo q u e t e n e m o s q u e h a ce r e s t ra d u cir lo s m e n s a je s d e
Re s o u rc e Bu n d le .

Oz it o
Buscar el Texto dentro de ResourceBundle
Lo s fich e ro s d e p ro p ie d a d e s co n t ie n e n p a re ja s cla ve / va lo r. Lo s va lo re s co n s is t e n e n
t e xt o t ra d u cid o q u e n u e s t ro p ro g ra m a m o s t ra rá . Es p e cífica re m o s la s cla ve s cu a n d o
q u e rra m o s u t iliza r lo s m e n s a je s t ra d u cid o s d e l Re s o u rc e Bu n d le co n e l m é t o d o
g e t S t rin g . Po r e je m p lo , p a ra re cu p e ra r e l m e n s a je id e n t ifica d o p o r la cla ve
"g re e t in g s ", lla m a ría m o s a g e t S t rin g d e e s t a fo rm a :

String msg1 = messages.getString("greetings");


En n u e s t ro e je m p lo , u t iliza m o s la cla ve g re e t in g s p o rq u e re fle ja e l co n t e n id o d e l
m e n s a je , p o d ría s h a b e r u t iliza d o cu a lq u ie r o t ro S t rin g , co m o s 1 o m s g 1 . S ó lo
re co rd a r q u e la cla ve d e b e e s t á r e s crit a e n t u p ro g ra m a y q u e d e b e e s t a r p re s e n t e
e n lo s fich e ro s d e p ro p ie d a d e s . S i t u t ra d u ct o r m o d ifica a ccid e n t a lm e n t e la s cla ve s
d e lo s fich e ro s d e p ro p ie d a d e s , g e t S t rin g n o p o d rá e n co n t ra r lo s m e n s a je s .
Es t o e s t o d o . Co m o p u e d e s ve r, in t e rn a cio n a liza r u n p ro g ra m a n o e s d e m a s ia d o
d íficil. S ó lo re q u ie re a lg o d e p la n ifica ció n , y u n p o co d e có d ig o e xt ra , p e ro lo s
b e n e ficio s s o n e n o rm e s . El e je m p lo q u e h e m o s cu b ie rt o e n e s t a s e cció n h a s id o
in t e n cio n a d a m e n t e s e n cillo p o rq u e q u e ría m o s p ro p o rcio n a rt e u n a in t ro d u cció n a l
p ro ce s o d e in t e rn a cio n a liza ció n . El API d e Ja va o fre ce m u ch a s m á s ca p a cid a d e s d e
in t e rn a cio n a liza ció n q u e la s d e s crit a s e n e s t a s e cció n . Exp lica re m o s e s o s t ó p ico s e n
m a yo r d e t a lle e n la s s ig u ie n t e s s e ccio n e s .

Oz it o
Seleccionar la Localidad
Un p ro g ra m a in t e rn a cio n a liza d o m u e s t ra in fo rm a ció n d ife re n t e a lo a n ch o d e l
m u n d o . Po r e je m p lo , e l p ro g ra m a m o s t ra rá d ife re n t e s m e n s a je s e n Pa rís , To kio o
Nu e va Yo rk. S i e l p ro ce s o d e lo ca liza ció n e s t á b ie n a ju s t a d o , e l p ro g ra m a m o s t ra rá
d ife re n t e s m e n s a je s e n Nu e va Yo rk y e n Lo n d re s , t e n ie n d o e n cu e n t a la s
d ife re n cia s e n t re e l In g lé s a m e rica n o y e l b rit á n ico . ¿ Có m o p u e d e u n p ro g ra m a
in t e rn a cio n a liza d o id e n t ifica r e l id io m a y la re g ió n d e s u s u s u a rio s fin a le s ? Es
s e n cillo , re firie n d o s e a u n o b je t o Lo c a le .
Un o b je t o Lo c a le e s u n id e n t ifica d o r p a ra u n a co m b in a ció n p a rt icu la r d e id io m a ,
re g ió n y cu lt u ra . S i u n a cla s e va ría s u co m p o rt a m ie n t o d e a cu e rd o co n u n o b je t o
Lo c a le , s e d ice q u e e s s e n s ib le a la lo ca lid a d . Po r e je m p lo , la cla s e
N u m b e rFo rm a t e s s e n s ib le a la lo ca lid a d p o rq u e e l fo rm a t e o d e n ú m e ro s d e p e n d e
d e la lo ca lid a d . N u m b e rFo rm a t p o d ría d e vo lve r u n n ú m e ro co m o 9 0 2 3 0 0
( Fra n cia ) , o 9 0 2 . 3 0 0 ( Ale m a n ia ) , o 9 0 2 , 3 0 0 ( U. S . ) . Lo s o b je t o s Lo c a le s o n s ó lo
id e n t ifica d o re s . El t ra b a jo re a l, co m o e l fo rm a t e o o la d e t e cció n d e lím it e s d e
p a la b ra s lo re a liza n lo s m é t o d o s d e la s cla s e s s e n s ib le s a la lo ca lid a d .
En e s t a le cció n a p re n d e rá s có m o t ra b a ja r co n o b je t o s Lo c a le , y có m o re a liza r la s
s ig u ie n t e s t a re a s :

Crear un Objeto Locale

Cu a n d o s e cre a u n o b je t o Lo c a le , s e d e b e e s p e cífica r u n có d ig o d e
id io m a y u n có d ig o d e p a ís . Exis t e u n t e rce r p a rá m e t ro o p cio n a l, la
va ria n t e .

Identificar Localidades Disponibles

La s cla s e s s e n s ib le s a la lo ca lid a d s ó lo s o p o rt a n cie rt a s d e fin icio n e s d e


lo ca lid a d e s . Es t a s e cció n m u e s t ra có m o d e t e rm in a r q u e d e fin ic io n e s d e
lo c a lid a d e s e s t á n s o p o rt a d a s .

La Localidad por Defecto

S i n o s e a s ig n a e xp lícit a m e n t e u n o b je t o Lo c a le a u n o b je t o s e n s ib le a la
lo ca lid a d , s e u t iliza rá la lo ca lid a d p o r d e fe ct o . Afo rt u n a d a m e n t e , s e
p u e d e s e le ccio n a r la Lo c a le p o r d e fe ct o .

El ámbito de una Localidad

En la p la t a fo rm a Ja va , n o s e e s p e cífica u n o b je t o Lo c a le g lo b a l
s e le ccio n a n d o u n a va ria b le d e e n t o rn o a n t e s d e e je cu t a r la a p lia ció n . En
s u lu g a r, s e a s ig n a u n o b je t o Lo c a le a ca d a o b je t o s e n s ib le a la
lo ca lid a d .
Oz it o
Crear un objeto Locale
Pa ra cre a r u n o b je t o Lo c a le , s e e s p e cifica e l có d ig o d e l id io m a y e l có d ig o d e l p a ís .
Po r e je m p lo p a ra e s p e cifica r e l id io m a Fra n cé s y e l p a ís Ca n a d a , s e lla m a rá a l
co n s t ru ct o r d e e s t a fo rm a :

aLocale = new Locale("fr","CA");


En e l s ig u ie n t e e je m p lo , cre a m o s o b je t o s Lo c a le p a ra e l id io m a In g lé s e n U. S . A. y
Gra n Bre t a ñ a :

bLocale = new Locale("en","US");


cLocale = new Locale("en","GB");
El p rim e r a rg u m e n t o e s e l có d ig o d e l le n g u a je , u n p a r d e le t ra s m in ú s cu la s
co n fo rm e s a la n o rm a IS O- 6 3 9 . Pu e d e s e n co n t ra r u n a lis t a co m p le t a d e có d ig o s
IS O- 6 3 9 e n : h t t p : / / www. ics . u ci. e d u / p u b / ie t f/ h t t p / re la t e d / is o 6 3 9 . t xt

El s e g u n d o a rg u m e n t o e s e l có d ig o d e p a ís . Qu e co n s is t e e n d o s le t ra s m a yú s cu la s ,
co n fo rm e a la n o rm a IS O3 1 6 6 . Pu e d e s e n co n t ra r u n co p ia d e e s t a n o rm a
e n : h t t p : / / www. ch e m ie . fu - b e rlin . d e / d ive rs e / d o c/ IS O_ 3 1 6 6 . h t m l

Ad e m á s , s i n e ce s it a s d is t in g u ir t o d a vía m á s t u Lo c a le , p u e d e s e s p e cifica r u n t e rce r


p a rá m e t ro , lla m a d o có d ig o d e va ria n t e . S i e xis t e n va ria cio n e s e n e l id io m a u t iliza d o
d e n t ro d e l m is m o p a ís , p o d ría s q u e re r e s p e cifica r u n a va ria n t e . Po r e je m p lo , e n e l
S u r d e Es t a d o s Un id o s , la g e n t e s u e le d e cie r "y'a ll, " cu a n d o e n e l No rt e d ice n "yo u
a ll. " S e p o d ría cre a r d ife re n t e s o b je t o s Lo ca le d e e s t a fo rm a :

nLocale = new Locale("en", "US" ,"NORTH");


sLocale = new Locale("en", "US", "SOUTH");
Lo s có d ig o s d e va ria n t e n o co n fo rm a n u n e s t á n d a rd . S o n a rb it ra rio s y e s p e cífico s
d e la a p lica ció n . S i s e cre a n o b je t o s Lo c a le co n lo s có d ig o s d e va ria n t e NORTH y
S OUTH, co m o e n e l e je m p lo a n t e rio r, s ó lo n u e s t ra a p lica ció n s a b rá co m o t ra t a rlo s .
No rm a lm e n t e , s e e s p e cífica n có d ig o s d e va ria n t e p a ra id e n t ifica r d ife re n cia s
cu a s a d a s p o r la p la t a fo rm a d e o rd e n a d o r. Po r e je m p lo , la s d ife re n cia s d e fu e n t e s
p o d ría fo rza r a u t iliza r ca ra ct e re s d ife re n t e s e n Win d o ws y e n UNIX. S e p o d ría
d e fin ir lo s o b je t o s Lo c a le co n e s t o s có d ig o s d e va ria n t e :

xLocale = new Locale("de", "DE" ,"UNIX");


yLocale = new Locale("de", "DE", "WINDOWS");
El có d ig o d e p a ís y e l có d ig o d e va ria n t e s o n o p cio n a le s . S e p o d ría cre a r u n o b je t o
Lo c a le p a ra e l id io m a In g lé s d e e s t a fo rm a :

enLocale = new Locale("en", "");


S in e m b a rg o , s i s e o m it e e l có d ig o d e p a ís , la a p lica ció n n o p o d rá a d a p t a rs e a la s
d ife re n cia s re g io n a le s d e l id io m a . Po r e je m p lo , u n p ro g ra m a q u e u t ilice e l o b je t o
e n Lo c a le n o p o d rá m o s t ra la p a la b ra "co lo u r" e n U. K. y la p a la b ra "co lo r" e n
U. S . A.
Po r co n ve n ie n cia , la cla s e Lo c a le p ro p o rcio n a co n s t a n t e s p a ra a lg u n o s id io m a s y
p a is e s . Po r e je m p lo , s e p u e d e cre a r u n o b je t o Lo c a le e s p e cifica n d o la s co n s t a n t e s
JAP AN ES E o JAP AN . Lo s o b je t o s cre a d o s p o r la s d o s s e n t e n cia s s ig u ie n t e s s o n
e q u iva le n t e s :

j1Locale = Locale.JAPAN;
j2Locale = new Locale("ja", "JA");
Cu a n d o s e e s p e cífica u n a co n s t a n t e d e id io m a , la p o rció n d e l p a ís d e l o b je t o
Lo c a le n o s e d e fin e . La s s ig u ie n t e s s e n t e n cia s cre a n o b je t o s Lo c a le e q u iva le n t e s :

j3Locale = Locale.JAPANESE;
j4Locale = new Locale("ja", "");

Oz it o
Identificar las Localidades Disponibles
S e p u e d e cre a r u n o b je t o Lo c a le co n cu a lq u ie r co m b in a ció n d e có d ig o s vá lid o s d e
id io m a y d e p a ís , p e ro e s o n o s ig n ifica q u e s e p u e d a u t iliza r. Re cu e rd a , u n o b je t o
Lo c a le e s s ó lo u n id e n t ifica d o r. El o b je t o Lo c a le s e p a s a a o t ro s o b je t o s q u e
re a liza n e l t ra b a jo ve rd a d e ro . Es t o s o t ro s o b je t o s , q u e lla m a m o s s e n s ib le s a la
lo ca lid a d , n o s a b e n co m o t ra t a r t o d a s la s p o s ib le s d e fin icio n e s d e Lo c a le .
Pa ra e n co n t ra r lo s t ip o s d e d e fin icio n e s d e Lo c a le q u e re co n o ce u n a cla s e s e n s ib le
a la lo ca lid a d , s e lla m a a l m é t o d o g e t Av a ila b le Lo c a le s . Po r e je m p lo , p a ra
e n co n t ra r la s d e fin icio n e s d e lo ca lid a d e s s o p o rt a d a s p o r la cla s e D a t e Fo rm a t , s e
p o d ría e s crib ir u n a ru t in a co m o é s t a :

import java.util.*;
import java.text.*;

public class Available {

static public void main(String[] args) {

Locale list[] = DateFormat.getAvailableLocales();

for (int i = 0; i < list.length; i++) {


System.out.println
(list[i].getLanguage() + " " + list[i].getCountry());
}
}
}

Oz it o
La Localidad por Defecto
S i n o s e a s ig n a u n o b je t o Lo c a le a u n o b je t o s e n s ib le a la lo ca lid a d , d e p e n d e d e l
o b je t o Lo c a le d e vu e lt o p o r e l m é t o d o g e t De fa u lt . S e p u e d e s e le ccio n a r e l o b je t o
Lo c a le p o r d e fe ct o d e d o s fo rm a s :
● S e le ccio n a r la s p ro p ie d a d e s d e l s is t e m a u s e r. la n g u a g e y u s e r. re g io n . La
cla s e Lo c a le s e le ccio n a e l va lo r p o r d e fe ct o re cu p e ra n d o lo s va lo re s d e e s t a s
p ro p ie d a d e s .
● Lla m a n d o a l m é t o d o s e t D e fa u lt .

El s ig u ie n t e e je m p lo m u e s t ra e s t a s d o s t é cn ica s d e s e le ccio n a r e l o b je t o Lo c a le
p o r d e fe ct o :

import java.util.*;

public class DefaultLocale {

static public void main(String[] args) {

Properties props = System.getProperties();


props.put("user.language", "ja");
props.put("user.region", "JA");
System.setProperties(props);

Locale aLocale = Locale.getDefault();


System.out.println(aLocale.toString());

aLocale = new Locale("fr", "FR");


Locale.setDefault(aLocale);
System.out.println(aLocale.toString());
}
}
Aq u í e s t á la s a lid a d e e s t e p ro g ra m a :

ja_JA
fr_FR
No d e p e n d a s d e la lo ca lid a d p o r d e fe ct o a m e n o s q u e la s e le ccio n e s a n t e s co n u n o
d e lo s d o s m é t o d o s m o s t ra d o s a rrib a . S i n o lo h a ce s p o d ría s e n co n t ra rt e q u e la
lo ca lid a d p o r d e fe ct o d e vu e lt a p o r g e t De fa u lt p o d ría n o s e r la m is m a e n t o d a s la s
p la t a fo rm a s Ja va .

Oz it o
El Ámbito de la Localidad
No e xis t e a lg o p a re cid o a u n a Lo ca lid a d g lo b a l e n e l le n g u a je d e p ro g ra m a ció n
Ja va . S e p u e d e e s p e cifica r u n a lo ca lid a d p o r d e fe ct o , co m o s e d e s crib ió e n la
p á g in a a n t e rio r, p e ro n o e s n e ce s a rio q u e s e u t ilice la m is m a lo ca lid a d a lo la rg o d e
t o d o e l p ro g ra m a . S i s e d e s e a , s e p u d e a s ig n a r u n o b je t o Lo c a le d ife re n t e p a ra
ca d a o b je t o s e n s ib le a la lo ca lid a d d e n u e s t ro p ro g ra m a . Es t e e s e l ca s o cu a n d o s e
e s crib e n a p lica cio n e s m u lt i- id io m a , q u e p u e d e n m o s t ra r in fo rm a ció n e n d is t in t o s
id io m a s . Pe ro p a ra la m a yo ría d e la s a p lica cio n e s s e s e le cio n a e l m is m o o b je t o
Lo c a le p a ra t o d o s lo s o b je t o s s e n s ib le s a la lo ca lid a d .
La p ro g ra m a ció n d is t rib u id a a lca n za a lg u n a s co t a s in t e re s a n t e s . Po r e je m p lo ,
s u p o n g a m o s q u e h e m o s d is e ñ a d o u n a a p lica ció n s e rvid o r q u e re cib e p e t icio n e s d e
clie n t e s d e d is t in t o s p a is e s . S i e l o b je t o Lo c a le d e ca d a clie n t e e s d ife re n t e , ¿ cu a l
d e b e ría s e r e l o b je t o Lo c a le d e l S e rvid o r? Qu izá s e l s e rvid o r s e a m u lt i- h ilo , y ca d a
t h re a d s e le ccio n e s u o b je t o Lo c a le p a ra lo s s e rvicio s d e s u clie n t e . O q u izá s t o d o s
lo s d a t o s p a s a d o s e n t re e l s e rvid o r y lo clie n t e s d e b e ría n s e r in d e p e n d ie n t e s d e la
lo ca lid a d .
¿ Qu é d is e ñ o d e b e ría m o s u t iliza r? La re s p u e s t a d e p e n d e d e lo s re q u e rim ie n t o s
e s p e cífico s d e la a p lica ció n , s i e s t á n in vo lu cra d o s s is t e m a s le g a le s , y d e lo
co m p le jo q u e s e q u ie ra e l s is t e m a . Te o rica m e n t e , s e p o d ría n s e le cio n a r t o d o s lo s
o b je t o s s e n s ib le s a la lo ca lid a d t a n t o e n e l clie n t e co m o e n e l s e rvid o r co n u n
o b je t o Lo c a le d ife re n t e . Po r s u p u e s t o , e s t o n o p o d ría s e r e n la p rá ct ica , p e ro
d e m u e s t ra la fle xib ilid a d d e lo s o b je t o s Lo c a le e n e l le n g u a je d e p ro g ra m a ció n
Ja va .

Oz it o
Aislar los objetos específicos de la localidad en un
ResourceBundle
Lo s d a t o s e s p e cífico s d e la lo ca lid a d d e b e n s e r cre a d o s d e a cu e rd o a la s
co n ve n cio n e s d e l id io m a y la re g ió n d e l u s u a rio fin a l. El t e xt o m o s t ra d o p o r u n
in t e rfa ce d e u s u a rio e s e l e je m p lo m á s o b vio d e d a t o s e xp e cífico s d e la lo ca lid a d .
Po r e je m p lo , u n a a p lica ció n co n u n b o t ó n "Ca n ce l" e n lo s Es t a d o s Un id o s , t e n d rá
u n b o t ó n "Ab b re ch e n " e n Ale m a n ía . En o t ro s p a is e s e s t e b o t ó n t e n d rá o t ra s
e t iq u e t a s . Ob via m e n t e , t u n o q u ie re s co d ifica r la e t iq u e t a d e e s t e b o t ó n . ¿ No s e ría
b o n it o p o d e r o b t e n e r a u t o m á t ica m e n t e la e t iq u e t a co rre ct a p a ra u n a Lo ca lid a d
d a d a ? Afo rt u n a d a m e n t e , s e p u e d e , a s ila n d o lo s o b je t o s e s p e cífico s d e la lo ca lid a d
e n u n Re s o u rc e Bu n d le .
En e s t a le cció n , a p re n d e rá s có m o cre a r, ca rg a r y a cce d e r a o b je t o s
Re s o u rc e Bu n d le . S i t ie n e s p ris a p o r e xa m in a r a lg ú n có d ig o fu e n t e , a d e la n t a t e y
ch e q u e a la s d o s ú lt im a s le ccio n e s . Lu e g o p o d rá s vo lve r a la s d o s p rim e ra s p a ra
o b t e n e r a lg u n a in fo rm a ció n co n ce p t u a l s o b re lo s o b je t o s Re s o u rc e Bu n d le .

La clase ResourceBundle

Lo s o b je t o s Re s o u rc e Bu n d le co n t ie n e n o b je t o s e s p e cífico s d e la
lo ca lid a d . Cu a n d o s e n e ce s it a u n o d e e s t o s o b je t o s , s e b u s ca e n e l
Re s o u rc e Bu n d le , q u e d e vu e lve e l o b je t o q u e co rre s p o n d e co n la
Lo ca lid a d d e l u s u a rio fin a l. En e s t a s e cció n , e xp lica re m o s co m o u n
Re s o u rc e Bu n d le s e re la cio n a co n u n a Lo c a le . Ta m b ié n d e s crib ire m o s
la s s u b cla s e s d e Re s o u rc e Bu n d le , y cu a n d o s e p u e d e n u t iliza r.

Preparar el uso de un ResourceBundle

An t e s d e cre a r y ca rg a r o b je t o s Re s o u rc e Bu n d le , s e d e b e ría p la n ifica r


u n p o co . Prim e ro , id e n t ifica r lo s o b je t o s e s p e cífico s d e la lo ca lid a d d e
n u e s t ro p ro g ra m a . Lu e g o , o rg a n iza r e s t o s o b je t o s e n ca t e g o ria s y
a lm a ce n a rlo s e n d ife re n t e s o b je t o s Re s o u rc e Bu n d le .

Utilizar Ficheros de Propiedades

S i n u e s t ra a p lica ció n co n t ie n e o b je t o s S t rin g q u e n e ce s it a n s e r


t ra d u cid o s a d ife re n t e s id io m a s , d e b e ría m o s a lm a ce n e r e s t o s o b je t o s
S t rin g e n u n P ro p e rt y Re s o u rc e Bu n d le , q u e e s t á co n s t it u id o p o r u n
co n ju n t o d e fich e ro s d e p ro p ie d a d e s . Co m o lo s fich e ro s d e p ro p ie d a d e s
s o n s e n cillo s fich e ro s d e t e xt o , p u e d e n s e r cre a d o s y m a n t e n id o s p o r t u s
t ra d u ct o re s . No n e ce s it a s ca m b ia r e l có d ig o fu e n t e . En e s t a s e cció n
a p re n d e rá s có m o s e le ccio n a r lo s fich e ro s d e p ro p ie d a d e s q u e co n s t it u ye n
u n P ro p e rt y Re s o u rc e Bu n d le .
Utilizar un ListResourceBundle

La cla s e Lis t Re s o u rc e Bu n d le , q u e e s u n a s u b cla s e d e


Re s o u rc e Bu n d le , m a n e ja o b je t o s e s p e cífico s d e la lo ca lid a d co n u n a
lis t a . Un Lis t Re s o u rc e Bu n d le e s t á co n s t it u id o p o r u n fich e ro d e cla s e ,
lo q u e s ig n ifica q u e s e d e b e rá co d ifica r y co m p ila r u n n u e vo fich e ro
fu e n t e ca d a ve z q u e q u e rra m o s s o p o rt a r u n a n u e va lo ca lid a d . Po r lo
t a n t o , n o s e d e b e ría u t iliza r u n Lis t Re s o u rc e Bu n d le p a ra a is la r o b je t o s
S t rin g q u e d e b a n s e r t ra d u cid o s a o t ro s id io m a s . Pa ra a is la r t e xt o
t ra d u cib le , s e d e b e ría u t iliza r u n P ro p e rt y Re s o u rc e Bu n d le p o rq u e e s t á
co n s t it u id o p o r u n co n ju n t o d e fich e ro s d e p ro p ie d a d e s e d it a b le s . S in
e m b a rg o , lo s o b je t o s Lis t Re s o u rc e Bu n d le s o n ú t ile s , p o rq u e a l
co n t ra rio q u e lo s fich e ro s d e p ro p ie d a d e s , p u e d e n a lm a ce n a r cu a lq u ie r
t ip o d e o b je t o e s p e cífico d e la lo ca lid a d . Pa s a n d o a t ra vé s d e u n
p ro g ra m a d e e je m p lo , e n e s t a s e cció n ve re m o s có m o u t iliza r u n
Lis t Re s o u rc e Bu n d le .

Oz it o
La clase ResourceBundle
Cómo se relaciona un ResourceBundle con una Locale

Co n ce p t u a lm e n t e h a b la n d o , u n Re s o u rc e Bu n d le e s u n co n ju n t o d e s u b cla s e s
re la cio n a d a s q u e co m p a rt e n e l m is m o n o m b re b a s e . La s ig u ie n t e lis t a m u e s t ra u n
co n ju n t o d e s u b cla s e s re la cio n a d a s . El n o m b re b a s e e s Bu t t o n La b e l. Lo s
ca ra ct e re s q u e s ig u e n a l n o m b re b a s e s o n e l có d ig o d e l id io m a , e l có d id o d e l p a ís y
e l có d ig o d e la va ria n t e d e u n Lo c a le . Po r e je m p lo , Bu t t o n La b e l_ e n _ GB
co rre s p o n d e co n la lo ca lid a d e s p e cífica d a p o r e l có d ig o d e l id io m a In g lé s , ( e n ) y e l
có d ig o d e l p a ís p a ra Gra n Bre t a ñ a ( GB) .

ButtonLabel
ButtonLabel_de
ButtonLabel_en_GB
ButtonLabel_fr_CA_UNIX
Pa ra s e le ccio n a r e l Re s o u rc e Bu n d le a p ro p ia d o , s e lla m a a l m é t o d o g e t Bu n d le .
Lo s s ig u ie n t e s e je m p lo s e le ccio n a n e l Bu t t o n La b e l Re s o u rc e Bu n d le p a ra
lo ca lid a d q u e co rre s p o n d e n co n e l id io m a Fra n cé s , e l p a ís Ca n a d a y la p la t a fo rm a
UNIX:

Locale currentLocale = new Locale("fr", "FR", "UNIX");

ResourceBundle introLabels =
ResourceBundle.getBundle("ButtonLabel", currentLocale);
S i n o e xis t e u n a cla s e Re s o u rc e Bu n d le p a ra la lo ca lid a d e s p e cifica d a . g e t Bu n d le
t ra t a d e e n co n t ra r la co rre s p o n d e n cia m á s ce rca rn a . Po r e je m p lo , s i n o e xis t ie ra
u n a cla s e p a ra Bu t t o n La b e l_ fr_ CA_ UN I X, g e t Bu n d le b u s ca rá la s cla s e s e n e l
s ig u ie n t e o rd e n :

ButtonLabel_fr_CA_UNIX
ButtonLabel_fr_CA
ButtonLabel_fr
ButtonLabel
S i g e t Bu n d le n o e n cu e n t ra u n a co rre s p o n d e n cia e n la lis t a a n t e rio r, in t e n t a rá u n a
b ú s q u e d a s im ila r u t iliza n d o la lo ca lid a d p o r d e fe ct o . S i vu e lve a fa lla r, g e t Bu n d le
la n za rá u n a Mis s in g Re s o u rc e Ex c e p t io n .
S ie m p re s e d e b e p ro p o rcio n a u n a cla s e b a s e s in s u fijo s . En e l e je m p lo a n t e rio r, s i
e xis t ie ra u n a cla s e lla m a d a Bu t t o n La b e l, g e t Bu n d le n o la n za ría
Mis s in g Re s o u rc e Ex c e p t io n .

Las subclases ListResourceBundle y PropertyResourceBundle


La cla s e a b s t ra ct a Re s o u rc e Bu n d le t ie n e d o s s u b cla s e s : Lis t Re s o u rc e Bu n d le y
P ro p e rt y Re s o u rc e Bu n d le . La s u b cla s e e le g id a d e p e n d e d e có m o e s t é n
lo ca liza d o s lo s d a t o s .
Un P ro p e rt y Re s o u rc e Bu n d le e s t á co n s t it u id o p o r u n o o m á s fich e ro s d e
p ro p ie d a d e s . S e d e b e ría n a lm a ce n a r o b je t o s S t rin g t ra d u cib le s e n fich e ro s d e
p ro p ie d a d e s . Có m o lo s fich e ro s d e p ro p ie d a d e s s o n s ó lo fich e ro s d e t e xt o y n o
fo rm a n p a rt e d e l có d ig o fu e n t e Ja va , p u e d e n s e r cre a d o s y a ct u a liza d o s p o r lo s
t ra d u ct o re s . No s e re q u ie re e xp e rie n cia e n p ro g ra m a ció n . Un t ra d u ct o r p u e d e
a ñ a d ir s o p o rt e p a ra u n a lo ca lid a d a d icio n a l co n s ó lo cre a r u n n u e vo fich e ro d e
p ro p ie d a d e s . No s e n e ce s it a u n n u e vo fich e ro d e cla s e . Lo s fich e ro s d e p ro p ie d a d e s
s ó lo p u e d e n co n t e n e r va lo re s p a ra o b je t o s S t rin g . S i n e ce s it a m o s o t ro s t ip o s d e
o b je t o s , s e d e b e u t iliza r u n Lis t Re s o u rc e Bu n d le . Co n s t ru ir u n Re s o u rce Bu n d le
co n Fich e ro s d e Pro p ie d a d e s t e m u e s t ra co m o u t iliza r P ro p e rt y Re s o u rc e Bu n d le .

La cla s e Lis t Re s o u rc e Bu n d le m a n e ja re cu rs o s co n u n a lis t a . Ca d a


Lis t Re s o u rc e Bu n d le e s t á co n s t it u id o p o r u n fich e ro d e cla s e . S e p u e d e a lm a ce n a r
cu a lq u ie r o b je t o e s p e cífico d e la lo ca lid a d e n u n Lis t Re s o u rc e Bu n d le . Pa ra a ñ a d ir
s o p o rt e p a ra n u e va s lo ca lid a d e s , s e d e b e cre a r o t ro fich e ro fu e n t e , y co m p ila rlo .
Co m o lo s t ra d u ct o re s n o rm a lm e n t e n o s o n p ro g ra m a d o re s , n o s e d e b e ría n
a lm a ce n a r o b je t o s S t rin g q u e re q u ie ra n t ra d u cció n e n u n Lis t Re s o u rc e Bu n d le .
Ut iliza r u n Lis t Re s o u rce Bu n d le co n t ie n e có d ig o d e e je m p lo q u e d e p u e d e re s u lt a r
ú t il.
La cla s e Re s o u rc e Bu n d le e s fle xib le . S i p rim e ro d e cid im o s ca rg a r n u e s t ro s
o b je t o s S t rin g s e s p e cífico s d e la lo ca lid a d e n u n Lis t Re s o u rc e Bu n d le , y lu e g o
d e cid im o s u t iliza r u n P ro p e rt y Re s o u rc e Bu n d le , e l im p a ct o e n n u e s t ro có d ig o
s e rá lim it a d o . Po r e je m p lo , la s ig u ie n t e lla m a d a a g e t Bu n d le re cu p e ra rá u n
Re s o u rc e Bu n d le p a ra la lo ca lid a d a p ro p ia d a , t a n t o s i Bu t t o n La b e l e s t á
co n s t it u id o p o r u n a cla s e o p o r u n fich e ro d e p ro p ie d a d e s :

ResourceBundle introLabels =
ResourceBundle.getBundle("ButtonLabel", currentLocale);

Parejas Clave-Valor

Lo s o b je t o s Re s o u rc e Bu n d le co n t ie n e n u n a rra y d e p a re ja s cla ve - va lo r. La cla ve ,


q u e d e b e s e r u n S t rin g , e s lo q u e s e e s p e cifica rá cu a n d o q u e rra m o s re cu p e ra r e l
va lo r d e s d e e l Re s o u rc e Bu n d le . El va lo r e s e l o b je t o e s p e cífico d e la lo ca lid a d . En
e l s ig u ie n t e e je m p lo , la s cla ve s s o n lo s o b je t o s S t rin g "OkKe y" y "Ca n ce lKe y":

class ButtonLabel_en extends ListResourceBundle {


// English version
public Object[][] getContents() {
return contents;
}
static final Object[][] contents = {
{"OkKey", "OK"},
{"CancelKey", "Cancel"},
};
}
Pa ra re cu p e ra r e l S t rin g "OK" d e s d e e l Re s o u rc e Bu n d le , d e b e ría m o s e s p e cifica r la
cla ve a p ro p ia d a cu a n d o lla m e m o s a g e t S t rin g :

String okLabel = ButtonLabel.getString("OkKey");


El e je m p lo p re ce d e n t e e s m u y s im p le , p o rq u e lo s va lo re s S t rin g e s t á n co d ifica d o s
e n e l có d ig o fu e n t e . Es t o n o e s u n a b u e n a p rá ct ica , p o rq u e t u s t ra d u ct o re s
n e ce s it a n t ra b a ja r co n fich e ro s d e p ro p ie d a d e s q u e e s t á n s e p a ra d o s d e l có d ig o
fu e n t e .
Un fich e ro d e p ro p ie d a d e s co n t ie n e p a re ja s d e cla ve - va lo r. La cla ve e s t á e n e l la d o
izq u ie d o d e l s ig n o ig u a l y e l va lo r e n e l la d o d e re ch o . Ca d a p a re ja e s t á e n u n a lín e a
in d e p e n d ie n t e . La s cla ve s s ó lo p u e d e n e s t a r re p re s e n t a d a s p o r o b je t o s S t rin g . El
s ig u ie n t e e je m p lo m u e s t ra e l co n t e n id o d e u n fich e ro d e p ro p ie d a d e s lla m a d o
Bu t t o n La b e l. p ro p e rt ie s :

OkKey = OK
CancelKey = Cancel

Oz it o
Preparar para Utilizar un ResourceBundle
Identificar los Objetos Específicos de la Localidad

S i la a p lica ció n t ie n e u n in t e rfa ce d e u s u a rio , co n t e n d rá m u ch o s o b je t o s e s p e cífico s


d e la lo ca lid a d . De b e ría m o s e m p e za r le ye n d o e l có d ig o y b u s cá n d o o b je t o s q u e
va rie n co n la lo ca lid a d . La lis t a p o d ría in clu ir o b je t o s e je m p la riza d o s d e la s
s ig u ie n t e s cla s e s :
● S t rin g

● Co m p o n e n t

● Gra p h ic s

● Im age

● Co lo r

● Au d io Clip

Ob s e rva rá s q u e e s t á lis t a n o co n t ie n e o b je t o s q u e re p re s e n t e n n ú m e ro s , fe ch a s ,
h o ra s o m o n e d a s . El fo rm a t o d e e s o s o b je t o s va ría co n la lo ca lid a d p e ro n o a s í lo s
p ro p io s o b je t o s . Po r e je m p lo , s e fo rm a t e a u n o b je t o D a t e d e a cu e rd o a la
lo ca lid a d , p e ro s e s ig u e u t iliza n d o e l m is m o o b je t o D a t e s in im p o rt a r la lo ca lid a d .
En ve z d e a is la r e s t o s o b je t o s e n u n Re s o u rc e Bu n d le , s e d e b e n fo rm a t e a r co n
cla s e s e s p e cia le s d e fo rm a t e o s e n s ib le a la lo ca lid a d . Ve re m o s co m o h a ce r e s t o e n
Fo rm a t e o d e Fe ch a s y Ho ra s .

En g e n e ra l, lo s o b je t o s a lm a ce n a d o s e n u n Re s o u rc e Bu n d le e s t á n p re d e fin id o s y
s e ve n d e n co n e l p ro d u ct o . Es t o s o b je t o s n o s e m o d ifica n m ie n t ra s e l p ro g ra m a s e
e s t á e je cu t a n d o . Po r e je m p lo , s e d e b e ría a lm a ce n a r le e t iq u e t a d e u n Me n u e n u n
Re s o u rc e Bu n d le p o rq u e e s e s p e cífico d e la lo ca lid a d , y n o ca m b ia d u ra n t e la
s e s ió n d e l p ro g ra m a . S in e m b a rg o , n o s e d e b e ría n a is la r e n u n Re s o u rc e Bu n d le
lo s o b je t o s S t rin g in t ro d u cid o s p o r e l u s u a rio fin a l e n u n Te x t Fie ld . Lo s d a t o s d e
e s t e e s t ilo p o d ría n va ria r d e d ía a d ía . S o n e s p e cífico s d e la s e s ió n d e l p ro g ra m a ,
n o d e la lo ca lid a d e n q u e s e e s t á e je cu t a n d o e l p ro g ra m a .
No rm a lm e n t e , la m a yo ría d e lo s o b je t o s q u e s e n e ce s it a a is la r e n u n
Re s o u rc e Bu n d le s o n o b je t o s S t rin g . S in e m b a rg o , n o t o d o s lo s o b je t o s S t rin g
s o n e s p e cífico s d e la Lo ca lid a d . Po r e je m p lo , s i u n S t rin g e s u n e le m e n t o d e
p ro t o co lo u t iliza d o e n u n p ro ce s o d e in t e r- co m u n ica ció n , n o n e ce s it a s e r lo ca liza d o
p o rq u e e l u s u a rio fin a l n u n ca lo ve rá . La d e cis ió n d e cu a n d o lo ca liza r a lg u n o s
o b je t o s S t rin g n o s ie m p re e s t á cla ra . Lo s fich e ro s LOG s o n u n b u e n e je m p lo . S i u n
fich e ro Lo g e s e s crit o p o r u n p ro g ra m a y le íd o p o r o t ro , a m b o s p ro g ra m a s e s t á n
u t ilza n d o e l fich e ro Lo g co m o u n b u ffe r d e co m u n ica ció n . S u p o n g a m o s q u e e l
u s u a rio fin a l ch e q u e a o ca s io n a lm e n t e e l co n t e n id o d e e s t e fich e ro . ¿ De b e ría e s t a r
lo ca liza d o e s t e fich e ro Lo g ? Po r o t ro la d o , s i e l fich e ro e s ra ra m e n t e ch e q u e a d o p o r
lo s u s u a rio s fin a le s , e l co s t e d e la t ra d u ció n p o d ría n o m e re ce r la p e n a . La d e cis ió n
d e lo ca liza r e s t e fich e ro Lo g d e p e n d e d e u n n ú m e ro d e fa ct o re s : d is e ñ o d e l
p ro g ra m a , fá cilid a d d e u t iliza ció n , co s t e d e la t ra d u ció n y s o p o rt a b ilid a d .
Organizar Objetos ResourceBundle

Pu e d e s o rg a n iza r t u s o b je t o s Re s o u rc e Bu n d le ca rg a n d o ca d a u n o d e e llo s e n u n a
ca t e g o ría d ife re n t e d e o b je t o s . Po r e je m p lo , p o d ría m o s q u e re r ca rg a r t o d o s la s
e t iq u e t a s d e Bu t t o n d e n t ro d e u n Re s o u rc e Bu n d le lla m a d a
Bu t t o n La b e ls Bu n d le . Ca rg a r lo s o b je t o s re la cio n a d o s e n d ife re n t e s o b je t o s
Re s o u rc e Bu n d le t ie n e va ria s ve n t a ja s :
● El có d ig o e s fá cil d e le e r y d e m a n t e n e r.

● Re cu p e ra r u n o b je t o d e l Re s o u rc e Bu n d le e s m á s rá p id o s i e s t e co n t ie n e u n
p e q u e ñ o n ú m e ro d e o b je t o s .
● Lo s Tra d u ct o re s e n co n t ra rá n m á s s e n cillo e l t ra b a ja r co n fich e ro s d e
p ro p ie d a d e s m á s p e q u e ñ o s .
La m a yo ría d e lo s d a t o s e s p e cífico s d e la lo ca lid a d co n s is t e n e n o b je t o s S t rin g . S i
e s t o s o b je t o s n e ce s it a n s e r t ra d u cid o s , s e a lm a ce n a n e n u n o b je t o
Re s o u rc e Bu n d le q u e e s t á co n s t it u id o p o r fich e ro s d e p ro p ie d a d e s . S i s e u t iliza n
fich e ro s d e p ro p ie d a d e s , lo s t a d u ct o re s p u e d e n a ñ a d ir s o p o rt e p a ra id io m a s
a d icio n a le s cre a n d o n u e vo s fich e ro s d e p ro p ie d a d e s .

Oz it o
Construir un ResourceBundle con Ficheros de
Propiedades
Es t a s e cció n p a s e a a t ra vé s d e u n p ro g ra m a d e e je m p lo lla m a d o
P ro p e rt ie s D e m o . El có d ig o fu e n t e d e l p ro g ra m a e s t á e n Pro p e rt ie s De m o . ja va .
Ta m b ié n p o d ría s e n co n t ra r ú t il e xa m in a r la s a lid a g e n e ra d a p o r e s t e p ro g ra m a .

1. Crear el Fichero de Propiedades por defecto

Un fich e ro d e p ro p ie d a d e s e s u n s e n cillo fich e ro d e t e xt o . Lo s fich e ro s d e


p ro p ie d a d e s s e p u e d e n cre a r y m a n t e n e r co n u n s e n cillo e d it o r d e t e xt o .
S ie m p re s e d e b e cre a r u n fich e ro d e p ro p ie d a d e s p o r d e fe ct o . El n o m b re d e e s t e
fich e ro e m p ie za co n e l n o m b re b a s e d e l Re s o u rc e Bu n d le y t e rm in a co n e l s u fijo
. p ro p e rt ie s . En e l p ro g ra m a P ro p e rt ie s D e m o , e l n o m b re b a s e e s La b e ls Bu n d le .
Po r lo t a n t o , e l fich e ro d e p ro p ie d a d e s p o r d e fe ct o s e lla m a
La b e ls Bu n d le . p ro p e rt ie s . Es t e fich e ro co n t ie n e la s s ig u ie n t e s lín e a s :

# This is the default LabelsBundle.properties file


s1 = computer
s2 = disk
s3 = monitor
s4 = keyboard
En e s t e fich e ro s e p u e d e o b s e rva r q u e la s lín e a s d e co m e n t a rio s e m p ie za n co n u n a
a lm o h a d illa ( # ) . La s o t ra s lín e a s co n t ie n e n p a re ja s d e cla ve - va lo r. La s cla ve s e s t á n
e n e l la d o izq u ie rd o d e l s ig n o ig u a l y lo s va lo re s e n e l la d o d e re ch o . Po r e je m p lo ,
"s 2 " e s la cla ve q u e co rre s p o n d e co n e l va lo r "d is k". Es t a cla ve e s a rb it ra ria .
Po d ría m o s h a b e rla lla m a d o a lg o co m o "m s g 5 " o "d is kID. ", p o r e je m p lo . S in
e m b a rg o , u n a ve z d e fin id a , la cla ve n o d e b e ría ca m b ia r p o rq u e e s re fe re n cia d a
d e n t ro d e l có d ig o fu e n t e . De e ch o , cu a n d o lo s lo ca liza d o re s cre a n u n n u e vo fich e ro
d e p ro p ie d a d e s p a ra a co m o d a r id io m a s a d icio n a le s , t ra d u cirá n lo s va lo re s a
d ife re n t e s id io m a s , p e ro n o la s cla ve s .

2. Crear Ficheros de Propiedades Adiciones si son Necearios

Pa ra s o p o rt a r u n a n u e va Lo c a le , lo s lo ca liza d o re s cre a rá n u n n u e vo fich e ro d e


p ro p ie d a d e s q u e co n t e n g a lo s va lo re s t ra d u cid o s . No s e n e ce s it a ca m b ia r e l có d ig o
fu e n t e , ya q u e e l p ro g ra m a re fe re n cia la s cla ve s , n o lo s va lo re s .
Po r e je m p lo , p a ra a ñ a d ir s o p o rt e p a ra e l id io m a Ale m á n , lo s lo ca liza d o re s t e n d rá n
q u e t ra d u cir lo s va lo re s d e La b e ls Bu n d le . p ro p e rt ie s y s it u a rlo s e n u n fich e ro
lla m a d o La b e ls Bu n d le _ d e _ D E. p ro p e rt ie s . Ob s e rva q u e e l n o m b re d e e s t e
fich e ro , a l ig u a l q u e e l fich e ro p o r d e fe ct o , e m p ie za co n e l n o m b re b a s e
La b e ls Bu n d le y t e rm in a co n e l s u fijo . p ro p e rt ie s . S in e m b a rg o , co m o e l fich e ro
s e h a cre a d o p a ra u n a lo ca lid a d e s p e cífica , e l n o m b re b a s e e s s e g u id o p o r e l có d ig o
d e l id io m a ( d e ) y e l có d ig o d e l p a ís ( D E) . El co n t e n id o d e
La b e ls Bu n d le _ d e _ D E. p ro p e rt ie s e s é s t e :

# This is the LabelsBundle_de_DE.properties file


s1 = Computer
s2 = Platte
s3 = Monitor
s4 = Tastatur
He m o s la n za d o t re s fich e ro s d e p ro p ie d a d e s co n e l p ro g ra m a d e e je m p lo
P ro p e rt ie s D e m o :

LabelsBundle.properties
LabelsBundle_de_DE.properties
LabelsBundle_fr.properties

3. Especificar la Localidad

En e l p ro g ra m a P ro p e rt ie s D e m o h e m o s cre a d o lo s o b je t o s Lo c a le d e e s t a fo rm a :

Locale[] supportedLocales = {
new Locale("fr","FR"),
new Locale("de","DE"),
new Locale("en","US")

Locale currentLocale = new Locale("fr","FR");


Pa ra ca d a u n o d e e s t o s o b je t o s h e m o s e s p e cífica d o u n có d ig o d e id io m a y u n
có d ig o d e p a ís . Es t o có d ig o s co rre s p o n d e n co n lo s fich e ro s d e p ro p ie d a d e s cre a d o s
e n lo s p a s o s a n t e rio re s . Po r e je m p lo , e l Lo c a le cre a d o co n lo s có d ig o s d e y D E
co rre s p o n d e co n e l fich e ro La b e ls Bu n d le _ d e _ D E. p ro p e rt ie s .

4. Crear el ResourceBundle

Es t e e s e l p a s o q u e m u e s t ra co m o s e re la cio n a n , la lo ca lid a d , lo s fich e ro s d e


p ro p ie d a d e s y e l Re s o u rc e Bu n d le . Pa ra cre a r e l Re s o u rc e Bu n d le , lla m a m o s a l
m é t o d o g e t Bu n d le , e s p e cifica n d o e l n o m b re b a s e y la lo ca lid a d :

ResourceBundle labels =
ResourceBundle.getBundle("LabelsBundle",currentLocale);
El m é t o d o g e t Bu n d le p rim e ro b u s ca u n fich e ro d e cla s e q u e co rre s p o n d a co n e l
n o m b re b a s e . S i n o p u e d e e n co n t ra r e l fich e ro d e cla s e , co m p ru e b a lo s fich e ro s d e
p ro p ie d a d e s . En e l p ro g ra m a P ro p e rt ie s D e m o , h e m o s co n s t it u id o e l
Re s o u rc e Bu n d le co n fich e ro s d e p ro p ie d a d e s e n ve z d e fich e ro s d e cla s e s .
Cu a n d o e l m é t o d o g e t Bu n d le lo ca liza e l fich e ro d e p ro p ie d a d e s co rre ct o , d e vu e lve
u n o b je t o P ro p e rt y Re s o u rc e Bu n d le ca rg a d o co n la s p a re ja s cla ve - va lo r d e l
fich e ro d e p ro p ie d a d e s .
S i n o e xis t e u n fich e ro d e p ro p ie d a d e s p a ra la lo ca lid a d e s p e cífica d a , g e t Bu n d le
s e le ccio n a e l fich e ro d e p ro p ie d a d e s co n la co rre s p o n d e n cia m á s ce rca n a . La
s ig u ie n t e t a b la id e n t ifica lo s fich e ro s d e p ro p ie d a d e s q u e b u s ca rá e l p ro g ra m a
P ro p e rt ie s D e m o p a ra ca d a lo ca lid a d :
Parámetros
Fichero de Propiedades Explicación
Locale
de DE La b e ls Bu n d le _ d e _ DE. p ro p e rt ie s Co rre s p o n d e n cia Exa ct a .
La b e ls Bu n d le _ fr_ FR. p ro p e rt ie s n o e xis t e ,
fr FR La b e ls Bu n d le _ fr. p ro p e rt ie s
p e ro e s la co rre s p o n d e n cia m á s ce rca n a .
S e s e le ccio n a e l fich e ro p o r d e fe ct o p o rq u e
en US La b e ls Bu n d le . p ro p e rt ie s lo s p a rá m e t ro s d e la lo ca lid a d n o
co rre s p o n d e n .

En lu g a r d e lla m a r a g e t Bu n d le , p o d ría m o s h a b e r cre a d o e l o b je t o


P ro p e rt y Re s o u rc e Bu n d le lla m a n d o a s u co n s t ru ct o r, q u e a ce p t a u n
I n p u t S t re a m co m o a rg u m e n t o . Pa ra cre a r e l I n p u t S t re a m d e b e m o s e s p e cífica r
e l n o m b re e xa ct o d e l fich e ro d e p ro p ie d a d e s e n la lla m a d a a l co n s t ru ct o r d e
File I n p u t S t re a m . Cre a r e l P ro p e rt y Re s o u rc e Bu n d le lla m a n d o a l m é t o d o
g e t Bu n d le e s m á s fle xib le , p o rq u e b u s ca rá lo s fich e ro s d e p ro p ie d a d e s co n la
co rre s p o n d e n cia m á s ce rca n a a la lo ca lid a d e s p e cífica d a .

5. Obtener el Texto Localizado

Pa ra re cu p e ra r lo s va lo re s t ra d u cid o s d e s d e e l Re s o u rc e Bu n d le , lla m a m o s a l
m é t o d o g e t S t rin g :

String value = labels.getString(key);


El S t rin g d e vu e lt o p o r g e t S t rin g co rre s p o n d e co n la cla ve q u e h e m o s
e s p e cifica d o . El S t rin g e s t á e n e l id io m a a p ro p ia d o , p ro p o rcio n a d o p o r u n fich e ro
d e p ro p ie d a d e s e xis t e n t e p a ra la lo ca lid a d e s p e cífica d a . Co m o la s cla ve s n o
ca m b ia n , lo s lo ca liza d o re s a ñ a d e n fich e ro s d e p ro p ie d a d e s a d icio n a le s
p o s t e rio rm e n t e , . Nu e s t ra lla m a d a a g e t S t rin g n o n e ce s it a ca m b ia r.

6. Iterar a través de todas las Claves

S i q u e re m o s re cu p e ra r lo s va lo re s p a ra t o d a s la s cla ve s d e u n Re s o u rc e Bu n d le ,
n e ce s it a m o s lla m a r a l m é t o d o g e t Ke y s . Es t e m é t o d o d e vu e lve u n a En u m e ra t io n
co n t o d a s la s cla ve s d e u n Re s o u rc e Bu n d le . S e p u e d e it e ra r a t ra vé s d e la
En u m e ra t io n y re cu p e ra r ca d a va lo r co n e l m é t o d o g e t S t rin g . La s s ig u ie n t e s
lín e a s d e có d ig o d e l p ro g ra m a P ro p e rt ie s D e m o , m u e s t ra n co m o s e h a ce e s t o :

ResourceBundle labels =
ResourceBundle.getBundle("LabelsBundle",currentLocale);
Enumeration bundleKeys = labels.getKeys();

while (bundleKeys.hasMoreElements()) {
String key = (String)bundleKeys.nextElement();
String value = labels.getString(key);
System.out.println("key = " + key + ", " +
"value = " + value);
}

Oz it o
Utilizar un ListResourceBundle
Es t a s e cció n ilu s t ra e l u s o d e u n o b je t o Lis t Re s o u rc e Bu n d le co n u n p ro g ra m a d e
e je m p lo lla m a d o Lis t D e m o . Exp lica re m o s ca d a p a s o in vo lu cra d o e n la cre a cció n
d e l p ro g ra m a Lis t D e m o , ju n t o co n la s s u b cla s e s d e Lis t Re s o u rc e Bu n d le q u e
s o p o rt a . El có d ig o fu e n t e d e l p ro g ra m a e s t á e n Lis t De m o . ja va . Ta m b ié n p o d ría s
q u e re r e xa m in a r la s a lid a p ro d u cid a p o r e l p ro g ra m a .

1. Crear las Subclases de ListResourceBundle

Un Lis t Re s o u rc e Bu n d le e s t á co n s t it u id o p o r u n fich e ro d e cla s e . Po r lo t a n t o ,


n u e s t ro p rim e r p a s o e s cre a r e l fich e ro d e cla s e p a ra ca d a Lo ca lid a d s o p o rt a d a . En
e l p ro g ra m a Lis t D e m o , e l n o m b re b a s e d e l Lis t Re s o u rc e Bu n d le e s
S t a t s Bu n d le . Có m o Lis t D e m o s o p o rt a t re s lo ca lid a d e s d ife re n t e s , re q u ie re lo s
s ig u ie n t e s fich e ro s d e cla s e s :

StatsBundle_en_CA.class
StatsBundle_fr_FR.class
StatsBundle_ja_JA.class
La cla s e S t a t s Bu n d le p a ra Ja p ó n e s t á d e fin id a e n e l có d ig o fu e n t e d e la s ig u ie n t e
fo rm a . Ob s e rva q u e e l n o m b re d e la cla s e e s t á co n s t ru id o a ñ a d ie n d o e l có d ig o d e
id io m a y d e l p a ís a l n o m b re b a s e d e l Lis t Re s o u rc e Bu n d le . De n t ro d e la cla s e , s e
in cia liza u n a rra y d e d o s d im e n s io n e s c o n t e n t s co n p a re ja s d e cla ve va lo r. La s
cla ve s s o n e l p rim e r e le m e n t o d e ca d a p a re ja : GDP, Po p u la t io n , y Lit e ra cy. La s
cla ve s d e b e n s e r o b je t o s S t rin g , y d e b e n s e r ig u a le s e n ca d a fich e ro cla s s d e l
co n ju n t o S t a t s Bu n d le . Lo s va lo re s p u e d e n s e r cu a lq u ie r t ip o d e o b je t o . En e s t e
e je m p lo , lo s va lo re s s o n d o s o b je t o s I n t e g e r y u n o b je t o Flo a t .

import java.util.*;

public class StatsBundle_ja_JA extends ListResourceBundle {

public Object[][] getContents() {


return contents;
}

private Object[][] contents = {


{"GDP", new Integer(21300)},
{"Population", new Integer(125449703)},
{"Literacy", new Double(0.99)},
};

}
2. Especificar la Localidad

En e l p ro g ra m a Lis t D e m o , h e m o s d e fin id o lo s s ig u ie n t e s o b je t o s Lo c a le :

Locale[] supportedLocales = {
new Locale("en","CA"),
new Locale("ja","JA"),
new Locale("fr","FR")
};
Ca d a o b je t o Lo c a le co rre s p o n d e a u n a cla s e d e S t a t s Bu n d le . Po r e je m p lo , la
lo ca lid a d Ja p o n e s a , q u e fu e d e fin id a co n lo s có d ig o s ja y JA, co rre s p o n d e co n
S t a t s Bu n d le _ ja _ JA. c la s s .

3. Crear el ResourceBundle

Pa ra cre a r e l Lis t Re s o u rc e Bu n d le , lla m a m o s a l m é t o d o g e t Bu n d le . En la


s ig u ie n t e lín e a d e có d id o , o b s e rva q u e h e m o s e s p e cífica d o e l n o m b re b a s e d e la
cla s e ( S t a t s Bu n d le ) y la Lo ca lid a d .

ResourceBundle stats =
ResourceBundle.getBundle("StatsBundle",currentLocale);
El m é t o d o g e t Bu n d le b u s ca rá u n a cla s e cu yo n o m b re e m p ie ce co n S t a t s Bu n d le y
e s t é s e g u id o p o r lo s có d ig o s d e id io m a y d e p á is e s p e cífica d o s p o r la Lo c a le . Po r
e je m p lo , s i c u rre n t Lo c a le s e cre a co n lo s có d ig o s ja y JA, g e t Bu n d le d e vu e lve
u n o b je t o Lis t Re s o u rc e Bu n d le ca rg a d o co n la cla s e S t a t s Bu n d le _ ja _ JA.

4. Recuperar Objetos Localizados

Ah o ra q u e t e n e m o s u n Lis t Re s o u rc e Bu n d le p a ra la Lo ca lid a d a p ro p ia d a ,
re cu p e ra re m o s lo s o b je t o s lo ca liza d o s p o r s u s cla ve s . En la s ig u ie n t e lín e a d e
có d ig o , re cu p e ra rm o s e l ra t io d e a lfa b e t iza ció n lla m a n d o a l m é t o d o g e t Ob je c t co n
e l p a rá m e t ro "Lit e ra cy". Co m o g e t Ob je c t d e vu e lve u n o b je t o , d e b e m o s t ip a rlo a
D o u b le :

Double lit = (Double)stats.getObject("Literacy");

Oz it o
Formateo de Números y Monedas
Lo s p ro g ra m a s a lm a ce n a n y o p e ra n co n n ú m e ro s d e u n a fo rm a in d e p e n d ie n t e d e la
Lo ca lid a d . An t e s d e m o s t ra r o im p rim ir u n n ú m e ro e l p ro g ra m a d e b e co n ve rt irlo a
u n S t rin g q u e e s t é e n u n fo rm a t o s e n s ib le a la Lo ca lid a d . Po r e je m p lo , e n Fra n cia ,
e l n ú m e ro 1 2 3 4 5 6 . 7 8 d e b e ría s e r fo rm a t e a d o co m o 1 2 3 4 5 6 , 7 8 , y e n Ale m a n ia
d e b e ría a p a re ce r co m o 1 2 3 . 4 5 6 , 7 8 . En e s t a le cció n , a p re n d e rá s co m o h a ce r q u e
t u s p ro g ra m a s s e a n id e p e n d ie n t e s d e la s co n ve n cio n e s d e la lo ca lid a d p a ra lo s
p u n t o s d e cim a le s , lo s s e p a ra d o re s d e m illa re s , y o t ra s p ro p ie d a d e s d e fo rm a t e o .

Utilizar Formatos Predefinidos

Ut iliza n d o lo s m é t o d o s d e fa ct o ría p ro p o rcio n a d o s p o r la cla s e


N u m b e rFo rm a t , s e p u e d e n o b t e n e r fo rm a t o s e s p e cífico s d e la lo ca lid a d
p a ra n ú m e ro s , m o n e d a s y p o rce n t a je s .

Formatear con Patrones

Co n la cla s e D e c im a lFo rm a t s e e s p e cífica u n fo rm a t o d e n ú m e ro co n


p a t ró n . La cla s e D e c im a lFo rm a t S y m b o ls p e rm it e m o d ifica r lo s
s im b o lo s d e fo rm a t e o co m o s e p a ra d o re s d e cim a le s o e l s ig n o n e g a t ivo .

Oz it o
Utilizar Formatos Predefinidos
Lla m a n d o a lo s m é t o d o s d e la cla s e Nu m b e rFo rm a t s e p u e d e n fo rm a t e a r n ú m e ro s ,
m o n e d a s y p o rce n t a je s d e a cu e rd o a la Lo ca lid a d . S in e m b a rg o , h a y u n e rro r:
N u m b e rFo rm a t p o d ría n o s o p o rt a r la Lo ca lid a d e s p e cifica d a . Pa ra co n o ce r la s
d e fin icio n e s d e Lo c a le s o p o rt a d a s p o r N u m b e rFo rm a t , lla m a m o s a l m é t o d o
g e t Av a ila b le Lo c a le s :

Locale[] locales = NumberFormat.getAvailableLocales();


S i N u m b e rFo rm a t n o s o p o rt a la lo ca lid a d q u e n e ce s it a m o s , p o d e m o s cre a r
n u e s t ro p ro p io fo rm a t e a d o r. Exp lica re m o s e s t e p ro ce d im ie n t o e n la s ig u ie n t e
s e cció n , Fo rm a t e a r co n Pa t ro n e s .

El s ig u ie n t e m a t e ria l m u e s t ra co m o o b t e n e r fo rm a t e a d o re s e s p e cífico s d e la
lo ca lid a d p a ra n ú m e ro s , m o n e d a s y p o rce n t a je s . Lo s có d ig o s d e e je m p lo s o n d e u n
p ro g ra m a lla m a d o Nu m b e rFo rm a t De m o . ja va .

Números

S e p u e d e n u t iliza r lo s m é t o d o s d e fa ct o ria d e N u m b e rFo rm a t p a ra fo rm a t e a r


n ú m e ro s d e t ip o s d e d a t o s p rim it ivo s , co m o d o u b le , y s u s co rre s p o n d ie n t e s
o b je t o s , co m o D o u b le .
En e l s ig u ie n t e fra g m e n t o d e có d ig o , fo rm a t e a re m o s u n D o u b le d e a cu e rd o a la
Lo ca lid a d . Prim e ro , o b t e n d ré m o s u n e je m p la r d e N u m b e rFo rm a t e s p e cífico d e la
Lo ca lid a d , lla m a n d o a g e t N u m b e rI n s t a n c e . Lu e g o lla m a m o s a l m é t o d o fo rm a t
co n e l D o u b le co m o a rg u m e n t o . El m é t o d o fo rm a t d e vu e lve e l n ú m e ro
fo rm a t e a d o e n u n S t rin g , q u e e s t á lis t o p a ra s e r m o s t ra d o .

Double amount = new Double(345987.246);


NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + currentLocale.toString());
La s a lid a d e e s t e e je m p lo m u e s t ra co m o e l fo rm a t o d e l m is m o n ú m e ro va ría co n la
Lo ca lid a d :

345 987,246 fr_FR


345.987,246 de_DE
345,987.246 en_US

Monedas
S i e s t á s e s crib ie n d o a p lia cio n e s d e n e g o cio s , n e ce s it a rá s fo rm a t e a r y m o s t ra r
va lo re s e n m o n e d a s . La s m o n e d a s s e fo rm a t e a n d e la m is m a fo rm a q u e lo s
n ú m e ro s , e xce p t o e n q u e s e lla m a a g e t Cu rre n c y I n s t a n c e p a ra cre a r e l
fo rm a t e a d o r. Cu a n d o s e lla m a a l m é t o d o fo rm a t , d e vu e lve u n S t rin g q u e in clu ye
e l n ú m e ro fo rm a t e a d o y e l s ig n o d e m o n e d a a p ro p ia d o .
El s ig u ie n t e có d ig o m u e s t ra co m o fo rm a t e a r m o n e d a d e u n a fo rm a e s p e cífica d e la
Lo ca lid a d :

Double currency = new Double(9876543.21);


NumberFormat currencyFormatter;
String currencyOut;

currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
currencyOut = currencyFormatter.format(currency);
System.out.println(currencyOut + " " + currentLocale.toString());
La s a lid a g e n e ra p o r la s lín e a s p re ce d e n t e s s e ría e s t a :

9 876 543,21 F fr_FR


9.876.543,21 DM de_DE
$9,876,543.21 en_US
A p rim e ra vis t a , e s t a s a lid a p o d ría p a re ce r e rró n e a , p o rq u e lo s va lo re s n u m é rico s
s o n ig u a le s . Po r s u p e s t o , 9 8 7 6 5 4 3 , 2 1 F n o e s e q u iva le n t e a 9 . 8 7 6 . 5 4 3 , 2 1 DM.
S in e m b a rg o , re cu e rd a q u e la cla s e N u m b e rFo rm a t n o p u e d e ca m b ia r m o n e d a s .
Lo s m é t o d o s p e rt e n e cie n t e s a la cla s e N u m b e rFo rm a t fo rm a t e a n m o n e d a s , p e ro
n o la s co n vie rt e n .

Porcentajes

Tá m b ie n s e p u e d e n u t iliza r lo s m é t o d o s d e la cla s e N u m b e rFo rm a t p a ra


fo rm a t e a r p o rce n t a je s . Pa ra o b t e n e r e l fo rm a t e a d o r e s p e cífico d e la lo ca lid a d s e
lla m a a l m é t o d o g e t P e rc e n t I n s t a n c e . Co n e s t e fo rm a t e a d o r, u n fra cció n co m o
0 . 7 5 s e m o s t ra rá co m o 7 5 % .
El s ig u ie n t e có d ig o m u e t ra co m o fo rm a t e a r p o rce n t a je s :

Double percent = new Double(0.75);


NumberFormat percentFormatter;
String percentOut;

percentFormatter = NumberFormat.getPercentInstance(currentLocale);
percentOut = percentFormatter.format(percent);

Oz it o
Formatear con Patrones
S e p u e d e u t iliza r la cla s e D e c im a lFo rm a t p a ra fo rm a t e a r n ú m e ro s d e cim a le s e n
ca d e n a s e s p e cífica s d e la Lo ca lid a d . Es t a cla s e p e rm it e co n t ro la r lo s ce ro s in icia le s y
fin a le s , lo s s u fijo s y p re fijo s , s e p a ra d o re s ( m illa re s ) , y e l s e p a ra d o r d e cim a l. S i s e
q u ie re ca m b ia r u n s ím b o lo d e l fo rm a t e o co m o e l s a p e ra d o r d e cim a l, s e p u e d e u t iliza r
D e c im a lFo rm a t S y m b o ls e n co n ju n ció n co n la cla s e D e c im a lFo rm a t . Es t a s cla s e s
o fre ce n u n a g ra n fle xib ilid a d e n e l fo rm a t e o d e n ú m e ro s , p e ro h a ce n e l có d ig o m á s
co m p le jo . S ie m p re q u e s e a p o s ib le , s e d e b e ría u t iliza r la cla s e N u m b e rFo rm a t , q u e s e
d e s crib ió e n la s e cció n a n t e rio r, e n ve z d e D e c im a lFo rm a t y
D e c im a lFo rm a t S y m b o ls .
Ut iliza n d o e je m p lo s , la s s ig u ie n t e s lín e a s m o s t ra rá n co m o u t iliza r la s cla s e s
D e c im a lFo rm a t y D e c im a lFo rm a t S y m b o ls . Lo s fra g m e n t o s d e có d ig o s e h a n
e xt ra id o d e u n p ro g ra m a lla m a d o De cim a lFo rm a t De m o . ja va .

Construir Patrones

La s p ro p ie d a d e s d e fo rm a t e o d e D e c im a lFo rm a t s e e s p e cífica n co n u n S t rin g p a t ró n .


El p a t ró n d e t e rm in a la a p a rie n cia d e l n ú m e ro fo rm a t e a d o . Pa ra u n a d e s crip ció n
co m p le t a d e la s ín t a xis d e lo s p a t ro n e s p u e d e s ve r la p á g in a S ín t a xis d e lo s Pa t ro n e s
d e Fo rm a t e o d e Nú m e ro s .
En e l s ig u ie n t e e je m p lo , h e m o s cre a d o u n fo rm a t e a d o r, p a s á n d o le u n p a t ró n a l
co n s t ru ct o r d e D e c im a lFo rm a t . Lu e g o , le h e m o s p a s a d o u n va lo r d o u b le a l m é t o d o
fo rm a t , q u e d e vu e lve u n S t rin g fo rm a t e a d o :

DecimalFormat myFormatter = new DecimalFormat(pattern);


String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);
La s a lid a d e la s lín e a s d e có d ig o p re ce d e n t e s s e d e s crib e e n la s ig u ie n t e t a b la . El v a lo r
e s e l n ú m e ro , u n d o u b le , q u e s e rá fo rm a t e a d o . El P a t ró n e s e l S t rin g q u e e s p e cífica
la s p ro p ie d a d e s d e fo rm a t e o . La S a lid a , q u e e s u n S t rin g , re p re s e n t a e l n ú m e ro
fo rm a t e a d o :
Valor Patrón Salida Explicación
El s ig n o Alm o h a d illa ( # ) in d ica u n d íg it o , la
1 2 3 4 5 6 . 7 8 9 ###,###.### 1 2 3 , 4 5 6 . 7 8 9 co m a la p o s ició n d e l s e p a ra d o r d e m illa re s y e l
p u n t o la p o s ició n d e l s e p a ra d o r d e cim a l.
El v a lo r t ie n e t re s d íg it o s a la d e re ch a d e l p u n t o
123456.789 # # # .# # 123456.79 d e cim a l, p e ro e l p a t ró n s ó lo t ie n e d o s . El m é t o d o
fo rm a t m a n e ja e s t o re d o n d e a n d o .
El p a t ró n e s p e cífica re lle n o co n ce ro s , p o rq u e s e
123.78 000000.000 0 0 0 1 2 3 . 7 8 0 u t iliza e l ca ra ct e r Ce ro e n ve z d e la a lm o h a d illa
(# ).
El p rim e r ca rá ct e r d e l p a t ró n e s e l s ig n o d e l
d ó la r ( $ ) . Ob s e rva q u e e s t e s ig n o p re ce d e
12345.67 $# # # ,# # # .# # # $12,345.67
in m e d ia t a m e n t e a l d íg it o m á s a la izq u ie rd a d e
la s a lid a fo rm a t e a d a .
El p a t ró n e s p e cífica e l s ig n o d e l Ye n Ja p o n é s ( ¥ )
12345.67 \ u00a 5# # # ,# # # .# # # ¥12,345.67
co n s u va lo r Un ico d e \ u 0 0 a 5 .

Formateo Sensible a la Localidad

El e je m p lo a n t e rio r cre a b a u n o b je t o D e c im a lFo rm a t p a ra la Lo ca lid a d p o r d e fe ct o . S i


s e q u ie re u n o b je t o D e c im a lFo rm a t p a ra u n a lo ca lid a d d is t in t a , s e e je m p la riza u n
N u m b e rFo rm a t y lu e g o s e fu e rza a D e c im a lFo rm a t . En t o n ce s , e l o b je t o
D e c im a lFo rm a t fo rm e t a rá lo s p a t ro n e s d e fin id o s d e u n a fo rm a s e n s ib le a la lo ca lid a d .
Aq u í s e p u e d e ve r u n e je m p lo :

NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + " " + output + " " + loc.toString());
Ab a jo p o d e m o s ve r e l re s u lt a d o d e la e je cu ció n d e e s t e có d ig o . Lo s n ú m e ro s
fo rm a t e a d o s , e n la s e g u n d a co lu m n a , va ría n co n la Lo ca lid a d :

###,###.### 123,456.789 en_US


###,###.### 123.456,789 de_DE
###,###.### 123 456,789 fr_FR
Po r e s o , lo s p a t ro n e s d e fo rm a t e o q u e h e m o s u t iliza d o h a s t a a h o ra s e g u ía n la s
co n ve n cio n e s d e l In g lé s No rt e a m e rica n o . Po r e je m p lo , e n e l p a t ró n "# # # , # # # . # # " la
co m a e s e l s e p a ra d o r d e m illa re s y e l p u n t o re p re s e n t a e l p u n t o d e cim a l. Es t a
co n ve n ció n e s t á b ie n , s a b ie n d o q u e lo s u s u a rio s fin a le s n o e s t á n e xp u e s t o s a e lla s . S in
e m b a rg o , a lg u n a s a p lica cio n e s , co m o la s h o ja s d e cá lcu lo y lo s g e n e ra d o re s d e
in fo rm e s , p e rm it e n a l u s u a rio fin a l d e fin ir s u s p ro p io s p a t ro n e s d e fo rm a t e o . Pa ra e s a s
a p lica cio n e s , lo s p a t ro n e s d e fo rm a t e o e s p e cifica d o s p o r e l u s u a rio fin a l d e b e ría n
u t iliza r la n o t a ció n lo ca liza d a . En e s t o s ca s o s q u e rre m o s lla m a r a l m é t o d o
a p p ly Lo c a liz e d P a t t e rn s o b re e l o b je t o D e c im a lFo rm a t .

Modificar los Símbolos de Formateo

Co n la cla s e De cim a lFo rm a t S ym b o ls s e p u e d e n m o d ifica r lo s s ím b o lo s q u e a p a re ce n e n


lo s n ú m e ro s fo rm a t e a d o s p o rd u cid o s p o r e l m é t o d o fo rm a t . Es t o s s ím b o lo s in clu ye n e l
p u n t o d e cim a l, e l s e p a ra d o r d e m illa re s , e l s ig n o m e n o s , y e l s ig n o d e p o rce n t a je
a d e m á s d e a lg u n o s m á s .
En e l s ig u ie n t e e je m p lo p o d e m o s ve r e l u s o d e D e c im a lFo rm a t S y m b o ls a p lica n d o u n
fo rm a t o in u s u a l a u n n ú m e ro . Em p e za m o s e je m p la riza n d o D e c im a lFo rm a t S y m b o ls
s in a rg u m e n t o s , lo q u e d e vu e lve u n o b je t o p a ra la Lo ca lid a d p o r d e fe ct o , ( Co m o
D e c im a lFo rm a t S y m b o ls e s u n a cla s e s e n s ib le a la Lo ca lid a d , p o d ría m o s h a b e r
e s p e cífica d o u n a Lo ca lid a d cu a n d o lla m a m o s a l co n s t ru ct o r. ) Lu e g o , m o d ifica m o s e l
s e p a ra d o r d e cim a l y e l d e m illa re s . Lu e g o e s p e cífica m o s e l D e c im a lFo rm a t S y m b o ls
cu a n d o e je m p la riza m o s la cla s e D e c im a lFo rm a t . S ó lo p a ra h a ce r la s co s a s m á s
co m p lica d a s , ca m b ia m o s la n u m e ro d e a g ru p a m ie n t o d e l fo rm a t e a d o r d e t re s a cu a t ro .
Fin a lm e n t e lla m a m o s a l m é t o d o fo rm a t .
Aq u í t ie n e s e l có d ig o d e Eje m p lo :

DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols();


unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');

String strange = "#,##0.###";


DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);

String bizarre = weirdFormatter.format(12345.678);


System.out.println(bizarre);
Es t o e s lo q u e a p a re ce rá cu a n d o im p rim a m o s e s t e e xt ra ñ o n ú m e ro fo rm a t e a d o

1^2345|678

Oz it o
Formateo de Fechas y Horas
Lo s o b je t o s D a t e re p re s e n t a n fe ch a s y h o ra s . No s e p u e d e m o s t ra r o im p rim ir u n
o b je t o D a t e s in co n ve rt irlo p rim e ro a u n S t rin g q u e e s t é e n e l fo rm a t o a p ro p ia d o .
Pe ro , ¿ Cu á l e s e l fo rm a t o a d e cu a d o ? Prim e ro , e l fo rm a t o d e b e ría e s t a r co n fo rm e a
la s co n ve n cio n e s d e la Lo ca lid a d d e l u s u a rio fin a l. Po r e je m p lo , lo s a le m a n e s
re co n o ce rá n e s t o 9 . 4 . 9 8 co m o u n a fe ch a vá lid a , p e ro lo s n o rt e a m e rica n o s
e s p e ra rá n q u e la m is m a fe ch a a p a re zca co m o 4 / 9 / 9 8 . S e g u n d o , e l fo rm a t o
d e b e ría in clu ir la in fo rm a ció n n e ce s a ria . Po r e je m p lo , u n p ro g a m a q u e m id a e l
re n d im ie n t o d e u n a re d p o d ría m o s t ra r m ilis e g u n d o s . Pro b a b le m e n t e u n ca le n d a rio
d e cit a s o n - lin e n o m o s t ra rá m ilis e g u n d o s , p e ro s i q u e m o s t ra rá lo s d ía s d e la
sem ana.
Es t a le cció n e xp lica co m o fo rm a t e a r fe ch a s y h o ra s e n d ife re n t e s fo rm a s , y d e u n a
m a n e ra s e n s ib le a la Lo ca lid a d . S i s ig u e s la s t é cn ica s d e s crit a s e n e s t a le cció n , t u s
p ro g ra m a s n o s ó lo m o s t ra rá n la s fe ch a s y h o ra s e n la Lo ca lid a d a p ro p ia d a , s in o
q u e e l có d ig o fu e n t e p e rm a n e ce ra in d e p e n d ie n t e d e cu a lq u ie r Lo ca lid a d
e s p e cífica d a .

Utilizar Formato Predefinidos

La cla s e D a t e Fo rm a t p ro p o rcio n a e s t ilo s d e fo rm a t e o p re d e fin id o s q u e


s o n e s p e cífico s d e la Lo ca lid a d y fá cile s d e u t ilia r.

Formatear con Patrones

Co n la cla s e S im p le D a t e Fo rm a t , s e p u e d e n cre a r fo rm a t o s
p e rs o n a liza d o s e s p e cífico s d e la Lo ca lid a d .

Cambiar los Símbolos de Formateo

Ut iliza n d o la cla s e D a t e Fo rm a t S y m b o ls , s e p u e d e n ca m b ia r lo s
s ím b o lo s q u e re p re s e n t a n lo s n o m b re s d e lo s m e s e s , d e lo s d ía s d e la
s e m a n a , y o t ro s e le m e n t o s d e fo rm a t e o .

Oz it o
Utilizar Formatos Predefinidos
La cla s e Da t e Fo rm a t p e rm it e fo rm a t e a r fe ch a s y h o ra s co n e s t ilo s p re d e fin id o s d e
u n a fo rm a s e n s ib le a la Lo ca lid a d , D a t e Fo rm a t n o s o p o rt a t o d a s la s p o s ib le s
d e fin icio n e s d e Lo ca lid a d e s . Pa ra ve r la s d e fin icio n e s d e Lo c a le q u e re co n o ce
D a t e Fo rm a t , lla m a m o s a l m é t o d o g e t Av a ila b le Lo c a le s :

Locale[] locales = DateFormat.getAvailableLocales();


En la s s ig u ie n t e s s e ccio n e s , ve re m o s có m o fo rm a t e a r fe ch a s y h o ra s co n la cla s e
D a t e Fo rm a t . Lo s e je m p lo s s e h a n s a ca d o e l p ro g ra m a Da t e Fo rm a t De m o . ja va .

Fechas

Fo rm a t e a r fe ch a s co n la cla s e D a t e Fo rm a t e s u n p ro ce s o e n d o s p a s o s . Prim e ro
s e cre a u n fo rm a t e a d o r co n e l m é t o d o g e t D a t e I n s t a n c e . S e g u n d o , s e lla m a a l
m é t o d o fo rm a t , q u e d e vu e lve u n S t rin g q u e co n t ie n e la fe ch a fo rm a t e a d a . En e l
s ig u ie n t e e je m p lo , h e m o s fo rm a t e a d o la fe ch a d e h o y lla m a n d o a e s t o s d o s
m é todos:

Date today;
String dateOut;
DateFormat dateFormatter;

dateFormatter =
DateFormat.getDateInstance(DateFormat.DEFAULT, currentLocale);
today = new Date();
dateOut = dateFormatter.format(today);

System.out.println(dateOut + " " + currentLocale.toString());


Aq u í e s t á la s a lid a g e n e ra d a p o r e s t e có d ig o . Ob s e rva q u e lo s fo rm a t o s d e fe ch a s
va ría n co n la Lo ca lid a d . Co m o D a t e Fo rm a t e s s e n s ib le a la Lo ca lid a d , t ie n e
cu id a d o d e lo s d e t a lle s d e fo rm a t e o p a ra ca d a Lo ca lid a d .

9 avr 98 fr_FR
9.4.1998 de_DE
09-Apr-98 en_US
En e l e je m p lo d e có d ig o a n t e rio r, h e m o s e s p e cífica d o e l e s t ilo d e fo rm a t o
D EFAULT. Es t e e s t ilo e s s ó lo u n o d e lo s e s t ilo s d e fo rm a t o p re d e fin id o s q u e
p ro p o rcio n a la cla s e D a t e Fo rm a t :
● DEFAULT

● S HORT

● MEDIUM
● LONG
● FULL

La s ig u ie n t e t a b la m u e s t ra có m o s e fo rm a t e a ca d a e s t ilo p a ra la s Lo ca lid a d e s d e
U. S . y Fra n cia :
Estilo Localidad U.S. Localidad Francia
DEFAULT 1 0 - Ap r- 9 8 1 0 a vr 9 8
S HORT 4/10/98 10/04/98
MEDIUM 1 0 - Ap r- 9 8 1 0 a vr 9 8
LONG Ap ril 1 0 , 1 9 9 8 1 0 a vril 1 9 9 8
FULL Frid a y, Ap ril 1 0 , 1 9 9 8 ve n d re d i, 1 0 a vril 1 9 9 8

Horas

Lo s o b je t o s D a t e re p re s e n t a n t a n t o fe ch a s co m o h o ra s . Fo rm a t e a r h o ra s co n la
cla s e D a t e Fo rm a t e s s im ila r a l fo rm a t e o d e fe ch a s , e xce p t o e n q u e e l fo rm a t e a d o r
s e cre a co n e l m é t o d o g e t Tim e I n s t a n c e :

DateFormat timeFormatter =
DateFormat.getTimeInstance(DateFormat.DEFAULT, currentLocale);
La s ig u ie n t e t a b la m u e s t ra lo s e s t ilo s d e fo rm a t o s p re d e fin id o s p a ra la s h o ra s e n
la s lo ca lid a d e s d e U. S . y Ale m a n ia :
Estilo Localidad U.S. Localidad Alemania
DEFAULT 3 : 5 8 : 4 5 PM 15:58:45
S HORT 3 : 5 8 PM 15:58
MEDIUM 3 : 5 8 : 4 5 PM 15:58:45
LONG 3 : 5 8 : 4 5 PM PDT 1 5 : 5 8 : 4 5 GMT+ 0 2 : 0 0
FULL 3 : 5 8 : 4 5 o clo ck PM PDT 1 5 . 5 8 Uh r GMT+ 0 2 : 0 0

Fechas y Horas

Pa ra m o s t ra r la fe ch a y la h o ra e n la m is m a S t rin g , s e cre a e l fo rm a t e a d o r co n e l
m é t o d o g e t D a t e Tim e I n s t a n c e . El p rim e r p a rá m e t ro e s e l e s t ilo d e fe ch a y e l
s e g u n d o e s e l e s t ilo d e la h o ra . El t e rce r p a rá m e t ro e s n u e s t ro vie jo a m ig o Lo c a le .
Aq u í t ie n e s u n e je m p lo rá p id o :

DateFormat formatter;

formatter = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG,
currentLocale);
Pa ra la lo ca lid a d d e U. S . , e l fo rm a t e a d o d e e s t e e je m p lo , fo rm a t e a rá la fe ch a y la
h o ra d e e s t a fo rm a :

April 10, 1998 4:05:54 PM PDT


S i e l e je m p lo d e l fo rm a t e a d o r s e h u b ie ra cre a d o co n la Lo ca lid a d Fra n cia , e l S t rin g
d e vu e lt o p o r e l m é t o d o fo rm a t s e ría :

11 avril 1998 01:05:54 GMT+02:00

Oz it o
Formatear con Patrones
En la s e cció n a n t e rio r, Ut iliza r fo rm a t o s p re d e fin id o s , d e s crib im o s lo s e s t ilo s d e
fo rm a t o s p ro p o rcio n a d o s p o r la cla s e D a t e Fo rm a t . En la m a yo ría d e lo s ca s o s ,
e s t o s fo rm a t o s p re d e fin id o s s o n s u ficie n t e . S in e m b a rg o , s i s e q u ie re n cre a r
fo rm a t o s p e rs o n a liza d o s , s e d e b e u t iliza r la cla s e S im p le Da t e Fo rm a t .

En la s ig u ie n t e s lín e a s , p ro p o rcio n a re m o s va rio s e je m p lo s d e có d ig o q u e


d e m u e s t ra n e l u s o d e lo s m é t o d o s d e la cla s e S im p le D a t e Fo rm a t . Po d rá s
e n co n t ra r e l có d ig o co m p le t o e n e l fich e ro lla m a d o S im p le Da t e Fo rm a t De m o . ja va .

Sobre los Patrones

Cu a n d o s e cre a u n o b je t o S im p le D a t e Fo rm a t , s e e s p e cífica u n p a t ró n e n u n
S t rin g . Lo s co n t e n id o s d e e s t e p a t ró n d e t e rm in a n e l fo rm a t o d e la fe ch a y d e la
h o ra . Pa ra u n a d e s crip ció n co m p le t a s o b re la s ín t a xis d e lo s p a t ro n e s p u e d e s ve r
la s t a b la s d e la s e cció n S ín t a xis d e lo s Pa t ro n e s d e Fo rm a t o d e Fe ch a s . Po d re m o s
ve r a lg u n o s e je m p lo s d e p a t ro n e s e n lo s s ig u ie n t e s e je m p lo s .
En e l s ig u ie n t e có d ig o h e m o s e s p e cífica d o e l p a t ró n cu a n d o s e cre a e l o b je t o
S im p le D a t e Fo rm a t y lu e g o lla m a m o s a l m é t o d o fo rm a t . El S t rin g d e vu e lt o p o r
e l m é t o d o fo rm a t co n t ie n e la fe ch a y h o ra fo rm a t e a d a s y e s t á lis t a p a ra
m o s t ra rs e .

Date today;
String output;
SimpleDateFormat formatter;

formatter = new SimpleDateFormat(pattern, currentLocale);


today = new Date();
output = formatter.format(today);

System.out.println(pattern + " " + output);


La t a b la s ig u ie n t e m u e s t ra la s a lid a g e n e ra d a p o r e l có d ig o a n t e rio r cu a n d o s e
e s p e cifica la lo ca lid a d d e U. S . :
patrón Salida
d d . MM. yy 09.04.98
yyyy. MM. d d G 'a t ' h h : m m : s s z 1 9 9 8 . 0 4 . 0 9 AD a t 0 6 : 1 5 : 5 5 PDT
EEE, MMM d , ''yy Th u , Ap r 9 , '9 8
h: m m a 6 : 1 5 PM
H: m m 18:15
H: m m : s s : S S S 18:15:55:624
K: m m a , z 6 : 1 5 PM, PDT
yyyy. MMMMM. d d GGG h h : m m a a a 1 9 9 8 . Ap ril. 0 9 AD 0 6 : 1 5 PM

Patrones y Localidades

La cla s e S im p le D a t e Fo rm a t e s s e n s ib le a la lo ca lid a d . S i s e e je m p la riza


S im p le D a t e Fo rm a t s in u n p a rá m e t ro Lo c a le , fo rm a t e a rá la fe ch a y h o ra d e
a cu e rd o a la Lo ca lid a d p o r d e fe ct o . Ta n t o e l p a t ró n co m o la Lo ca lid a d d e t e rm in a n
e l fo rm a t o . Pa ra e l m is m o p a t ró n , la cla s e S im p le D a t e Fo rm a t p o d ría fo rm a t e a r la
fe ch a y la h o ra d e fo rm a d ife re n t e s i va ría la Lo ca lid a d .
En e l s ig u ie n t e e je m p lo , e l p a t ró n e s t á co d ifica d o e n la s e n t e n cia q u e cre a e l o b je t o
S im p le D a t e Fo rm a t :

Date today;
String result;
SimpleDateFormat formatter;

formatter = new SimpleDateFormat("EEE d MMM yy", currentLocale);


today = new Date();
result = formatter.format(today);

System.out.println("Locale: " + currentLocale.toString());


System.out.println("Result: " + result);
El có d ig o a n t e rio r g e n e ra e s t a s a lid a . Au n q u e e l p a t ró n e s t é co d ifica d o , e l fo rm a t o
d e la fe ch a ca m b ia ca d a ve z q u e s e e s p e cifica u n a Lo ca lid a d d ife re n t e :

Locale: fr_FR
Result: ven 10 avr 98

Locale: de_DE
Result: Fr 10 Apr 98

Locale: en_US
Result: Thu 9 Apr 98

Oz it o
Cambiar los Símbolos de Formateo de Fechas
El m é t o d o fo rm a t d e S im p le D a t e Fo rm a t d e vu e lve u n S t rin g fo rm a d o p o r d íg it o s
y s ím b o lo s . Po r e je m p lo , e n e l S t rin g "Frid a y, Ap ril 1 0 , 1 9 9 8 , " lo s s ím b o lo s s o n
"Frid a y" y "Ap ril. " S i lo s s ím b o lo s e n ca p s u la d o s e n S im p le D a t e Fo rm a t n o cu b re n
t u s n e ce s id a d e s , p u e d e s ca m b ia rlo s co n la cla s e Da t e Fo rm a t S ym b o ls . S e p u e d e n
ca m b ia r lo s s ím b o lo s q u e re p re s e n t a n lo s n o m b re s d e lo s m e s e s , d e lo s d ía s d e la s
s e m a n a , d e la s zo n a s h o ra ria s . e t c.
Ech e m o s u n vis t a zo a u n e je m p lo q u e m o d ifica lo s n o m b re s co rt o s d e lo s d ía s d e la
s e m a n a . Po d rá s e n co n t ra r e l có d ig o fu e n t e d e e s t e e je m p lo e n e l fich e ro lla m a d o
Da t e Fo rm a t S ym b o ls De m o . ja va . En e s t e e je m p lo , e m p e za m o s cre a n d o u n o b je t o
D a t e Fo rm a t S y m b o l p a ra la Lo ca lid a d d e U. S . Te n e m o s cu rio s id a d s o b re la s
a b re via t u ra s q u e e n ca p s u la D a t e Fo rm a t S y m b o l p a ra lo s d ía s d e la s e m a n a , p o r
e s o lla m a m o s a l m é t o d o g e t S h o rt W e e k d a y s . He m o s d e cid id o cre a r ve rs io n e s e n
m a yú s cu la s d e e s t a s a b re via t u ra s e n e l a rra y d e S t rin g lla m a d o c a p it a lD a y s .
Lu e g o a p lica m o s e l n u e vo co n ju n t o d e s ím b o lo s d e c a p t it a lD a y s a l o b je t o
D a t e Fo rm a t S y m b o l co n e l m é t o d o s e t S h o rt W e e k d a y s . Fin a lm e n t e ,
e je m p la riza m o s la cla s e S im p le D a t e Fo rm a t , e s p e cífica n d o e l
D a t e Fo rm a t S y m b o l q u e t e n ía lo s n u e vo s n o m b re s . Aq u í e s t á e l có d ig o fu e n t e :

Date today;
String result;
SimpleDateFormat formatter;
DateFormatSymbols symbols;
String[] defaultDays;
String[] modifiedDays;

symbols = new DateFormatSymbols(new Locale("en","US"));


defaultDays = symbols.getShortWeekdays();

for (int i = 0; i < defaultDays.length; i++) {


System.out.print(defaultDays[i] + " ");
}
System.out.println();

String[] capitalDays = {
"", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
symbols.setShortWeekdays(capitalDays);

modifiedDays = symbols.getShortWeekdays();
for (int i = 0; i < modifiedDays.length; i++) {
System.out.print(modifiedDays[i] + " ");
}
System.out.println();
System.out.println();

formatter = new SimpleDateFormat("E", symbols);


today = new Date();
result = formatter.format(today);
System.out.println(result);
La s a lid a g e n e ra d a p o r e s t e có d ig o s e m u e s t ra a b a jo . La p rim e ra lín e a co n t ie n e lo s
n o m b re s co rt o s d e lo s d ía s d e la s e m a n a a n t e s d e ca m b ia rlo s . La s e g u n d a lín e a
co n t ie n e lo s n o m b re s e n m a yú s cu la s q u e h e m o s a p lica d o co n e l m é t o d o
s e t S h o rt W e e k d a y s . Es t a s d o s p rim e ra s lín e a s p a re ce n id e n t a d a s , p o rq u e la
p rim e ra ca d e n a d e l a rra y d e n o m b re s e s n u ll. La ú lt im a lín e a m u e s t ra e l re s u lt a d o
d e vu e lt o p o r e l m é t o d o S im p le D a t e Fo rm a t . fo rm a t .

Sun Mon Tue Wed Thu Fri Sat


SUN MON TUE WED THU FRI SAT

WED

Oz it o
Formateo de Mensajes
A t o d o s n o s g u s t a u t iliza r p ro g ra m a s q u e n o s cu e n t e n lo q u e e s t á n h a cie n d o . Lo s
p ro g ra m a s q u e n o s m a n t ie n e n in fo rm a d o s n o rm a lm e n t e lo h a ce n m o s t ra n d o
m e n s a je s d e e s t a d o o d e e rro r. Po r s u p u e s t o , e s t o s m e n s a je s n e ce s it a n s e r
t ra d u cid o s p a ra q u e p u e d a n s e r e n t e n d id o s p o r lo s u s u a rio s fin a le s d e t o d o e l
m u n d o . Exp lica m o s la t ra d u ció n d e m e n s a je s d e t e xt o s e n Ais la r Ob je t o s
Es p e cífico s d e la Lo ca lid a d e n u n Re s o u rce Bu n d le . No rm a lm e n t e co n m o ve r e l
m e n s a je S t rin g d e n t ro d e u n Re s o u rc e Bu n d le , ya e s t á h e ch o . S in e m b a rg o , s i u n
m e n s a je co n t ie n e d a t o s va ria b le s t e n d re m o s q u e h a ce r u n o s p a s o s e xt ra p a ra
p re p a ra r s u t ra d u cció n .
En la s ig u ie n t e lis t a d e m e n s a je s , h e m o s s u b ra ya d o lo s d a t o s va ria b le s :

The disk named MyDisk contains 300 files.


The current balance of account #34-98-222 is $2,745.72.
405,390 people have visited your website since January 1, 1998.
Delete all files older than 120 days.
Po d ría m o s e s t a r t e n t a d o s a co n s t ru ir e l ú lt im o m e n s a je d e la lis t a co n ca t e n a n d o
fra s e s y va ria b le s :

double numDays;
ResourceBundle mssgBundle;
.
.
String message = mssgBundle.getString("deleteolder") +
numDays.toString() +
mssgBundle.getString("days");
Es t a a p ro xim a ció n fu n cio n a b ie n e n In g lé s , p e ro n o fu n cio n a e n id io m a s d o n d e lo s
ve rb o s a p a re zca n a l fin a l d e la s e n t e n cia . Co m o e l o rd e n d e la s p a la b ra s d e e s t e
m e n s a je e s t á co d ifica d o , lo s lo ca liza d o re s n o p o d rá n cre a r t ra d u ccio n e s
g ra m á t ica m e n t e co rre ct a s p a ra t o d o s lo s id io m a s .
¿ Có m o p o d e m o s h a ce r q u e n u e s t ro s p ro g ra m a s s e a n fá cilm e n t e lo ca liza b le s s i
n e ce s it a m o s u t iliza r m e n s a je s co n ca t e n a d o s ? Po d e m o s h a ce rlo u t iliza n d o la cla s e
Me s s a g e Fo rm a t , q u e e s e l p u n t o p rin cip a l d e e s t a le cció n .

Tratar con Mensajes Concatenados

Un m e n s a je co n ca t e n a d o p o d ría co n t e n e r va rio s t ip o s d e va ria b le s :


fe ch a s , h o ra s , ca d e n a s , n ú m e ro s , m o n e d a s y p o rce n t a je s . Pa ra
fo rm a t e a r u n m e n s a je co n ca t e n a d o d e u n fo rm a in d e p e n d ie n t e d e la
Lo ca lid a d , s e co n s t ru ye u n p a t ró n q u e lu e g o s e a p lica a u n o b je t o
Me s s a g e Fo rm a t .
Manejar Plurales

La s p a la b ra s d e u n m e n s a je p u e d e n va ria r s i s o n e n p lu ra l o s in g u la r.
Co n la cla s e Ch o ic e Fo rm a t , s e p u e d e m a p e a r u n n ú m e ro a u n a p a la b ra
o fra s e , p e rm it ie n d o co n s t ru ir m e n s a je s q u e s e a n g ra m á t ica m e n t e
co rre ct o s .

Oz it o
Tratar con Mensajes Concatenados
En e s t a s e cció n p a s a re m o s a t ra vé s d e u n p ro g ra m a d e e je m p lo p a ra d e m o s t ra r có m o
in t e rn a cio n a liza r u n m e n s a je co n ca t e n a d o . El p ro g ra m a d e e je m p lo h a ce u s o d e la cla s e
Me s s a g e Fo rm a t . El có d ig o fu e n t e co m p le t o lo s p u e d e s e n co n t ra r e n
Me s s a g e Fo rm a t De m o . ja va .

1. Identificar las Variables del Mensaje

La ve rs ió n in g le s a d e l m e n s a je q u e q u e re m o s in t e rn a cio n a liza r e s e s t a :

At 1:15 PM on April 13, 1998, we detected 7 spaceships on the planet Mars.


^ ^ ^ ^
| | | |
Date Date Number String

Ob s e rva q u e h e m o s s u b ra ya d o la s va ria b le s , y h e m o s id e n t ifica d o q u é t ip o d e o b je t o s


re p re s e n t a rá e s t o s d a t o s .

2. Aislar el Patrón del Mensaje en un ResourceBundle

Va m o s a a lm e ce n a r e l m e n s a je e n u n Re s o u rc e Bu n d le lla m a d o Me s s a g e Bu n d le . Aq u í
t ie n e s e l có d ig o d e cre a cció n d e l Re s o u rc e Bu n d le :

ResourceBundle messages =
ResourceBundle.getBundle("MessageBundle",currentLocale);
Es t e Re s o u rc e Bu n d le e s t á co m p u e s t o p o r u n fich e ro d e p ro p ie d a d e s p a ra ca d a Lo ca lid a d .
Co m o n u e s t ro Re s o u rc e Bu n d le s e lla m a Me s s a g e Bu n d le , e l fich e ro d e p ro p ie d a d e s p a ra
la Lo ca lid a d U. S . En g lis h s e lla m a rá Me s s a g e Bu n d le _ e n _ US . p ro p e rt ie s . Aq u í t ie n e s lo s
co n t e n d o s d e e s t e fich e ro d e p ro p ie d a d e s :

template = At {2,time,short} on {2,date,long}, we detected {1,number,integer}


spaceships on the planet {0}.
planet = Mars
He m o s e s p e cifica d o e l p a t ró n e n la p rim e ra lín e a d e l fich e ro d e p ro p ie d a d e s . S i
co m p a ra m o s e s t e p a t ró n co n e l m e n s a je d e t e xt o m o s t ra d o e n e l p a s o 1 , ve re m o s q u e s e
h a re e m p la za d o ca d a va ria b le d e l m e n s a je co n u n a rg u m e n t o e n ce rra d o e n t re co rch e t e s .
Ca d a a rg u m e n t o e m p ie za co n u n d íg it o lla m a d o e l n ú m e ro d e a rg u m e n t o , q u e co rre s p o n d e
co n e l ín d ice d e u n e le m e n t o e n u n a rra y d e Ob je c t q u e co n t ie n e lo s va lo re s d e lo s
a rg u m e n t o s . Ob s e rva q u e e n e l p a t ró n , e s t o s a rg u m e n t o s n o e s t á n e n n in g ú n o rd e n
p a rt icu la r. S e p u e d e n s it u a r lo s a rg u m e n t o s e n cu a lq u ie r o rd e n d e n t ro d e l p a t ró n . El ú n ico
re q u e rim ie n t o e s q u e e l n ú m e ro d e l a rg u m e n t o t e n g a u n e le m e n t o co rre s p o n d ie n t e e n e l
a rra y d e va lo re s d e lo s a rg u m e n t o s . En e l s ig u ie n t e p a s o e xp lica re m o s e l a rra y d e va lo re s
d e a rg u m e n t o s , p e ro p rim e ro e ch e m o s u n vis t a zo a t o d o s lo s a rg u m e n t o s d e l p a t ró n . La
s ig u ie n t e t a b la p ro p o rcio n a a lg u n o s d e t a lle s s o b re lo s a rg u m e n t o s .
Argumento Descripción
La p a rt e h o ra ria d e u n o b je t o D a t e . El e s t ilo "s h o rt " e s p e cifica e l e s t ilo d e
{ 2 , t im e , s h o rt } fo rm a t o D a t e Fo rm a t . S HORT.
La p a rt e d e la fe ch a d e u n o b je t o D a t e . El m is m o o b je t o D a t e s e u t iliza p a ra la s
{ 2 , d a t e , lo n g } d o s va ria b le s d e fe ch a y h o ra . En e l a rra y d e a rg u m e n t o s Ob je c t e l ín d ice q u e
co n t ie n e e l o b je t o D a t e e s e l 2 .
{ 1 , n u m b e r, in t e g e r} Un o b je t o N u m b e r, a d e m á s cu a lifica d o co n e l e s t ilo n u m é rico "in t e g e r".
{0} El S t rin g d e l Re s o u rc e Bu n d le q u e co rre s p o n d e co n la cla ve "p la n e t ".

Pa ra u n a d e s crip ció n co m p le t a d e la s ín t a xis d e a rg u m e n t o s , p u e d e s ve r la d o cu m e n t a ció n


d e l API p a ra la cla s e Me s s a g e Fo rm a t .

3. Seleccionar los Argumentos del Mensaje

En la s s ig u ie n t e s lín e a s d e có d ig o , a s ig n a m o s lo s ca lo re s p a ra ca d a a rg u m e n t o d e l p a t ró n .
Lo s ín d ice s d e lo s e le m e n t o s d e l a rra y m e s s a g e Arg u m e n t s co rre s p o n d e n co n lo s
n ú m e ro s d e lo s a rg u m e n t o s d e l p a t ró n . Po r e je m p lo , e l e le m e n t o d e ín d ice 1 , q u e e s u n
I n t e g e r( 7 ) , co rre s p o n d e co n e l a rg u m e n t o { 1 , n u m b e r, in t e g e r} d e l p a t ró n . Ext ra e m o s
lo s o b je t o s S t rin g , q u e s o n lo s e le m e n t o s 0 y 3 , d e l Re s o u rc e Bu n d le co n g e t S t rin g ,
p o rq u e d e b e n s e r t ra d u cid o s . El a rra y d e a rg u m e n t o s d e l m e n s a je s e d e fin e d e e s t a fo rm a :

Object[] messageArguments = {
messages.getString("planet"),
new Integer(7),
new Date()
};

4. Crear el Formateador

Lu e g o , cre a m o s u n o b je t o Me s s a g e Fo rm a t . S e le ccio n a m o s la Lo ca lid a d p o rq u e n u e s t ro


m e n s a je co n t ie n e o b je t o s D a t e y N u m b e r, q u e d e b e ría n s e r fo rm a t e a d o s d e u n a m a n e ra
s e n s ib le a la Lo ca lid a d . Po r e je m lo e n in g lé s No rt e Am e rica n o la fe ch a s 4 / 1 3 / 9 8 e s t á e n e l
fo rm a t o co rre ct o , p e ro e n fra n cé s d e b e ría fo rm a t e a rs e co m o 1 3 / 0 4 / 9 8 . Cre a m o s e l
fo rm a t e a d o r d e m e n s a je s d e la s ig u ie n t e fo rm a :

MessageFormat formatter = new MessageFormat("");


formatter.setLocale(currentLocale);

5. Formatear el Mensaje utilizando el Patrón y los Argumentos

En e s t e p a s o , d e m o s t ra re m o s co m o t ra b a ja n ju n t o s , e l p a t ró n , lo s a rg u m e n t o s d e l
m e n s a je y e l fo rm a t e a d o r. Prim e ro , e xt ra e m o s e l S t rin g d e l p a t ró n d e l Re s o u rc e Bu n d le
co n e l m é t o d o g e t S t rin g . La cla ve p a ra e l p a t ró n e s "t e m p la t e . " Pa s a m o s e l p a t ró n a l
fo rm a t e a d o r co n e l m é t o d o a p p ly P a t t e rn . Lu e g o , fo rm a t e a m o s e l m e n s a je u t iliza n d o e l
a rra y d e a rg u m e n t o s d e l m e n s a je lla m a n d o a l m é t o d o fo rm a t . El S t rin g d e vu e lt o p o r e s t e
m é t o d o ya e s t á lis t o p a ra u t iliza r. To d o e s t o s e re a liza co n s ó lo d o s lín e a s d e có d ig o :

formatter.applyPattern(messages.getString("template"));
String output = formatter.format(messageArguments);

6. Ejecutar el Programa de Desmostración

Ve a m o s q u e s u ce d e cu a n d o e l p ro g ra m a s e e je cu t a co n la Lo ca lid a d U. S . En g lis h :
% java MessageFormatDemo en US

currentLocale = en_US

At 1:15 PM on April 13, 1998, we detected 7 spaceships on the planet Mars.


Cu a n d o s e e je cu t a e l p ro g ra m a p a ra la Lo ca lid a d Ale m a n a , o b s e rva m o s q u e la fe ch a y la
h o ra h a n s id o lo ca liza d a s :

% java MessageFormatDemo de DE

currentLocale = de_DE

Um 13.15 Uhr am 13. April 1998 haben wir 7 Raumschiffe auf dem Planeten Mars
entdeckt.

Oz it o
Manejar Plurales
En In g lé s , la s fo rm a s p lu ra l y s in g u la r d e u n a p a la b ra n o m a lm e n t e s o n d ife re n t e s .
Es t o p u e d e re p re s e n t a r u n p ro b le m a cu a n d o s e co n s t ru ye n m e n s a je s q u e s e
re fie re n a ca n t id a d e s . Po r e je m p lo , s i e l m e n s a je in fo rm a d e l n ú m e ro d e fich e ro s
e n u n d is co , s o n p o s ib le s la s s ig u ie n t e s va ria cio n e s :

There are no files on XDisk.


There is one file on XDisk.
There are 2 files on XDisk.
La fo rm a m á s rá p id a d e re s o lve r e s t e p ro b le m a e s cre a r u n p a t ró n d e
Me s s a g e Fo rm a t co m o é s t e :

There are {0,number} file(s) on {1}.


De s a fo rt u n a d a m e n t e , e s t e p a t ró n re s u lt a g ra m á t ica m e n t e in co rre ct o :

There are 1 file(s) on XDisk.


Po d e m o s h a ce r a lg o m e jo r q u e e s t o u t iliza n d o la cla s e Ch o ice Fo rm a t . En e s t a
s e cció n , ve re m o s co m o t ra ra r co n p lu ra le s e n u n m e n s a je , p a s a n d o a t ra vé s d e u n
p ro g ra m a d e e je m p lo lla m a d o Ch o ice Fo rm a t De m o . ja va . Es t e p ro g ra m a t a m b ié n
h a ce u s o d e la cla s e Me s s a g e Fo rm a t q u e s e d e s crib ió e n la s e cció n a n t e rio r,
Tra t a r co n Me n s a je s Co n ca t e n a d o s .

1. Definir el Patrón del Mensaje

Prim e ro , id e n t ifiq u e m o s la s va ria b le s d e n u e s t ro m e n s a je :

There | are no files | on | XDisk | .


There | is one file | on | XDisk | .
There | are 2 files | on | XDisk | .
|______________| |_______|
^ ^
| |
variable variable
Lu e g o , re e m p la za m o s la s va ria b le s d e l m e n s a je co n a rg u m e n t o s , cre a n d o u n
p a t ró n q u e p u e d e a p lica rs e a u n o b je t o Me s s a g e Fo rm a t :

There {0} on {1}.


Es m u y s e n cillo t ra b a ja r co n e l a rg u m e n t o p a ra e l n o m b re d e l d is co , q u e e s t á
re p re s e n t a d o p o r { 1 } . Lo t ra t a re m o s ig u a l q u e cu a lq u ie r o t ra va ria b le S t rin g e n u n
p a t ró n Me s s a g e Fo rm a t . Es t e a rg u m e n t o co rre s p o n d e co n e l e le m e n t o 1 d e l a rra y
d e va lo re s ( Ve r p a s o 7 ) .
Tra t a r co n e l a rg u m e n t o { 0 } e s m á s co m p le jo p o r u n p a r d e ra zo n e s :
● Prim e ro , la fra s e q u e re e m p la za e s t e a rg u m e n t o va ría co n e l n ú m e ro d e
fich e ro s . Pa ra co n s t ru ir e s t a fra s e e n t ie m p o d e e je cu ció n , n e ce s it a m o s
m a p e a r e l n ú m e ro d e fich e ro s e n u n S t rin g p a rt icu la r. Po r e je m p lo , e l
n ú m e ro 1 , m a p e a rá e l S t rin g "is o n e file . " La cla s e Ch o ic e Fo rm a t p e rm it e
re a liza r e l m a p e a d o n e ce s a rio .
● S e g u n d o , s i e l d is co co n t ie n e va rio s fich e ro s , la fra s e in clu irá u n e n t e ro . La
cla s e Me s s a g e Fo rm a t n o s p e rm it e in s e rt a r n ú m e ro s e n u n a fra s e .

2. Crear un ResourceBundle

Ais la re m o s e l t e xt o d e l m e n s a je e n u n Re s o u rc e Bu n d le p o rq u e d e b e s e r
t ra d u cid o :

ResourceBundle bundle =
ResourceBundle.getBundle("ChoiceBundle",currentLocale);
He m o s d e cid id o co n s t ru ir n u e s t ro Re s o u rc e Bu n d le co n fich e ro s d e p ro p ie d a d e s .
El fich e ro Ch o ic e Bu n d le _ e n _ US . p ro p e rt ie s co n t ie n e la s s ig u ie n t e s lín e a s :

pattern = There {0} on {1}.


noFiles = are no files
oneFile = is one file
multipleFiles = are {2} files
El co n t e n id o d e e s t e fich e ro d e p ro p ie d a d e s m u e s t ra có m o s e co n s t ru irá n y
fo rm a t e a rá n lo s m e n s a je s . La p rim e ra lín e a co n t ie n e e l p a t ró n p a ra
Me s s a g e Fo rm a t , q u e e xp lica m o s e n e l p a s o a n t e rio r. La s o t ra s lín e a s co n t ie n e n
fra s e s q u e re e m p la za rá n e l a rg u m e n t o { 0 } e n e l p a t ró n . La fra s e p a ra la cla ve
"m u lt ip le File s " co n t ie n e e l a rg u m e n t o { 2 } , q u e s e rá re e m p la za d o p o r u n n ú m e ro
Aq u í p o d e m o s ve r la ve rs ió n fra n ce s a d e l fich e ro d e p ro p ie d a d e s
Ch o ic e Bu n d le _ fr_ FR. p ro p e rt ie s :

pattern = Il {0} sur {1}.


noFiles = n' y a pas des fichiers
oneFile = y a un fichier
multipleFiles = y a {2} fichiers

3. Crear un formateador de Mensaje

En e s t e p a s o , e je m p la riza m o s Me s s a g e Fo rm a t y s e le ccio n a m o s s u Lo ca lid a d :

MessageFormat messageForm = new MessageFormat("");


messageForm.setLocale(currentLocale);
4. Crear un formateador de Choice

El o b je t o Ch o ic e Fo rm a t n o s p e rm it e e le g ir, b a s á n d o s e e n u n n ú m e ro d o u b le , u n
S t rin g p a rt icu la r. El ra n g o d e n ú m e ro s d o u b le y lo s o b je t o s S t rin g co n lo s q u e s e
m a p e a n , s e e s p e cifica n e n a rra ys :

double[] fileLimits = {0,1,2};

String [] fileStrings = {
bundle.getString("noFiles"),
bundle.getString("oneFile"),
bundle.getString("multipleFiles")
};
Ch o ic e Fo rm a t m a p e a ca d a e le m e n t o d e l a rra y d o u b le co n e l e le m e n t o d e l a rra y
S t rin g q u e t ie n e e l m is m o ín d ice . En n u e s t ro có d ig o d e e je m p lo , e l 0 m a p e a e l
S t rin g d e vu e lt o p o r la lla m a d a a b u n d le . g e t S t rin g ( "n o File s ") . Po r co in cid e n cia ,
e n n u e s t ro e je m p lo , e l ín d ice e s e l m is m o q u e e l va lo r e n e l a rra y file Lim it s . s i
h u b ie ra m o s s e le ccio n a d o file Lim it s [ 0 ] a 7 , Ch o ic e Fo rm a t m a p e a ría e l n ú m e ro 7
co n file S t rin g s [ 0 ] .
Es p e cifica m o s lo s a rra ys d o u b le y S t rin g cu a n d o e je m p la riza m o s Ch o ic e Fo rm a t :

ChoiceFormat choiceForm = new ChoiceFormat(fileLimits, fileStrings);

5. Aplicar el Patrón

¿ Re cu e rd a s e l p a t ró n q u e co n s t ru im o s e n e l p a s o 1 ? Ah o ra e s e l m o m e n t o d e
re cu p e ra r e l p a t ró n d e l Re s o u rc e Bu n d le y a p lica rlo a l o b je t o Me s s a g e Fo rm a t :

String pattern = bundle.getString("pattern");


messageForm.applyPattern(pattern);

6. Asignar lo formatos

En e s t e p a s o , a s ig n a m o s e l o b je t o Ch o ic e Fo rm a t cre a d o e n e l p a s o 4 a l o b je t o
Me s s a g e Fo rm a t :

Format[] formats = {choiceForm, null, NumberFormat.getInstance()};


messageForm.setFormats(formats);
El m é t o d o s e t Fo rm a t s a s ig n a o b je t o s Fo rm a t a lo s a rg u m e n t o s d e l p a t ró n d e l
m e n s a je . De b e m o s lla m a r a l m é t o d o a p p ly P a t t e rn a n t e s d e l lla m a r a l m é t o d o
s e t Fo rm a t s . La s ig u ie n t e t a b la m u e s t ra có m o e l a rra y Fo rm a t co rre s p o n d e co n
lo s a rg u m e n t o s d e l p a t ró n d e l m e n s a je :
Elemento del Array Argumento del Patrón
ch o ice Fo rm {0}
n u ll {1}
Nu m b e rFo rm a t . g e t In s t a n ce ( ) { 2 }

7. Seleccionar los Argumentos y el Formato del Mensaje

En t ie m p o d e e je cu ció n , a s ig n a m o s la s va ria b le s a l a rra y d e a rg u m e n t o s q u e


p a s a m o s a l o b je t o Me s s a g e Fo rm a t . Lo s e le m e n t o s d e l a rra y co rre s p o n d e n co n lo s
a rg u m e n t o s d e l p a t ró n . Po r e je m p lo , m e s s a g e Arg u m e n t [ 1 ] m a p e a a l a rg u m e n t o
{ 1 } d e l p a t ró n , q u e e s u n S t rin g q u e co n t ie n e e l n o m b re d e l d is co . En e l p a s o
a n t e rio r, a s ig n a m o s u n o b je t o Ch o ic e Fo rm a t a l a rg u m e n t o { 0 } d e l p a t ró n . Po r lo
t a n t o , e l n ú m e ro a s ig n a d o a m e s s a g e Arg u m e n t [ 0 ] e l S t rin g s e le ccio n a d o p o r e l
o b je t o Ch o ic e Fo rm a t . S i m e s s a g e Arg u m e n t [ 0 ] e s m a yo r o ig u a l q u e 2 , e l
S t rin g "a re { 2 } file s " re e m p la za a l a rg u m e n t o { 0 } d e l p a t ró n . El n ú m e ro a s ig n a d o
a m e s s a g e Arg u m e n t [ 2 ] s e rá s u b s t it u id o e n lu g a r d e l a rg u m e n t o { 2 } d e l p a t ró n .
In t e n t a re m o s h a ce r e s t o co n la s s ig u ie n t e s lín e a s d e có d ig o :

Object[] messageArguments = {null, "XDisk", null};

for (int numFiles = 0; numFiles < 4; numFiles++) {


messageArguments[0] = new Integer(numFiles);
messageArguments[2] = new Integer(numFiles);
String result = messageForm.format(messageArguments);
System.out.println(result);
}

8. Ejecutar el Programa de Demostración

Eje cu t e m o s e l p ro g ra m a p a ra la Lo ca lid a d U. S . En g lis h :

% java ChoiceFormatDemo en US

currentLocale = en_US

There are no files on XDisk.


There is one file on XDisk.
There are 2 files on XDisk.
There are 3 files on XDisk.
Co m p a ra lo s m e n s a je s m o s t ra d o s p o r e l p ro g ra m a co n la s fra s e s d e l
Re s o u rc e Bu n d le d e l p a s o 2 . Ob s e rva q u e e l o b je t o Ch o ic e Fo rm a t s e le ccio n a la
fra s e co re ct a , q u e e l o b je t o Me s s a g e Fo rm a t u t iliza p a ra co n s t ru ir e l m e n s a je
a p ro p ia d o .
La ve rs ió n fra n ce s a d e l m e n s a je t a m b ié n p a re ce co rre ct a :
% java ChoiceFormatDemo fr FR

currentLocale = fr_FR

Il n' y a pas des fichiers sur XDisk.


Il y a un fichier sur XDisk.
Il y a 2 fichiers sur XDisk.
Il y a 3 fichiers sur XDisk.

Oz it o
Trabajar con Excepciones
En la le cció n , Ma n e jo d e Erro re s u t iliza n d o Exce p cio n e s , m o s t ra m o s co m o la n za r y
ca p t u ra r e xce p cio n e s . Co m o p o d rá s re co rd a r, lo s m e n s a je s d e e xce p cio n e s
m o s t ra d o s p o r lo s e je m p lo s d e e s t a le cció n e s t á n e n In g lé s . Fre cu e n t e m e n t e , lo s
m e n s a je s d e e xce p cio n e s s ó lo s e u t iliza n p a ra p ro p ó s it o s d e d e p u ra d o y n u n ca s o n
vis t o s p o r lo u s u a rio s fin a le s . S in e m b a rg o , s i e s t o s u s u a rio s e s t á n e xp u e s t o s a
m e n s a je s d e e xce p cio n e s , d e b e re m o s a s e g u ra rn o s d e q u e n o e s t á n co d ifica d o s e n
cu a lq u ie r o t ro id io m a .
En e s t a le cció n , d a re m o s a lg u n o s t ru co s p a ra h a ce r lo s m e n s a je s d e e xce p cio n e s
in d e p e n d ie n t e s d e la Lo ca lid a d . Lo s e je m p lo s d e có d ig o d e e s t a s e cció n in clu ye n
o b je t o s Re s o u rc e Bu n d le y Me s s a g e Fo rm a t . S i n o lo h a s h e ch o a n t e rio rm e n t e ,
d e b e ría s le e r p rim e ro Ais la r Ob je t o s Es p e cífico s d e la Lo ca lid a d e n u n
Re s o u rce Bu n d le , y Fo rm a t e o d e Me n s a je s .

Manejar Mensajes de Excepciones Codificados

S i e l t e xt o d e l m e n s a je d e u n s u b cla s e d e Ex c e p t io n h a s id o co d ifica d o ,
n o p u e d e s e r lo ca liza d o , Pe ro e xis t e u n a t a jo , q u e e xp lica re m o s e n e s t a
s e cció n .

Crear Subclases de Exception Independientes de la Localidad

S i cre a m o s u n a s u b cla s e d e Ex c e p t io n , d e b e ría m o s a s e g u ra rn o s d e q u e


n o co n t ie n e u n m e n s a je s co d ifica d o e n s u in t e rio r. Nu e s t ra s s u b cla s e s ,
d e b e ría n im p le m e n t a r e l m é t o d o g e t Lo c a liz e d Me s s a g e .

Oz it o
Manejar Mensajes de Excepciones Codificados
Internamente
S u p o n g a m o s q u e lla m a m o s a u n m é t o d o q u e la n za u n a e xce p ció n , y q u e re m o s m o s t ra r e l
m e n s a je d e la e xce p ció n cu a n d o o cu rra e l e rro r. S i e s t e m é t o d o p e rt e n e ce a u n a cla s e d e u n
p a q u e t e e s crit o p o r o t ra s p e rs o n a s , n o t e n d re m o s n in g ú n co n t ro l s o b re e l t e xt o d e l m e n s a je
a m e n o s q u e t e n g a m o s a cce s o a l có d ig o fu e n t e . Es t e p u e d e s e r u n g ra ve p ro b le m a s i e l t e xt o
d e l m e n s a je h a s id o co d ifica d o , p o rq u e n o p o d rá s e r t ra d u cid o a o t ro s id io m a s . En e l
s ig u ie n t e có d ig o d e e je m p lo , e n co n t ra m o s e s t e p ro b le m a cu a n d o a b rim o s u n fich e ro q u e n o
e xis t e :

static public void defaultMessage() {

try {
FileInputStream in = new FileInputStream("vapor.txt");
}
catch (FileNotFoundException e) {
System.out.println("e.getMessage = " + e.getMessage());
System.out.println("e.getLocalizedMessage = " + e.getLocalizedMessage());
System.out.println("e.toString = " + e.toString());
}
}
La cla u s u la Ca t c h d e l m é t o d o d e fa u lt Me s s a g e g e n e ra la s ig u ie n t e s a lid a :

e.getMessage = vapor.txt
e.getLocalizedMessage = vapor.txt
e.toString = java.io.FileNotFoundException: vapor.txt
Es t o s m e n s a je s s o n in a d e cu a d o s p o r va ria s ra zo n e s . Prim e ro , e l t e xt o d e l m e n s a je e s t á
co d ifica d o d e n t ro d e la cla s e File N o t Fo u n d Ex c e p t io n y n o p u e d e s e r lo ca liza d o . In t e n t a m o s
im p rim ir e l S t rin g d e vu e lt o p o r g e t Lo c a liz e d Me s s a g e , p e ro co m o g e t Lo c a liz e d Me s s a g e
n o h a s id o im p le m e n t a d a , s ó lo d e vu e lve e l m is m o m e n s a je q u e e l m é t o d o g e t Me s s a g e .
Ad e m á s , g e t Me s s a g e s ó lo d e vu e lve e l n o m b re d e l fich e ro , q u e p o r s í m is m o n o e s u n
m e n s a je t ra d u cib le . Au n q u e p o d ría m o s e n co n t ra r ú t il e l t e n e r e l n o m b re d e l fich e ro d u ra n t e
la d e p u ra ció n , n u e s t ro s u s u a rio s fin a le s n e ce s it a rá n u n m e n s a je m á s in fo rm a t ivo .
En g e n e ra l, lo s m e n s a je s p ro p o rcio n a d o s p o r s u b cla s e s d e Ex c e p t io n , co m o
File N o t Fo u n d Ex c e p t io n , s e h a n cre a d o p a ra p ro g ra m a d o re s , n o p a ra u s u a rio s fin a le s . Po r
e je m p lo , u n p ro ce s a d o r d e t e xt o s n o d e b e ría m o s t ra r, "ja va . io . File No t Fo u n d Exce p t io n :
va p o r. t xt , " cu a n d o e l u s u a rio t ra t a d e a b rir u n fich e ro q u e n o e xis t e . Es t e m e n s a je , a u n q u e
e s t é cn ica m e n t e co rre ct o , n o t ie n e s e n t id o p a ra la m a yo ría d e la g e n t e . En s u lu g a r, cu a n d o
e l p ro ce s a d o r d e t e xt o s ca p t u ra ra la File N o t Fo u n d Ex c e p t io n , d e b e ría m o s t ra r e s t e
m e n s a je : "Ca n n o t fin d t h e file n a m e d va p o r. t xt . Ma ke s u re t h e file e xis t s . "
En u n a a p lica ció n co m o u n p ro ce s a d o r d e t e xt o s , e l t e xt o d e vu e lt o p o r
File N o t Fo u n d Ex c e p t io n . g e t Me s s a g e n o e s a p ro p ia d o p a ra lo s u s u a rio s fin a le s .
De b e ría m o s p ro p o rcio n a r u n m e n s a je q u e s e a fá cil d e e n t e n d e r, y q u e p u e d a s e r t ra d u cid o .
Ve re m o s co m o h a ce r e s t o co n e l s ig u ie n t e e je m p lo .
Co m o e l t e xt o d e l m e n s a je n e ce s it a s e t ra d u cid o , lo a is la re m o s e n u n Re s o u rc e Bu n d le .
Alm a ce n a re m o s n u e s t ro s m e n s a je s e n u n fich e ro d e p ro p ie d a d e s , co n s t ru ire m o s u n
Re s o u rc e Bu n d le lla m a d o Ex c e p t io n Bu n d le . Aq u í t e n e m o s e l m e n s a je d e l fich e ro
Ex c e p t io n Bu n d le _ e n _ US . p ro p e rt ie s :

template = Cannot find the file named {0}. Make sure the file exists.
En e l s ig u ie n t e có d ig o m o s t ra m o s u n m e n s a je s e n s ib le a la lo ca lid a d cu a n d o s e ca p t u ra
File N o t Fo u n d Ex c e p t io n . Prim e ro cre a m o s u n Re s o u rc e Bu n d le p a ra la Lo ca lid a d
a p ro p ia d a . Lu e g o re cu p e ra m o s e l p a t ró n d e l m e n s a je t ra d u cid o d e s d e e l Re s o u rc e Bu n d le .
Fin a lm e n t e , a p lica m o s e l p a t ró n d e l fo rm a t o p a ra in s e rt a r e l n o m b re d e l fich e ro e n e l
m e n s a je :

static public void customMessage(Locale currentLocale) {

System.out.println("Locale: " + currentLocale.toString());


String fileName = "vapor.txt";

try {
FileInputStream in = new FileInputStream(fileName);
}
catch (FileNotFoundException e) {
ResourceBundle messages =
ResourceBundle.getBundle("ExceptionBundle",currentLocale);
Object[] messageArguments = {fileName};
MessageFormat formatter = new MessageFormat("");
formatter.setLocale(currentLocale);
formatter.applyPattern(messages.getString("template"));
String errorOut = formatter.format(messageArguments);
System.out.println(errorOut);
}
}
La s a lid a d e l m é t o d o c u s t o m Me s s a g e e s t á b a s t a n t e m e jo r q u e :
"ja va . io . File No t Fo u n d Exce p t io n : va p o r. t xt . "

Locale: en_US
Cannot find the file named vapor.txt. Make sure the file exists.

Locale: de_DE
Die Datei vapor.txt konnte nicht gefunden werden.
Stellen Sie sicher, daß die Datei existiert.

Oz it o
Crear Subclases de Excepciones Independientes
de la Localidad
S i q u e re m o s cre a r u n s u b cla s e d e Ex c e p t io n cu a n d o n e ce s it a m o s m a n e ja r e rro re s
e s p e cífico s d e n u e s t ra s a p lica cio n e s , p o d e m o s cre a r n u e s t ra s s u b cla s e s
in d e p e n d ie n t e s d e la Lo ca lid a d s o b re s crib ie n d o s u m é t o d o g e t Lo c a liz e d Me s s a g e .
Ca d a m é t o d o q u e s o b re s crib a m o s d e b e ría a is la r e l m e n s a je q u e d e vu e lve e n u n
Re s o u rc e Bu n d le . Es t o p e rm it irá q u e e l m e n s a je s e a t ra d u cid o a va rio s id io m a s
d u ra n t e la lo ca liza ció n .
En e l s ig u ie n t e e je m p lo , ve re m o s có m o cre a r u n a s u b cla s e d e Ex c e p t io n q u e
m u e s t ra u n m e n s a je in d e p e n d ie n t e d e la Lo ca lid a d . El có d ig o fu e n t e d e e s t e
p ro g ra m a e s t á e n e s t o s d o s fich e ro s : Ove rLim it Exce p t io n . ja va y Acco u n t . ja va .

El p ro g ra m a Ac c o u n t s im u la u n a cu e n t a d e cré d it o . S i e s t e p ro g ra m a s e e xce d e e l
lím it e d e cré d it o , re cu p e ra u n m e n s a je lo ca liza d o d e s d e u n Re s o u rc e Bu n d le
lla m a d o Ex c e p t io n Bu n d le , y lu e g o m u e s t ra e l m e n s a je . En e l fich e ro
Ex c e p t io n Bu n d le _ e n _ US . p ro p e rt ie s , h e m o s e s p e cifica d o e s t e m e n s a je :

pattern = Negative balance of {0,number,currency} is not allowed.


El p ro g ra m a Ac c o u n t re cu p e ra e l m e n s a je co n e l m é t o d o g e t Lo c a liz e d Me s s a g e ,
q u e h e m o s im p le m e n t a d o e n u n a s u b cla s e d e Ex c e p t io n lla m a d a
Ov e rLim it Ex c e p t io n . El m é t o d o g e t Lo c a liz e d Me s s a g e a ce p t a u n o b je t o Lo c a le
co m o p a rá m e t ro . Es p e cifica m o s la Lo ca lid a d cu a n d o re cu p e ra m o s e l p a t ró n d e l
m e n s a je d e s d e e l Re s o u rc e Bu n d le , y t a m b ié n cu a n d o d e fin im o s e l o b je t o
Me s s a g e Fo rm a t . Po r lo t a n t o , n u e s t ra cla s e Ov e rLim it Ex c e p t io n e s s e n s ib le a la
Lo ca lid a d :

public class OverLimitException extends Exception {

private double detail;

public OverLimitException (double amount) {


detail = amount;
}

public String getMessage() {


return getLocalizedMessage(Locale.getDefault());
}

public String getLocalizedMessage(Locale currentLocale) {


ResourceBundle messages =
ResourceBundle.getBundle("ExceptionBundle",currentLocale);
Object[] messageArguments = {new Float(detail)};
MessageFormat formatter = new MessageFormat("");
formatter.setLocale(currentLocale);
formatter.applyPattern(messages.getString("pattern"));
return formatter.format(messageArguments);
}
}
En la cla s e Ac c o u n t , e l m é t o d o w it h d ra w la n za u n Ov e rLim it Ex c e p t io n s i e l
n u e vo b a la n ce e xce d e e l lím it e d e cré d it o . En e l s ig u ie n t e có d ig o , o b s e rva q u e
h e m o s p a s a d o e l p a rá m e t ro v a lu e a l co n s t ru ct o r Ov e rLim it Ex c e p t io n e n la
s e n t e n cia t h ro w . El co n s t ru ct o r a s ig n a e s t e p a rá m e t ro a l ca m p o d e t a il d e la cla s e
Ov e rLim it Ex c e p t io n . El m é t o d o g e t Lo c a liz e d Me s s a g e in s e rt a u n a
re p re s e n t a ció n S t rin g d e l ca m p o d e t a il e n e l m e n s a je d e vu e lt o . El m é t o d o
w it h d ra w e s e l s ig u ie n t e :

public void withdraw(double amount) throws OverLimitException {


double value = balance - amount;
if (value < creditLimit) {
throw new OverLimitException(value);
}
else {
balance = value;
}
}
En e l m é t o d o m a in d e la cla s e Ac c o u n t , lla m a m o s a l m é t o d o w it h d ra w y ca p t u ra
e l Ov e rLim it Ex c e p t io n s ie m p re q u e s e la n ce . La cla u s u la c a t c h im p rim e e l
S t rin g d e vu e lt o p o r g e t Lo c a liz e d Me s s a g e . Aq u í t ie n e s e l m é t o d o m a in :

static public void main(String[] args) {

Locale[] locales = {
new Locale("en","US"),
new Locale("de","DE")
};

Account credit = new Account();


credit.deposit(20.00f);

for (int k = 0; k < locales.length; k++) {


try {
credit.withdraw(1000.00f);
}
catch (OverLimitException e) {
System.out.println("Locale: " + locales[k].toString());
System.out.println(e.getLocalizedMessage(locales[k]));
}
} // for
}
El p ro g ra m a Ac c o u n t m u e s t ra d o s m e n s a je s lo ca liza d o s . No s ó lo e l t e xt o s e
m u e s t ra e n e l id io m a co rre ct o , s i n o q u e t a m b ié n e l fo rm a t o d e m o n e d a e s e l
a d e cu a d o p a ra ca d a Lo ca lid a d . :

% java Account

Locale: en_US
Negative balance of ($980.00) is not allowed.

Locale: de_DE
Ihr Konto um -980,00 DM zu überziehen ist nicht gestattet.

Oz it o
Comparar Strings
La s a p lica cio n e s q u e b u s ca n u o rd e n a n t e xt o re a liza n fre cu e n t e s co m p a ra cio n e s .
Po r e je m p lo , u n n a ve g a d o r n e ce s it a co m p a ra r la ig u a ld a d d e d o s ca d e n a s cu a n d o
lo s u s u a rio s fin a le s b u s ca n a lg ú n t e xt o . Un e s crit o r d e in fo rm e s re a liza
co m p a ra cio n e s d e ca d e n a s cu a n d o o rd e n a u n lis t a d e ca d e n a s e n o rd e n a lfa b é t ico .
S i la a u d ie n cia d e n u e s t ra a p lica ció n e s t á lim it a d a a p e rs o n a s d e h a b la in g le s a ,
p ro b a b le m e n t e p o d a m o s h a ce r la s co m p a ra cio n e s co n e l m é t o d o
S t rin g . c o m p a re To . Es t e m é t o d o re a liza u n a co m p a ra ció n b in a ria d e ca ra ct e re s
Un ico d e d e n t ro d e la s ca d e n a s . Pa ra m u ch o s id io m a s , e s t a co m p a ra ció n b in a ria n o
e s s u ficie n t e p a ra o rd e n a r ca d e n a s , p o rq u e lo s va lo re s Un ico d e n o co rre s p o n d e n
co n e l o rd e n re la t ivo d e lo s ca ra ct e re s .
Afo rt u n a d a m e n t e , la cla s e Co lla t o r p e rm it e re a liza r co m p a ra cio n e s d e ca d e n a s e n
d ife re n t e s id io m a s . En e s t a le cció n , ve re m o s có m o u t iliza r la cla s e Co lla t o r p a ra
b u s ca r y o rd e n a r t e xt o .

Realizar Comparaciones Independientes de la Localidad

La s re g la s d e co m p a ra ció n d e fin e n la s e cu e n cia d e o rd e n a ció n d e lo s


s t rin g s . Es t a s re g la s p u e d e n va ria r co n la Lo ca lid a d , p o rq u e lo s d is t in t o s
id io m a s n a t u ra le s o rd e n a n s u s p a la b ra s d e fo rm a d ife re n t e . Ut iliza n d o
la s re g la s p re d e fin id a s d e la cla s e Co lla t o r, p o d e m o s o rd e n a r ca d e n a s
d e u n a fo rm a in d e p e n d ie n t e d e la Lo ca lid a d .

Personalizar la Reglas de Comparación

En a lg u n o s ca s o s , la s re g la s p re d e fin id a s d e co m p a ra ció n p ro p o rcio n a d a s


p o r la cla s e Co lla t o r p o d ría n n o s e r s u ficie n t e . Po r e je m p lo , p o d ría m o s
q u e re r o rd e n a r s t rin g s e n u n id io m a cu ya lo ca lid a d n o e s t u vie ra
s o p o rt a d a p o r Co lla t o r. En e s t a s it u a ció n , p o d e m o s d e fin ir n u e s t ra s
p ro p ia s re g la s d e co m p a ra ció n , y a s ig n a rla s a u n o b je t o
Ru le Ba s e d Co lla t o r.

Aumentar el Rendimiento de la Comparación

Co n la cla s e Co lla t io n Ke y , p o d re m o s in cre m e n t a r la e ficie n cia d e la


co m p a ra ció n d e ca d e n a s . Es t a cla s e co n vie rt e o b je t o s S t rin g a cla ve s
co rt a s q u e s ig u e n la s re g la s d e u n o b je t o Co lla t o r d a d o .

Oz it o
Realizar Comparaciones Independientes de la
Localidad
S e u t iliza la cla s e Co lla t o r p a ra re a liza r co m p a ra cio n e s in d e p e n d ie n t e s d e la
Lo ca lid a d . Es t a cla s e e s s e n s ib le a la Lo ca lid a d . Pa ra ve r la s lo ca lid a d e s s o p o rt a d a s
p o r la cla s e Co lla t o r, s e lla m a a l m é t o d o g e t Av a ila b le Lo c a le s :

Locale[] locales = Collator.getAvailableLocales();


Pa ra e je m p la riza r la cla s e Co lla t o r, s e lla m a a l m é t o d o g e t I n s t a n c e y s e
e s p e cifica u n a Lo ca lid a d :

Collator myCollator = Collator.getInstance(new Locale("en", "US"));


El m é t o d o g e t I n s t a n c e re a lm e n t e d e vu e lve u n Ru le Ba s e d Co lla t o r, q u e e s u n a
s u b cla s e co n cre t a d e Co lla t o r. El o b je t o Ru le Ba s e d Co lla t o r co n t ie n e u n co n ju n t o
d e re g la s q u e d e t e rm in a n e l o rd e n d e o rd e n a ció n d e la s ca d e n a s p a ra u n a lo ca lid a d
e s p e cifica d a . Es t a s re g la s e s t á n p re d e fin id a s p a ra ca d a lo ca lid a d . Co m o e s t a s
re g la s e s t á n e n ca p s u la d a s d e n t ro d e Ru le Ba s e d Co lla t o r, lo s p ro g ra m a s n o
n e ce s it a rá n ru t in a s e s p e cia le s p a ra t ra t a r co n la s re g la s d e co m p a ra ció n p a ra
va rio s id io m a s .
S e lla m a a l m é t o d o Co lla t o r. c o m p a re p a ra re a liza r co m p a ra cio n e s d e ca d e n a s
in d e p e n d ie n t e s d e la Lo ca lid a d . Es t e m é t o d o d e vu e lve u n e n t e ro m e n o r q u e , ig u a l
q u e o m a yo r q u e ce ro cu a n d o la ca d e n a d e l p rim e r a rg u m e n t o s e a m e n o r q u e ,
ig u a l q u e o m a yo r q u e la ca d e n a d e l s e g u n d o a rg u m e n t o .

System.out.println(myCollator.compare("abc", "def"));
System.out.println(myCollator.compare("rtf", "rtf"));
System.out.println(myCollator.compare("xyz", "abc"));
Aq u i p u e d e s ve r la s a lid a d e l p ro g ra m a a n t e rio r:

-1
0
1
Ut iliza re m o s e l m é t o d o c o m p a re p a ra re a liza r o p e ra cio n e s d e o rd e n a ció n . El
p ro g ra m a d e e je m p lo , lla m a d o Co lla t o rDe m o . ja va u t iliza e l m é t o d o c o m p a re p a ra
o rd e n a r u n a rra y d e p a la b ra s In g le s a s y Fra n ce s a s . En e s t e p ro g ra m a , ve re m o s lo
q u e s u ce d e cu a n d o s e o rd e n a u n a rra y co n d o s o b je t o s Co lla t o r d ife re n t e s :

Collator fr_FRCollator = Collator.getInstance(new Locale("fr","FR"));


Collator en_USCollator = Collator.getInstance(new Locale("en","US"));
Nu e s t ro m é t o d o p a ra o rd e n a r, lla m a d o s o rt S t rin g s , p u e d e s e r u t iliza d o co n
cu a lq u ie r Co lla t o r. Ob s e rva q u e e l m é t o d o s o rt S t rin g s lla m a a l m é t o d o
c o m p a re :

public static void sortStrings(Collator collator, String[] words) {


String tmp;
for (int i = 0; i < words.length; i++) {
for (int j = i + 1; j < words.length; j++) {
// Compare elements of the array two at a time.
if (collator.compare(words[i], words[j] ) > 0 ) {
// Swap words[i] and words[j]
tmp = words[i];
words[i] = words[j];
words[j] = tmp;
}
}
}
}
El Co lla t o r In g lé s o rd e n a la s p a la b ra s d e e s t a fo rm a :

peach
pêche
péché
sin
De a cu e rd o a la s re g la s d e co m p a ra ció n d e l id io m a Fra n cé s , la lis t a a n t e rio r s e ría
e rró n e a . En Fra n cé s , "p ê ch e " d e b e ría s e g u ir a "p é ch é " e n u n a lis t a o rd e n a d a .
Nu e s t ro Co lla t o r Fra n cé s o rd e n a d e l a rra y d e fo rm a co rre ct a :

peach
péché
pêche
sin

Oz it o
Personalizar las Reglas de Comparación
En la s e cció n a n t e rio r, e xp lica m o s co m o re a liza r co m p a ra cio n e s d e ca d e n a s
u t iliza n d o d ife re n t e s re g la s p a ra ca d a lo ca lid a d . Es t a s re g la s d e co m p a ra ció n
d e t e rm in a n e l o rd e n d e o rd e n a ció n d e la s ca d e n a s . S i la s re g la s p re d e fin id a s n o
s o n s u ficie n t e s , p o d e m o s d is e ñ a r n u e s t ra s p ro p ia s re g la s y a s ig n a rla s a u n o b je t o
Ru le Ba s e d Co lla t o r.
La s re g la s d e co m p a ra ció n p e rs o n a liza d a s e s t á n co n t e n id a s e n u n o b je t o S t rin g
q u e s e p a s a a l co n s t ru ct o r d e Ru le Ba s e d Co lla t o r. Aq u í t e n e m o s u n e je m p lo :

String simpleRule = "< a < b < c < d";


RuleBasedCollator simpleCollator = new RuleBasedCollator(simpleRule);
Pa ra e l o b je t o s im p le Co lla t o r d e l e je m p lo a n t e rio r, "a " e s m e n o r q u e "b , " q u e e s
m e n o r q u e "c, " y a s í s u ce s iva m e n t e . El m é t o d o s im p le Co lla t o r. c o m p a re s e
re fe rirá a e s t a s re g la s cu a n d o co m p a re ca d e n a s . La s ín t a xis co m p le t a u t iliza d a p a ra
co n s t ru ir u n a re g la d e co m p a ra ció n e s m á s fle xib le y co m p le t a q u e e s e s e n cillo
e je m p lo . Pa ra u n a co m p le t a d e s crip ció n d e la s ín t a xis , p u e d e s ve r a la
d o cu m e n t a ció n d e l API p a ra la cla s e Ru le Ba s e d Co lla t o r.

En e l s ig u ie n t e e je m p lo o rd e n a m o s u n a lis t a d e p a la b ra s e s p a ñ o la s co n d o s o b je t o s
Co lla t o rs . El có d ig o co m p le t o d e e s t e e je m p lo e s t á e n e l fich e ro lla m a d o
Ru le s De m o . ja va .

Em p e za m o s d e fin ie n d o n u e s t ra s p ro p ia s re g la s d e o rd e n a ció n p a ra In g lé s y
Es p a ñ o l. He m o s d e cid id o o rd e n a r la s p a la b ra s e n Es p a ñ o l d e la fo rm a t ra d icio n a l.
Cu a n d o s e o rd e n a d e e s t a fo rm a , la s le t ra s "ch , " y "ll, " y s u s m a yú s cu la s
e q u iva le n t e s . t ie n e n s u p ro p ia p o s ició n e n e l o rd e n d e o rd e n a ció n . Es t a s p a re ja s d e
ca ra ct e re s s e co m p a ra n co m o s i fu e ra n u n s ó lo ca ra ct e r. Po r e je m p lo , "ch " o rd e n a
co m u n a s ó la le t ra d e s p u é s d e "cz". Ob s e rva la s d ife re n cia s p a ra lo s d o s Co lla t o rs :

String englishRules =
("< a,A < b,B < c,C < d,D < e,E < f,F " +
"< g,G < h,H < i,I < j,J < k,K < l,L " +
"< m,M < n,N < o,O < p,P < q,Q < r,R " +
"< s,S < t,T < u,U < v,V < w,W < x,X " +
"< y,Y < z,Z");

String smallnTilde = new String("\u00F1");


String capitalNTilde = new String("\u00D1");

String traditionalSpanishRules =
("< a,A < b,B < c,C " +
"< ch, cH, Ch, CH " +
"< d,D < e,E < f,F " +
"< g,G < h,H < i,I < j,J < k,K < l,L " +
"< ll, lL, Ll, LL " +
"< m,M < n,N " +
"< " + smallnTilde + "," + capitalNTilde + " " +
"< o,O < p,P < q,Q < r,R " +
"< s,S < t,T < u,U < v,V < w,W < x,X " +
"< y,Y < z,Z");
En la s s ig u ie n t e s lín e a s d e có d ig o , cre a m o s lo s Co lla t o rs y lla m a m o s a n u e s t ra
ru t in a d e o rd e n a ció n :

try {
RuleBasedCollator enCollator =
new RuleBasedCollator(englishRules);
RuleBasedCollator spCollator =
new RuleBasedCollator(traditionalSpanishRules);

sortStrings(enCollator, words);
printStrings(words);

System.out.println();

sortStrings(spCollator, words);
printStrings(words);
}
catch (ParseException pe) {
System.out.println("Parse exception for rules");
}
La ru t in a d e o rd e n a ció n , lla m a d a s o rt S t rin g s , e s g e n é rica . Ord e n a cu a lq u ie r a rra y
d e p a la b ra s d e a cu e rd o a la s re g la s d e cu a lq u ie r o b je t o Co lla t o r:

public static void sortStrings(Collator collator, String[] words) {


String tmp;
for (int i = 0; i < words.length; i++) {
for (int j = i + 1; j < words.length; j++) {
// Compare elements of the words array
if( collator.compare(words[i], words[j] ) > 0 ) {
// Swap words[i] and words[j]
tmp = words[i];
words[i] = words[j];
words[j] = tmp;
}
}
}
}
Cu a n d o o rd e n a m o s co n la s re g la s d e o rd e n a ció n In g le s a s e l a rra y a p a re ce rá d e
e s t a fo rm a :

chalina
curioso
llama
luz
Co m p a ra la lis t a a n t e rio r co n la s ig u ie n t e , q u e e s t á o rd e n a d a d e a cu e rd o a la s
re g la s d e o rd e n a ció n d e l Es p a ñ o l t ra d icio n a l:

curioso
chalina
luz
llama

Oz it o
Aumentar el Rendimiento de la Ordenación
La o rd e n a ció n d e la rg a s lis t a s d e p a la b ra s co n s u m e m u ch o t ie m p o . S i e l a lg o rit m o
d e o rd e n a ció n co m p a ra ca d e n a s re p e t id a m e n t e p o d e m o s a ce le ra r e l p ro ce s o
u t iliza n d o la cla s e Co lla t io n Ke y .
Un o b je t o Co lla t io n Ke y re p re s e n t a u n a cla ve d e o rd e n a ció n p a ra u n S t rin g y u n
Co lla t o r d a d o s . Co m p a ra r d o s o b je t o s Co lla t io n Ke y e n vu e lve u n a a m p lica
co m p a ra ció n d e cla ve s co rt a s q u e e s m á s rá p id o q u e co m p a ra r o b je t o s S t rin g co n
e l m é t o d o Co lla t o r. c o m p a re . S in e m b a rg o , g e n e ra r o b je t o s Co lla t io n Ke y
t a m b ié n n e ce s it a t ie m p o . Po r lo t a n t o , s i u n S t rin g s ó lo va a s e r co m p a ra d o u n a
ve z, Co lla t o r. c o m p a re o fre ce m e jo r re n d im ie n t o .
En e l s ig u ie n t e e je m p lo , u t iliza m o s u n o b je t o Co lla t io n Ke y p a ra o rd e n a r u n a rra y
d e p a la b ra s . El có d ig o co m p le t o d e e s t e e je m p lo e s t á e n e l fich e ro lla m a d o
Ke ys De m o . ja va .

Cre a m o s u n a rra y d e o b je t o s Co lla t io n Ke y e n e l m é t o d o m a in . Pa ra cre a r u n


Co lla t io n Ke y , s e lla m a a l m é t o d o g e t Co lla t io n Ke y s o b re u n o b je t o Co lla t o r. No
s e p u e d e n co m p a ra r d o s o b je t o s Co lla t io n Ke y q u e n o s e a n o rig in a le s d e l m is m o
o b je t o Co lla t o r. Aq u i p o d e m o s ve r e l m é t o d o m a in :

static public void main(String[] args) {

Collator enUSCollator = Collator.getInstance(new Locale("en","US"));

String [] words = {
"peach",
"apricot",
"grape",
"lemon"
};

CollationKey[] keys = new CollationKey[words.length];

for (int k = 0; k < keys.length; k ++) {


keys[k] = enUSCollator.getCollationKey(words[k]);
}

sortArray(keys);
printArray(keys);
}
El m é t o d o s o rt Arra y lla m a a l m é t o d o Co lla t io n Ke y . c o m p a re To . Es t e m é t o d o
d e vu e lve u n e n t e ro m e n o r q u e , ig u a l q u e , o m a yo r q u e ce ro s i e l o b je t o k e y s [ i] e s
m e n o r q u e , ig u a l q u e o m a yo r q u e e l o b je t o k e y s [ j] . Ob s e rva q u e h e m o s
co m p a ra d o lo s o b je t o s Co lla t io n Ke y , n o lo s o b je t o s S t rin g d e l a rra y o rig in a l d e
p a la b ra s . Aq u í p u e d e s ve r e l có d ig o d e l m é t o d o s o rt Arra y :

public static void sortArray(CollationKey[] keys) {

CollationKey tmp;

for (int i = 0; i < keys.length; i++) {


for (int j = i + 1; j < keys.length; j++) {
// Compare the keys
if( keys[i].compareTo( keys[j] ) > 0 ) {
// Swap keys[i] and keys[j]
tmp = keys[i];
keys[i] = keys[j];
keys[j] = tmp;
}
}
}
}
He m o s o rd e n a d o u n a rra y d e o b je t o s Co lla t io n Ke y , p e ro n u e s t ro o b je t ivo o rig in a l
e ra o rd e n a r u n a rra y d e o b je t o s S t rin g . Pa ra re cu p e ra r e l S t rin g q u e re p re s e n t a a
ca d a o b je t o Co lla t io n Ke y , lla m a m o s a l m é t o d o g e t S o u rc e S t rin g e n e l m é t o d o
d is p la y W o rd s :

static void displayWords(CollationKey[] keys) {

for (int i = 0; i < keys.length; i++) {


System.out.println(keys[i].getSourceString() + " ");
}
}
El m é t o d o d is p la y W o rd s im p rim e la s s ig u ie n t e s lín e a s :

apricot
grape
lemon
peach

Oz it o
Detectar Límites de Texto
La s a p lica cio n e s q u e m a n ip u la n t e xt o n e ce s it a n lo ca liza r lím it e s d e n t ro d e l p ro p io
t e xt o . Po r e je m p lo , co n s id e re m o s a lg u n a s d e la s fu n cio n e s co m u n e s e n u n
p ro ce s a d o r d e t e xt o s : ilu m in a r u n ca ra ct e r, co rt a r u n a p a la b ra , m o ve r e l cu rs o r a l
p á rra fo s ig u ie n t e , y co rt a r la s p a la b ra s a l fin a l d e la lín e a . Pa ra re a liza r ca d a u n a
d e e s t a s fu n cio n e s , e l p ro ce s a d o r d e t e xt o s d e b e p o d e r d e t e ct a r lo s lím it e s ló g ico s
d e l t e xt o . Afo rt u n a d a m e n t e , n o t e n e m o s q u e e s crib ir n u e s t ra s p ro p ia s ru t in a s p a ra
re a liza r a n á lis is d e lím it e s . En s u lu g a r, p o d e m o s a p ro ve ch a rn o s d e lo s m é t o d o s
p ro p o cio n a d o s p o r la cla s e Bre a kIt e ra t o r.

Sobre la clase BreakIterator

Es t a s e cció n e xp lica la e je m p la riza ció n d e m é t o d o s y lo s cu rs o re s


im a g in a rio s d e la cla s e Bre a k I t e ra t o r.

Límite de Caracter

En e s t a s e cció n a p re n d e rá s la d ife re n cia e n t re lo s ca ra ct e re s d e u s u a rio y


lo s ca ra ct e re s Un ico d e , y co m o lo ca liza r lo s ca ra ct e re s d e u s u a rio co n u n
Bre a k I t e ra t o r.

Límite de Palabra

S i la a p lica ció n n e ce s it a s e le ccio n a r o la ca liza r p a la b ra s d e n t ro d e l t e xt o ,


e n co n t ra re m o s u t il e l u s o d e u n Bre a k I t e ra t o r.

Límites de Párrafo

De t e rm in a r lo s lím it e s d e p á rra fo p u e d e s e r p ro b le m á t ico , d e b id o a la


u t iliza ció n a m b ig u a d e t e rm in a d o re s d e s e n t e cia s e n m u ch o s id io m a s
e s crit o s . Es t a s e cció n e xa m in a a lg u n o s d e lo s p ro b le m a s q u e p o d re m o s
e n co n t ra rn o s , y co m o t ra t a rlo s co n la cla s e Bre a k I t e ra t o r.

Límite de Línea

Es t a s e cció n d e s crib e co m o lo ca liza r la s ru p t u ra s d e lín e a p o t e n cia le s e n


u n a ca d e n a d e t e xt o co n u n Bre a k I t e ra t o r.

Oz it o
Sobre la clase BreakIterator
La cla s e Bre a k I t e ra t o r e s s e n s ib le a la Lo ca lid a d , p o rq u e lo s lím it e s d e t e xt o
p u e d e n va ria r co n e l id io m a . Po r e je m p lo , la re g la s p a ra ru p t u ra d e lín e a s n o s o n
la s m is m a s p a ra t o d o s lo s id io m a s . Pa ra d e t e rm in a r la s Lo ca lid a d e s s o p o rt a d a s p o r
la cla s e Bre a k I t e ra t o r s e lla m a a l m é t o d o g e t Av a ila b le Lo c a le s :

Locale[] locales = BreakIterator.getAvailableLocales();


S e p u e d e n a n a liza r cu a t ro t ip o s d ife re n t e s d e lím it e s co n la cla s e Bre a k I t e ra t o r:
ca ra ct e r, p a la b ra , p á rra fo y ru p t u ra p o t e n cia l d e lín e a . Cu a n d e s e e je m p la riza u n
Bre a k I t e ra t o r, s e d e b e lla m a r a l m é t o d o d e cre a cció n a p ro p ia d o :
● g e t Ch a ra c t e rI n s t a n c e

● g e t W o rd I n s t a n c e

● g e tSe nte nce Ins ta nce

● g e t Lin e I n s t a n c e

Ca d a e je m p la r d e Bre a k I t e ra t o r s ó lo p u e d e d e t e ct a r u n t ip o d e lím it e . S i s e
q u ie re lo ca liza r e l lím it e d e ca ra ct e r y d e p a la b ra , p o r e je m p lo , s e n e ce s it a rá cre a r
d o s e je m p la re s s e p a ra d o s .
Un Bre a k I t e ra t o r t ie n e u n cu rs o r im a g in a rio q u e a p u n t a a l lím it e a ct u a l e n u n a
ca d e n a d e t e xt o . S e p u e d e m o ve r e s t e cu rs o r d e n t ro d e l t e xt o co n lo s m é t o d o s
p re v io u s y n e x t . Po r e je m p lo , s i h e m o s cre a d o u n Bre a k I t e ra t o r co n
g e t W o rd I n s t a n c e , ca d a ve z q u e lla m e m o s a l m é t o d o n e x t e l cu rs o r d e m o ve rá a l
s ig u ie n t e lím it e d e p a la b ra d e n t ro d e l t e xt o . Lo s m é t o d o s d e m o vim ie n t o d e l cu rs o r
d e vu e lve n u n e n t e ro in d ica n d o la p o s ició n d e l lím it e . Es t a p o s ició n e s e l ín d ice d e l
ca ra ct e r d e la ca d e n a d e t e xt o q u e s ig u e a l lím it e . Al ig u a l q u e lo s S t rin g s
in d e xa d o s , lo s lím it e s e s t á n b a s a d o s e n ce ro . El p rim e r lím it e e s e l 0 , y e l ú lt im o
lím it e e s la lo n g it u d d e la ca d e n a .
S e d e b e ría u t iliza r la cla s e Bre a k I t e ra t o r s ó lo co n t e xt o n a t u ra l. No s e d e b e
u t iliza r co n le n g u a je s d e p ro g ra m a ció n .
En la s s ig u ie n t e s s e ccio n e s , p ro p o rcio n a re m o s e je m p lo s d e ca d a t ip o d e lím it e . Lo s
e je m p lo s d e có d ig o s e h a n e xt ra id o d e u n fich e ro lla m a d o Bre a kIt e ra t o rDe m o . ja va .

Oz it o
Límite de Caracter
S e n e ce s it a rá lo ca liza r lo s lím it e s d e ca ra ct e r s i n u e s t ra a p lica ció n p e rm it e a l
u s u a rio fin a l s e le ccio n a r ca ra ct e re s in d ivid u a le s . o m o ve r e l cu rs o r a t ra vé s d e l
t e xt o ca ra ct e r a ca ra ct e r. Pa ra cre a r u n Bre a k I t e ra t o r q u e lo ca lice lo s lím it e s d e
ca ra ct e r s e lla m a a l m é t o d o g e t Ch a ra c t e rI n s t a n c e :

BreakIterator characterIterator =
BreakIterator.getCharacterInstance(currentLocale);
Es t e t ip o d e Bre a k I t e ra t o r d e t e ct a lím it e s e n t re ca ra ct e re s d e u s u a rio , n o s ó lo
ca ra ct e re s Un ico d e . Lo s ca ra ct e re s d e u s u a rio va ría n co n e l id io m a , p e ro la cla s e
Bre a k I t e ra t o r p u e d e re co n o ce r e s t a s d ife re n cia s p o rq u e e s s e n s ib le a la
Lo ca lid a d . Un ca ra ct e r d e u s u a rio p o d ría e s t a r co m p u e s t o p o r u n o o m á s ca ra ct e re s
Un ico d e . Po r e je m p lo , e l ca ra ct e r d e u s u a rio ü p o d ría co m p o n e rs e co m b in a n d o lo s
ca ra ct e re s Un ico d e '\ u 0 0 7 5 ' ( u ) '\ u 0 0 a 8 ' ( ¨ ) . S in e m b a rg o , e s t e n o e s e l m e jo r
e je m p lo , p o rq u e e l ca ra ct e r ü t a m b ié n p o d ría s e r re p re s e t n a d o p o r u n s ó lo ca ra ct e r
Un ico d e '\ u 0 0 fc'. Ve re m o s e l id io m a Ára b e p a ra u n e je m p lo m á s re a lis t a .
En Ára b e , la p a la b ra p a ra ca s a e s :

Au n q u e e s t a p a la b ra co n t ie n e t re s ca ra ct e re s d e u s u a rio , e s t á co m p u e s t a p o r s e is
ca ra ct e re s Un ico d e :

String house = "\u0628" + "\u064e" + "\u064a" +


"\u0652" + "\u067a" + "\u064f";
Lo s ca ra ct e re s Un ico d e d e la s p o s icio n e s 1 , 3 y 5 e n la ca d e n a h o u s e s o n
d ia crít ico s . En Ára b e lo s d ia crít ico s s o n n e ce s a rio s , p o rq u e p u e d e n a lt e ra r e l
s ig n ifica d o d e la s p a la b ra s . Lo s d ia crít ico s e n n u e s t o e je m p lo s o n ca ra ct e re s n o
b la n co s ya q u e a p a re ce n s o b re lo s ca ra ct e re s b a s e . En u n p ro ce s a d o r d e t e xt o s
á ra b e , n o p o d e m o s m o ve r e l cu rs o r s o b re ca d a ca ra ct e r Un ico d e d e la ca d e n a . En
s u lu g a r, d e b e m o s m o ve rn o s s o b re ca d a ca ra ct e r d e u s u a rio , q u e p o d ría e s t a r
co m p u e s t o p o r m á s d e u n ca ra ct e r Un ico d e . Po r lo t a n t o , d e b e m o s u t iliza r u n
Bre a k I t e ra t o r p a ra s ca n e a r lo s ca ra ct e re s d e u s u a rio e n la ca d e n a .
En n u e s t ro e je m p lo , Bre a kIt e ra t o rDe m o . ja va , h e m o s cre a d o u n Bre a k I t e ra t o r
p a ra s ca n e a r ca ra ct e re s a rá b ico s . Lu e g o p a s a m o s e s t e Bre a k I t e ra t o r, ju n t o co n
e l o b je t o S t rin g cre a d o a n t e rio rm e n t e , a l m é t o d o lla m a d o lis t P o s it io n s :

BreakIterator arCharIterator =
BreakIterator.getCharacterInstance(new Locale ("ar","SA"));
listPositions (house,arCharIterator);
El m é t o d o lis t P o s it io n s u t iliza u n Bre a k I t e ra t o r p a ra lo ca liza r lo s lím it e s d e
ca ra ct e r d e n t ro d e la ca d e n a . Ob s e rva q u e a s ig n a m o s u n s t rin g p a rt icu la r a l
Bre a k I t e ra t o r co n e l m é t o d o s e t Te x t . Re cu p e ra m o s e l p rim e r lím it e d e ca ra ct e r
co n e l m é t o d o firs t , lu e g o lla m a m o s a l m é t o d o n e x t h a s t a q u e s e d e vu e lva la
co n s t a n t e Bre a k I t e ra t o r. D ON E. Aq u í p o d e m o s ve r e l có d ig o d e e s t a ru t in a :

static void listPositions(String target, BreakIterator iterator) {

iterator.setText(target);
int boundary = iterator.first();

while (boundary != BreakIterator.DONE) {


System.out.println (boundary);
boundary = iterator.next();
}
}
El m é t o d o lis t P o s it io n s im p rim e la s s ig u ie n t e s p o s icio n e s d e lím it e s p a ra lo s
ca ra ct e re s d e u s u a rio d e la ca d e n a h o u s e . La s p o s icio n e s d e lo s d ia crít ico s ( 1 , 3 ,
5 ) n o s e lis t a n :

0
2
4
6

Oz it o
Límite de Palabra
S e in vo ca a l m é t o d o g e t W o rd I t e ra t o r p a ra e je m p la riza r u n Bre a k I t e ra t o r q u e
d e t e ct e lím it e s d e p a la b ra :

BreakIterator wordIterator =
BreakIterator.getWordInstance(currentLocale);
Qu e rre m o s cre a r u n Bre a k I t e ra t o r co m o é s t e cu a n d o n u e s t ra s a p lica cio n e s
n e ce s it e n re a liza r o p e ra cio n e s co n p a la b ra s in d ivid u a le s . Es t a s o p e ra cio n e s p o d ría n
s e r la s fu n cio n e s co m u n e s d e lo s p ro ce s a d o re s d e t e xt o s co m o s e le cio n a r, co rt a r,
p e g a r y co p ia r. O n u e s t ra s a p lica cio n e s p o d ría n b u s ca r p a la b ra s , y p a ra h a ce r e s t o
n e ce s it a n p o d e r d is t in g u ir e n t re p a la b ra s co m p le t a s .
Cu a n d o s e re a liza n a n á lis is d e lím it e s d e p a la b ra , u n Bre a k I t e ra t o r d ife re n cia
e n t re la s p a la b ra s y lo s ca ra ct e re s q u e n o fo rm a n p a rt e d e la s p a la b ra s . Es t o s
ca ra ct e re s , q u e in clu ye n e s p a cio s , t a b u la d o re s , m a rca s d e p u n t u a ció n , y a lg u n o s
s ím b o lo s , t ie n e n lím it e s d e p a la b ra s e n á m b o s la d o s .
En e l s ig u ie n t e e je m p lo , e xt ra id o d e l p ro g ra m a Bre a kIt e ra t o rDe m o . ja va , q u e re m o s
m a rca r lo s lím it e s d e p a la b ra s e n a lg ú n t e xt o . Prim e ro cre a m o s e l Bre a k I t e ra t o r y
lu e g o lla m a m o s a u n m é t o d o q u e h e m o s e s crit o lla m a d o m a rk Bo u n d a rie s :

Locale currentLocale = new Locale ("en","US");

BreakIterator wordIterator =
BreakIterator.getWordInstance(currentLocale);

String someText = "She stopped. " +


"She said, \"Hello there,\" and then went on.";

markBoundaries(someText, wordIterator);
El p ro p ó s it o d e e s t e m é t o d o e s m a rca r lo s lím it e s d e p a la b ra s e n u n s t rin g co n u n
ca ra ct e r ( '^ ') . Ca d a ve z q u e Bre a k I t e ra t o r d e t e ct a u n lím it e p a la b ra , in s e rt a m o s
e s t e ca ra ct e r e n e l b u ffe r m a rk e rs . S ca n e a m o s e l s t rin g e n u n b u cle , lla m a n d o a l
m é t o d o n e x t h a s t a q u e d e vu e lva Bre a k I t e ra t o r. D ON E. Aq u í t e n e m o s e l có d ig o
d e la ru t in a m a rk Bo u n d a rie s :

static void markBoundaries(String target, BreakIterator iterator) {

StringBuffer markers = new StringBuffer();


markers.setLength(target.length() + 1);
for (int k = 0; k < markers.length(); k++) {
markers.setCharAt(k,' ');
}
iterator.setText(target);
int boundary = iterator.first();

while (boundary != BreakIterator.DONE) {


markers.setCharAt(boundary,'^');
boundary = iterator.next();
}

System.out.println(target);
System.out.println(markers);
}
El m é t o d o m a rk Bo u n d a rie s im p rim e e l s t rin g t a rg e t y e l b u ffe r m a rk e rs .
Ob s e va d o n d e o cu rre n lo s ca ra ct e re s ( '^ ') e n re la ció n co n la s m a rca s d e
p u n t u a ció n y lo s e s p a cio s :

She stopped. She said, "Hello there," and then went on.
^ ^^ ^^ ^ ^^ ^^^^ ^^ ^^^^ ^^ ^^ ^^ ^
El Bre a k I t e ra t o r h a ce s e n cilla la s e le cció n d e p a la b ra s d e n t ro d e u n t e xt o . No
t e n e m o s q u e e s crib ir n u e s t ra s p ro p ia s ru t in a s p a ra m a n e ja r la s re g la s d e
p u n t u a ció n d e lo s d is t in t o s id io m a s , p o rq u e la cla s e Bre a k I t e ra t o r lo h a ce p o r
n o s o t ro s . Aq u í p o d e m o s ve r u n a s u b ru t in a q u e e xt ra e e im p rim e la s p a la b ra s d e
u n a ca d e n a d a d a :

static void extractWords(String target, BreakIterator wordIterator) {

wordIterator.setText(target);
int start = wordIterator.first();
int end = wordIterator.next();

while (end != BreakIterator.DONE) {


String word = target.substring(start,end);
if (Character.isLetterOrDigit(word.charAt(0))) {
System.out.println(word);
}
start = end;
end = wordIterator.next();
}
}
En n u e s t ro e je m p lo , lla m a m o s a e x t ra c t W o rd s , le p a s a m o s la m is m a ca d e n a q u e
e n e l e je m p lo a n t e rio r. El m é t o d o e x t ra c t W o rd s im p rim irá la s ig u ie n t e lis t a d e
p a la b ra s :

She
stopped
She
said
Hello
there
and
then
went
on.

Oz it o
Límite de Sentencia
En m u ch o s id io m a s e l t e rm in a d o r d e s e n t e n cia e s u n p u n t o . En In g lé s , t a m b ié n s e
u t iliza u n p u n t o p a ra e s p e cifica r e l s e p a ra d o r d e cim a l, p a ra in d ica r u n a m a rca d e
e lip s is , y p a ra t e rm in a r a b re via t u ra s . Có m o e l p u n t o t ie n e m á s d e u n p ro p ó s it o , n o
p o d e m o s d e t e rm in a r e l lím it e s e s e n t e n cia co n t o t a l s e g u rid a d .
Prim e ro , e ch e m o s u n vis t a zo a u n ca s o e n e l q u e s i fu n cio n a la d e t e cció n d e lím it e
d e s e n t e n cia . Em p e za re m o s cre a n d o u n Bre a k I t e ra t o r co n e l m é t o d o
g e tSe nte nce Ins ta nce :

BreakIterator sentenceIterator =
BreakIterator.getSentenceInstance(currentLocale);
Pa ra d e m o s t ra r lo s lím it e s d e s e n t e n cia s , u t iliza re m o s e l m é t o d o m a rkBo u n d a rie s ,
q u e s e e xp licó e n la s e cció n a n t e rio r. El m é t o d o m a rk Bo u n d a rie s im p rim e
ca ra ct e re s ( '^ ') e n u n s t rin g p a ra in d ica r la s p o s icio n e s d e lo s lím it e s . En e l
s ig u ie n t e e je m p lo , lo s lím it e s d e s e n t e n cia s e s t á n d e fin id o s a p ro p ia d a m e n t e :

She stopped. She said, "Hello there," and then went on.
^ ^ ^
Ta m b ié n s e p u e d e n lo ca liza r lo s lím it e s d e s e n t e n cia s q u e t e rm in e n e n
in t e rro g a cio n e s o p u n t o s d e e xa cla m a ció n .

He's vanished! What will we do? It's up to us.


^ ^ ^ ^
Ut iliza r e l p u n t o co m o s e p a ra d o r d e cim a l n o p ro vo ca n in g ú n e rro r:

Please add 1.5 liters to the tank.


^ ^
Un a m a rca d e e lip s is ( p u n t o s s u s p e n s ivo s ) in d ica la o m is ió n d e t e xt o d e n t ro d e u n
p a s a je e n t re co m illa d o . En e l s ig u ie n t e e je m p lo lo s p u n t o s s u s p e n s ivo s g e n e ra n
lím it e s d e s e n t e n cia :

"No man is an island . . . every man . . . "


^ ^ ^ ^ ^ ^^
La s a b re via t u ra s t a m b ié n p o d ría n p ro vo ca r e rro re s . S i e l p u n t o e s s e g u id o p o r u n
e s p a cio e n b la n co y u n a le t ra m a yú s cu la , e l Bre a k I t e ra t o r d e t e ct a u n lím it e d e
s e n t e n cia :

My friend, Mr. Jones, has a new dog. The dog's name is Spot.
^ ^ ^ ^
Oz it o
Límite de Línea
La s a p lica cio n e s q u e fo rm a t e a n t e xt o o re a liza n ru p t u ra d e lín e a s d e b e n lo ca liza r la s
ru p t u ra s d e lín e a s p o t e n cia le s . S e p u e d e n e n co n t ra r e s t a s ru p t u ra s d e lín e a , o lím it e s ,
co n u n Bre a k I t e ra t o r q u e h a ya s id o cre a d o co n e l m é t o d o g e t Lin e I n s t a n c e :

BreakIterator lineIterator =
BreakIterator.getLineInstance(currentLocale);
Es t e Bre a k I t e ra t o r d e t e rm in a la p o s ició n e n q u e s e p u e d e ro m p e r u n a lín e a p a ra
co n t in u a r e n la s ig u ie n t e lín e a . La s p o s icio n e s d e t e ct a d a s p o r e l Bre a k I t e ra t o r s o n
ru p t u ra s d e lín e a s p o t e n cia le s . La ru p t u ra d e lín e a re a l m o s t ra d a e n la p a n t a lla p o d ría
n o s e r la m is m a .
En lo s s ig u ie n t e s e je m p lo s , u t iliza m o s e l m é t o d o m a rkBo u n d a rie s p a ra ve r lo s lím it e s
d e lín e a d e t e ct a d o s p o r u n Bre a k I t e ra t o r. Es t e m é t o d o im p rim e m a rca s e n lo s
lím it e s d e lín e a d e la ca d e n a fu e n t e .
De a cu e rd o a l Bre a k I t e ra t o r, u n lím it e d e lín e a o cu rre d e s p u é s d e l fin a l d e u n a
s e cu e n cia d e ca ra ct e re s b la n co s , ( s p a ce , t a b , n e wlin e ) . En e l s ig u ie n t e e je m p lo ,
p o d e m o s ro m p e r la lín e a e n cu a lq u ie ra d e lo s lím it e s d e t e ct a d o s :

She stopped. She said, "Hello there," and then went on.
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
La s ru p t u ra s d e lín e a s p o t e n cia le s t a m b ié n o cu rre n in m e d ia t a m e n t e d e s p u é s d e u n
g u ió n :

There are twenty-four hours in a day.


^ ^ ^ ^ ^ ^ ^ ^ ^
En e l s ig u ie n t e e je m p lo , ro m p e m o s u n a ca d e n a e n lín e a s d e la m is m a lo n g it u d co n u n
m é t o d o lla m a d o fo rm a t Lin e s . Ut iliza m o s u n Bre a k I t e ra t o r p a ra lo ca liza r la s
ru p t u ra s d e lín e a s p o t e n cia le s . Pa ra ro m p e r u n a lín e a , e je cu t a m o s u n
S y s t e m . o u t . p rin t ln ( ) s ie m p re q u e la lo n g it u d d e la lín e a a ct u a l a lca n ce e l va lo r d e l
p a rá m e t ro m a x Le n g t h . El m é t o d o fo rm a t Lin e s e s co rt o , s e n cillo , y g ra cia s a l
Bre a k I t e ra t o r, in d e p e n d ie n t e d e la Lo ca lid a d . Aq u í p u e d e s ve r s u có d ig o fu e n t e :

static void formatLines(String target, int maxLength,


Locale currentLocale) {

BreakIterator boundary = BreakIterator.getLineInstance(currentLocale);


boundary.setText(target);
int start = boundary.first();
int end = boundary.next();
int lineLength = 0;

while (end != BreakIterator.DONE) {


String word = target.substring(start,end);
lineLength = lineLength + word.length();
if (lineLength >= maxLength) {
System.out.println();
lineLength = word.length();
}
System.out.print(word);
start = end;
end = boundary.next();
}
}
En e l p ro g ra m a Bre a kIt e ra t o rDe m o . ja va lla m a m o s a fo rm a t Lin e s d e e s t a fo rm a :

String moreText = "She said, \"Hello there,\" and then " +


"went on down the street. When she stopped " +
"to look at the fur coats in a shop window, " +
"her dog growled. \"Sorry Jake,\" she said. " +
" \"I didn't know you would take it personally.\"";

formatLines(moreText, 30, currentLocale);


Aq u í p o d e m o s ve r la s a lid a d e la lla m a d a a fo rm a t Lin e s :

She said, "Hello there," and


then went on down the
street. When she stopped to
look at the fur coats in a
shop window, her dog
growled. "Sorry Jake," she
said. "I didn't know you
would take it personally."

Oz it o
Convertir Texto no-Unicode
En e l le n g u a je d e p ro g ra m a ció n Ja va , lo s va lo re s c h a r re p re s e n t a n ca ra ct e re s
Un ico d e . Un ico d e e s u n a co d ifica ció n d e ca ra ct e re s d e 1 6 b it s q u e s o p o rt a la
m a yo ría d e lo s id io m a s d e l m u n d o . Po d rá s a p re n d e r m á s s o b re e l e s t á n d a rd
Un ico d e e n la we b s it e d e Un ico d e Co n s o rt iu m .

Po co s e d it o re s d e t e xt o s o p o rt a n a ct u a lm e n t e t e xt o Un ico d e . El e d it o r d e t e xt o q u e
h e m o s u t iliza d o p a ra e s crib ir lo s có d ig o s d e e je m p lo d e e s t a le cció n s ó lo s o p o rt a
ca ra ct e re s AS CII, q u e e s t á n lim it a d o s a 7 b it s . Pa ra in d ica r u n ca ra ct e r Un ico d e
q u e n o p u e d e s e r re p re s e n t a d o e n AS CII, co m o "ö , " h e m o s u t iliza d o la s e cu e n cia
d e e s ca p e '\ u d d d d '. Ca d a "d " e n la s e cu e n cia d e e s ca p e e s u n d íg it o h e xa d e cim a l.
El s ig u ie n t e e je m p lo m u e s t ra có m o in d ica r e l ca ra ct e r "ö " co n u n a s e cu e n cia d e
e s ca p e :

String str = "\u00F6";


char c = '\u00F6';
Character letter = new Character('\u00F6');
No t e n e m o s q u e e s p e cifica r a l s e cu e n cia d e e s ca p e Un ico d e p a ra ca ra ct e re s AS CII.
Cu a n d o s e le e n fich e ro s AS CII o IS O La t in - 1 , e l e n t o rn o d e e je cu ció n d e Ja va
co n vie rt e a u t o m á t ica m e n t e lo s ca ra ct e re s a Un ico d e . S in e m b a rg o , s i s e q u ie re
co n ve rt ir t e xt o d e s d e o t ra s co d ifica cio n e s a Un ico d e , d e b e m o s re a liza r la s
co n ve rs io n e s n o s o t ro s m is m o s .
En e s t a le cció n s e e xp lica e l API q u e s e u t iliza p a ra t ra d u cir t e xt o n o - Un ico d e a
Un ico d e . An t e s d e u t iliza r e s t o s APIs , d e b e ría m o s ve rifica r q u e la co d ifica ció n q u e
q u e re m o s co n ve rt ir e s t á s o p o rt a d a . La lis t a d e co d ifica cio n e s s o p o rt a d a s n o fo rm a
p a rt e d e la e s p e cifica ció n d e l le n g u a je d e p ro g ra m a ció n Ja va . Po r lo t a n t o , p o d ría
va ria r co n la s p la t a fo rm a s . Pa ra ve r la s co d ifica cio n e s s o p o rt a d a s p o r e l JDK,
p u e d e s ve r la s e cció n "S u p p o rt e d En co d in g s " e n la d o cu m e n t a ció n
In t e rn a t io n a liza t io n Ove rvie w.

La s s ig u ie n t e s s e ccio n e s d e s crib e n d o s t é cn ica s p a ra co n ve rt ir t e xt o n o - Un ico d e :

Bytes Codificados y Strings

Es t a s e cció n m u e s t ra có m o co n ve rt ir a rra ys d e b yt e s n o - Un ico d e e n


o b je t o s S t rin g s , y vice - ve rs a .

Streams de Caracteres y de Bytes

En e s t a s e cció n a p re n d e rá s co m o t ra d u cir e n t re s t re a m s d e ca ra ct e re s
Un ico d e y s t re a m s d e b yt e s co n t e xt o n o - Un ico d e .

Oz it o
Bytes Codificados y Strings
S i e l t e xt o n o - Un ico d e e s t á a lm a ce n a d o e n u n a rra y d e b yt e s , s e p u e d e n co n ve rt ir
a Un ico d e co n u n o d e lo s m é t o d o s co n s t ru ct o re s d e S t rin g . In ve rs a m e n t e , s e
p u e d e co n ve rt ir u n o b je t o S t rin g e n u n a rra y d e b yt e s d e ca ra ct e rs n o - Un ico d e
co n e l m é t o d o S t rin g . g e t By t e s . Cu a n d o s e lla m a a e s t o s m é t o d o s s e d e b e
e s p e cifica r e l id e n t ifica d o r d e la co d ifica ció m co m o u n o d e lo s p a rá m e t ro s .
En lo s s ig u ie n t e s e je m p lo s co n ve rt ire m o s ca ra ct e re s e n t re UTF8 y Un ico d e . UTF8
e s u n a fo rm a b in a ria co m p a ct a p a ra co d ifica r ca ra ct e re s Un ico d e d e 1 6 - b it s e n 8
b it s . El có d ig o fu e n t e d e e s t e e je m p lo e s t á e n e l fich e ro lla m a d o
S t rin g Co n ve rt e r. ja va .

Prim e ro cre a m o s u n S t rin g q u e co n t ie n e lo s ca ra ct e re s Un ico d e :

String original = new String("A" + "\u00ea" + "\u00f1"


+ "\u00fc" + "C");
Cu a n d o im p rim im o s e l S t rin g lla m a d o o rig in a l a p a re ce rá co m o :

AêñüC
Pa ra co n ve rt ir e l o b je t o S t rin g a UTF8 , lla m a m o s a l m é t o d o g e t By t e s y le
e s p e cifica m o s e l id e n t ifica d o r d e co d ifica ció n a p ro p ia d o co m o u n p a rá m e t ro . El
m é t o d o g e t By t e s d e vu e lve u n a rra y d e b yt e s e n fo rm a t o UTF8 . Pa ra cre a r u n
o b je t o S t rin g d e s d e u n a rra y d e b yt e s n o - Un ico d e , lla m a m o s a l co n s t ru ct o r d e
S t rin g co n e l p a rá m e t ro d e la co d ifica ció n , El có d ig o q u e h a ce e s t á s lla m a d a s e s t á
e n ce rra d o e n u n b lo q u e t ry , p a ra e l ca s o d e q u e la co d ifica ció n e s p e cifica d a n o
e s t u vie ra s o p o rt a d a :

try {
byte[] utf8Bytes = original.getBytes("UTF8");
byte[] defaultBytes = original.getBytes();

String roundTrip = new String(utf8Bytes, "UTF8");


System.out.println("roundTrip = " + roundTrip);

System.out.println();
printBytes(utf8Bytes, "utf8Bytes");
System.out.println();
printBytes(defaultBytes, "defaultBytes");
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Im p rim im o s lo s va lo re s d e lo s a rra ys u t f8 By t e s y d e fa u lt By t e s p a ra d e m o s t ra r
u n p u n t o im p o rt a n t e . La lo n g it u d d e l t e xt o co n ve rt id o p o d ría n o s e r la m is m a q u e
la lo n g it u d d e l t e xt o o rig in a l. Alg u n o s ca ra ct e re s Un ico d e s e t ra d u ce n e n b yt e s
s e n cillo s , y o t ro s e n p a re ja s d e b yt e s . Nu e s t ra ru t in a p a ra m o s t ra r lo s a rra ys d e
b yt e s e s e s t a :

public static void printBytes(byte[] array, String name) {


for (int k = 0; k < array.length; k++) {
System.out.println(name + "[" + k + "] = " + "0x" +
UnicodeFormatter.byteToHex(array[k]));

}
}
Aq u í e s t á la s a lid a d e lo s m é t o d o s p rin t By t e s . Ob s e rva q u e s ó lo e l p rim e r y ú lt im o
ca ra ct e re s la "A" y la "C", s o n lo s m is m o s e n lo s d o s a rra ys :

utf8Bytes[0] = 0x41
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xaa
utf8Bytes[3] = 0xc3
utf8Bytes[4] = 0xb1
utf8Bytes[5] = 0xc3
utf8Bytes[6] = 0xbc
utf8Bytes[7] = 0x43

defaultBytes[0] = 0x41
defaultBytes[1] = 0xea
defaultBytes[2] = 0xf1
defaultBytes[3] = 0xfc
defaultBytes[4] = 0x43

Oz it o
Streams de Caracteres y de Bytes
El p a q u e t e ja v a . io p ro p o rcio n a cla s e s q u e p e rm it e n co n ve rs io n e s e n t re s t re a m s d e
ca ra ct e re s y s t re a m s d e b yt e s d e t e xt o n o - Un ico d e . Co n la cla s e
In p u t S t re a m Re a d e r, s e p u e d e n co n ve rt ir s t re a m s d e b yt e s a s t re a m s d e
ca ra ct e re s . S e u t iliza la cla s e Ou t p u t S t re a m Writ e r p a ra t ra d u cir s t re a m s d e
ca ra ct e re s a s t re a m s d e b yt e s .
Cu a n d o s e cre a n o b je t o s I n p u t S t re a m Re a d e r y Ou t p u t S t re a m W rit e r, s e d e b e
e s p e cifica r la co d ifica ció n q u e s e q u ie re co n ve rt ir. Po r e je m p lo , s i q u e re m o s
t ra d u cir u n fich e ro d e t e xt o e n fo rm a t o UTF8 a Un ico d e , d e b e ría m o s cre a r u n
I n p u t S t re a m Re a d e r d e la s ig u ie n t e fo rm a :

FileInputStream fis = new FileInputStream("output.txt");


InputStreamReader isr = new InputStreamReader(fis, "UTF8");
S i s e o m it e e l id e n t ifica d o r d e co d ifica ció n , I n p u t S t re a m Re a d e r y
Ou t p u t S t re a m W rit e r u t iliza rá n la co d ifica ció n p o r d e fe ct o . Al ig u a l q u e la lis t a d e
co d ifica cio n e s s o p o rt a d a s , la co d ifica ció n p o r d e fe ct o p u e d e va ria r co n la
p la t a fo rm a Ja va . En la ve rs ió n 1 . 1 d e l JDK, la co d ifica ció n p o r d e fe ct o e s 8 8 5 9 _ 1
( IS O- La t in - 1 ) . Es t e va lo r s e s e le ccio n a e n la p ro p ie d a d d e l s is t e m a file . e n c o d in g .
Pu e d e s d e t e rm in a r la co d ifica ció n q u e u t iliza rá u n I n p u t S t re a m Re a d e r o u n
Ou t p u t S t re a m W rit e r lla m a n d o a l m é t o d o g e t En c o d in g . En e l s ig u ie n t e e je m p lo ,
lla m a m o s a l m é t o d o p a ra d e t e rm in a r q u e la co d ifica ció n p o r d e fe ct o d e n u e s t ra
p la t a fo rm a s e a 8 8 5 9 _ 1 :

InputStreamReader defaultReader = new InputStreamReader(fis);


System.out.println(defaultReader.getEncoding());
S e e s p e cífica u n I n p u t S t re a m cu a n d o s e cre a u n I n p u t S t re a m Re a d e r, y u n
Ou t p u t S t re a m cu a n d o s e co n s t ru ye u n Ou t p u t S t re a m W rit e r. I n p u t S t re a m y
Ou t p u t S t re a m s o n s u p e rcla s e s a b s t ra ct a s y t o d a s s u s e n t ra d a s y s a lid a s s o n
s t re a m s d e b yt e s , Es t o p e m it e re a liza r co n ve rs io n e s d e cu a lq u ie ra d e lo s s t re a m s
d e b yt e s q u e p e rt e n e zca n a s u s s u b cla s e s . Po r e je m p lo , co n u n
I n p u t S t re a m Re a d e r s e p u e d e co n ve rt ir t e xt o n o - Un ico d e d e s d e u n
File I n p u t S t re a m o u n P ip e d I n p u t S t re a m , p o rq u e a m b a s s o n s u b cla s e s d e
I n p u t S t re a m .
En e l s ig u ie n t e e je m p lo . ve re m o s co m o re a liza r co n ve rs io n e s co n la s cla s e s
I n p u t S t re a m Re a d e r y Ou t p u t S t re a m W rit e r. El có d ig o fu e n t e d e e s t e e je m p lo
lo p u e d e s e n co n t ra r e n e l fich e ro S t re a m Co n ve rt e r. ja va . En e s t e e je m p lo ,
co n ve rt im o s u n a s e cu e n cia d e ca ra ct e re s Un ico d e d e s d e u n o b je t o S t rin g e n u n
File Ou t p u t S t re a m d e b yt e s co d ifica d o e n UTF8 . El m é t o d o q u e re a liza la
co n ve rs ió n s e lla m a w rit e Ou t p u t :

static void writeOutput(String str) {


try {
FileOutputStream fos = new FileOutputStream("output.txt");
Writer out = new OutputStreamWriter(fos, "UTF8");
out.write(str);
out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
re a d In p u t , le e m o s lo s b yt e s co d ifica d o s e n UTF8 d e s d e e l fich e ro cre a d o co n e l
m é t o d o w rit e Ou t p u t . Ut iliza m o s u n I n p u t S t re a m Re a d e r p a ra co n ve rt ir lo s b yt e s
d e UTF8 a Un ico d e , y d e vo lve r e l re s u lt a d o e n u n S t rin g . Aq u í p u e d e s ve r e l
m é t o d o re a d I n p u t :

static String readInput() {

StringBuffer buffer = new StringBuffer();


try {
FileInputStream fis = new FileInputStream("output.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
}
in.close();
return buffer.toString();
}
catch (IOException e) {
e.printStackTrace();
return null;
}
}
En e l m é t o d o m a in d e n u e s t ro p ro g ra m a e je m p lo , lla m a m o s a l m é t o d o
w rit e Ou t p u t p a ra cre a r u n fich e ro d e b yt e s co d ifica d o e n UTF. Lu e g o le e m o s e l
m is m o fich e ro , co n virt ie n d o d e n u e vo lo s b yt e s a Un ico d e . Aq u í p u e d e s ve r e l
có d ig o d e l m é t o d o m a in :

public static void main(String[] args) {

String jaString =
new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217");
writeOutput(jaString);
String inputString = readInput();
String displayString = jaString + " " + inputString;
new ShowString(displayString, "Conversion Demo");
}
La ca d e n a o rig in a l ( ja S t rin g ) d e b e ría s e r id é n t ica a la re cie n cre a d a
( in p u t S t rin g ) . Pa ra ve r s i la s d o s ca d e n a s s o n ig u a le s , la s co n ca t e n a m o s y la s
m o s t ra m o s co n u n o b je t o S h o w S t rin g . La cla s e S h o w S t rin g m u e s t ra u n s t rin g
co n e l m é t o d o Gra p h ic s . d ra w S t rin g . El có d ig o fu e n t e d e e s t a cla s e s e s t á e n e l
fich e ro S h o wS t rin g . ja va . Cu a n d o e je m p la riza m o s u n S h o w S t rin g e n n u e s t ro
p ro g ra m a e je m p lo , a p a re ce n la s s ig u ie n t e s ve n t a n a s . La re p e t ició n d e lo s
ca ra ct e re s m o s t ra d o s ve rifica q u e la s d o s ca d e n a s s o n id é n t ica s .

Oz it o
Una Lista para Internacionalizar un Programa Existente
Mu ch o s p ro g ra m a s n o s o n in t e rn a cio n a liza d o s cu a n d o s e e s crib e n p o r p rim e ra ve z. Es t o s
p ro g ra m a s p o d ría n h a b e r e m p e za d o co m o p ro t o t ip o s , o q u izá s n o s e h u b ie ra p e n s a d o e n s u
d is t rib u ció n in t e rn a cio n a l. S i s e n e ce s it a in t e rn a cio n a liza r u n p ro g ra m a e xis t e n t e , s e d e b e ría n
re a liza r la s s ig u ie n t e s t a re a s :
● I d e n t ific a r lo s d a t o s d e p e n d ie n t e s d e la c u lt u ra .

Lo s m e n s a je s d e t e xt o s o n la fo rm a m á s o b via d e d a t o s q u e va ría n co n la cu lt u ra , p o rq u e
d e b e n s e r t ra d u cid o s . S in e m b a rg o , h a y o t ro s t ip o s d e d a t o s q u e p o d ría n va ria r co n la
re g ió n o e l id io m a . La s ig u ie n t e lis t a co n t ie n e e je m p lo s d e d a t o s d e p e n d ie n t e s d e la
cu lt u ra :
❍ m e n s a je s

❍ e t iq u e t a s d e co m p o n e n t e s GUI

❍ a yu d a o n lin e

❍ s o n id o s

❍ co lo re s

❍ g ra fu ico s

❍ ico n o s

❍ fe ch a s

❍ h o ra s

❍ n ú m e ro s

❍ m one da s

❍ m e d id a s

❍ n ú m e ro s d e t e lé fo n o

❍ h o n o re s y t ít u lo s

❍ d ire ccio n e s

❍ d is t rib u cio n e s d e p á g in a

Pa ra m á s in fo rm a ció n p u e d e s ve r Da t o s s e n s ib le s a la Cu lt u ra
● Ais la r t e x t o t ra d u c ib le e n fa rd o s d e re c u rs o s .
La t ra d u cció n e s co s t o s a . S e p u e d e a yu d a r a re d u cir lo s co s t e s a is la n d o e l t e xt o q u e d e b e
s e r t ra d u cid o e n o b je t o s Re s o u rc e Bu n d le . El t e xt o t ra d u cib le in clu ye m e n s a je s d e
e s t a d o , m e n s a je s d e e rro r, e n t ra d a s d e d ia rio , y e t iq u e t a s d e co m p o n e n t e s GUI. Es t e
t e xt o e s t á co d ifica d o d e n t ro d e lo s p ro g ra m a s q u e n o h a n s id o in t e rn a cio n a liza d o s . S e
n e ce s it a rá lo ca liza r la s o cu rre n cia s d e l t e xt o e s crit o q u e s e m u e s t ra a lo s u s u a rio s fin a le s .
Po r e je m p lo , s e n e ce s it a rá lim p ia r có d ig o co m o é s t e :

String buttonLabel = "OK";


...
Button okButton = new Button(buttonLabel);
Pu e d e s ve r Ais la r Ob je t o s e s p e cífico s d e la Lo ca lid a d e n u n Re s o u rce Bu n d le .
● Tra t a r c o n m e n s a je s c o m p u e s t o s
Lo s m e n s a je s co m p u e s t o s co n t ie n e n d a t o s va ria b le s . En e l m e n s a je , "El d is co co n t ie n e
1 1 0 0 fich e ro s , " e l e n t e ro 1 1 0 0 p o d ría va ria r. Es t e m e n s a je e s d íficil d e t ra d u cir p o rq u e la
p o s ició n d e l e n t e ro e n la s e n t e n cia n o e s la m is m a e n t o d o s lo s id io m a s . El s ig u ie n t e
m e n s a je n o e s t ra d u cib le p o rq u e e l o rd e n d e lo s e le m e n t o s d e la s e n t e n cia e s t á co d ifica d o
p o r co n ca t e n a ció n :

Integer fileCount;
...
String diskStatus = "The disk contains " + fileCount.toString() + " files.";
S ie m p re q u e s e a p o s ib le , s e d e b e ría e vit a r co n s t ru ir m e n s a je s co m p u e s t o s p o rq u e s o n
d ifícile s d e t ra d u cir. S in e m b a rg o , s i la a p lica ció n n e ce s it a m e n s a je s co m p u e s t o s s e
p u e d e n m a n e ja r co n la s t é cn ica s d e s crit a s e n Fo rm a t e a r Me n s a je s .
● Fo rm a t e a r N ú m e ro s y Mo n e d a s
S i la a p lica ció n m u e s t ra n ú m e ro s y m o n e d a s , n e ce s it a re m o s fo rm a t e a rla s d e u n a fo rm a
in d e p e n d ie n t e d e la Lo ca lid a d . El s ig u ie n t e có d ig o t o d a vía n o e s t á in t e rn a cio n a liza d o
p o rq u e n o m u e s t ra co re ct a m e n t e lo s n ú m e ro s e n t o d o s lo s p a is e s :

Double amount;
TextField amountField;
...
String displayAmount = amount.toString();
amountField.setText(displayAmount);
Ne ce s it a re m o s re e m p la za r e l có d ig o a n t e rio r co n u n a ru t in a q u e fo rm a t e e co rre ct a m e n t e
lo s n ú m e ro s . El le n g u a je d e p ro g ra m a ció n Ja va p ro p o rcio n a va ria s cla s e s q u e fo rm a t e a n
n ú m e ro s y m o n e d a s . Es t a s cla s e s s e e xp lica ro n e n la s e cció n , Fo rm a t e a r Nú m e ro s y
Mo n e d a .
● Fo rm a t e a r Fe c h a s y Ho ra s
La fe ch a y la h o ra va ría n co n la re g ió n y e l id io m a , S i e l có d ig o co n t ie n e s e n t e n cia s co m o
la s ig u ie n t e , n e ce s it a re m o s ca m b ia rla s :

Date currentDate = new Date();


TextField dateField;
...
String dateString = currentDate.toString();
dateField.setText(dateString);
S i u t iliza m o s la s cla s e s d e fo rm a t e o d e fe ch a s n u e s t ra a p lica ció n p o d rá m o s t ra r la fe ch a y
la h o ra d e la fo rm a co rre ct a e n t o d o e l m u n d o . Pa ra e je m p lo s e in s t ru ccio n e s , p u e d e s ve r
Fo rm a t e a r Fe ch a s y Ho ra s .
● Ma n e ja r m e n s a je s d e Ex c e p c ió n
De b e ría m o s e vit a r a n u e s t ro s u s u a rio s fin a le s lo s m e n s a je s d e e xce p ció n co d ifica d o s e n
n u e s t ro p ro p io id io m a . La s e cció n Tra b a ja r co n Exce p cio n e s m u e s t ra co m o a t a ja r e s t e
p ro b le m a .
● Co m p a ra c ió n d e Ca d e n a s
Cu a n d o s e o rd e n a o s e b u s ca t e xt o , s e n e ce s it a co m p a ra r ca d e n a s . S i e l t e xt o s e
m u e s t ra , n o d e b e ría m o s u t iliza r lo s m é t o d o s d e co m p a ra ció n d e la cla s e S t rin g . Un
p ro g ra m a q u e n o h a ya s id o in t e rn a cio n a liza d o p o d ría co m p a ra r la s ca d e n a s d e e s t a
fo rm a :
String target;
String candidate;
...
if (target.equals(candidate)) {
...
if (target.compareTo(candidate) < 0) {
...
Lo s m é t o d o s S t rin g . e q u a ls S t rin g . c o m p a re To re a liza n co m p a ra cio n e s b in a ria s . q u e n o
s o n e fe ct iva s cu a n d o s e o rd e n a o s e b u s ca e n a lg u n o s id io m a s . En s u lu g a r, d e b e ría m o s
u t iliza r la cla s e Co lla t o r, q u e s e d e s crib e e n la s e cció n Co m p a ria r S t rin g s .
● Ut iliz a r At rib u t o s d e Ca ra c t e re s Un ic o d e
Lo s d e s a rro lla d o re s a co s t ru m b ra d o s a p ro g ra m a r e n o t ro s le n g u a je s p o d ría n d e t e rm in a r
lo s a t rib u t o s d e u n ca ra ct e r co m p a rá n d o lo co n u n ca ra ct e r co n s t a n t e . Po r e je m p lo ,
p o d ría n e s crib ir có d ig o co m o é s t e :

char ch;
...
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
// ch is a letter
...
if (ch >= '0' && ch <= '9') {
// ch is a digit
...
if ((ch == ' ') || (ch == '\n') || (ch == '\t')) {
// ch is a whitespace
Es t e t ip o d e có d ig o n o fu n cio n a e n t o d o s lo s id io m a s , De b e ría m o s re e m p la za r e s t a
co m p a ra ció n d e ca ra ct e re s co n lla m a d a s a lo s m é t o d o s p ro p o rcio n a d o s p o r la cla s e
Ch a ra ct e r. Po r e je m p lo , p o d ría m o s re e m p la za r e l có d ig o a n t e rio r co n la s s ig u ie n t e s
s e n t e n cia s :

char ch;
...
if (Character.isLetter(ch)) {
...
if (Character.isDigit(ch)) {
...
if (Character.isSpaceChar(ch)) {
● Co n v e rt ir Te x t o N o - Un ic o d e
Lo s ca ra ct e re s e n e l le n g u a je d e p ro g ra m a ció n Ja va e s t á n co d ifica d o s e n Un ico d e . S i
n u e s t ra s a p lica cio n e s m a n e ja n t e xt o n o - Un ico d e , d e b e m o s t ra d u cirlo a Un ico d e . Pa ra m á s
in fo rm a ció n , p u e d e s ve r Co n ve rt ir t e xt o No - Un ico d e .
● Re s e rv a r e s p a c io s u fic ie n t e e n e l GUI
No rm a lm e n t e e l t e xt o s e e xp a n d e cu a n d o s e t ra d u ce d e l in g lé s a o t ro s id io m a s . Ta m b ié n
la a n ch u ra d e lo s ca ra ct e re s n o e s la m is m a p a ra t o d o s lo s ju e g o s d e ca ra ct e re s y t ip o s
d e fu e n t e s . De b e m o s a s e g u ra rn o s d e d is e ñ a r e l GUI co n e s p a cio d e s o b ra .

Oz it o
El Formato de Ficheros Java (JAR)
Versión original de Alan Sommerer

El fo rm a t o d e fich e ro s d e 'Arch ivo s Ja va TM' t e p e rm it e e m p a q u e t a r va rio s fich e ro s


e n u n s ó lo a rch ivo . Típ ica m e n t e u n fich e ro JAR co n t e n d rá lo s fich e ro s d e cla s e s y
lo s re cu rs o s a u xilia re s a s o cia d o s co n lo s a p p le t s y a p lica cio n e s . Es t o s re cu rs o s
a u xilia re s p o d ría n in clu ir, p o r e je m p lo , fich e ro s d e im a g e n y s o n id o q u e s e a n
u t iliza d o s p o r u n a p p le t .
N o t a : El fo rm a t o d e fich e ro JAR fu e p re s e n t a d o e n la ve rs ió n 1 . 1 d e l
JDK, y la ve rs ió n 1 . 2 in clu ye m u ch a s m e jo ra s e n la fu n cio n a lid a d d e lo s
fich e ro s JAR. A m e n o s q u e s e d ig a lo co n t ra rio la s ca ra ct e ris t ica s
cu b ie rt a s e n e s t a le cció n p e rt e n e ce n a la s d o s ve rs io n e s . S i u n a
ca ra ct e rís t ica o e je m p lo p e rt e n e ce s ó lo a u n a d e la s ve rs io n e s , s e
in fo rm a rá d e e llo co n u n a a n o t a ció n co m o e s t a "ve rs ió n 1 . 2 . "

El fo rm a t o d e fich e ro s JAR p ro p o rcio n a m u ch o s b e n e ficio s :


● S e g u rid a d : Pu e d e s firm a r d ig it a lm e n t e e l co n t e n id o d e u n fich e ro JAR. Lo s
u s u a rio s q u e re co n o zca n t u firm a p u e d e n p e rm it ir a t u s o ft wa re p rivile g io s d e
s e g u rid a d q u e d e o t ro m o d o n o t e n d ría .
● Dis m in u ir e l t ie m p o d e d e s ca rg a : S i t u s a p p le t s e s t á n e m p a q u e t a d o s e n u n
fich e ro JAR, lo s fich e ro s d e cla s e s y lo s re cu rs o s a s o cia d o s p u e d e n s e r
d e s ca rg a d o s p o r e l n a ve g a d o r e n u n a s ó la t ra n s a ció n HTTP s in n e ce s id a d d e
a b rir u n a n u e va co n e xió n p a ra ca d a fich e ro .
● Co m p re s ió n : El fo rm a t o JAR p e rm it e co m p rim ir t u s fich e ro s p a ra a h o rra r
e s p a cio .
● Em p a q u e t a d o p o r e x t e n s io n e s ( ve rs ió n 1 . 2 ) : El m a rco d e t ra b a jo d e la s
e xt e n s io n e s p ro p o rcio n a u n s ig n ifica d o p o r e l cu a l p u e d e s a ñ a d ir fu n cio n a lid a d
a l co ra zó n d e la p la t a fo rm a Ja va , Y e l fo rm a t o JAR d e fin e e l e m p a q u e t a d o p o r
e xt e n s io n e s . Ja va 3 D TM y Ja va Ma il s o n e je m p lo s d e e xt e n s io n e s d e s a rro lla d a s
p o r S u n TM. Me d ia n t e e l u s o d e l fo rm a t o JAR t a m b ié n p u e d e s co n ve rt ir t u
s o ft wa re e n e xt e n s io n e s .
● Em p a q u e t a d o s e lla d o ( ve rs ió n 1 . 2 ) : Lo s p a q u e t e s a lm a ce n a d o s e n fich e ro s
JAR p u e d e n s e r s e lla d o s o p cio n a lm e n t e p a ra q u e e l p a q u e t e p u e d e re fo rza r s u
co n s is t e n cia . El s e lla d o d e u n p a q u e t e d e n t ro d e u n fich e ro JAR s ig n ifica q u e
t o d a s la s cla s e s d e fin id a s e n e s e p a q u e t e d e b e n e n co n t ra rs e d e n t ro d e l m is m o
fich e ro JAR.
● Em p a q u e t a d o v e rs io n a d o ( v e rs ió n 1 . 2 ) : Un fich e ro JAR p u e d e co n t e n e r d a t o s
s o b re lo s fich e ro s q u e co n t ie n e , co m o in fo rm a ció n s o b re e l ve n d e d o r o la
ve rs ió n .
● Po rt a b ilid a d : El m e ca n is m o s p a ra m a n e ja r lo s fich e ro s JAR s o n u n a p a rt e
e s t á n d a rd d e l co ra zó n d e l API d e la p la t a fo rm a Ja va .
Ut iliza r fich e ro s JAR: b á s ico

Mu e s t ra có m o re a liza r la s o p e ra cio n e s b á s ica s s o b re fich e ro s JAR, y có m o e je cu t a r


s o ft wa re q u e e s t á co n t e n id o e n e s t o s fich e ro s . Es t a le cció n t a m b ié n p re s e n t a e l
co n ce p t o d e 'm a n ifie s t o ' d e lo s fich e ro s JAR, q u e ju e g a u n p a p e l im p o rt a n t e e n la s
fu n cio n a lid a d e s a va n za d a s d e l fo rm a t o JAR.
Firm a r y Au t e n t ifica r fich e ro s JAR

Mu e s t ra co m o u t iliza r la s h e rra m ie n t a s d e l JDKTM p a ra firm a r d ig it a lm e n t e fich e ro s


JAR y ve rifica r la s firm a s d e fich e ro s JAR firm a d o s .

Oz it o
Utilizar Ficheros JAR: Básico
Es t a le cció n t e m o s t ra rá có m o re a liza r la s o p e ra cio n e s b á s ica s co n fich e ro s JAR.
Lo s fich e ro s JAR e s t á n e m p a q u e t a d o s co n e l fo rm a t o ZIP, p o r e s o p u e d e s u t iliza rlo s
e n t a re a s d e l "e s t ilo ZIP" co m o co m p re s ió n d e d a t o s , a rch iva d o , d e s co m p re n s ió n y
d e s e m p a q u e t a d o d e a rch ivo s .
De e ch o , e s t o s e s t á n e n t re lo s u s o s m á s co m u n e s d e lo s fich e ro s JAR, y s e p u e d e n
o b t e n e r m u ch o s b e n e ficio s d e lo s fich e ro s JAR u t iliza n d o s ó lo e s t a s ca ra ct e rís t ica s
b á s ica s . Po r e je m p lo , e m p a q u e t a r a p p le t s m u lt i- cla s e s e n u n s ó lo fich e ro JAR
p u e d e re d u cir d rá s t ica m e n t e e l t ie m p o d e d e s ca rg a d e l a p p le t .
In clu s o s i q u ie re s a p ro ve ch a rt e d e la s fu n cio n a lid a d e s a va n za d a s d e l fo rm a t o JAR
co m o la firm a e le ct ró n ico a , p rim e ro s n e ce s it a rá s fa m ilia riza rt e co n la s o p e ra cio n e s
fu n d a m e n t a le s .
Pa ra re a liza r la s t a re a s b á s ica s co n fich e ro s JAR, d e b e s u t ilizia r la He rra m ie n t a d e
Arch ivo s Ja va TM p ro p o rcio n a d a co m o p a rt e d e l JDK. Co m o e s t a h e rra m ie n t a e s
in vo ca d a u t iliza n d o e l co m a n d o ja r , p o r co n ve n ie n cia la lla m a re m o s "h e rra m ie n t a
Ja r".
Es t a le cció n t e e n s e ñ a rá co m o u t iliza r la h e rra m ie n t a Ja r, co n e je m p lo s d e ca d a
u n a d e la s ca ra ct e rís t ica s b á s ica s :
● Cre a r u n fich e ro JAR

● Ve r e l co n t e n id o d e u n fich e ro JAR
● Ext ra e r e l co n t e n id o d e u n fich e ro JAR
● Mo d ifica r u n fich e ro d e Ma n ifie s t o

Ad e m á s , e s t a le cció n co n t ie n e u n a s e cció n Eje cu t a r S o ft wa re e m p a q u e t a d o e n


fich e ro s JAR q u e t e e n s e ñ a co m o lla m a r a lo s a p p le t s y a p lica cio n e s q u e e s t á n
e m p a q u e t a d o s e n fich e ro s JAR.
Co m o s in o p s is d e lo s t ó p ico s cu b ie rt o s e n e s t a le cció n , la s ig u ie n t e t a b la s u m a riza
la s o p e ra cio n e s m á s co m u n e s co n fich e ro s JAR:
Operación Comando
Pa ra cre a r u n fich e ro JAR ja r cf ja r- file in p u t - file ( s )

Pa ra ve r e l co n t e n id o d e u n fich e ro JAR ja r t f ja r- file


Pa ra e xt ra e r e l co n t e n id o d e u n fich e ro
ja r xf ja r- file
JAR
Pa ra e xt ra e r fich e rs o e s p e cífico s d e u n
ja r xf ja r- file a rch ive d - file ( s )
fich e ro JAR
Pa ra e je cu t a r u n a a p lica ció n
jre -cp app.jar MainClass
e m p a q u e t a d a e n u n fich e ro JAR

<applet code=AppletClassName.class
Pa ra lla m a r a u n a p p le t e m p a q u e t a d o
archive="JarFileName.jar"
e n u n fich e ro JAR
width=width height=height>
</applet>

Alg u n a s d e la s ca ra ct e rís t ica s m á s a va n za d a s o fre cid a s p o r e l fo rm a t o JAR, co m o e l


s e lla d o d e p a q u e t e s y la firm a e le ct ró n ica s e h a n h e ch o p o s ib le s g ra cia s a l
m a n ifie s t o d e lo s fich e ro s JAR, u n fich e ro e s p e cia l q u e co n t ie n e n lo s fich e ro s JAR.
En la s e cció n fin a l d e e s t a le cció n , Co m p re n d e r e l Ma n ifie s t o , e n co n t ra rá s
in fo rm a ció n b á s ica s o b re la e s t ru ct u ra y u t iliza ció n d e l fich e ro d e m a n ifie s t o .

Referencias adicionales
La d o cu m e n t a ció n d e JDK in clu ye p á g in a s s o b re la h e rra m ie n t a Ja r:
● Ja r t o o l re fe re n ce fo r Win d o ws p la t fo rm

● Ja r t o o l re fe re n ce fo r S o la ris p la t fo rm

Oz it o
Crear un fichero JAR
El comando de la herramienta Jar
El fo rm a t o b á s ico d e l co m a n d o p a ra cre a r u n fich e ro JAR e s :

jar cf fichero-jar fichero(s)-de entrada


Ech e m o s u n vis t a zo a la s o p cio n e s y a rg u m e n t o s u t iliza d o s e n e s t e co m a n d o :
● La o p ció n c in d ica q u e q u ie re s cre a r u n fich e ro JAR.

● La o p ció n f in d ica q u e q u ie re s q u e la s a lid a va ya a u n fich e ro e n ve z d e a


stdout.
● fic h e ro - file e s e l n o m b re q u e q u ie re s p a ra e l fich e ro JAR re s u lt a n t e . Pu e d e s
u t iliza r cu a lq u ie r n o m b re d e fich e ro . Po r co n ve n ció n , a lo s fich e ro s JAR s e le s
d a la e xt e n s ió n . ja r, a u n q u e n o e s o b lig a t o rio .
● El a rg u m e n t o fic h e ro ( s ) - d e e n t ra d a e s u n a lis t a d e lim it a d a p o r e s p a cio s d e
u n o o m á s fich e ro s q u e d e b e n s e r s it u a d o s d e n t ro d e t u fich e ro JAR. Es t e
a rg u m e n t o p u e d e t e n e r s im b o lo d e l co m o d ín * . S i a lg u n o d e lo s fich e ro ( s ) - d e
e n t ra d a , e s u n d ire ct o rio , e l co n t e n id o d e d ich o d ire ct o rio s e a ñ a d irá a l fich e ro
JAR re cu rs iva m e n t e .
La s o p cio n e s c y f p u e d e n a p a re ce r e n cu a lq u ie r o rd e n , p e ro n o d e b e e xis t ir n in g ú n
e s p a cio e n t re e lla s .
Es t e co m a n d o g e n e ra rá u n fich e ro JAR co m p rim id o y lo s it u a rá e n e l d ire ct o rio
a ct u a l. El co m a n d o t a m b ié n g e n e rá u n fich e ro d e m a n ifie s t o , p o r d e fe ct o .
META- I N F/ MAN I FES T. MF, p a ra e l a rch ivo JAR.
Po d ría s a ñ a d ir cu a lq u ie ra d e e s t a s o p cio n e s a d icio n a le s a la s o p cio n e s c f d e l
co m a n d o b á s ico :
● v - p ro d u ce u n s a lid a v e rb o s a e n s t d e rr ( e n ve rs ió n 1 . 1 ) o s t d o u t ( e n ve rs ió n
1 . 2 ) m ie n t ra s s e co n s t ru ye e l fich e ro . La s a lid a ve rb o s a t e d ice e l n o m b re d e
ca d a fich e ro a ñ a d id o a l fich e ro JAR.
● 0 - in d ica q u e n o q u ie re s q u e e l fich e ro JAR s e a co m p rim id o .

● M - in d ica q u e n o s e d e b e ría p ro d u cir e l fich e ro d e m a n ifie s t o p o r d e fe ct o .

● m - u t iliza d a p a ra in clu ir in fo rm a ció n d e m a n ifie s t o d e s d e u n fich e ro d e


m a n ifie s t o e xis t e n t e . El fo rm a t o u t iliza d o p o r e s t a o p ció n e s :

jar cmf existing-manifest output-file input-file(s)


En la ve rs ió n 1 . 1 e l fo rm a t o JAR s ó lo s o p o rt a n o m b re s d e fich e rs o AS CII. La
ve rs ió n 1 . 2 a ñ a d e s o p o rt e p a ra n o m b re s co d ifica d o s e n UTF8 .
Un ejemplo
Ve a m o s u n e je m p lo . El JDKTM in clu ye u n a d e m o d e l a p p le t TicTa cTo e . Es t a d e m o
co n t ie n e fich e ro s d e cla s e s , fich e ro s d e a u d io e im á g e n e s , t o d o s a lm a ce n a d o s e n
u n d ire ct o rio lla m a d o Tic Ta c To e q u e t ie n e e s t a e s t ru ct u ra :

TicTacToe
_____________|______________
| | |
TicTacToe.class audio images
| |
Lo s s u b d ire ct o rio s a u d io e im a g e s co n t ie n e n fich e ro s GIF y d e s o n id o u t iliza d o s
p o r e l a p p le t .
Pa ra e m p a q u e t a r e s t a d e m o e n u n s ó lo fich e ro JAR lla m a d o Tic Ta c To e . ja r,
d e b e ría s e je cu t a r e s t e co m a n d o d e s d e e l d ire ct o rio Tic Ta c To e :

jar cvf TicTacToe.jar TicTacToe.class audio images


Lo s a rg u m e n t o s a u d io e im a g e s re p re s e n t a n d ire ct o rio s , p o r e s o la h e rra m ie n t a
JAR lo s s it u a rá re cu rs iva m e n t e a e llo s y s u s co n t e n id o s e n e l fich e ro JAR. El fich e ro
JAR g e n e ra d o Tic Ta c To e . ja r e s t a rá s it u a d o e n e l d ire ct o rio Tic Ta c To e . Co m o e l
co m a n d o u t iliza la o p ció n v p a ra s a lid a ve rb o s a , p o d rá s ve r e s t a s a lid a :

adding: TicTacToe.class (in=3825) (out=2222) (deflated 41%)


adding: audio/ (in=0) (out=0) (stored 0%)
adding: audio/beep.au (in=4032) (out=3572) (deflated 11%)
adding: audio/ding.au (in=2566) (out=2055) (deflated 19%)
adding: audio/return.au (in=6558) (out=4401) (deflated 32%)
adding: audio/yahoo1.au (in=7834) (out=6985) (deflated 10%)
adding: audio/yahoo2.au (in=7463) (out=4607) (deflated 38%)
adding: images/ (in=0) (out=0) (stored 0%)
adding: images/cross.gif (in=157) (out=160) (deflated -1%)
adding: images/not.gif (in=158) (out=161) (deflated -1%)
Pu e d e s ve r d e s d e e s t a s a lid a q u e e l fich e ro JAR Tic Ta c To e . ja r e s t á co m p rim id o .
La h e rra m ie n t a JAR co m p rim e lo s fich e ro s p o r d e fe ct o . Pu e d e s d e s a ct iva r la
co m p re s ió n u t iliza n d o la o p ció n 0 ( ce ro ) , co n lo q u e e l co m a n d o s e p a re ce ría a
e sto:

jar cvf0 TicTacToe.jar TicTacToe.class audio images


Po d ría s q u e re r e vit a r la co m p re s ió n , p o r e je m p lo , p a ra in cre m e n t a r la ve lo cid a d a
la q u e e l fich e ro JAR p o d ría s e r ca rg a d o p o r u n n a ve g a d o r. Lo s fich e ro s JAR s in
co m p rim ir g e n e ra lm e n t e p u e d e n ca rg a rs e m á s rá p id o q u e lo s co m p rim id o s p o rq u e
n o n e ce s it a n d e s co m p rim ir lo s fich e ro s d u ra n t e la d e s ca rg a .
La h e rra m ie n t a JAR a ce p t a rá a rg u m e n t o s q u e u t ilice n e l s íb o lo d e co m o d ín * .
Co m o n o e xis t e n fich e ro s e n e l d ire ct o rio Tic Ta c To e q u e n o s e q u ie ra n a ñ a d ir,
p o d ría s u t iliza r e s t e co m a n d o a lt e rn a t ivo p a ra co n s t ru ir e l fich e ro JAR:

jar cvf TicTacToe.jar *


Un a n o t a fin a l: a u n q u e la s a lid a ve rb o s a n o lo in d iq u e , la h e rra m ie n t a Ja r a ñ a d e
a u t o m á t ica m e n t e u n fich e ro d e m a n ifie s t o a l a rch ivo JAR e n la lo ca liza ció n
META- I N F/ MAN I FES T. MF.

Oz it o
Ver el contenido de un fichero JAR
El comando de la herramienta Jar
El fo rm a t o d e l co m a n d o b á s ico p a ra ve r e l co n t e n id o d e u n fich e ro JAR e s :

jar tf fichero-jar
Ech e m o s u n vis t a zo a la s o p cio n e s y a rg u m e n t o s u t iliza d o s e n e s t e co m a n d o :
● La o p ció n t in d ica q u e q u ie re s ve r la t a b la d e co n t e n id o s d e l fich e ro JAR.

● La o p ció n f in d ica q u e e l fich e ro JAR q u e s e q u ie re ve r e s t a e s p e cifica d o e n la


lín e a d e co m a n d o s . S in la o p ció n f, la h e rra m ie n t a Ja r e s p e ra ría u n fich e ro e n
s t d in .
● El a rg u m e n t o fic h e ro - ja r e s e l n o m b re d e l fich e ro ( o p a t h ) d e l fich e ro JAR
cu yo co n t e n id o s e q u ie re vis u a liza r.
La s o p cio n e s t y f p u e d e n a p a re ce r e n cu a lq u ie r o rd e n , p e ro n o p u e d e e xis t ir
n in g ú n e s p a cio e n t re e lla s .
Es t e co m a n d o m o s t ra rá la t a b la d e co n t e n id o s d e l fich e ro JAR e n s t d o u t .
Op cio n a lm e n t e p u e s t e s u t iliza r la o p ció n ve rb o s o , v , p a ra p ro d u cir in fo rm a ció n
a d icio n a l s o b re e l t a m a ñ o d e lo s fich e ro s , y la s fe ch a s d e m o d ifica ció n .

Un Ejemplo
Ut ilice m o s la h e rra m ie n t a Ja r p a ra lis t a r e l co n t e n id o d e l fich e ro Tic Ta c To e . ja r
q u e fu e cre a d o e n la p á g in a a n t e rio r:

jar tf TicTacToe.jar
Es t e co m a n d o m o s t ra rá e l co n t e n id o d e l fich e ro JAR e n s t d o u t :

META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
El fich e ro JAR co n t ie n e e l fich e ro cla s s d e TicTa cTo e y lo s d ire ct o rio s d e a u d io e
im a g e s , co m o s e e s p e ra b a . La s a lid a t a m b ié n m u e s t ra q u e e l fich e ro JAR co n t ie n e
u n fich e ro d e m a n ifie s t o , META- I N F/ MAN I FES T. MF, q u e fu e s it u a d o
a u t o m á t ica m e n t e e n e l a rch ivo p o r la h e rra m ie n t a JAR.
To d o s lo s p a t h s s e m u e s t ra n co n b a rra s in ve rt id a s , s in im p o rt a r la p la t a fo rm a o e l
s is t e m a o p e ra t ivo q u e e s t é s u t iliza n d o . Lo s p a t h s e n u n fich e ro JAR s ie m p re s o n
p a t h s re la t ivo s ; p o r e je m p lo , n u n ca ve rá s u n p a t h q u e e m p ie ce co n C:.
La h e rra m ie n t a Ja r m o s t ra rá in fo rm a ció n a d icio n a l s i u t iliza s la o p ció n v :

jar tvf TicTacToe.jar


La s a lid a ve rb o s a d e l fich e ro JAR TicTa cTo e s e p o d ría p a re ce r a e s t o :

256 Mon Apr 20 10:50:28 PDT 1998 META-INF/MANIFEST.MF


3885 Mon Apr 20 10:49:50 PDT 1998 TicTacToe.class
0 Wed Apr 15 16:39:32 PDT 1998 audio/
4032 Wed Apr 15 16:39:32 PDT 1998 audio/beep.au
2566 Wed Apr 15 16:39:32 PDT 1998 audio/ding.au
6558 Wed Apr 15 16:39:32 PDT 1998 audio/return.au
7834 Wed Apr 15 16:39:32 PDT 1998 audio/yahoo1.au
7463 Wed Apr 15 16:39:32 PDT 1998 audio/yahoo2.au
0 Wed Apr 15 16:39:44 PDT 1998 images/
157 Wed Apr 15 16:39:44 PDT 1998 images/cross.gif
158 Wed Apr 15 16:39:44 PDT 1998 images/not.gif

Oz it o
Extraer el contenido de un fichero JAR
El comando de la herramienta Jar
El fo rm a t o b á s ico d e l co m a n d o p a ra e xt ra e r e l co n t e n id o d e u n fich e ro JAR e s :

jar xf fichero-jar [fichero(s)-archivados]


Ech e m o s u n vis t a zo a la s o p cio n e s y a rg u m e n t o s d e e s t e co m a n d o :
● La o p ció n x in d ica q u e q u ie re s e xt ra e r lo s fich e ro s d e u n a rch ivo JAR.

● La o p ció n f in d ica q u e e l fich e ro JAR q u e s e q u ie re ve r e s t a e s p e cifica d o e n la


lín e a d e co m a n d o s . S in la o p ció n f, la h e rra m ie n t a Ja r e s p e ra ría u n fich e ro e n
s t d in .
● El a rg u m e n t o fic h e ro - ja r e s e l n o m b re d e fich e ro ( o p a t h y n o m b re ) d e l
fich e ro JAR d e l q u e q u ie re s e xt ra e r lo s fich e ro s .
● fic h e ro ( s ) - a rc h iv a d o s e s u n a rg u m e n t o o p cio n a l q u e co n s is t e e n u n lis t a
d e lim it a d a p o r e s p a cio s d e lo s fich e ro s q u e s e q u ie re n e xt ra e r d e l a rch ivo . S i
e s t e a rg u m e n t o n o e s t á p re s e n t e , la h e rra m ie n t a Ja r e xt ra e rá t o d o s lo s
fich e ro s d e l a rch ivo .
Co m o e s n o rm a l, e l o rd e n e n q u e a p a re zca n la s o p cio n e s x y f n o im p o rt a , p e ro n o
d e b e e xis t ir n in g ú n e s p a cio e n t re e lla s .
Cu a n d o s e e xt ra e n fich e ro s , la h e rra m ie n t a Ja r co p ia lo s fich e ro s d e s e a d o s y lo s
e s crib e e n e l d ire ct o rio a ct u a l, re p ro d u cie n d o la e s t ru ct u ra d e d ire ct o rio s q u e lo s
fich e ro s t e n ía n e n e l a rch ivo . El a rch ivo JAR o rig in a l n o s e m o d ifica .
Pre ca u ció n : Cu a n d o s e e x t ra e n fich e ro s , la h e rra m ie n t a Ja r s o b re e s crib e cu a lq u ie r
fich e ro q u e t e n g a e l m is m o n o m b re y p a t h q u e lo s fich e ro s e x t ra id o s .

Un ejemplo
Ext ra ig a m o s a lg u n o s fich e ro s d e l a rch ivo JAR TicTa cTo e q u e u t iliza m o s e n la s
s e ccio n e s a n t e rio re s . Re co rd e m o s q u e e l co n t e n id o d e Tic Ta c To e . ja r e ra :

META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
S u p o n g a m o s q u e q u e re m o s e xt ra e r lo s fich e ro s TicTa cTo e . cla s s y cro s s . g if. Pa ra
h a ce r e s t o , p u e d e s u t iliza r e s t e co m a n d o :

jar xf TicTacToe.jar TicTacToe.class images/cross.gif


Es t e co m a n d o h a ce d o s co s a s :
● S it ú a u n a co p ia d e Tic Ta c To e . c la s s e n e l d ire ct o rio a ct u a l.

● Cre a e l d ire ct o rio im a g e s , s i n o e xis t e , y s it ú a u n a co p ia d e c ro s s . g if e n é l.

El fich e ro JAR o rig in a l n o s e m o d ifica .


S e p u e d e n e xt ra e r t o d o s lo s fich e ro s q u e s e q u ie ra n d e la m is m a fo rm a . Cu a n d o e l
co m a n d o n o e s p e cífica q u é fich e ro s e xt ra e r, la h e rra m ie n t a JAR e xt ra e t o d o s lo s
fich e ro s d e l a rch ivo . Po r e je m p lo , p u e d e s e xt ra e r t o d o s lo s fich e ro s d e l a rch ivo
TicTa cTo e u t iliza n d o e s t e co m a n d o :

jar xf TicTacToe.jar

Oz it o
Modificar un Fichero de Manifiesto
El comando de la herramienta Jar
La h e rra m ie n t a Ja r t e p e rm it e m e zcla r e l co n t e n id o d e u n fich e ro d e m a n ifie s t o
p re - e xis t e n t e co n e l fich e ro d e m a n ifie s t o p o r d e fe ct o q u e s e g e n e ra cu a n d o s e
cre a u n fich e ro JAR.
Po d ría s q u e re r p ro d u cir u n fich e ro d e m e n ifie s t o q u e n o fu e ra p o r d e fe ct o , p o r
e je m p lo , a ñ a d ie n d o u n a ca b e ce ra d e p ro p ó s it o e s p e cia l q u e p e rm it a a t u fich e ro
JAR re a liza r u n a fu n ció n p a rt icu la r. Pu e d e s ve r e je m p lo s d e a lg u n a s ca b e ce ra s d e
p ro p ó s it o e s p e cia l e n la s e cció n En t e n d e r e l Ma n ifie s t o .

El co m a n d o b á s ico t ie n e e s t e fo rm a t o :

jar cmf manifest jar-file input-file(s)


Ech e m o s u n vis t a zo a la s o p cio n e s y a rg u m e n t o s u t iliza d o s e n e s t e co m a n d o :
● La o p ció n c in d ica q u e q u ie re s cre a r u n fich e ro JAR.

● La o p ció n m in d ica q u e q u ie re s m e zcla r in fo rm a ció n d e u n fich e ro d e


m a n ifie s t o e xis t e n t e e n e l fich e ro d e m a n ifie s t o d e l fich e ro JAR q u e e s t á s
cre a n d o .
● La o p ció n f in d ica q u e q u ie re s q u e la s a lid a va ya a u n fich e ro ( e l fich e ro Ja r
q u e e s t á s cre a n d o ) , e n ve z d e a s t d o u t .
● m a n ife s t e s e l n o m b re ( o p a t h y n o m b re ) d e l fich e ro d e m a n ifie s t o e xis t e n t e
cu yo co n t e n id o q u ie re s in clu ir e n e l m a n ifie s t o d e l fich e ro JAR.
● ja r- file e s e l n o m b re q u e q u ie re s p a ra e l fich e ro JAR re s u lt a n t e .

● El a rg u m e n t o in p u t - file ( s ) e s u n a lis t a d e lim it a d a p o r e s p a cio s d e lo s


fich e rp s q u e q u ie re s a ñ a d ir a t u fich e ro JAR.
La s o p cio n e s c , m , y f p u e d e n a p a re ce r e n cu a lq u ie r o rd e n , p e ro n o d e b e e xis t ir
n in g ú n e s p a cio e n t re e lla s .

Un ejemplo
En la ve rs ió n 1 . 2 d e la p la t a fo rm a Ja va TM, lo s p a q u e t e s d e n t ro d e fich e ro s JAR
p u e d e n s e lla rs e o p cio n a lm e n t e , lo q u e s ig n ifica q u e t o d a s la s cla s e s d e fin id a s e n u n
p a q u e t e d e b e n e s t á s a rch iva d a s e n e l m is m o fich e ro JAR. Po r e je m p lo , p o d ría s
q u e re r s e lla r u n p a q u e t e , p a ra a s e g u ra r la co n s it e n cia d e ve rs io n e s e n t re la s cla s e s
d e t u s o ft wa re .
Un p a q u e t e p u e d e s e lla rs e a ñ a d ie n d o la ca b e ce ra S e a le d :

Name: myCompany/myPackage/
Sealed: true
Pa ra a lm a ce n a r la ca b e ce ra S e a le d e n e l m a n ifie s t o d e u n fich e ro JAR, p rim e ro
n e ce s it a s e s crib ir u n fich e ro d e m a n ifie s t o co n la s ca b e ce ra s a p ro p ia d a s .
Re a lm e n t e , e l fich e ro q u e e s crib a s n o t ie n e q u e s e r u n fich e ro d e m a n ifie s t o
co m p le t o ; p u e d e co n t e n e r s ó lo s u ficie n t e in fo rm a ció n p a ra q u e la h e rra m ie n t a Ja r
s e p a d ó n d e y q u é in fo rm a ció n m e zcla r d e n t ro d e l fich e ro d e m a n ifie s t o p o r d e fe ct o .
S u p o n g a m o s , p o r e je m p lo , q u e t u fich e ro JAR e s p a ra co n t e n e r e s t o s cu a t ro
pa que te s:

myCompany/firstPackage
myCompany/secondPackage
myCompany/thirdPackage
myCompand/fourthpackage
y q u e q u ie re s s e lla r firs t P a c k a g e y t h ird P a c k a g e . Pa ra h a ce r e s t o , d e b e ría s
e s crib ir u n fich e ro d e m a n ifie s t o p a rcia l co n e s t e co n t e n id o :

Name: myCompany/firstPackage/
Sealed: true

Name: myCompany/thirdPackage/
Sealed: true
Lu e g o s u p o n g a m o s q u e :
● q u e h a s lla m a d o a t u m a n ifie s t o p a rcia l m y Ma n ife s t

● e l fich e ro JAR q u e q u ie re s cre a r s e lla m a rá m y Ja r. ja r

● El d ire ct o rio a ct u a l e s e l d ire ct o rio p a d re d e m y Co m p a n y

Po d ría s cre a r e l fich e ro JAR co n e s t e co m a n d o :

jar cmf myManifest myJar.jar myCompany


El a s p e ct o re s u lt a n t e d e l fich e ro d e m a n ifie s t o d e m y Ja r. ja r d e p e n d e rá d e la
ve rs ió n d e l JDK q u e e s t é s u t iliza n d o . En cu a lq u ie r ca s o , la in fo rm a ció n d e s e lla d o ,
s e rá in clu id a p a ra firs t P a c k a g e y t h ird P a c k a g e .

Oz it o
Ejecutar software empaquetado en un fichero JAR
Ah o ra q u e h a s a p re n d id o a cre a r fich e ro s JAR, ¿ Có m o e je cu t a rá s re a lm e n t e e l
có d ig o q u e h a s e m p a q u e t a d o ? Exis t e n d o s e s ce n a rio s a co n s id e ra r:
● Tu fich e ro JAR co n t ie n e u n a p p le t p a ra s e r e je cu t a d o d e n t ro d e u n n a ve g a d o r.

● Tu fich e ro JAR co n t ie n e u n a a p lica ció n q u e e s lla m a d a d e s d e la lín e a d e


co m a n d o s .

Ficheros JAR en los Applets


Pa ra lla m a r a u n a p p le t d e s d e u n a p á g in a HTML y e je cu t a rlo d e n t ro d e u n
n a ve g a d o r, n e ce s it a s u t iliza r la e t iq u e t a APPLET. ( Pu e d e s ve r Es crib ir Ap p le t s p a ra
m a s in fo rm a ció n s o b re lo s a p p le t s . ) S i e l a p p le t e s t á e m p a q u e t a d o e n u n fich e ro
JAR, lo u n ico d ife re n t e q u e t ie n e s q u e h a ce r e s u t iliza r e l p a rá m e t ro ARCHIVE p a ra
e s p e cifica r e l p a t h re la t ivo d e l a rch ivo JAR.
Có m o e je m p lo , u t ilize m o s ( d e n u e vo !) e l a p p le t TicTa cTo e q u e vie n e co n e l JDK d e
Ja va TM. La e t iq u e t a APPLET e n e l fich e ro HTML q u e lla m a a e s t e a p p le t s e p a rce ría a
e s t o ( ig n o ra n d o la e t iq u e t a ALT p a ra m á s cla rid a d ) :

<applet code=TicTacToe.class
width=120 height=120>
</applet>
S i e l a p p le t TicTa cTo e e s t u vie ra e m p a q u e t a d o e n u n fich e ro JAR lla m a d o
Tic Ta c To e . ja r, p o d ría s m o d ifica r la e t iq u e t a APPLET co n la s e n cilla a d icció n d e u n
p a rá m e t ro ARCHIVE:

<applet code=TicTacToe.class
archive="TicTacToe.jar"
width=120 height=120>
</applet>
El p a rá m e t ro ARCHIVE e s p e cifica e l p a t h re la t ivo p a ra e l fich e ro JAR q u e co n t ie n e
Tic Ta c To e . c la s s . Es t e e je m p lo a s u m e q u e e l fich e ro JAR y e l fich e ro HTML e s t á n
e n e l m is m o d ire ct o rio . S i n o fu e ra a s í, d e b e ría s e s p e cifica r e l p a t h d e l fich e ro JAR.

Ficheros JAR para Aplicaciones - JDK 1.1


Pu e d e s e je cu t a r a p lia cio n e s q u e e s t á n e m p a q u e t a d a s e n fich e ro s JAR u t iliza n d o la
h e rra m ie n t a jre d e l JDK 1 . 1 :

jre -cp app.jar MainClass


La o p ció n - c p a ñ a d e a p p . ja r a l cla s s p a t h d e l s is t e m a . Ma in Cla s s id e n t ifica la cla s e
d e n t ro d e l fich e ro JAR q u e e s e l p u n t o d e e n t ra d a d e la a p lica ció n . ( Re cu e rd a q u e
e n u n u n a a p lica ció n , u n a d e la s cla s e s d e b e t e n e r u n m é t o d o co n la firm a :
p u b lic s t a t ic v o id m a in ( S t rin g [ ] a rg s ) q u e s irve co m o p u n t o d e e n t ra d a o d e
a rra n q u e d e la a p lica ció n . )

Ficheros JAR para Aplicaciones - sólo JDK 1.2


En la ve rs ió n 1 . 2 d e l JDK, p u e d e s e je cu t a r a p lica cio n e s e m p a q u e t a d a s e n fich e ro s
JAR co n e l in t é rp re t e Ja va . El co m a n d o b á s ico e s :

java -jar jar-file


La b a n d e ra - ja r le d ice a l in t é rp re t e q u e la a p lica ció n e s t á e m p a q u e t a d a e n u n
fich e ro JAR.
No t a : la o p ció n - ja r n o e s t á d is p o n ib le e n in t é rp re t e s a n t e rio re s a la v e rs ió n 1 . 2 d e l
JDK.
S in e m b a rg o , p a ra q u e e s t e co m a n d o fu n cio n e , e l in t é rp re t e n e ce s it a s a b e r q u é
cla s e d e n t ro d e l fich e ro JAR e s e l p u n t o d e e n t ra d a d e la a p lica ció n .
Pa ra h a ce r e s t o , d e b e s a ñ a d ir u n a ca b e ce ra Ma in - Cla s s a l m a n ifie s t o d e l fich e ro
JAR. La ca b e ce ra t ie n e e s t a fo rm a :

Main-Class: classname
d o n d e c la s s n a m e e s e l n o m b re d e la cla s e q u e e s e l p u n t o d e e n t ra d a d e la
a p lica ció n .
Pa ra cre a r u n fich e ro JAR q u e t e n g a u n m a n ifie s t o co n la ca b e ce ra a p ro p ia d a
Ma in - Cla s s , p u e d e s u t iliza r la o p ció n m co m o s e d e s crib ió e n la s e cció n a n t e rio r.
Prim e ro d e b e rá s p re p ra ra r u n a p la n t illa d e m a n ifie s t o q u e co n s is t a e n u n a s ó la
lín e a co n la ca b e ce ra Ma in - Cla s s y e l va lo r. Po r e je m p lo , s i t u a p lica ció n fu e ra la
a p lica ció n d e u n a s o la cla s e He llo Wo rld , e l p u n t o d e e n t ra d a , p o r s u p u e s t o , s e ría
la cla s e He llo Wo rld , y t u p la n t illa d e m a n ifie s t o p o d ría s e r co m o e s t a lín e a :

Main-Class: HelloWorld
As u m ie n d o q u e t u p la n t illa s e e n cu e n t a e n u n fich e ro lla m a d o t e m p la t e , la p o d ría s
m e zcla r co n e l fich e ro d e m a n ifie s t o d e l fich e ro JAR co n u n co m a n d o co m o e s t e :

jar cmf template app.jar HelloWorld.class


Co n t u fich e ro JAR p re p a ra d o d e e s t a fo rm a , p u e d e s e je cu t a r e l p ro g ra m a
He llo Wo rld d e s d e la lín e a d e co m a n d o s :

java -jar app.jar


Oz it o
Entender el Manifiesto
Lo s fich e ro s JAR p u e d e n s o p o rt a n u n a m p lio ra n g o d e fu n cio n a lid a d e s , in clu ye n d o
la firm a e le ct ró n ica , e l co n t ro l d e ve rs io n e s , e l s e lla d o d e p a q u e t e s , la s
e xt e n s io n e s , e t c. ¿ Qu é le d a a lo s fich e ro s JAR la h a b ilid a d p a ra s e r t a n ve rs á t ile s ?
La re s p u e s t a s e e n cu e n t ra d e n t ro d e l m a n ifie s t o d e lo s fich e ro s JAR.
El m a n ifie s t o e s u n fich e ro e s p e cia l q u e p u e d e co n t e n e r in fo rm a ció n s o b re lo s o t ro s
fich e ro s e m p a q u e t a d o s e n u n fich e ro JAR. Pe rs o n a liza r la in fo rm a ció n "m e t a " d e l
m a n ifie s t o , t e p e rm it e u t iliza r lo s fich e ro s JAR p a ra u n a g ra n va rie d a d d e
p ro p ó s it o s .
An t e s d e ve r a lg u n a s d e la s fo rm a s e n q u e p u e d e s e r m o d ifica d o e l m a n ifie s t o p a ra
p e rm it ir fu n cio n a lid a d e s e s p e cia le s a lo s fich e ro s JAR, e ch e m o s u n vit a zo a la lín e a
b a s e d e l m a n ifie s t o p o r d e fe ct o .

El Manifiesto por defecto


S ie m p re q u e cre a s u n fich e ro JAR, a u t o m á t ica m e n t e re cib e u n fich e ro d e
m a n ifie s t o p o r d e fe ct o . S ó lo p u e d e h a b e r u n fich e ro d e m a n ifie s t o e n u n fich e ro
JAR, y s ie m p re d e b e t e n e r e l p a t h :

META-INF/MANIFEST.MF
Cu a n d o u n fich e ro JAR e s cre a d o co n la ve rs ió n 1 . 2 d e l JDK, e l m a n ifie s t o p o r
d e fe ct o e s m u y s e n cillo . Aq u í t ie n e s t o d o s u co n t e n id o :

Manifest-Version: 1.0
Created-By: Manifest JDK1.2
Co m o p u e d e s ve r e n e s t e e je m p lo , la s e n t ra d a s d e u n fich e ro d e m a n ifie s t o t ie n e n
la fo rm a d e p a re ja s : "ca b e ce ra : va lo r". El n o m b re d e u n a ca b e ce ra e s t á s e p a ra d o
d e s u va lo r p o r d o s p u n t o s .
El m a n ifie s t o m o s t ra d o a rrib a e s co n fo rm e a la ve rs ió n 1 . 0 d e la e s p e cifica ció n d e
m a n ifie s t o y h a s id o cre a d o co n la ve rs ió n 1 . 2 d e l JDK, Es t a s s o n p ro p ie d a d e s d e l
p ro p io m a n ifie s t o , p e ro t a m b ié n p u e d e co n t e n e r in fo rm a ció n s o b re o t ro s fich e ro s
e m p a q u e t a d o s e n e l a rch ivo .
La in fo rm a ció n e xa ct a g ra b a d a e n e l fich e ro d e m a n ifie s t o d e p e n d e d e l u s o p re vis t o
d e l fich e ro JAR. El fich e ro d e m a n ifie s t o p o r d e fe ct o n o a s u m e n a d a s o b re la
in fo rm a ció n q u e d e b e ría a lm a ce n a r s o b re o t ro s fich e ro s , p o r e s o s ó lo co n t ie n e
d a t o s s o b re é l m is m o .
El fo rm a t o d e l fich e ro d e m a n ifie s t o p o r d e fe ct o ca m b ia d e la ve rs ió n 1 . 1 a la
ve rs ió n 1 . 2 d e l JDK. S i cre a s u n fich e ro JAR p a ra e l p a q u e t e , ja v a . m a t h , p o r
e je m p lo , e l fich e ro d e m a n ifie s t o p o r d e fe ct o d e l JDK 1 . 1 s e p a re ce ría a e s t o :
Manifest-Version: 1.0

Name: java/math/BigDecimal.class
Digest-Algorithms: SHA MD5
SHA-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=
MD5-Digest: z6z8xPj2AW/Q9AkRSPF0cg==

Name: java/math/BigInteger.class
Digest-Algorithms: SHA MD5
SHA-Digest: oBmrvIkBnSxdNZzPh5iLyF0S+bE=
MD5-Digest: wFymhDKjNreNZ4AzDWWg1Q==
Al co n t ra rio q u e e l m a n ifie s t o d e l JDK 1 . 2 e l d e l JDK 1 . 1 t ie n e e n t ra d a s p a ra ca d a
u n o d e lo s fich e ro s co n t e n id o s e n e l a rch ivo , in clu ye n d o lo s p a t h s d e lo s fich e ro s y
va lo re s d ig e s t . Es t o s ú lt im o s va lo re s s o n s o lo im p o rt a n t e s co n re s p e ct o a la firm a
d e fich e ro s JAR. De e ch o , e l p o r q u é la in fo rm a ció n d ig e s t n o e s t á e n e l fich e ro d e
m a n ifie s t o d e l JDK 1 . 2 - e s p o rq u e n u n ca la n e ce s it a . Pa ra a p re n d e r m á s s o b re la
firm a , p u e d e s ve r la le cció n Firm a r y Au t e n t ifica r fich e ro s JAR.

Cabeceras de Manifiesto para Propósitos Especiales


De p e n d ie n d o d e l p a p e l q u e q u ie re s q u e ju e g u e t u fich e ro JAR, p o d ría s m o d ifica r e l
m a n ifie s t o p o r d e fe ct o . S í s ó lo e s t a s in t e re s a d o e n la s ca ra ct e ris t ica s "ZIP" d e l
fich e ro JAR co m o la co m p re s ió n o e l a rch iva d o , n o t e n d rá s q u e p re o cu p a rt e d e l
fich e ro d e m a n ifie s t o . Es t e fich e ro n o ju e g a n in g ú n p a p e l e n e s t a s s it u a cio n e s .
La m a yo ría d e lo s u s o s d e lo s fich e ro s JAR q u e va n m á s a llá d e l s im p le a rch iva d o y
co m p re n s ió n n e ce s it a n q u e a lg u n a in fo rm a ció n e s p e cia l s e a a lm a ce n a d a e n e l
fich e ro d e m a n ifie s t o . Ab a jo t ie n e s u n a b re ve d e s crip ció n d e la s ca b e ce ra s
re q u e rid a s p a ra a lg u n a s fu n cio n e s d e p ro p ó s it o e s p e cia l d e lo s fich e ro s JAR:
● Ap lica cio n e s e m p a q u e t a d a s e n fich e ro s JAR

● De s ca rg a d e e xt e n s io n e s
● S e lla d o d e p a q u e t e s
● Ve rs io n a d o d e p a q u e t e s
Ap lic a c io n e s e m p a q u e t a d a s e n fic h e ro s JAR - s ó lo v e r s ió n 1 . 2
S i t ie n e s u n a a p lica ció n e n u n fich e ro JAR, n e ce s it a s in d ica r d e a lg u n a fo rm a q u e
cla s e e s e l p u n t o d e e n t ra d a d e la s q u e s e in clu ye n e n e l fich e ro JAR. ( Re cu e rd a
q u e e l p u n t o d e e n t ra d a e s u n a cla s e q u e t e n g a u n m é t o d o co n la firm a :
p u b lic s t a t ic v o id m a in ( S t rin g [ ] a rg s ) . )
Es t a in fo rm a ció n s e p ro p o rcio n a co n la ca b e ce ra Ma in - Cla s s , q u e t ie n e e s t a fo rm a
g e n e ra l:
Main-Class: classname
d o n d e c la s s n a m e e s e l n o m b re d e la cla s e q u e e s e l p u n t o d e e n t ra d a d e la
a p lica ció n .
D e s c a rg a d e Ex t e n s io n e s - s ó lo v e r s ió n 1 . 2
La d e s ca rg a d e e xt e n s io n e s s o n fich e ro s JAR q u e s o n re fe re n cia d o s p o r e l fich e ro
d e m a n ifie s t o d e o t ro s fich e ro s JAR. En u n a s it u a ció n t íp ica , u n a p p le t e s t a ría
e m p a q u e t a d o e n u n fich e ro JAR cu yo m a n ifie s t o re fe re n cia ra a u n fich e ro JAR ( o a
va rio s fich e ro s JAR) q u e s e rvirá n co m o u n a e xt e n s ió n p a ra lo s p ro p ó s it o s d e l
a p p le t . La s e xt e n s io n e s p u e d e n re fe re n cia rs e u n a s a o t ra s d e la m is m a fo rm a .
La d e s ca rg a d e e xt e n s io n e s s e e s p e cifica e n e l ca m p o d e ca b e ce ra Cla s s - P a t h e n
e l fich e ro d e m a n ifie s t o d e l a p p le t , a p lica ció n , u o t ra e xt e n s ió n . Un a ca b e ce ra
Cla s s - P a t h s e p o d ría p a re ce r a e s t o , p o r e je m p lo :

Class-Path: servlet.jar infobus.jar acme/beans.jar


Co n e s t a ca b ce ra , la s cla s e s d e lo s fich e ro s s e rv le t . ja r, in fo b u s . ja r, y
a c m e / b e a n s . ja r s e rvirá n co m o e xt e n s io n e s p a ra lo s p ro p ó s it o s d e l a p p le t o
a p lica ció n . La s URLs e n la ca b e ce ra Cla s s - P a t h s o n re la t iva s a la URL d e l fich e ro
JAR d e l a p p le t o d e la a p lica ció n .
S e lla d o d e P a q u e t e s - s ó lo v e r s ió n 1 . 2
Lo s p a q u e t e s a lm a ce n a d o s e n fich e ro s JAR p u e d e n s e r s e lla d o s o p cio n a lm e n t e p a ra
q u e e l p a q u e t e p u e d a re fo rza r s u co n s is t e n cia . El s e lla d o d e u n p a q u e t e d e n t ro d e
u n fich e ro JAR s ig n ifica q u e t o d a s la s cla s e s d e fin id a s e n e s e p a q u e t e d e b e n
e n co n t ra rs e d e n t ro d e l m is m o fich e ro JAR.
Un p a q u e t e p u e d e s e lla rs e a ñ a d ie n d o la ca b e ce ra S e a le d :

Name: myCompany/myPackage/
Sealed: true
Ve rs io n a d o d e P a q u e t e s - s ó lo v e r s ió n 1 . 2
La p a g in a Es p e cifica ció n d e Ve rs io n a d o d e Pa q u e t e s d e fin e va ria s ca b e ce ra s d e
m a n ifie s t o p a ra co n t e n e r in fo rm a ció n d e l ve rs io n a d o . Un co n ju n t o d e d ich a s
ca b e ce ra s p u e d e s e r a s ig n a d o a ca d a p a q u e t e . La s ca b e ce ra s d e ve rs io n a d o
d e b e ría n a p a re ce r d ire ct a m e n t e d e b a jo d e la ca b e ce ra n a m e d e l p a q u e t e . Es t e
e je m p lo m u e s t ra la s ca b e ce ra s d e ve rs io n a d o :

Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems. Inc."

Información Adicional
La Es p e cifica ció n d e l fo rm a t o d e m a n ifie s t o e s fo rm a p a rt e d e la d o cu m e n t a ció n
o n - lin e d e l JDK.

Oz it o
Firmado y Verificación de Ficheros JAR
Es t a le cció n t e e n s e ñ a co m o u t iliza r la s h e rra m ie n t a s p ro p o rcio n a d a s p o r e l JDK d e
Ja va TM p a ra firm a r y ve rifica r fich e ro s JAR:
● Firm a r fich e ro s JAR t e m u e s t ra co m o u t iliza r la s h e rra m ie n t a s d e l JDKTM p a ra
firm a r d ig it a lm e n t e t u s fich e ro s JAR.
● Ve rifica r fich e ro s JAR firm a d o s t e e n s e ñ a co m o ve rifica r fich e ro s JAR.

S i n o e s t á s fa m ilia riza d o co n la firm a , p o d rá s e n co n t ra r a lg u n a in fo rm a ció n e n la


p á g in a En t e n d e r la Firm a y Ve rifica ció n , d o n d e e n co n t ra rá s d e fin icio n e s d e
t é rm in o s re le va n t e s , e xp lica cio n e s d e a lg u n o s b e n e ficio s p ro p o rcio n a d o s p o r la
firm a , y u n a g u ía d e l m e ca n is m o d e firm a u t iliza d o p o r la p la t a fo rm a Ja va y s u
re la ció n co n lo s fich e ro s JAR.

Oz it o
Firmar ficheros JAR
El JDK d e Ja va TM co n t ie n e la s h e rra m ie n t a s q u e n e ce s it a s p a ra firm a r fich e ro s JAR.
De p e n d ie n d o d e la ve rs ió n d e l JDK q u e t e n g a s , u t iliza rá s :
● JDK 1 . 2 La h e rra m ie n t a JAR d e Firm a y Ve rifica ció n

● JDK 1 . 1 La h e rra m ie n t a d e S e g u rid a d JAVA

La Herramienta JAR de Firma y Verificación del JDK 1.2


Es t a h e rra m ie n t a s e in vo ca u t iliza n d o e l co m a n d o ja rs ig n e r, p o r lo t a n t o , n o s
re fe rire m o s a e lla co m o "Ja rs ig n e r".
Pa ra firm a r u n fich e ro JAR, p rim e ro d e b e s t e n e r u n a cla ve p riva d a . La s cla ve s
p riva d a s y s u s co rre s p o n d ie n t e s cla ve s p ú b lica s e s t á n a lm a ce n a d a s e n b a s e s d e
d a t o s p ro t e g id a s lla m a d a s k e y s t o re s . Un ke ys t o re p u e d e co n t e n e r la s cla ve s d e
m u ch o s firm a n t e s p o t e n cia le s . Ca d a cla ve d e l ke ys t o re p u e d e s e r id e n t ifica d a p o r
u n a lia s q u e s u e le s e r e l n o m b re d e l firm a n t e p ro p ie t a rio d e la cla ve . Po r e je m p lo ,
la cla ve p e rt e n e cie n t e a Rit a Jo n e s , p o d ría t e n e r e l a lia s "rit a ".
La fo rm a b á s ica p a ra e l co m a n d o d e firm a d e u n fich e ro JAR e s

jarsigner jar-file alias


En e s t e co m a n d o :
● ja r- file Es e l n o m b re d e l fich e ro JAR a firm a r.

● a lia s e s e l a lia s q u e id e n t ifica la cla ve p riva d a q u e s e u t iliza rá p a ra firm a r e l


fich e ro JAR, y s u ce rt ifica d o a s o cia d o .
La h e rra m ie n t a Ja rs ig n e r t e p e d irá la s p a s s wo rd s p a ra e l ke ys t o re y e l a lia s .
La fo rm a b á s ica d e e s t e co m a n d o a s u m e q u e e l ke ys t o re a u t iliza r e s u n fich e ro
lla m a d o . k e y s t o re e n t u d ire ct o rio . Cre a rá la firm a y e l fich e ro d e b lo q u e s d e
firm a s co n lo s n o m b re s x . S F y x . D S A re s p e ct iva m e n t e , d o n d e x s o n la s p rim e ra s
o ch o le t ra s d e l a lia s , t o d a s e n m a yú s cu la s . Es t e co m a n d o b á s ico , s o b re - e s crib irá e l
fich e ro JAR o rig in a l co n e l fich e ro JAR firm a d o .
En la p rá ct ica , p o d ría s q u e re r u t iliza r e s t e co m a n d o e n co n ju n ció n co n u n a o m á s
d e e s t a s fu n cio n e s :
● - k e y s t o re file - e s p e cifica u n fich e ro ke ys t o re p o r d e fe ct o s i n o q u ie re s
u t iliza r la b a s e d e d a t o s p o r d e fe ct o . k e y s t o re .
● - s t o re p a s s p a s s w o rd - Te p e rm it e in t ro d u cir la p a s s wo rd d e l ke ys t o re e n la
lín e a d e co m a n d o s e n ve z d e p e d irt e lo .
● - k e y p a s s p a s s w o rd - Te p e rm it e in t ro d u cir la p a s s wo rd d e l a lia s e n la lín e a
d e co m a n d o s e n ve z d e p e d irt e lo .
● - s ig file file - e s p e cifica e l n o m b re b a s e p a ra lo s fich e ro s . S F y . DS A s i n o
q u ie re s q u e e l n o m b re b a s e s e t o m e d e t u a lia s . file d e b e e s t a r co m p u e s t o
s o lo p o r le t ra s m a yú s cu la s ( A- Z) , n u m e ra le s ( 0 - 9 ) , s u b ra ya d o .
● - s ig n e d ja r file - e s p e cifica e l n o m b re d e l fich e ro JAR firm a d o a g e n e ra r, s i n o
q u ie re s q u e e l fich e ro o rig in a l s e a s o b re - e s crit o co n e l fich e ro firm a d o .

Ejemplo
Ve a m o s u n p a r d e e je m p lo s d e firm a d e fich e ro s JAR co n la h e rra m ie n t a Ja rs ig n e r.
En e s t o s e je m p lo s a s u m im o s q u e :
● Tu a lia s e s "jo h n d o e ".

● la ke ys t o re q u e q u ie re s u t iliza r e s u n fich e ro lla m a d o "m yke ys " e n e l


d ire ct o rio d e t ra b a jo a ct u a l.
● la p a s s wo rd d e l ke ys t o re e s "a b c1 2 3 ".

● la p a s s wo rd d e t u a lia s e s "m yp a s s ".

Pa ra firm a r u n fich e ro JAR lla m a d o a p p . ja r, p o d ría s u t iliza r e s t e co m a n d o :

jarsigner -keystore mykeys -storepass abc123


-keypass mypass app.jar johndoe
Co m o e s t e co m a n d o n o u t iliza la o p ció n - s ig file , lo s fich e ro s . S F y . DS A s e cre a ra n
co n lo s n o m b re s JOHN D OE. S F y JOHN D OE. D S A. Co m o e l co m a n d o n o u t iliza la
o p ció n - s ig n e d ja r, e l fich e ro firm a d o re s u lt a n t e s o b re - e s crib irá la ve rs ió n o rig in a l
d e a p p . ja r.
Ve a m o s q u e s u ce d e ría s i u t iliza ra m o s u n a co m b in a ció n d e o p cio n e s d ife re n t e :

jarsigner -keystore mykeys -sigfile SIG


-signedjar SignedApp.jar app.jar johndoe
Es t a ve z, t e p e d irá q u e in t ro d u zca s la s p a s s wo rd s p a ra e l Ke ys t o re y e l a lia s
p o rq u e n o s e h a n e s p e cifica d o e n la lín e a d e co m a n d o s . ( Po r ra zo n e s d e s e g u rid a d ,
p ro b a b le m e n t e n o e s u n a b u e n a id e a e s p e cifica r t u s p a s s wo rd s e n la lín e a d e
co m a n d o s . ) Lo s fich e ro s d e firm a y b lo q u e d e firm a s s e lla m a rá n S I G. S F y
S I G. D S A, re s p e ct iva m e n t e , y e l fich e ro firm a d o S ig n e d Ap p . ja r s e s it u a rá e n e l
d ire ct o rio a ct u a l. El fich e ro JAR o rig in a l p e rm a n e ce co m o e s t a b a .

Página de Referencia de Jarsigner


La s p á g in a s co m p le t a s d e re fe re n cia d e la h e rra m ie n t a d e firm a y ve rifica ció n d e
fich e rs o JAR e s t á n o n - lin e :
● Pá g in a d e Re fe re n cia d e Ja rs ig n e r co n e je m p lo s Win d o ws

● Pá g in a d e Re fe re n cia d e Ja rs ig n e r co n e je m p lo s S o la ris
La herramienta de Seguridad Java del JDK 1.1
S i e s t á s u t iliza n d o la ve rs ió n 1 . 1 d e l JDK, u t iliza rá s la h e rra m ie n t a d e s e g u rid a d
Ja va p a ra firm a r fich e ro s JAR. Pa ra lla m a r a e s t a h e rra m ie n t a s e u t iliza e l co m a n d o
ja v a k e y , p o r e s o , la lla m a re m o s "Ja va ke y" p a ra a co rt a r.
La h e rra m ie n t a Ja va ke y m a n e ja u n a b a s e d e d a t o s q u e co n t ie n e p a re ja s d e cla ve s
p ú b lica / p riva d a y lo s ce rt ifica d o s re la cio n a d o s . Pa ra firm a r u n fich e ro JAR co n e s t a
h e rra m ie n t a , n e ce s it a s t e n e r u n a p a re ja d e cla ve s p ú b lica / p riva d a e n e s t a b a s e d e
d a t o s . La h e rra m ie n t a Ja va Ke y b u s ca rá la b a s e d e d a t o s e n la lo ca liza ció n
e s p e cifica d a p o r la p ro p ie d a d id e n t it y . d a t a b a s e e n e l fich e ro d e p ro p ie d a d e s d e
s e g u rid a d , ja v a . s e c u rit y . No rm a lm e n t e la b a s e d e d a t o s co n t ie n e p a re s d e cla ve s
d e m u ch o s firm a n t e s p o t e n cia le s , ca d a p a r d e cla ve s e s t á a s o cia d o co n e l n o m b re
d e u s u a rio d e u n firm a n t e .
Ad e m á s d e lo s p a re s d e cla ve s , la b a s e d e d a t o s d e Ja va ke y co n t ie n e ce rt ifica d o s
p a ra la s cla ve s p ú b lica s . Cu a n d o s e a ñ a d e u n ce rt ifica d o a la b a s e d e d a t o s ,
Ja va ke y le a s ig n a u n n ú m e ro ú n ico p a ra p ro p ó s it o s d e id e n t ifica ció n .
Pa ra firm a r u n fich e ro , d e b e s p ro p o rcio n a r a Ja va ke y e s t a in fo rm a ció n :
● El n o m b re d e u s u a rio d e l p a r d e cla ve s a u t iliza r.

● El n ú m e ro d e ce rt ifica d o a u t iliza r.

● El n o m b re q u e d e b e n t e n e r lo s fich e ro s d e firm a y d e b lo q u e d e firm a s .

● El n o m b re d e l fich e ro JAR firm a d o .

Es t a in fo rm a ció n s e p ro p o rcio n a u t iliza n d o u n d ire ct iv e file , q u e e s b á s ica m e n t e u n


fich e ro d e p ro p ie d a d e s q u e le e Ja va ke y cu a n d o firm a u n fich e ro JAR. Aq u í t ie n e s u n
e je m p lo :

# The signer property specifies the username corresponding to


# the key pair that Javakey is to use to sign the JAR file.
# In this example, Javakey will sign the file using the key pair
# belonging to user "rita".

signer=rita

# The cert property tells Javakey which certificate to use. Each


# certificate in Javakey's database is identified by a number.
# To see a list of all the certificates and associated numbers in
# the database, use the command 'javakey -ld'.

cert=1

# The signature.file property specifies the name that the signature


# file and signature block file are to have. In this example,
# the files will be named SIGFILE.SF and SIGFILE.DSA, respectively.

signature.file=sigfile

# The out.file property specifies the name that Javakey should give
# to the signed JAR file it produces. This property is optional.
# If it's not present, Javakey will give the signed file the name
# of the original JAR file, but with a .sig filename extension.

out.file=rita.jar
Un a ve z q u e t u fich e ro d ire ct ivo e s t á lis t o , p u e d e s firm a r t u fich e ro JAR u t iliza n d o
u n co m a n d o co n e s t a fo rm a :

javakey -gs directive-file jar-file


En e s t e co m a n d o :
● - g s e s la o p ció n q u e le d ice a Ja va ke y q u e firm e u n fich e ro JAR.

● d ire c t iv e - file e s e l p a t h y e l n o m b re d e l fich e ro d e ire ct ivo q u e Ja va ke y


d e b e ría u t iliza r.
● ja r- file e s e l p a t h y e l n o m b re d e l fich e ro JAR q u e q u ie re s firm a r.

Ja va ke y s it u a rá e l fich e ro JAR firm a d o e n e l d ire ct ivo a ct u a l.


Ja va ke y p u e d e re a liza r m u ch a s o t ra s fu n cio n e s re la cio n a d a s co n e l m a n e jo d e
b a s e s d e d a t o s d e cla ve s y ce rt ifica d o s . Pu e d e s ve r la d o cu m e n t a ció n o n - lin e d e l
JDK p a ra m á s in fo rm a ció n s o b re Ja va Ke y:
● Pá g in a d e re fe re n cia d e Ja va ke y p a ra Win d o ws

● Pá g in a d e re fe re n cia d e Ja va ke y p a ra S o la ris

Oz it o
Verificar Ficheros JAR Firmados
No rm a lm e n t e , la ve rifica ció n d e fich e ro s JAR firm a d o s s e rá re s p o n s a b ilid a d d e t u
e n t o rn o d e e je cu ció n Ja va TM . As u m ie n d o q u e u t iliza s e l JDK 1 . 1 o p o s t e rio r, t u
n a ve g a d o r ve rifica rá lo s a p p le t s firm a d o s q u e d e s ca rg u e s . Y e n la ve rs ió n 1 . 2 d e la
p la t a fo rm a Ja va , la s a p lica cio n e s Ja va firm a d a s lla m a d a s co n la o p ció n - ja r d e l
in t é rp re t e s e rá n ve rifica d a s p o r e l e n t o rn o d e e je cu ció n .
S in e m b a rg o , p u e d e s ve rifica r fich e ro s JAR firm a d o s , u t iliza n d o la h e rra m ie n t a
Ja rs ig n e r d e l JDK 1 . 2 . Po r e je m p lo , p o d ría s h a ce r e s t o p a ra p ro b a r u n fich e ro JAR
firm a d o q u e t u h a s p re p a ra d o . La h e rra m ie n t a Ja rs ig n e r p u e d e ve rifica r fich e ro s
firm a d o s co n e l p ro p io Ja rs ig n e r o co n la h e rra m ie n t a Ja va ke y d e l JDK 1 . 1 .
No t a : La v e rs ió n 1 . 1 d e l JDK n o p ro p o rcio n a u n a u t ilid a d p a ra v e rifica r fich e ro s JAR
firm a d o s .
El co m a n d o b á s ico p a ra ve rifica r u n fich e ro JAR firm a d o e s :

jarsigner -verify jar-file


Es t e co m a n d o ve rifica rá la firm a d e l fich e ro JAR y s e a s e g u ra q u e lo s fich e ro s d e l
a rch ivo n o h a n ca m b ia d o d e s d e q u e s e firm ó . Ve rá s e s t e m e n s a je :

jar verified.
s i la ve rifica ció n t u vo é xit o . S i in t e n t a s ve rifica r u n fich e ro JAR s in firm a r, ve rá s e l
s ig u ie n t e m e n s a je :

jar is unsigned. (signatures missing or not parsable)


S i fa lla la ve rifica ció n , s e m o s t ra rá e l m e n s a je a p ro p ia d o . Po r e je m p lo , s i e l
co n t e n id o d e l fich e ro JAR h a ca m b ia d o d e s d e q u e fu e firm a d o , s e m o s t ra rá u n
m e n s a je co m o é s t e s i in t e n t a s ve rifica r la firm a d e l fich e ro :

jarsigner: java.lang.SecurityException: invalid SHA1


signature file digest for test/classes/Manifest.class

Oz it o
Entender la Firma y la Verificación
La p la t a fo rm a Ja va TM t e p e rm it e firm a r d ig it a lm e n t e t u s fich e ro s JAR. S e firm a
d ig it a lm e n t e u n fich e ro p o r la m is m a ra zó n p o r la q u e s e firm a u n d o cu m e n t o d e
p a p e l - p a ra p e rm it ir a lo s le ct o re s s a b e r q u e t ú h a s e s crit o e l d o cu m e n t o , o a l
m e n o s q u e e l d o cu m e n t o t ie n e t u a p ro va ció n .
Po r e je m p lo , cu a n d o firm a s u n a ca rt a , q u ie n re co n o zca t u firm a p u e d e co n firm a r
q u e t ú h a s e s crit o la ca rt a . De fo rm a s im ila r, cu a n d o firm a s u n fich e ro
d ig it a lm e n t e , a q u e l q u e "re co n o zca " t u firm a d ig it a l s a b e q u e e l fich e ro vie n e d e t í.
El p ro ce s o d e "re co n o cim ie n t o " d e firm a s e le ct ró n ica s s e lla m a v e rific a c ió n .
¿ Po r q u é e s t a n im p o rt a n t e firm a r y ve rifica r lo s fich e ro s ? Cu a n d o d e s ca rg a s u n
fich e ro d e u n a p p le t s in firm a r d e la we b , la p la t a fo rm a Ja va n o le p e rm it e q u e
re a lice o p e ra cio n e s s e n s ib le s a la s e g u rid a d co m o le e r o e s crib ir fich e ro s lo ca le s o
e je cu t a r p ro g ra m a s lo ca le s . Pe ro ¿ q u é s u ce d e s i d ich a s o p e ra cio n e s s o n u n a p a rt e
cru cia l d e la fu n cio n a lid a d d e l a p p le t ? y ¿ q u é p a s a s i q u ie re s q u e t u a p p le t re a lice
u n a o p e ra ció n p ro h ib id a n o rm a lm e n t e ? Aq u í e s d o n d e a p a re ce n la firm a y la
ve rifica ció n .
S i u n a p p le t e s t á firm a d o , t ú p u e d e s d e t e rm in a r s i vie n e d e u n a fu e n t e co rre ct a .
Un a ve z q u e t ú ( o t u n a ve g a d o r) h a ya s ve rifica d o q u e e l a p p le t vie n e d e u n a
fu e n t e co rre ct a , la p la t a fo rm a p u e d e re la ja r la s re s t riccio n e s d e s e g u rid a d y
p e rm it ir q u e e l a p p le t re a lice a lg u n a s o p e ra cio n e s q u e o rd in a ria m e n t e e s t a ría n
p ro h ib id a s . En la ve rs ió n 1 . 1 d e la p la t a fo rm a Ja va , u n a p p le t v e rd a d e ro t ie n e la
m is m a lib e rt a d q u e u n a a p lica ció n lo ca l. En la ve rs ió n 1 . 2 d e la p la t a fo rm a , u n
a p p le t v e rd a d e ro t ie n e la s lib e rt a d e s e s p e cifica d a s e n e l fich e ro d e p o licía .
La p la t a fo rm a Ja va p e rm it e la firm a y ve rifica ció n u t iliza n d o n ú m e ro s e s p e cia le s
lla m a d o s c la v e s p ú b lica y p riva d a . Es t a s cla ve s vie n e n e n p a re ja s y ju e g a n
p a p e le s co m p le m e n t a rio s .
La cla ve p riva d a e s e l "lá p iz" e le ct ró n ico co n e l q u e t ú firm a s u n fich e ro . Co m o s u
n o m b re in d ica , t u cla ve p riva d a s ó lo la co n o ce s t ú , p o r e s o n a d ie p u e d e fa ls ifica r t u
firm a . Un fich e ro firm a d o co n t u cla ve p riva d a s ó lo p u e d e s e r ve rifica d o p o r la
co rre s p o n d ie n t e cla ve p ú b lica .
S in e m b a rg o , s ó lo la s cla ve s p ú b lica y p riva d a , n o s o n s u ficie n t e s p a ra ve rifica r u n a
firm a . Un a cla ve p ú b lica s ó lo p u e d e ve rifica r q u e u n fich e ro firm a d o fu e firm a d o
p o r la cla ve p riva d a co rre s p o n d ie n t e . Po r e s o a u n q u e u n a cla ve p ú b lica p u e d e
d e cirt e q u e u n a firm a e s "a u t é n t ica ", n o p u e d e d e cirt e d e q u ie n e s la firm a !
Po r lo t a n t o , s e re q u ie re u n e le m e n t o m á s p a ra h a ce r e l t ra b a jo d e firm a y
ve rifica ció n . El e le m e n t o a d icio n a l e s e l c e rt ific a d o q u e lo s firm a n t e s in clu ye n e n
u n fich e ro JAR firm a d o . Un c e rt ific a d o e s u n a s e n t e n cia firm a d a d ig it a lm e n t e p o r
u n a a u t o rid a d e n c e rt ific a c ió n q u e in d ica q u ie n e s e l p ro p ie t a rio d e u n a firm a
p a rt icu la r. En e l ca s o d e lo s fich e ro s JAR firm a d o s , e l ce rt ifica d o in d ica a q u ié n
p e rt e n e ce la cla ve p ú b lica co n t e n id a e n e l fich e ro JAR.
Cu a n d o firm a s u n fich e ro JAR t u cla ve p ú b lica s e s it ú a d e n t ro d e l a rch ivo ju n t o co n
u n ce rt ifica d o a s o cia d o p a ra fa cilit a r e l u s o p o r cu a lq u ie ra q u e q u ie ra ve rifica r t u
firm a .
Pa ra s u m a riza r la firm a d ig it a l:
● El firm a n t e firm a e l fich e ro JAR u t iliza n d o u n a cla ve p riva d a .

● La co rre s p o n d ie n t e cla ve p ú b lica s e s it ú a d e n t ro d e l fich e ro JAR, ju n t o co n s u


ce rt ifica d o , p a ra q u e s e a p o s ib le s u u s o p o r q u ie n q u ie ra ve rifica r la firm a .

El fichero de Firma
Cu a n d o firm a s u n fich e ro JAR, s e a ñ a d e a u t o m á t ica m e n t e u n fich e ro d e firm a e n
e l d ire ct o rio META- INF d e l fich e ro JAR. Es t e e s e l m is m o d ire ct o rio q u e co n t ie n e e l
m a n ife s t o d e l fich e ro JAR. Lo s fich e ro s d e firm a t ie n e n la e xt e n s ió n . S F.

Aq u í t ie n e s u n e je m p lo d e l co n t e n id o d e u n fich e ro d e firm a :

Signature-Version: 1.0
SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
Created-By: SignatureFile JDK 1.2

Name: test/classes/Manifest.class
SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=

Name: test/classes/SignatureFile.class
SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=

Name: test/images/manifest-concept.gif
SHA1-Digest: kdHbE7kL9ZHLgK7akHttYV4XIa0=

Name: test/images/manifest-schematic.gif
SHA1-Digest: mF0D5zpk68R4oaxEqoS9Q7nhm60=
El fich e ro d e firm a co n t ie n e e n t ra d a s p a ra ca d a n o m b re d e fich e ro e l va lo r d e
re s u m e n . La lín e a S HA1 - Dig e s t - Ma n ife s t co n t ie n e e l re s u m e n d e l fich e ro d e
m a n ifie s t o .
Lo s va lo re s d e re s u m e n s o n re p re s e n t a cio n e s co d ifica d a s d e l co n t e n id o d e lo s
fich e ro s e n e l m o m e n t o e n q u e fu e ro n firm a d o s . El re s u m e n d e u n fich e ro ca m b ia rá
s ó lo s i ca m b ia e l p ro p io fich e ro . Cu a n d o s e ve rifica u n fich e ro JAR firm a d o , s e
ca lcu la e l re s u m e n d e ca d a fich e ro y s e co m p a ra co n e l re s u m e n a lm a ce n a d o e n e l
fich e ro d e m a n ifie s t o p a ra a s e g u ra rs e d e q u e e l co n t e n id o d e l fich e ro JAR n o h a
ca m b ia d o d e s d e q u e s e firm ó .
Pu e d e s e n co n t ra r in fo rm a ció n a d icio n a l s o b re la firm a d e fich e ro s e n la s p á g in a s d e
d o cu m e n t a ció n d e l JDK Fo rm a t o d e l Ma n ife s t o .

El fichero de bloques de firmas


Ad e m á s d e l fich e ro d e firm a , cu a n d o s e firm a u n fich e ro JAR s e a ñ a d e
a u t o m á t ica m e n t e u n fich e ro d e b lo q u e d e firm a e n e l d ire ct o rio META- INF. Al
co n t ra rio q u e e l fich e ro d e m a n ifie s t o o e l fich e ro d e firm a , lo s fich e ro s d e b lo q u e s
d e firm a s n o t ie n e n u n fo rm a t o le ib le .
El fich e ro d e b lo q u e d e firm a s co n t ie n e d o s e le m e n t o s e s e n cia le s p a ra la
ve rifica ció n :
● La firm a d ig it a l p a ra e l fich e ro JAR q u e fu e g e n e ra d o p o r la cla ve p riva d a d e l
firm a n t e .
● La cla ve p ú b lica d e l firm a n t e , ju n t o co n s u ce rt ifica d o , p a ra s e r u t iliza d a s p o r
cu a lq u ie ra q u e q u ie ra ve rifica r e l fich e ro JAR.
Lo s n o m b re s d e lo s fich e ro s d e b lo q u e s d e firm a s n o rm a lm e n t e t ie n e n la e xt e n s ió n ,
. D S A in d ica n d o q u e h a n s id o cre a d o s p o r e l Alg o rit m o d e Firm a Dig it a l p o r d e fe ct o .
S in e m b a rg o , s o n p o s ib le s o t ra s e xt e n s io n e s s i la s cla ve s e s t á n a s o cia d a s co n o t ro s
a lg o rit m o s e s t á n d a rd .

Documentación Relacionada
Pa ra in fo rm a ció n a d icio n a l s o b re la s cla ve s , lo s ce rt ifica d o s , y a u t o rid a d e s d e
ce rt ifica ció n , p u e d e s ve r
● La s cla ve s d e l JDK 1 . 2 y la h e rra m ie n t a d e Ma n e jo d e Ce rt ifica d o

● Ce rt ifica d o s X. 5 0 9

Pa ra m á s in fo rm a ció n s o b re la a rq u it e ct u ra d e s e g u rid a d d e la p la t a fo rm a Ja va ,
p u e d e s ve r e s t a d o cu m e n t a ció n re la cio n a d a :
● Es p e cifica ció n y Re fe re n cia s o b re e l API Ja va d e Cryp t o g ra fía

● Do cu m e n t a ció n s o b re s e g u rid a d e n e l JDK 1 . 2

Oz it o
Utilizar el JNI (Java Native Interface)
La s p á g in a s d e e s t a s e cció n m u e s t ra n co m o in t e g ra r có d ig o n a t ivo e n p ro g ra m a s
e s crit o s e n Ja va . Ta m b ié n a p re n d e re m o s có m o e s crib ir m é t o d o s n a t iv o s e n
le n g u a je Ja va . Lo s m é t o d o s n a t ivo s e s t á n im p le m e n t a d o s e n o t ro s le n g u a je s co m o
C. Ad e m á s , e l API I n v o c a t io n n o s p e rm it e in clu ir la Má q u in a Virt u a l Ja va e n
n u e s t ra s a p lica cio n e s n a t iva s .

Paso a Paso
Exp lica p a s o a p a s o u n s e n cillo e je m p lo ( lo s m é t o d o s n a t ivo s d e l p ro g ra m a "He llo
Wo rld !") p a ra ilu s t ra r có m o e s crib ir, co m p ila r y e je cu t a r u n p ro g ra m a Ja va co n
m é t o d o s n a t ivo s .

El Interface de Programación Nativo de Java


Mu e s t ra có m o im p le m e n t a r e l la d o d e l le n g u a je Ja va y e l la d o d e l le n g u a je n a t ivo
d e u n m é t o d o n a t ivo . Es t a le cció n in clu ye in fo rm a ció n s o b re e l p a s o d e a rg u m e n t o s
d e d is t in t o s t ip o s d e d a t o s a u n m é t o d o n a t ivo y có m o d e vo lve r d is t in t o s t ip o s d e
d a t o s d e s d e u n m é t o d o n a t ivo . Es t a le cció n t a m b ié n d e s crib e m u ch a s fu n cio n e s
ú t ile s q u e n u e s t ro le n g u a je Na t ivo p u e d e u t iliza r p a ra a cce d e r a o b je t o s Ja va y s u s
m ie m b ro s , p a ra cre a r o b je t o s Ja va , la n za r e xce p cio n e s , lla m a r a la Má q u in a Virt u a l
Ja va , y m u ch o m á s .
Co n s id e ra c io n e s d e S e g u rid a d : Ob s e rva q u e la p o s ib ilid a d d e la ca rg a
d e lib re ría s d in á m ica s e s t á s u je t a a la a p ro b a ció n d e l co n t ro la d o r d e
s e g u rid a d . Cu a n d o s e t ra b a ja co n m é t o d o s n a t ivo s , s e d e b e n ca rg a r
lib re ría s d in á m ica s . Alg u n o s a p p le t s n o p o d rá n u t iliza r m é t o d o s n a t ivo s
p o rq u e e l n a ve g a d o r o vis u a liza d o r e n q u e s e e s t á n e je cu t a n d o re s t rin g e
la ca rg a d e lib re ría s d in á m ica s . Pu e d e s ve r Re s t riccio n e s d e S e g u rid a d
p a ra m á s in fo rm a ció n s o b re la s re s t riccio n e s d e s e g u rid a d d e lo s a p p le t s .
N o t a : Lo s p ro g ra m a d o re s d e Ma cOS d e b e rá n re fe rirs e a Ma cOS Ru n t im e
p a ra Ja va ( MRJ) .

Oz it o
Paso a Paso:
Es t a s p á g in a s p a s e a n a t ra vé s d e lo s p a s o s n e ce s a rio s p a ra in t e g ra r có d ig o n a t ivo
e n p ro g ra m a s e s crit o s e n Ja va .
Es t a le cció n im p le m e n t a e l co n s a b id o p ro g ra m a "He llo Wo rld !". Es t e p ro g ra m a
t ie n e d o s cla s e s Ja va . La p rim e ra , lla m a d a Ma in , im p le m e n t a e l m é t o d o m a in ( )
p a ra t o d o e l p ro g ra m a . La s e g u n d a , lla m a d a He llo W o rld , e s u n m é t o d o , u n
m é t o d o n a t ivo , q u e m u e s t ra "He llo Wo rld !". La im p le m e n t a ció n p a ra e l m é t o d o
n a t ivo s e h a p ro p o rcio n a d o e n le n g u a je C.

Paso 1: Escribir el Código Java

Cre a u n cla s e Ja va lla m a d a He llo W o rld q u e d e cla ra u n m é t o d o n a t ivo .


Ta m b ie n , e s crib e e l p ro g ra m a p rin cip a l q u e cre a e l o b je t o He llo W o rld y
lla m a a l m é t o d o n a t ivo .

Paso 2: Compilar el Código Java

Ut iliza ja v a c p a ra co m p ila r e l có d ig o Ja va e s crit o e n e l P a s o 1 .

Paso 3: Crear el fichero .h

Ut iliza ja v a h p a ra cre a r u n fich e ro d e ca b e ce ra ( u n fich e ro . h ) a l e s t ilo


JNI, a p a rt ir d e la cla s e He llo W o rld . El fich e ro d e ca b e ce ra p ro p o rcio n a
u n a d e fin ició n d e fu n ció n p a ra la im p le m e n t a ció n d e l m é t o d o n a t ivo
d is p la y He llo W o rld ( ) , q u e s e h a d e fin id o e n la cla s e He llo W o rld .

Paso 4: Escribir la Implementación del Método Nativo

Es crib e la im p le m e n t a ció n p a ra e l m é t o d o n a t ivo e n u n fich e ro fu e n t e e n


e l le n g u a je n a t ivo . La im p le m e n t a ció n s e rá u n a fu n ció n n o rm a l q u e s e rá
in t e g ra d a co n n u e s t ra cla s e Ja va .

Paso 5: Crear una Librería Compartida

Ut iliza e l co m p ila d o r C p a ra co m p ila r e l fich e ro . h y e l fich e ro . c q u e s e


h a n cre a d o e n lo s p a s o s 3 y 4 e n u n a lib re ría co m p a rt id a . En
t e rm in o lo g ía Win d o ws 9 5 / NT, u n a lib re ría co m p a rt id a s e lla m a Lib re ría
d e Ca rg a Din á m ica ( DLL) .

Paso 6: Ejecutar el Programa

Y fin a lm e n t e , u t iliza ja v a , e l in t é rp re t e d e l le n g u a je Ja va , p a ra e je cu t a r
e l p ro g ra m a .
Oz it o
Paso 1: Escribir el Código Java
El s ig u ie n t e fra g m e n t o d e có d ig o Ja va d e fin e u n a cla s e lla m a d a He llo W o rld . Es t a
cla s e t ie n e u n s e g m e n t o d e có d ig o e s t á t ico :

class HelloWorld {
public native void displayHelloWorld();

static {
System.loadLibrary("hello");
}
}

Definir un Método Nativo

To d o s lo s m é t o d o s , t a n t o m é t o d o s Ja va , co m o m é t o d o s n a t ivo s , s e
d e b e n d e fin ir d e n t ro d e u n a cla s e Ja va . Cu a n d o s e e s crib e la
im p le m e n t a ció n d e u n m é t o d o e n u n le n g u a je d e p ro g ra m a ció n d is t in t o
d e Ja va , s e d e b e in clu ir la p a la b ra cla ve n a t iv e co m o p a rt e d e la
d e fin ició n d e l m é t o d o d e n t ro d e la cla s e ja va . La cla ve n a t iv e in d ica a l
co m p ila d o r Ja va q u e la fu n ció n e s u n a fu n ció n e n le n g u a je n a t ivo . Es
s e n cillo d e cir q u e la im p le m e n t a ció n d e l m é t o d o d is p la y He llo W o rld ( )
d e la cla s e He llo W o rld e s t á e s crit a e n o t ro le n g u a je d e p ro g ra m a ció n
p o rq u e la cla ve n a t iv e a p a re ce co m o p a rt e d e s u d e fin ició n d e m é t o d o :

public native void displayHelloWorld();


Es t a d e fin ició n d e m é t o d o e n n u e s t ra cla s e Ja va s ó lo p ro p o rcio n a la firm a
d e l m é t o d o p a ra d is p la y He llo W o rld ( ) . No p ro p o rcio n a la
im p le m e n t a ció n p a ra e l m é t o d o . S e d e b e rá p ro p o rcio n a r la
im p le m e n t a ció n p a ra d is p la y He llo W o rld ( ) e n u n fich e ro fu e n t e
s e p a ra d o e n e l le n g u a je n a t ivo .
La d e fin ició n d e m é t o d o p a ra d is p la y He llo W o rld ( ) t a m b ié n in d ica q u e
e l m é t o d o e s u n m é t o d o d e e je m p la r p ú b lico , n o a ce p t a n in g ú n
a rg u m e n t o , y n o d e vu e lve n in g ú n va lo r. Pa ra m á s in fo rm a ció n s o b re lo s
a rg u m e n t o s y lo s va lo re s d e re t o rn o d e s d e m é t o d o s n a t ivo s p u e d e s ve r
Pro g ra m a ció n d e In t e rfa ce Na t ivo e n Ja va .

Carga de la Librería

S e d e b e co m p ila r e l có d ig o d e le n g u a je n a t ivo q u e im p le m e n t a
d is p la y He llo W o rld d e n t ro d e u n a lib re ría co m p a rt id a ( s e h a rá e s t o e n
e l Pa s o 5 : Cre a r u n a Lib re ría Co m p a rt id a ) . Ta m b ié n s e d e b e ca rg a r la
lib re ría co m p a rt id a d e n t ro d e la cla s e Ja va q u e la re q u ie re . Es t a ca rg a d e
la lib re ría co m p a rt id a d e n t ro d e la cla s e Ja va m a p e a la im p le m e n t a ció n
d e l m é t o d o n a t ivo a s u d e fin ició n .
S e u t iliza e l m é t o d o S y s t e m . lo a d Lib ra ry p a ra ca rg a r la lib re ría
co m p a rt id a q u e s e cre o cu a n d o co m p ila m o s la im p le m e n t a ció n d e l
có d ig o . Es t e m é t o d o s e co lo ca co n u n in icia liza d o r s t a t ic . El a rg u m e n t o
d e S y s t e m . lo a d Lib ra ry e s e l n o m b re d e la lib re ría . El s is t e m a u t iliza u n
e s t á n d a rd , p e ro e s p e cífico d e la p la t a fo rm a , p a ra co n ve rt ir e l n o m b re d e
la lib re ría a u n n o m b re d e lib re ría n a t ivo . Po r e je m p lo , e n S o la ris
co n vie rt e e l n o m b re "h e llo " a lib h e llo . s o , m ie n t ra s q u e e n Win 3 2
co n vie rt e e l m is m o n o m b re d e lib re ría a h e llo . d ll.
El s ig u ie n t e in icia liza d o r s t a t ic d e la cla s e He llo W o rld ca rg a la lib re ría
a p ro p ia d a , lla m a d a h e llo . El s is t e m a d e e je cu ció n e je cu t a u n
in icia liza d o r e s t á t ico cu a n d o ca rg a la cla s e .

static {
System.loadLibrary("hello");
}

Crear el Programa Principal

Ta m b ié n s e d e b e cre a r u n fich e ro fu e n t e s e p a ra d o co n u n a a p lica ció n


Ja va q u e e je m p la rize la cla s e q u e co n t ie n e la d e fin ició n d e m é t o d o
n a t ivo . Es t a a p lica ció n Ja va t a m b ié n lla m a rá a l m é t o d o n a t ivo . Co m o e s
u n a a p lica ció n , d e b e t e n e r u n m é t o d o m a in . En u n fich e ro fu e n t e
s e p a ra d o , q u e p a ra e s t e e je m p lo h e m o s lla m a d o Ma in . ja va , s e cre a u n a
a p lica ció n Ja va q u e e je m p la riza He llo W o rld y lla m a a l m é t o d o n a t ivo
d is p la y He llo W o rld ( ) .

class Main {
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
Co m o s e p u e d e ve r a p a rt ir d e l có d ig o a n t e rio r, s e lla m a a u n m é t o d o
n a t ivo d e la m is m a fo rm a e n q u e s e lla m a ría a u n m é t o d o n o rm a l: s ó lo
a ñ a d ir e l n o m b re d e l m é t o d o a l fin a l d e l n o m b re d e l o b je t o , s e p a ra d o
co n u n p u n t o ( '. ') . Un a p a re ja d e p a ré n t e s is , ( ) , s ig u e a l n o m b re d e l
m é t o d o y e n cie rra lo s a rg u m e n t o s . El m é t o d o d is p la y He llo W o rld ( ) n o
t ie n e n in g ú n a rg u m e n t o .

Oz it o
Paso 2: Compilar el Código Java
S e u t iliza e l co m p ila d o r d e l le n g u a je Ja va p a ra co m p ila r la cla s e Ja va cre a d a e n e l
p a s o a n t e rio r. En e s t e m o m e n t o t a m b ié n s e d e b e ría co m p ila r la a p lica ció n Ja va q u e
s e e s crib ió p a ra p ro b a r e l m é t o d o n a t ivo .

Oz it o
Paso 3: Crear el fichero .h
En e s t e p a s o s e u t iliza e l p ro g ra m a d e u t ilid a d ja v a h p a ra g e n e ra r u n fich e ro d e
ca b e ce ra ( u n fich e ro . h ) d e s d e la cla s e Ja va He llo W o rld . El fich e ro d e ca b e ce ra
p ro p o rcio n a u n p ro t o t ip o d e fu n ció n p a ra la im p le m e n t a ció n d e l m é t o d o n a t ivo
d is p la y He llo W o rld ( ) d e fin id o e n e s t a cla s e .
Eje cu t a ja v a h a h o ra s o b re la cla s e He llo W o rld q u e s e cre ó e n lo s p a s o s
a n t e rio re s .
Po r d e fe ct o , ja v a h s it ú a e l n u e vo fich e ro . h e n e l m is m o d ire ct o rio q u e e l fich e ro
. c la s s . S e u t iliza la o p ció n - d p a ra in s t ru ir a ja v a h p a ra q u e s it ú e e l fich e ro d e
ca b e ce ra e n u n d ire ct o rio d ife re n t e .
El n o m b re d e l fich e ro d e ca b e ce ra e s e l n o m b re d e la cla s e ja va co n e xt e n s ió n . h .
Po r e je m p lo , e l co m a n d o a n t e rio r g e n e ra rá u n fich e ro lla m a d o He llo W o rld . h .

La definición de Función

Mira e l fich e ro d e ca b e ce ra He llo W o rld . h .

#includejava example-1dot1/HelloWorld.h
Ja v a _ He llo W o rld _ d is p la y He llo W o rld ( ) Es la fu n ció n q u e p ro p o rcio n a la
im p le m e n t a ció n d e l m é t o d o n a t ivo d e la cla s e He llo W o rld , q u e s e e s crib irá e n e l
Pa s o 4 : Es crib ir la Im p le m e n t a ció n d e l Mé t o d o Na t ivo . S e u t iliza la firm a d e la
fu n ció n cu a n d o s e e s crib e la im p le m e n t a ció n d e l m é t o d o n a t ivo .
S i He llo W o rld co n t u vie ra o t ro s m é t o d o s n a t ivo s , s u s firm a s d e fu n ció n d e b e ría n
a p a re ce r a q u í t a m b ié n .
El n o m b re d e la fu n ció n e n e l le n g u a je n a t ivo q u e im p le m e n t a e l m é t o d o n a t ivo
co n s is t e e n e l p re fijo Ja v a _ , e l n o m b re d e l p a q u e t e , e l n o m b re d e la cla s e , y e l
n o m b re d e l m é t o d o n a t ivo . En t re ca d a n o m b re d e co m p o n n e t e h a y u n
s u b ra ya d o "_ " co m o s e p a ra d o r. El n o m b re d e p a q u e t e s e o m it e cu a n d o e l m é t o d o
e s t á e n e l p a q u e t e p o r d e fe ct o .
As í, e l m é t o d o n a t ivo d is p la y He llo W o rld d e n t ro d e la cla s e He llo W o rld s e
co n vie rt e e n Ja v a _ He llo W o rld _ d is p la y He llo W o rld ( ) . En n u e s t ro e je m p lo , n o
h a y n o m b re d e p a q u e t e , p o rq u e He llo W o rld e s t á e n e l p a q u e t e p o r d e fe ct o .
Ob s e rva q u e la im p le m e n t a ció n d e la fu n ció n e n e l le n g u a je n a t ivo , q u e a p a re ce e n
e l fich e ro d e ca b e ce ra , a ce p t a d o s p a rá m e t ro s , a u n q u e e n s u d e fin ició n e n le n g u a je
Ja va n o a ce p t a rá n in g u n o . El JNI re q u ie re q u e cu a lq u ie r m é t o d o n a t ivo t e n g a e s t o s
d o s p a rá m e t ro s . El p rim e r p a rá m e t ro e s u n p u n t e ro a u n in t e rfa ce JN I En v . A
t ra vé s d e e s t e p u n t e ro , e l có d ig o n a t ivo p o d rá a cce d e r a lo s p a rá m e t ro s y o b je t o s
d e la a p lica ció n Ja va . El p a rá m e t ro jo b je c t e s u n a re fe re n cia a l p ro p io o b je t o . Pa ra
u n m é t o d o n a t ivo n o - e s t á t ico co m o e l m é t o d o d is p la y He llo W o rld d e n u e s t ro
e je m p lo , e s t e a rg u m e n t o e s u n a re fe re n cia a l o b je t o . Pa ra m é t o d o s n a t ivo s
e s t á t ico s , e s t e a rg u m e n t o s e ría u n a re fe re n cia a l m é t o d o Ja va . Pa ra a cla ra rlo u n
p o co , s e p u e d e p e n s a r e n e l p a rá m e t ro jo b je c t co m o e n la va ria b le "t h is " d e C+ + .
Nu e s t ro e je m p lo ig n o ra á m b o s p a rá m e t ro s .
La s ig u ie n t e le cció n Pro g ra m a ció n d e l In t e rfa ce Na t ivo e n Ja va , d e s crib e co m o
a cce d e r a lo s d a t o s u t iliza n d o e l p a rá m e t ro e n v .

Oz it o
Paso 4: Escribir la Implementación del Método Nativo
Ah o ra p o d e m o s e n t ra r e n e l n e g o cio d e e s crib ir la im p le m e n t a ció n d e l m é t o d o n a t ivo e n
o t ro le n g u a je d is t in t o d e ja va .
La fu n ció n q u e e s crib a m o s d e b e t e n e r la m is m a firm a d e fu n ció n q u e la q u e s e g e n e ró
co n ja v a h d e n t ro d e l fich e ro He llo W o rld . h e n e l Pa s o 3 : Cre a r e l fich e ro . h . Re cu e rd a
q u e la firm a d e la fu n ció n g e n e ra d a p a ra e l m é t o d o n a t ivo d is p la y He llo W o rld ( ) d e la
cla s e He llo W o lrd , s e p a re ce a e s t o :

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject);


Aq u í t ie n e s la im p le m e n t a ció n e n le n g u a je C p a ra e l m é t o d o n a t ivo
Ja v a _ He llo W o rld _ d is p la y He llo W o rld ( ) . Es t a im p le m e n t a ció n s e e n cu e n t ra e n e l
fich e ro lla m a d o He llo W o rld I m p . c .

#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL


Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
La im p le m e n t a ció n p a ra Ja v a _ He llo W o rld _ d is p la y He llo W o rld ( ) e s co rre ct a : la fu n ció n
u t iliza la fu n ció n p rin t f( ) p a ra m o s t ra r e l s t rin g "He llo Wo rld !" y re t o rn a .
Es t e fich e ro in clu ye t re s fich e ro s d e ca b e ce ra :
● jn i. h - Es t e fich e ro d e ca b e ce ra p ro p o rcio n a in fo rm a ció n q u e e l có d ig o n a t ivo
n e ce s it a p a ra in t e ra ct u a r co n e l s is t e m a d e e je cu ció n Ja va . Cu a n d o s e e s crib a n
m é t o d o s n a t ivo s , s ie m p re s e d e b e in clu ir e s t e fich e ro d e ca b e ce ra e n lo s fich e ro s
fu e n t e n a t ivo s .
● He llo W o rld . h - El fich e ro . h q u e s e g e n e ró e n e l Pa s o 3 : Cre a r e l fich e ro . h .

● s t d io . h - El có d ig o a n t e rio r t a m b ié n in clu ye e l fich e ro s t d io . h p o rq u e u t iliza la


fu n ció n p rin t f( ) .

Oz it o
Paso 5: Crear una Librería Compartida
Re cu e rd a q u e e n e l Pa s o 1 : Es crib ir e l Có d ig o Ja va s e u t ilizó la s ig u ie n t e lla m a d a d e
m é t o d o p a ra ca rg a r u n a lib re ría co m p a rt id a lla m a d a h e llo d e n t ro d e n u e s t ro p ro g ra m a e n
e l m o m e n t o d e la e je cu ció n :

System.loadLibrary("hello");
Ah o ra e s t á m o s lis t o s p a ra cre a r la lib re ría co m p a rt id a .
En e l p a s o a n t e rio r, cre a m o s u n fich e ro C e n e l q u e e s crib im o s la im p le m e n t a ció n p a ra e l
m é t o d o n a t ivo d is p la y He llo W o rld . S e g ra b ó e l m é t o d o n a t ivo e n e l fich e ro
He llo W o rld I m p . c . Ah o ra , d e b e re m o s co m p ila r e s t e fich e ro e n u n a lib re ría , q u e d e b e
lla m a rs e h e llo p a ra co rre s p o n d e r co n e l n o m b re u t iliza d o e n e l m é t o d o
S y s t e m . lo a d Lib ra ry .
S e u t iliza n la s h e rra m ie n t a s d is p o n ib le s p a ra co m p ila r e l có d ig o n a t ivo q u e s e cre o e n lo s
p a s o s a n t e rio re s e n u n a lib re ría co m p a rt id a . En S o la ris , s e cre a rá u n a lib re ría co m p a rt id a ,
m ie n t ra s q u e e n Win d o ws 9 5 / NT s e cre a rá u n a lib re ría d e e n la ce d in á m ico ( DLL) . Re cu e rd a
e s p e cifica r e l p a t h o p a t h s n e ce s a rio s p a ra t o d o s lo s fich e ro s d e ca b e ce ra n e ce s a rio s .
En S o la ris , e l s ig u ie n t e co m a n d o co n s t ru ye u n a lib re ría lla m a d a lib h e llo . s o :

cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris \
HelloWorldImp.c -o libhello.so
En Win 3 2 , e l s ig u ie n t e co m a n d o co n s t ru ye u n a lib re ría d e e n la ce d in á m ico h e llo . d ll
u t iliza n d o Micro s o ft Vis u a l C+ + 4 . 0 :

cl -Ic:\java\include -Ic:\java\include\win32 -LD HelloWorldImp.c -Fehello.dll


Po r s u p u e s t o , s e n e ce s it a e s p e cifica r e l p a t h d e in c lu d e q u e co rre s p o n d a co n la
co n fig u ra ció n d e n u e s t ra m á q u in a .

Oz it o
Paso 6: Ejecutar el Programa
Ah o ra e je cu t a la a p lica ció n Ja va ( La cla s e Ma in ) co n e l in t é rp re t e ja va . De b e ría s
ve r la s ig u ie n t e s a lid a :

Hello World!
S i ve s u n a e xce p ció n co m o é s t a :

java.lang.UnsatisfiedLinkError: no hello in shared library path


at java.lang.Runtime.loadLibrary(Runtime.java)
at java.lang.System.loadLibrary(System.java)
at
at java.lang.Thread.init(Thread.java)
e s p o rq u e n o t ie n e s co n fig u ra d o co rre ct a m e n t e e l p a t h d e lib re ría s . El p a t h d e
lib re ría s e s u n a lis t a d e d ire ct o rio s e n la q u e e l s is t e m a d e e je cu ció n Ja va b u s ca
cu a n d o s e ca rg a n lib re ría s . Co n fig u ra ció n d e l p a t h d e lib re ría s , y a s e g u ra t e d e l
n o m b re d e l d ire ct o rio d o n d e e s t á la lib re ría h e llo .

Oz it o
Interface de Programación Nativo de Java
El JDK 1 . 1 s o p o rt a e l In t e rfa ce Na t ivo Ja va ( JNI) . Po r u n la d o , e l JNI d e fin e u n
e s t á n d a rd d e n o m b re s y co n ve n cio n e s d e lla m a d a s p a ra q u e la Má q u in a Virt u a l
Ja va ( VM) p u e d a e n co n t ra r n u e s t ro s m é t o d o s n a t ivo s . Po r o t ro la d o , e l JNI o fre ce
u n co n ju n t o d e fu n cio n e s d e in t e rfa ce e s t á n d a rd . S e p u e d e lla m a r a la s fu n cio n e s
JNI d e s d e n u e s t ro s m é t o d o s n a t ivo s p a ra h a ce r co s a s co m o a cce d e r y m a n ip u la r
o b je t o s Ja va , lib e ra r o b je t o s Ja va , cre a r n u e vo s o b je t o s , lla m a r a m é t o d o s Ja va ,
e t c.
Es t a s e cció n m u e s t ra có m o s e g u ir la s co n ve n cio n e s d e n o m b re s y d e lla m a d a s d e l
JNI, y co m o u t iliza r la s fu n cio n e s d e l JNI d e s d e u n m é t o d o n a t ivo . Ca d a e je m p lo
co n s is t e e n u n p ro g ra m a e s crit o e n Ja va q u e lla m a a va rio s m é t o d o s n a t ivo s
im p le m e n t a d o s e n C. Lo s m é t o d o s n a t ivo s , a s u ve z, p o d ría n lla m a r a la s fu n cio n e s
JNI p a ra a cce d e r a lo s o b je t o s Ja va .
La s e cció n t a m b ié n m u e s t ra có m o in clu ir la m á q u in a virt u a l Ja va d e n t ro d e u n a
a p lica ció n n a t iva .

Declarar Métodos Nativos

En e l la d o d e l le n g u a je Ja va , s e d e cla ra u n m é t o d o n a t ivo co n la p a la b ra
cla ve n a t iv e y u n cu e rp o d e m é t o d o va cío . En e l la d o d e l le n g u a je
n a t ivo , s e p ro p o rcio n a la im p le m e n t a ció n d e l m é t o d o n a t ivo . De b e m o s
t e n e r cu id a d o cu a n d o e s crib a m o s m é t o d o s n a t ivo s q u e "co rre s p o n d a " la
im p le m e n t a ció n d e la fu n ció n n a t iva co n la firm a d e l m é t o d o e n e l fich e ro
d e ca b e ce ra d e l le n g u a je Ja va . La h e rra m ie n t a ja v a h , q u e s e e xp licó e n
e l Pa s o 3 : Cre a r e l fich e ro . h , n o s a yu d a a g e n e ra r p ro t o t ip o s d e
fu n cio n e s n a t iva s q u e co rre s p o n d e n co n la d e cla ra ció n d e l m é t o d o n a t ivo
e n le n g u a je Ja va .

Mapear entre Tipos Java y Tipos Nativos

El JNI d e fin e u n m a p e a d o d e lo s t ip o s d e l le n g u a je Ja va y lo s t ip o s d e
le n g u a je n a t ivo ( C/ C+ + ) . Es t a p á g in a p re s e n t a lo s t ip o s n a t ivo s
co rre s p o n d ie n t e s t a n t o a lo s t ip o s p rim it ivo s Ja va co m o in t y d o u b le , y
lo s o b je t o s d e l le n g u a je Ja va , in clu ye n d o s t rin g s y a rra ys .

Acceder a Strings Java

Lo s S t rin g s s o n u n t ip o d e o b je t o Ja va p a rt icu la rm e n t e ú t il. El JNI


p ro p o rcio n a u n co n ju n t o d e fu n cio n e s p a ra m a n ip u la ció n d e S t rin g s q u e
h a ce s e n cilla la t e re a m a n e ja r o b je t o s S t rin g s d e Ja va e n e l có d ig o
n a t ivo . El p ro g ra m a d o r p u e d e t ra d u cir e n t re S t rin g s Ja va y S t rin g s
n a t ivo s e n lo s fo rm a t o s Un ico d e y UTF- 8 .
Acceder a Arrays Java

Lo s Arra ys s o n o t ro t ip o d e o b je t o s Ja va m u y u t iliza d o s . S e p u e d e n
u t iliza r la s fu n cio n e s d e m a n ip u la ció n d e a rra ys d e l JNI p a ra cre a r y
a cce d e r a lo s e le m e n t o s d e u n a rra y.

Llamar a Métodos Java

El JNI s o p o rt a u n co m p le t o co n ju n t o d e o p e ra cio n e s d e lla m a d a q u e


p e rm it e n in vo ca r m é t o d o s Ja va d e s d e có d ig o n a t ivo . S e lo ca liza e l
m é t o d o u t iliza n d o s u n o m b re y s u firm a . S e p u e d e n lla m a r t a n t o a
m é t o d o s e s t á t ico s co m o a m é t o d o s d e e je m p la r ( n o e s t á t ico s ) . S e p u e d e
u t iliza r la h e rra m ie n t a ja v a p p a ra g e n e ra r firm a s d e m é t o d o s a l e s t ilo
JNI p a ra lo s fich e ro s d e cla s e s .

Acceder a Campos Java

El JNI p e rm it e lo ca liza r u n ca m p o Ja va u t iliza n d o e l n o m b re y la firm a d e l


ca m p o . S e p u e d e n lo ca liza r y a cce d e r t a n t o a ca m p o s e s t á t ico s co m o
ca m p o s d e e je m p la r ( n o e s t á t ico s ) . S e p u e d e u t iliza r la h e rra m ie n t a
ja v a p p a ra g e n e ra r firm a s d e ca m p o s a l e s t ilo JNI p a ra lo s fich e ro s d e
cla s e s .

Capturar y Lanzar Excepciones

Es t a s e cció n e n s e ñ a co m o t ra t a r co n e xce p cio n e s d e n t ro d e u n a


im p le m e n t a ció n d e m é t o d o n a t ivo . Nu e s t ro s m é t o d o s n a t ivo s p u e d e n
ca p t u ra r, la n za r y b o rra r e xce p cio n e s .

Refeencias Locales y Globales

El có d ig o n a t ivo s e p u e d e re fe rir a o b je t o s Ja va u t iliza n d o re fe re n cia s


lo ca le s o g lo b a le s . La s re fe re n cia s lo ca le s s o n s ó lo vá lid a s d e n t ro d e u n a
lla m a d a a m é t o d o n a t ivo . S o n lib e ra d a s a u t o m á t ica m e n t e d e s p u é s d e
q u e re t o rn e e l m é t o d o n a t ivo . La s re fe re n cia s g lo b a le s d e b e n a s ig n a rs e y
lib e ra rs e e xp lícit a m e n t e .

Threads y Métodos Nativos

Es t a p á g in a d e s crib e la im p lica ció n d e e je cu t a r m é t o d o s n a t ivo s e n u n


e n t o rn o m u lt i- t h re a d . El JNI o fre ce co n s t ru ct o re s d e s in cro n iza ció n
b á s ico s p a ra m é t o d o s n a t ivo s .

Llamar a la Máquina Virtual Java

Es t a s e cció n e n s e ñ a có m o ca rg a r la Má q u in a Virt u a l Ja va d e s d e u n a
lib re ría n a t iva e n u n a a p lica ció n n a t iva . In clu ye in s t ru ccio n e s d e có m o
in icia liza r la Má q u in a Virt u a l Ja va e in vo ca r m é t o d o s Ja va . El API
"In vo ca t io n " t a m b ié n p e rm it e a ñ a d ir t h re a d s n a t ivo s a u n a Má q u in a
Virt u a l Ja va q u e ya e s t á e je cu t á n d o s e y co n ve rt irs e e llo s m is m o s e n
t h re a d s Ja va . Act u a lm e n t e , e l JDK s ó lo s o p o rt a la a d ició n d e t h re a d s
n a t ivo s e n Win 3 2 . El s o p o rt e p a ra t h re a d s n a t ivo s e n S o la ris e s t a rá
d is p o n ib le e n u n a fu t u ra ve rs ió n .

Programación JNI en C++

En e l le n g u a je C+ + , e l JNI p re s e n t a u n in t e rfa ce m u ch o m á s cla ro y


re a liza ch e q u e o s d e t ip o s e s t á t ico s a d icio n a le s .

Oz it o
Declarar Métodos Nativos
Es t a p á g in a ilu s t ra có m o d e cla ra r u n m é t o d o n a t ivo e n e l le n g u a je Ja va y có m o
g e n e ra r e l co rre s p o n d ie n t e p ro t o t ip o d e fu n ció n e n C/ C+ + .

El Lado Java

Nu e s t ro p rim e r e je m p lo , P ro m p t . ja v a , co n t ie n e u n m é t o d o n a t ivo q u e a ce p t a e
im p rim e u n S t rin g Ja va . El p ro g ra m a lla m a a l m é t o d o n a t ivo , q u e e s p e ra p o r u n a
e n t ra d a d e l u s u a rio y lu e g o d e vu e lve la lín e a q u e e l u s u a rio a t e ce la d o .
La cla s e Ja va P ro m p t co n t ie n e u n m é t o d o m a in q u e e s u t iliza d o p a ra lla m a r a l
p ro g ra m a . Ad e m á s , e xis t e u n m é t o d o n a t ivo g e t Lin e :

private native String getLine(String prompt);


Ob s e rva q u e la s d e cla ra cio n e s p a ra m é t o d o s n a t ivo s s o n ca s i id e n t ica s a la s
d e cla ra cio n e s d e m é t o d o s n o rm a le s d e Ja va . Exis t e n d o s d ife re n cia s . Lo s m é t o d o s
n a t ivo s d e b e n t e n e r la p a la b ra cla ve n a t iv e . Es t a p a la b ra cla ve in fo rm a a l
co m p ila d o r Ja va q u e la im p le m e n t a ció n p a ra e s t e m é t o d o s e p ro p o rcio n a e n o t ro
le n g u a je . Ta m b ié n , la d e cla ra ció n d e l m é t o d o n a t ivo t e rm in a co n u n p u n t o y co m a ,
e l s ím b o lo d e t e rm in a d o r d e s e n t e n cia , p o rq u e n o h a y im p le m e n t a cio n e s p a ra
m é t o d o s n a t ivo s e n lo s fich e ro s d e cla s e s d e l le n g u a je Ja va .

El Lado del Lenguaje Nativo

S e d e b e n d e cla ra r e im p le m e n t a r lo s m é t o d o s n a t ivo s e n u n le n g u a je n a t ivo , co m o


C o C+ + . An t e s d e h a ce r e s t o , e s ú t il g e n e ra r u n fich e ro d e ca b e ce ra q u e co n t e n g a
e l p ro t o t ip o d e la fu n ció n p a ra la im p le m e n t a ció n d e l m é t o d o n a t ivo .
Co m p ila m o s e l fich e ro P ro m p t . ja v a y lu e g o g e n e ra m o s e l fich e ro . h . Prim e ro s
co m p ila m o s e l fich e ro P ro m p t . ja v a d e e s t a fo rm a :

javac Prompt.java
Un a ve z co m p ila d o s a t is fa ct o ria m e n t e y h a b ie n d o cre a d o e l fich e ro P ro m p t . c la s s ,
p o d e m o s cre a r u n fich e ro d e ca b e ce ra a l s t ilo JNI, e s p e cifica n d o u n a o p ció n - jn i a
ja v a h :

javah -jni Prompt


Exa m in a m o s e l fich e ro Pro m p t . h . Ob s e rva e l p ro t o t ip o d e fu n ció n p a ra e l m é t o d o
n a t ivo g e t Lin e q u e d e cla ra m o s e n Pro m p t . ja va .

JNIEXPORT jstring JNICALL


Java_Prompt_getLine(JNIEnv *, jobject, jstring);
La d e fin ició n d e la fu n ció n d e l m é t o d o n a t ivo e n e l có d ig o d e im p le m e n t a ció n d e b e
co rre s p o n d e r co n e l p ro t o t ip o d e fu n ció n g e n e ra d o e n e l fich e ro d e ca b e ce ra .
S ie m p re s e d e b e in clu ir JN I EXP ORT y JN I CALL e n lo s p ro t o t ip o s d e fu n ció n p a ra
m é t o d o s n a t ivo s . JN I EXP ORT y JN I CALL s e a s e g u ra n d e q u e e l có d ig o fu e n t e s e
co m p ila rá e n p la t a fo rm a s co m o Win 3 2 q u e re q u ie re n p a la b ra s cla ve s e s p e cia le s
p a ra fu n cio n e s e xp o rt a d a s d e s d e lib re ría s d e e n la ce d in á m ico .
Lo s n o m b re s d e lo s m é t o d o s n a t ivo s s o n u n a co n ca t e n a ció n d e lo s s ig u ie n t e s
co m p o n e n t e s :
● El p re fijo Ja v a _

● El n o m b re d e la cla s e t o t a lm e n t e cu a lifica d o

● Un s u b ra ya d o "_ " s e p a ra d o r

● e l n o m b re d e l m é t o d o

( Ob s e rva q u e lo s n o m b re s d e lo s m é t o d o s n a t ivo s s o b re ca rg a d o s , a d e m á s d e lo s
co m p o n e n t e s a n t e rio re s , t ie n e n u n d o b le s u b ra ya d o "_ _ " a ñ a d id o a l n o m b re d e l
m é t o d o y s e g u id o p o r la firm a d e a rg u m e n t o s ) .
As í, la im p le m e n t a ció n e n có d ig o n a t ivo p a ra e l m é t o d o P ro m p t . g e t Lin e s e
co n vie rt e e n Ja v a _ P ro m p t _ g e t Lin e . ( No e xis t e n o m b re d e p a q u e t e , p o rq u e la
cla s e P ro m p t e s t á e n e l p a q u e t e p o r d e fe ct o ) .
Ca d a m é t o d o n a t ivo t ie n e d o s p a rá m e t ro s a d e m á s d e lo s q u e p o n g a m o s e n la
d e cla ra ció n e n le n g u a je Ja va . El p rim e r p a rá m e t ro , JN I En v * , e s e l p u n t e ro a l
in t e rfa ce JNI. Es t e p u n t e ro a in t e rfa ce e s t á o rg a n iza d o co m o u n a t a b la d e
fu n cio n e s , d o n d e ca d a fu n ció n JNI t ie n e u n p u n t o d e e n t ra d a co n o cid o e n la t a b la .
Nu e s t ro s m é t o d o s n a t ivo s lla m a n a fu n cio n e s e s p e cífica s d e l JNI p a ra a cce d e r a
o b je t o s Ja va a t ra vé s d e l p u n t e ro JN I En v * . El p a rá m e t ro jo b je c t e s u n a
re fe re n cia a l p ro p io o b je t o ( e s co m o e l p u n t e ro t h is e n C+ + ) .
Y p o r ú lt im o , o b s e rva q u e e l JNI t ie n e u n co n ju n t o d e t ip o s d e n o m b re s , co m o
jo b je c t y js t rin g , y ca d a t ip o co rre s p o n d e co n u n t ip o d e l le n g u a je Ja va . To d o s
e s t o s e cu b re e n la p á g in a s ig u ie n t e .

Oz it o
Conversión entre Tipos Java y Tipos Nativos
En e s t á p á g in a a p re n d e re m o s co m o re fe re n cia r lo s t ip o s Ja va e n n u e s t ro m é t o d o
n a t ivo . S e n e ce s it a rá re fe re n cia r a lo s t ip o s Ja va cu a n d o q u e ra m o s :
● Acce d e r a lo s a rg u m e n t o s p a s a d o s a u n m é t o d o n a t ivo d e s d e u n a a p lica ció n
Ja va .
● Cre a r n u e vo s o b je t o s Ja va e n n u e s t ro m é t o d o n a t ivo .

● Ha ce r q u e n u e s t ro m é t o d o n a t ivo d e vu e lva re s u lt a d o s a s u lla m a d o r.

Tipos Primitivos de Java

Nu e s t ro s m é t o d o n a t ivo p u e d e a cce d e r d ire ct a m e n t e a lo s t ip o s p rim it iv o s d e


Ja va , co m o b o o le a n s , in t e g e rs , flo a t s , e t c. , q u e s e a n p a s a d o s d e s d e p ro g ra m a s
e s crit o s e n le n g u a je Ja va . Po r e je m p lo , e l t ip o b o o le a n d e Ja va s e co n vie rt e e n e l
t ip o jb o o le a n e n e l le n g u a je n a t ivo ( re p re s e n t a d o co m o 8 b it s s in s ig n o ) , m ie n t ra s
q u e e l t ip o flo a t d e Ja va s e co n vie rt e e n e l t ip o jflo a t e n e l le n g u a je n a t ivo
( re p re s e n t a d o p o r 3 2 b it s ) . La s ig u ie n t e t a b la d e s crib e la s co n ve rs io n e s e n t re lo s
t ip o s p rim it ivo s d e Ja va y lo s t ip o s n a t ivo s .
Tipos Primitivos y Nativos Equivalentes

Tip o Ja va Tip o Na t ivo Ta m a ñ o e n b it s


b o o le a n jb o o le a n 8 , u n s ig n e d
b yt e jb yt e 8
ch a r jch a r 1 6 , u n s ig n e d
s h o rt js h o rt 16
in t jin t 32
lo n g jlo n g 64
flo a t jflo a t 32
d o u b le jd o u b le 64
vo id vo id n/ a

Tipos de Objetos Java

Lo s Ob je t o s Ja va s e p a s a n p o r re fe re n cia . To d a s la s re fe re n cia s a o b je t o s Ja va
t ie n e n e l t ip o jo b je c t . Po r co n ve n ie n cia y p a ra re d u cir lo s e rro re s d e
p ro g ra m a ció n , e l JNI im p le m e n t a u n co n ju n t o d e t ip o s q u e co n ce p t u a lm e n t e s o n
t o d o s "S u b t ip o s " d e jo b je c t , d e la s ig u ie n t e fo rm a :
● jo b je c t re p re s e n t a t o d o s lo s o b je t o s Ja va .

❍ jc la s s re p re s e n t a o b je t o s d e l t ip o ( ja va . la n g . Cla s s ) .

❍ js t rin g re p re s e n t a S t rin g s Ja va ( ja va . la n g . S t rin g ) .

❍ ja rra y re p re s e n t a a rra ys Ja va .
■ jo b je c t Arra y re p re s e n t a a rra ys d e o b je t o s .
■ jb o o le a n Arra y re p re s e n t a a rra ys b o o le a n o s .

■ jb y t e Arra y re p re s e n t a a rra ys d e b yt e s .

■ jc h a rArra y re p re s e n t a a rra ys d e ch a r.

■ js h o rt Arra y re p re s e n t a a rra ys d e s h o rt .

■ jin t Arra y re p re s e n t a a rra ys d e in t .

■ jlo n g Arra y re p re s e n t a a rra ys d e lo n g .

■ jflo a t Arra y re p re s e n t a a rra ys d e flo a t .

■ jd o u b le Arra y re p re s e n t a a rra ys d e d o u b le .

❍ jt h ro w a b le re p re s e n t a e xce p cio n e s Ja va ( ja va . la n g . Th ro wa b le ) .
En n u e s t ro e je m p lo P ro m p t . ja v a , e l m é t o d o n a t ivo g e t Lin e :

private native String getLine(String prompt);


t o m a u n S t rin g Ja va co m o a rg u m e n t o y d e vu e lve u n S t rin g Ja va . S u
im p le m e n t a ció n n a t iva co rre s p o n d ie n t e t ie n e e l t ip o js t rin g t a n t o p a ra e l
a rg u m e n t o co m o p a ra e l va lo r d e re t o rn o :

JNIEXPORT jstring JNICALL


Java_Prompt_getLine(JNIEnv *, jobject, jstring);
Co m o s e m e n cio n ó a n t e rio rm e n t e , js t rin g co rre s p o n d e a l t ip o S t rin g d e Ja va .
Ob s e rva q u e e l s e g u n d o a rg u m e n t o d e Ja v a _ P ro m p t _ g e t Lin e , q u e e s u n a
re fe re n cia a l p ro p io o b je t o , t ie n e e l t ip o jo b je c t .

Oz it o
Strings Java
Cu a n d o u n a a p lica ció n Ja va p a s a u n s t rin g a u n p ro g ra m a e n le n g u a je n a t ivo , le
p a s a e l s t rin g co m o d e l t ip o js t rin g . Es t e t ip o e s m u y d ife re n t e d e l t ip o s t rin g
n o rm a l d e l C ( Ch a r * ) . S i n u e s t ro có d ig o in t e n t a im p rim ir d ire ct a m e n t e u n js t rin g ,
re s u lt a rá e n u n a ca id a d e la VM ( Má q u in a Virt u a l) . Po r e je m p lo , e l s ig u ie n t e
s e g m e n t o d e có d ig o in t e n t a im p rim ir in co rre ct a m e n t e u n js t rin g y p o d ría re s u lt a r
e n u n a ca íd a d e la m á q u in a virt u a l:

/* DO NOT USE jstring THIS WAY !!! */


JNIEXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
{
printf("%s", prompt);
Nu e s t ro m é t o d o n a t ivo d e b e u t iliza r la s fu n cio n e s JNI p a ra co n ve rt ir lo s s t rin g s
Ja va e n s t rin g s n a t ivo s . El JNI s o p o rt a la co n ve rs ió n d e s d e y h a cia s t rin g s n a t ivo s
Un ico d e y UTF- 8 . En p a rt icu la r, lo s s t rin g s UFT- 8 u t iliza n e l b it m á s a lt o p a ra
s e ñ a la r ca ra ct e re s m u lt i- b yt e s ; p o r lo t a n t o s o n co m p a t ib le s co n e l AS CII d e 7 - b it s .
En Ja va , lo s s t rin g s UTF- 8 s ie m p re t e rm in a n e n 0 .

Acceder a Strings Java

Nu e s t ro m é t o d o n a t ivo n e ce s it a lla m a r a Ge t S t rin g UTFCh a rs p a ra im p rim ir


co rre ct a m e n t e e l s t rin g p a s a d o d e s d e la a p lica ció n Ja va . Ge t S t rin g UTFCh a rs
co n vie rt e la re p re s e n t a ció n in t e rn a Un ico d e d e u n S t rin g Ja va e n u n s t rin g UTF- 8 .
Un a ve z s e g u ro s d e q u e e l s t rin g s ó lo co n t ie n e ca ra ct e re s AS CII d e 7 - b it s , s e
p u e d e p a s a r d ire ct a m e n t e a la s fu n cio n e s n o rm a le s d e l C, co m o p rin t f, co m o s e
vió e n P ro m p t . c .

JNIEXPORT jstring JNICALL


Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
{
char buf[128];
const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, prompt, str);
Ob s e rva q u e cu a n t o n u e s t ro m é t o d o n a t ivo h a ya t e rm in a d o d e u t iliza r e l s t rin g
UFT- 8 , d e b e lla m a r a Re le a s e S t rin g UTFCh a rs . Re le a s e S t rin g UTFCh a rs in fo rm a
a la VM q u e e l m é t o d o n a t ivo h a t e rm in a d o co n e l s t rin g , p a ra q u e p u e d a lib e ra r la
m e m o ria u t iliza d a p o r e l s t rin g . S i n o lla m a m o s a Re le a s e S t rin g UTFCh a rs s e n o s
lle n a rá la m e m o ria .
El m é t o d o n a t ivo t a m b ié n p u e d e co n s t ru ir u n n u e vo s t rin g u t iliza n d o la fu n ció n
N e w S t rin g UTF d e l JNI. La s s ig u ie n t e s lín e a s d e có d ig o d e
Ja v a _ P ro m p t _ g e t Lin e m u e s t ra n e s t o :

scanf("%s", buf);
return (*env)->NewStringUTF(env, buf);
}

Utilizar el Puntero a Interface JNIEnv

Lo s m é t o d o s n a t ivo s d e b e n a cce d e r y m a n ip u la r lo s o b je t o s Ja va , co m o lo s s t rin g s ,


a t ra vé s d e l p u n t e ro a in t e rfa ce e n v . En le n g u a je C, e s t o re q u ie re u t iliza r e l
p u n t e ro e n v p a ra re fe re n cia r la fu n ció n JNI. Ob s e rva có m o e l m é t o d o n a t ivo u t iliza
e l p u n t e ro e n v p a ra re fe re n cia r la s d o s fu n cio n e s , Ge t S t rin g UTFCh a rs y
Re le a s e S t rin g UTFCh a rs . Ad e m á s , e n v s e p a s a co m o p rim e r p á ra m e t ro a e s a s
fu n cio n e s .

Otras Funciones JNI para Acceder a Strings Java

El JNI t a m b ié n p ro p o rcio n a r fu n cio n e s p a ra o b t e n e r la re p re s e n t a ció n Un ico d e d e


s t rin g s Ja va . Es t o e s m u y ú t il, p o r e je m p lo , e n a q u e llo s s is t e m a s o p e ra t ivo s q u e
s o p o rt a n Un ico d e co m o fo rm a t o n a t ivo . Ta m b ié n h a y fu n cio n e s ú t ile s p a ra o b t e n e r
la lo n g it u d d e u n S t rin g Ja va t a n t o e n UTF- 8 co m o e n Un ico d e .
● Ge t S t rin g Ch a rs t o m a e l s t rin g Ja va y d e vu e lve u n p u n t e ro a u n a rra y d e
ca ra ct e re s Un ico d e q u e co n t ie n e e l s t rin g .
● Re le a s e S t rin g Ch a rs lib e ra e l p u n t e ro a l a rra y d e ca ra ct e re s Un ico d e .

● N e w S t rin g co n s t ru ye u n n u e vo o b je t o ja v a . la n g . S t rin g d e s d e u n a rra y d e


ca ra ct e re s Un ico d e .
● Ge t S t rin g Le n g t h d e vu e lve la ln g it u d d e u n s t rin g q u e e s t á co n t e n id o e n u n
a rra y d e ca ra ct e re s Un ico d e .
● Ge t S t rin g UTFLe n g t h d e vu e lve la lo n g it u d d e u n s t rin g s s i e s t á re p re s e n t a d o
e n e l fo rm a t o UTF- 8 .

Oz it o
Acceder a Arrays Java
El JNI u t iliza e l t ip o ja rra y p a ra re p re s e n t a r re fe re n cia s a a rra ys ja va . Al ig u a l q u e
co n js t rin g , n o s e p u e d e a cce d e r d ire ct a m e n t e a lo s t ip o s ja rra y d e s d e e l có d ig o
n a t ivo , s e d e b e n u t iliza r la s fu n cio n e s p ro p o rcio n a d a s p o r e l JNI q u e p e rm it e n
o b t e n e r p u n t e ro s a lo s e le m e n t o s d e a rra ys d e e n t e ro s .
Nu e s t ro s e g u n d o e je m p lo , I n t Arra y . ja v a , co n t ie n e u n m é t o d o n a t ivo q u e s u m a e l
t o t a l d e u n a rra y d e e n t e ro s p a s a d o p o r la a p lica ció n Ja va . No s e p u e d e
im p le m e n t a r e l m é t o d o n a t ivo d ire ccio n a n d o d ire ct a m e n t e lo s e le m e n t o s d e l a rra y.
El s ig u ie n t e có d ig o in t e n t a in co rre ct a m e n t e a cce d e r d ire ct a m e n t e a lo s e le m e n t o s
d e l a rra y:

/* This program is illegal! */


JNIEXPORT jint JNICALL
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
int i, sum = 0;
for (i=0; i<10; i++)
sum += arr[i];
La fo rm a co rre ct a d e im p le m e n t a r la fu n ció n a n t e rio r, s e p u e d e ve r e n e l m é t o d o
n a t ivo In t Arra y. c. En e s t e e je m p lo , s e u t iliza u n a fu n ció n JNI p a ra o b t e n e r la
lo n g it u d d e l a rra y. Lu e g o s e p u e d e n re cu p e ra r lo s e le m e n t o s . Y fin a lm e n t e s e
u t iliza u n a t e rce ra fu n ció n d e l JNI p a ra lib e ra r la m e m o ria d e l a rra y.

Acceder a un Array de Elementos Primitivos

Prim e ro s e o b t ie n e la lo n g it u d d e l a rra y lla m a n d o a la fu n ció n Ge t Arra y Le n g t h d e l


JNI. Ob s e rva q u e a l co n t ra rio q u e e n lo s a rra y d e l C, lo s a rra y Ja va a lm a ce n a n
in fo rm a ció n s o b re la lo n g it u d .

JNIEXPORT jint JNICALL


Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
int i, sum = 0;
jsize len = (*env)->GetArrayLength(env, arr);
Lu e g o s e o b t ie n e u n p u n t e ro a lo s e le m e n t o s d e l a rra y. Nu e s t ro e je m p lo co n t ie n e
u n a rra y d e e n t e ro s , p o r e s o u t iliza m o s la fu n ció n d e l JNI Ge t I n t Arra y Ele m e n t s
p a ra o b t e n e r e s t e p u n t e ro . ( El JNI p ro p o rcio n a u n ju e g o d e fu n cio n e s p a ra o b t e n e r
p u n t e ro s a e le m e n t o s d e l a rra y; s e u t iliza la fu n ció n q u e co rre s p o n d e co n e l t ip o
p rim it ivo d e l a rra y) . Un a ve z o b t e n id o e l p u n t e ro , s e p u e d e n u t iliza r la s o p e ra co n e s
n o rm a le s d e l C s o b re e l a rra y d e e n t e ro s re s u lt a n t e .

jint *body = (*env)->GetIntArrayElements(env, arr, 0);


for (i=0; i<len; i++)
sum += body[i];
En g e n e ra l, e l re co le ct o r d e b a s u ra p o d ría e lim in a r lo s a rra ys Ja va . S in e m b a rg o , la
m á q u in a virt u a l g a ra n t iza q u e e l re s u lt a d o d e Ge t I n t Arra y Ele m e n t s a p u n t a a u n
a rra y d e e n t e ro s in a m o vib le . El JNI o b ie n b a ja e l "p in " d e l a rra y "m a rcá n d o lo " o
h a ce u n a co p ia d e l a rra y e n u n a m e m o ria in a m o vib le . A ca u s a d e e s t o , e l có d ig o
n a t ivo d e b e lla m a r a Re le a s e I n t Arra y Ele m e n t s cu a n d o h a t e rm in a d o d e u t iliza r
e l a rra y d e e s t a fo rm a :

(*env)->ReleaseIntArrayElements(env, arr, body, 0);


return sum;
}
Re le a s e I n t Arra y Ele m e n t s p e rm it e a l JNI co p ia r d e vu e lt a y lib e ra r la m e m o ria
re fe re n cia d a p o r e l p a rá m e t ro b o d y s i e s u n a co p ia d e l a rra y o rig in a l Ja va ,
"d e s m a rca " e l a rra y ja va q u e fu e m a rca d o e n la m e m o ria . No o lvid e s lla m a r a
Re le a s e I n t Arra y Ele m e n t s . S i s e o lvid a h a ce r e s t a lla m a d a e l a rra y p e rm a n e ce
m a rca d o p o r u n la rg o p e rio d o d e Tie m p o . Y la m á q u in a virt u a l n o p o d rá re cla m a r la
m e m o ria u t iliza d a p a ra a lm a ce n a r la co p ia in a m o vib le d e l a rra y.
El JNI p ro p o rcio n a u n co n ju n t o d e fu n cio n e s p a ra a cce d e r a lo s e le m e n t o s d e
a rra ys d e lo s d is t in t o s t ip o s p rim t ivo s :
● Ge t Bo o le a n Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e
b o o le a n
● Ge t By t e Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e b yt e s

● Ge t Ch a rArra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e ch a r

● Ge t S h o rt Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e s h o rt

● Ge t I n t Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e in t

● Ge t Lo n g Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e lo n g

● Ge t Flo a t Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e flo a t

● Ge t D o u b le Arra y Ele m e n t s a cce d e a lo s e le m e n t o s d e u n a rra y Ja va d e


d o u b le

Acceder a un Número Pequeño de Elementos

Ob s e rva q u e la fu n ció n Ge t < t y p e > Arra y Ele m e n t s p o t e n cia lm e n t e p o d ría co p ia r


e l a rra y e n t e ro . Po d ría m o s q u e re r co p ia r u n n ú m e ro lim it a d o d e e le m e n t o s ,
e s p e cia lm e n t e s i e l a rra y e s g ra n d e . S i s ó lo e s t a m o s in t e re s a d o s e n u n n ú m e ro
p e q u e ñ o d e e le m e n t o s ( e n u n a rra y p o t e n cia lm e n t e g ra n d e ) , d e b e ría m o s u t iliza r
la s fu n cio n e s Ge t / S e t < t y p e > Arra y Re g io n . Es t a s fu n cio n e s p e rm it e n a cce d e r,
m e d ia n t e co p ia , a u n co n ju n t o p e q u e ñ o d e e le m e n t o s d e u n a rra y.

Acceder a Arrays de Objetos

El JNI p ro p o rcio n a u n co n ju n t o s e p a ra d o d e fu n cio n e s p a ra a cce d e r a e le m e n t o s d e


a rra ys d e o b je t o s . S e p u e d e n u t iliza r e s t a s fu n cio n e s p a ra o b t e n e r y s e le ccio n a r
o b je t o s in d ivid u a le s d e l a rra y. Ob s e rva q u e n o s e p u e d e o b t e n e r e l a rra y d e
o b je t o s co m p le t o d e u n a s o la ve z.
● Ge t Ob je c t Arra y Ele m e n t d e vu e lve e l o b je t o d e l e le m e n t o e n u n ín d ice d a d o .

● S e t Ob je c t Arra y Ele m e n t a ct u a liza e l o b je t o d e l e le m e n t o e n u n ín d ice d a d o .

Oz it o
Llamar a Métodos Java
Es t a p á g in a ilu s t ra có m o lla m a r a m é t o d o s Ja va d e s d e m é t o d o s n a t ivo s . Nu e s t ro
p ro g ra m a d e e je m p lo , Ca llb a c k s . ja v a , lla m a a u n m é t o d o n a t ivo . El m é t o d o n a t ivo
h a ce u n a n u e va lla m a d a a l m é t o d o Ja va . Pa ra h a ce r la s co s a s u n p o co m á s
in t e re s a n t e s , e l m é t o d o Ja va lla m a d e n u e vo ( re cu rs iva m e n t e ) a l m é t o d o n a t ivo . Es t e
p ro ce s o co n t in ú a h a s t a q u e la re cu rs ió n a lca n za cin co n ive le s d e p ro fu n d id a d , e n e s e
m o m e n t o e l m é t o d o Ja va re t o rn a s in h a ce r m á s lla m a d a s a l m é t o d o n a t ivo . Pa ra
a yu d a rn o s a ve r e s t o , lo s d o s m é t o d o s im p rim e n u n a s e cu e n cia d e t ra za d o .

Llamar a un Método Java desde un Método Nativo

Pa ra ve r co m o e l có d ig o n a t ivo lla m a a l m é t o d o Ja va , e n fo q u é m o n o s e n la
im p le m e n t a ció n d e Ca llb a c k s _ n a t iv e Me t h o d , q u e e s t á im p le m e n t a d a e n
Ca llb a c k s . c . Es t e m é t o d o n a t ivo co n t ie n e u n a lla m a d a a l m é t o d o ja va
Ca llb a c k s . c a llb a c k .

JNIEXPORT void JNICALL


Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
if (mid == 0)
return;
printf("In C, depth = %d, about to enter Java\n", depth);
(*env)->CallVoidMethod(env, obj, mid, depth);
printf("In C, depth = %d, back from Java\n", depth);
}
S e p u e d e lla m a r a u n m é t o d o d e e je m p la r ( n o e s t á t ico ) s ig u ie n d o e s t o s t re s p a s o s :
● El m é t o d o n a t ivo lla m a a la fu n ció n JNI Ge t Ob je c t Cla s s . Ge t Ob je c t Cla s s
d e vu e lve e l o b je t o cla s s Ja va a l q u e p e rt e n e ce e l o b je t o .
● En t o n ce s e l m é t o d o n a t ivo lla m a a la fu n ció n JNI Ge t Me t h o d I D . Ge t Me t h o d I D
re a liza u n b ú s q u e d a d e l m é t o d o Ja va d e n t ro d e la cla s e d a d a . La b ú s q u e d a e s t á
b a s a d a t a n t o e n e l n o m b re d e l m é t o d o co m o e n s u firm a . S i e l m é t o d o n o e xis t e ,
Ge t Me t h o d I D d e vu e lve ce ro ( 0 ) . Un re t o rn o in m e d ia t o d e s d e e l m é t o d o n a t ivo
e n e s e p u n t o ca u s a e l la n za m ie n t o d e u n a e xce p ció n N o S u c h Me t h o d Erro r e n e l
có d ig o Ja va .
● Fin a lm e n t e , e l m é t o d o n a t ivo lla m a a la fu n ció n JNI Ca llVo id Me t h o d .
Ca llVo id Me t h o d lla m a a u n m é t o d o d e e je m p la r q u e t ie n e e l t ip o d e re t o rn o
co m o v o id . S e p a s a n e l o b je t o , e l ID d e l m é t o d o y lo s a rg u m e n t o s re a le s a
Ca llVo id Me t h o d .

Formar el Nombre del Método y su Firma

El JNI re a liza u n b ú s q u e d a s im b ó lica b a s á n d o s e e n e l n o m b re y la firm a d e l m é t o d o .


Es t o a s e g u ra q u e e l m is m o m é t o d o n a t ivo s e g u irá fu n cio n a n d o d e s p u é s d e h a b e r
a ñ a d id o n u e vo s m é t o d o s a la cla s e Ja va co rre s p o n d ie n t e .
El n o m b re d e l m é t o d o e s e l n o m b re d e l m é t o d o e n fo rm a t o UTF- 8 . Es p e cifica e l n o m b re
d e l m é t o d o p a ra u n co n s t ru ct o r d e u n a cla s e e n ce rra n d o la p a la b ra in it e n t re "< y > ".
Ob s e rva q u e e l JNI u t iliza la firm a d e l m é t o d o p a ra d e n o t a r e l t ip o d e re t o rn o d e l
m é t o d o Ja va . Es t a firm a ( I ) V, p o r e je m p lo , d e n o t a u n m é t o d o Ja va q u e t o m a u n
a rg u m e n t o d e l t ip o in t y t ie n e u n t ip o d e re t o rn o v o id . La fo rm a g e n e ra l p a ra u n a
firm a d e m é t o d o e s :

"(tipos-argumentos)tipo-retorno"
La s ig u ie n t e t a b la s u m a riza la co d ifica ció n Ja va p a ra la s firm a s :
Tipos de Firmas de la VM de Java

Firm a Tip o Ja va
Z b o o le a n
B b yt e
C ch a r
S s h o rt
I in t
J lo n g
F flo a t
D d o u b le
L cla s e s - t o t a lm e n t e - cu a lifica d a ; cla s e - t o t a lm e n t e - cu a lifica d a
[ t ip o t ip o [ ]
( t ip o - a rg u m e n t o ) t ip o - re t o rn o t ip o d e m é t o d o

Po r e je m p lo , e l m é t o d o P ro m p t . g e t Lin e t ie n e la firm a :

(Ljava/lang/String;)Ljava/lang/String;
P ro m p t . g e t Lin e t ie n e u n p a rá m e t ro , u n o b je t o S t rin g , y e l t ip o d e l m é t o d o t a m b ié n
e s S t rin g .
El m é t o d o Ca llb a c k s . m a in t ie n e la firm a :

([Ljava/lang/String;)V
La firm a in d ica q u e e l m é t o d o Ca llb a c k s . m a in t o m a u n p a rá m e t ro , u n o b je t o S t rin g ,
y e l t ip o d e l m é t o d o e s v o id .
Lo s t ip o s d e a rra ys s o n in d ica d o s co n co rch e t e a b ie rt o ( [ ) s e g u id o p o r e l t ip o d e lo s
e le m e n t o s d e l a rra y.

Utilizar javap para Generar Firmas de Métodos

Pa ra e vit a r lo s e rro re s d e riva d o s d e la firm a d e m é t o d o s m a n u a l, s e p u e d e u t iliza r la


h e rra m ie n t a ja v a p p a ra im p rim ir la s firm a s d e m é t o d o s . Po r e je m p lo , e je cu t a n d o :

javap -s -p Prompt
S e p u e d e o b t e n e r la s ig u ie n t e s a lid a :

Compiled from Prompt.java


class Prompt extends java.lang.Object
/* ACC_SUPER bit set */
{
private native getLine (Ljava/lang/String;)Ljava/lang/String;
public static main ([Ljava/lang/String;)V
<init> ()V
static <clinit> ()V
}
La b a n d e ra "- s " in fo rm a a ja v a p p a ra q u e s a q u e la s firm a s e n ve z d e lo s t ip o s Ja va . La
b a n d e ra "- p " in s t ru ye a ja v a p p a ra q u e in clu ya lo s m ie m b ro s p riva d o s .

Llamar a Métodos Java utilizando los IDs

Cu a n d o s e lla m a a u n m é t o d o e n e l JNI, s e le p a s a u n ID d e l m é t o d o a la fu n ció n re a l


d e lla m a d a . Ob t e n e r u n ID d e u n m é t o d o e s u n a o p e ra ció n q u e co n s u m e m u ch o s
re cu rs o s . Co m o s e o b t ie n e e l ID d e l m é t o d o d e fo rm a s e p a ra d a d e la lla m a d a a l
m é t o d o , s ó lo s e n e ce s it a re a liza r e s t a o p e ra ció n u n a ve z. As í, e s p o s ib le , o b t e n e r
p rim e ro e l ID d e l m é t o d o y lu e g o u t iliza rlo la s ve ce s n e ce s a ria s p a ra in vo ca r a l m is m o
m é todo.
Es im p o rt a n t e t e n e r e n m e n t e q u e u n ID d e m é t o d o s ó lo e s v á lid o m ie n t ra s q u e n o s e
d e s ca rg u e la cla s e d e la s e d e riv a . Un a ve z q u e la cla s e s e h a d e s ca rg a d o , e l ID d e l
m é t o d o n o e s vá lid o . Co m o re s u lt a d o , s i s e q u ie re g u a rd a r e l ID d e l m é t o d o , d e b e m o s
a s e g u ra rn o s d e m a n t e n e r viva a u n a re fe re n cia a la cla s e Ja va d e la q u e s e d e riva e l ID
d e l m é t o d o . Mie n t ra s e xis t a la re fe re n cia a la cla s e Ja va ( e l va lo r jc la s s ) , e l có d ig o
n a t ivo m a n t e n d rá u n a re fe re n cia viva a la cla s e . La p á g in a Re fe re n cia s Lo ca le s y
Glo b a le s e xp lica co m o m a n t e n e r viva u n a re fe re n cia in clu s o d e s p u é s d e q u e e l m é t o d o
n a t ivo re t o rn e y e l va lo r d e jc la s s s a lg a fu e ra d e á m b it o .

Pasar Argumentos al Método Java

El JNI p ro p o rcio n a va ria s fo rm a s d e p a s a r a rg u m e n t o s a l m é t o d o Ja va . La m á s


fre cu e n t e , s e p a s a n lo s a rg u m e n t o s s ig u ie n d o a l ID d e l m é t o d o . Ta m b ié n h a y d o s
va ria cio n e s d e lla m a d a s a m é t o d o s q u e t o m a n a rg u m e n t o s e n u n fo rm a t o a lt e rn a t ivo .
Po r e je m p lo , la fu n ció n Ca llVo id Me t h o d V re cib e lo s a rg u m e n t o s e n u n v a _ lis t y la
fu n ció n Ca llVo id Me t h o d A e s p e ra lo s a rg u m e n t o s e n u n a rra y d e u n io n e s jv a lu e . Lo s
t ip o s d e l a rra y d e u n io n e s jv a lu e s o n lo s s ig u ie n t e s :

typedef union jvalue {


jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
Ad e m á s d e la fu n ció n Ca llVo id Me t h o d , e l JNI t a m b ié n s o p o rt a fu n cio n e s d e lla m a d a a
m é t o d o s co n t ip o s d e re t o rn o , co m o Ca llBo o le a n Me t h o d , Ca llI n t Me t h o d , e t c. El t ip o
d e re t o rn o d e la fu n ció n d e lla m a d a a m é t o d o d e b e co rre s p o n d e r co n e l t ip o d e l m é t o d o
Ja va q u e s e d e s e a in vo ca r.

Llamar a Métodos Estáticos

S e p u e d e lla m a r a m é t o d o s e s t á t ico s Ja va d e fo rm a s im ila r a co m o s e lla m a a m é t o d o s


d e e je m p la r. S e d e b e n s e g u ir e s t o s p a s o s :
● Ob t e n e r e l ID d e l m é t o d o u t iliza n d o la fu n ció n JNI Ge t S t a t ic Me t h o d I D e n ve z la
fu n ció n Ge t Me t h o d I D .
● Pa s a r la cla s e , e l ID d e l m é t o d o y lo s a rg u m e n t o s a la fa m ilia d e fu n cio n e s d e
lla m a d a s a m é t o d o s e s t á t ico s : Ca llS t a t ic Vo id Me t h o d ,
Ca llS t a t ic Bo o le a n Me t h o d , e t c.
S i s e co m p a ra n la s fu n cio n e s d e lla m a d a p a ra m é t o d o s d e e je m p la r y e s t á t ico s ,
ve re m o s q u e la s fu n cio n e s d e lla m a d a a m é t o d o s d e e je m p la r re cib e n e l o b je ct , e n ve z
d e la cla s e , co m o e l s e g u n d o a rg u m e n t o , s e g u id o p o r e l a rg u e m n t o JN I En v . Po r
e je m p lo , s u p o n g a m o s , q u e h e m o s a ñ a d id o u n m é t o d o e s t á t ico :

static int incDepth(int depth) {return depth + 1};


d e n t ro d e Ca llb a c k . ja v a . Po d re m o s lla m a r a e s t e m é t o d o e s t á t ico in c D e p t h d e s d e
Ja v a _ Ca llb a c k _ n a t iv e Me t h o d u t iliza n d o la s s ig u ie n t e s fu n cio n e s JNI:

JNIEXPORT void JNICALL


Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "incDepth", "(I)I");
if (mid == 0)
return;
depth = (*env)->CallStaticIntMethod(env, cls, mid, depth);

Llamar a Métodos de Ejemplar de una Superclase

S e p u e d e lla m a r a m é t o d o s d e fin id o s e n u n a s u p e rcla s e q u e s e h a n s o b re e s crit o e n la


cla s e a la q u e p e rt e n e ce e l o b je t o . El JNI p ro p o rcio n a u n co n ju n t o d e fu n cio n e s
Ca llN o n v irt u a l< t y p e > Me t h o d p a ra e s t e p ro p ó s it o . Pa ra lla m a r a u n m é t o d o d e
e je m p la r d e u n a s u p e rlcla s e , s e d e b e h a ce r lo s ig u ie n t e :
● Ob t e n e r e l ID d e l m é t o d o d e la s u p e rcla s e u t iliza n d o Ge t Me t h o d I D e n ve z d e
Ge t S t a t ic Me t h o d I D .
● Pa s a r e l o b je t o , la s u p e rcla s e , e l ID d e l m é t o d o , y lo s a rg u e m n t o s a la fa m ilia d e
fu n cio n e s d e lla m a d a s n o vit u a le s : Ca llN o n v irt u a lVo id Me t h o d ,
Ca llN o n v irt u a lBo o le a n Me t h o d , e t c.
S e rá ra ro q u e n e ce s it e m o s in vo ca r a m é t o d o s d e e je m p la r d e u n a s u p e rcla s e . Es t a
fa cilid a d e s s im ila r a lla m a r a l m é t o d o d e u n a cla s e , d ig a m o s f, u t iliza n d o :

super.f();
e n e l le n g u a je Ja va .

Oz it o
Acceder a Campos Java
El JNI p ro p o rcio n a fu n cio n e s q u e lo s m é t o d o s n a t ivo s u t iliza n p a ra o b t e n e r y
s e le ccio n a r ca m p o s Ja va . S e p u e d e n o b t e n e r y s e le ccio n a r t a n t o ca m p o s d e
e je m p la r co m o ca m p o s d e cla s e ( e s t á t ico s ) . S im ila rm e n t e a l a cce s o a lo s m é t o d o s ,
s e u t iliza u n co n ju n t o d e fu n cio n e s JNI p a ra a cce d e r a ca m p o s d e e je m p la r y o t ro
co n ju n t o p a ra a cce d e r a ca m p o s e s t á t ico s .
Nu e s t ro p ro g ra m a d e e je m p lo , Fie ld Ac c e s s . ja v a , co n t ie n e u n a cla s e co n u n
ca m p o In t e g e r e s t á t ico s i y u n ca m p o S t rin g d e e je m p la r s . El p ro g ra m a d e
e je m p lo lla m a a l m é t o d o n a t ivo a c c e s s Fie ld s , q u e im p rim e lo s va lo re s d e e s o s
d o s ca m p o s y m o d ifica e s o s va lo re s . Pa ra ve rifica r q u e s e h a n m o d ifica d o
re a lm e n t e lo s va lo re s d e lo s ca m p o s , im p rim im o s d e n u e vo s u s va lo re s d e s d e la
a p lica ció n Ja va d e s p u é s d e q u e h a ya re t o rn a d o e l m é t o d o n a t ivo .

Procedimiento para Acceder a Campos Java

Pa ra o b t e n e r y s e le ccio n a r ca m p o s Ja va d e s d e u n m é t o d o n a t ivo , s e d e b e h a ce r lo
s ig u ie n t e :
● Ob t e n e r e l id e n d ifica d o r p a ra e s e ca m p o d e n t ro d e s u cla s e , e l n o m b re y e l
t ip o d e firm a , Po r e je m p lo , e n Fie ld Ac c e s s . c , o b t e n e m o s e l id e n t ifica d o r p a ra
e l ca m p o e s t á t ico e n t e ro s i d e e s t a fo rm a :

fid = (*env)->GetStaticFieldID(env, cls, "si", "I");


y o b t e n e m o s e l id e n t ifica d o r p a ra e l ca m p o s t rin g d e e je m p la r s , d e e s t a
fo rm a :

fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");


● Ut iliza r u n a d e la s va ria s fu n cio n e s JNI p a ra o b t e n e r o m o d ifica r e l ca m p o
e s p e cifica d o p o r e l id e n t ifica d o r d e l ca m p o . Pa ra o b t e n e r e l va lo r d e l ca m p o ,
s e p a s a la cla s e a u n a d e la s fu n cio n e s d e a cce s o a ca m p o s a p ro p ia d a . Po r
e je m p lo , e n Fie ld Ac c e s s . c , u t iliza m o s Ge t S t a t ic I n t Fie ld p a ra o b t e n e r e l
va lo r d e l ca m p o e s t á t ico In t e n g e r s i, d e e s t a fo rm a :

si = (*env)->GetStaticIntField(env, cls, fid);


Ut iliza m o s la fu n ció n Ge t Ob je c t Fie ld p a ra o b t e n e r e l va lo r d e l ca m p o d e
e je m p la r S t rin g s :

jstr = (*env)->GetObjectField(env, obj, fid);


Ig u a l q u e h icim o s cu a n d o lla m a m o s a u n m é t o d o Ja va , d ivid im o s e l co s t o d e la
b ú s q u e d a d e l ca m p o u t iliza n d o u n p ro ce s o d e d o s p a s o s . Prim e ro o b t e n e m o s e l ID
d e l ca m p o , lu e g o u t iliza m o s e l ID d e l ca m p o p a ra a cce d e r a l p ro p io ca m p o . El ID
d e ca m p o s ó lo id e n t ifica a u n ca m p o e n u n a cla s e d a d a . Ig u a lm e n t e q u e lo s IDs d e
m é t o d o , u n ID d e ca m p o p e rm a n e ce vá lid o h a s t a q u e la cla s e d e la q u e s e h a
d e riva d o e s d e s ca rg a d a .

Firmas de Campos

La s firm a s d e ca m p o s e e s p e cifica n s ig u ie n d o e l m is m o e s q u e m a d e co d ifica ció n


q u e la s firm a s d e m é t o d o s . La fo rm a g e n e ra l d e u n a firm a d e ca m p o e s :

"tipo_de_campo"
La firm a d e l ca m p o e s u n s ím b o lo co d ifica d o p a ra e l t ip o d e l ca m p o , e n ce rra d o
e n t re co m illa s ( "") . Lo s s ím b o lo s d e ca m p o s s o n lo s m is m o s q u e lo s s ím b o lo s d e lo s
a rg u m e n t o s e n la firm a d e m é t o d o s . Es t o e s , u n ca m p o In t e g e r s e re p re s e n t a co n
"I", u n ca m p o flo a t s e re p re s e n t a co n "F", u n ca m p o d o u b le "D" y u n ca m p o
b o o le a n o co n "Z", e t c.
La firm a p a ra u n o b je t o Ja va , co m o u n S t rin g , e m p ie za co n la le t ra L, s e g u id a p o r
la cla s e t o t a lm e n t e cu a lifica d a d e l o b je t o , y t e rm in a d a co n u n p u n t o y co m a ( ; ) .
As í, s e fo rm a ría la firm a u n ca m p o S t rin g , co m o c . s e n Fie ld Acce s s . ja va , d e e s t a
fo rm a :

"Ljava/lang/String;"
Lo s a rra ys s e in d ica n co n u n co rch e t e a b ie rt o ( [ ) s e g u id o p o r e l t ip o d e l a rra y. Po r
e je m p lo , s e d e s ig n a ría u n a rra y d e In t e g e r d e e s t a fo rm a :

"[I"
Pu e d e s re fe rirt e a la t a b la d e la p á g in a a n t e rio r q u e s u m a riza la co d ifica ció n p a ra
la s firm a s Ja va y s u s co rre s p o n d ie n t e s t ip o s .
S e p u e d e u t iliza r ja v a p co n la o p ció n "- s " p a ra g e n e ra r firm a s d e ca m p o s d e u n a
cla s e . Po r e je m p lo , s i s e e je cu t a :

javap -s -p FieldAccess
Es t e d a u n a s a lid a q u e co n t ie n e la s s ig u ie n t e s firm a s d e ca m p o s :

...
static si I
s Ljava/lang/String;
...

Oz it o
Capturar y Lanzar Excepciones
Cu a n d o s e la n za u n a e xce p ció n e n Ja va , la Má q u in a Virt u a l b u s ca a u t o m á t ica m e n t e e l
m a n e ja d o r d e e xce p ció n m á s ce rca n o y d e s p lie g a la p ila s i e s n e ce s a rio . La ve n t a ja d e e s t e
e s t ilo d e m a n e jo d e e xce p cio n e s e s q u e lib e ra a l p ro g ra m a d o r d e t e n e r cu id a d o y d e l
m a n e jo in u s u a l d e lo s e rro re s s it u a d o s e n ca d a o p e ra ció n d e l p ro g ra m a . En s u lu g a r, la
Má q u in a Virt u a l Ja va p ro p a g a a u t o m á t ica m e n t e la s co n d icio n e s d e l e rro r a la p o s ició n ( la
cla u s u la c a t c h d e Ja va ) q u e m a n e ja e l m is m o t ip o d e co n d icio n e s d e e rro r d e u n a fo rm a
ce n t ra liza d a .
Mie n t ra s q u e o t ro s le n g u a je s co m o C+ + s o p o rt a n u n a n o ció n s im ila r d e m a n e jo d e
e xce p cio n e s , n o e xis t e u n a m a n e ra u n ifo rm a d a d e la n za r y ca p t u ra r e xce p cio n e s e n lo s
le n g u a je s n a t ivo s . Po r lo t a n t o , e l JNI re q u ie re q u e s e co m p ru e b e n la s p o s ib le s e xce p cio n e s
d e s p u é s d e lla m a r a s u s fu n cio n e s . El JNI t a m b ié n p ro p o rcio n a fu n cio n e s q u e p e rm it e n a lo s
m é t o d o s n a t ivo s la n za r e xce p cio n e s Ja va . Es t a s e xce p cio n e s p u e d e n s e r m a n e ja d a s p o r
o t ra s p a rt e s d e l có d ig o n a t ivo o p o r la Má q u in a Virt u a l Ja va . De s p u é s d e q u e e l có d ig o
n a t ivo la n ce o ca p t u re u n a e xce p ció n , p u e d e e lim in a r la s e xce p cio n e s p e n d ie n t e s p a ra q u e
e l cá lcu lo co n t in ú e , o p u e d e la n za r o t ra e xce p ció n p a ra u n m a n e ja d o r e xt e rio r.
Mu ch a s fu n cio n e s JNI p u e d e n la n za r e xcp e cio n e s . Po r e je m p lo , la fu n ció n Ge t Fie ld I D
d e s crit a e n la p á g in a a n t e rio r la n za u n N o S u c h Fie ld Erro r s i e l ca m p o e s p e cifica d o n o
e xis t e . Pa ra s im p lifica r e l ch e q u e o d e e rro re s , la m a yo ría d e la s fu n cio n e s JNI u t iliza n u n a
co m b in a ció n d e có d ig o s d e e rro r y e xce p cio n e s Ja va p a ra in fo rm a r d e la s co n d icio n e s d e
e rro r. Po r e je m p lo , s e p o d ría ch e q u e a r s i e l ca m p o jfie ld I D d e vu e lt o p o r Ge t Fie ld I D e s
ce ro ( 0 ) e n ve z d e lla m a r a la fu n ció n JNI Ex c e p t io n Oc c u rre d . Cu a n d o e l re s u lt a d o d e
Ge t Fie ld I D n o e s ce ro ( 0 ) , s e p u e d e e s t a r s e g u ro d e q u e n o h a y u n a e xce p ció n p e n d ie n t e .
El re s t o d e la p á g in a ilu s t ra có m o ca p t u ra r y la n za r e xce p cio n e s e n có d ig o n a t ivo . El có d ig o
d e e je m p lo e s t á e n Ca t c h Th ro w . ja v a .

El m é t o d o Ca t c h Th ro w . m a in lla m a a l m é t o d o n a t ivo . El m é t o d o n a t ivo , d e fin id o e n


Ca t c h Th ro w . c , p rim e ro lla m a a l m é t o d o Ca t c h Th ro w . c a llb a c k Ja va , d e e s t a fo rm a :

jclass cls = (*env)->GetObjectClass(env, obj);


jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V");
jthrowable exc;
if (mid == 0)
return;
(*env)->CallVoidMethod(env, obj, mid);
Ob s e rva q u e co m o Ca llVo id Me t h o d la n za u n a N u llP o in t e rEx c e p t io n , e l có d ig o n a t ivo
p u e d e d e t e ct a r e s t a e xce p ció n d e s p u é s d e q u e Ca llVo id Me t h o d re t o rn e lla m a n d o a l
m é t o d o Ex c e p t io n Oc c u rre d :

exc = (*env)->ExceptionOccurred(env);
if (exc) {
Co m o s e p u e d e ve r e s m u y s e n cillo ca p t u ra r y la n za r u n a e xce p ció n . En n u e s t ro e je m p lo , n o
h a ce m o s m u ch o co n la e xce p ció n e n Ca t c h Th ro w . c e xce p t o u t iliza r e l m é t o d o
Ex c e p t io n D e s c rib e p a ra s a ca r u n m e n s a je d e d e p u ra d o . El m é t o d o n a t ivo la n za e n t o n ce s
u n a I lle g a lArg u m e n t Ex c e p t io n . Es e s t a e xe p ció n I lle g a lArg u m e n t Ex c e p t io n e s la q u e
ve rá e l có d ig o Ja va q u e lla m ó a l m é t o d o n a t ivo .
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);

newExcCls = (*env)->FindClass(env, "java/lang/IllegalArgumentException");


if (newExcCls == 0) /* Unable to find the new exception class, give up. */
return;
(*env)->ThrowNew(env, newExcCls, "thrown from C code");
La fu n ció n Th ro w N e w co n s t ru ye u n o b je t o e xce p t io n d e s d e u n a cla s e e xce p t io n d a d a y u n
s t rin g d e m e n s a je y p o s t e a la e xce p ció n e n e l t h re a d a ct u a l.
Ob s e rva q u e e s e x t re m a d a m e n t e im p o rt a n t e co m p ro b a r, m a n e ja r y lim p ia r la s e xce p cio n e s
p e n d ie n t e s a n t e s d e lla m a r a la s s ig u ie n t e s fu n cio n e s JNI. Lla m a r a rb it ra ria m e n t e a
fu n c io n e s JN I c o n u n a e x c e p c ió n p e n d ie n t e p o d ría g e n e ra r re s u lt a d o s
in e x p e ra d o s . S o lo s e p u e d e n lla m a r d e fo rm a s e g u ra a u n a s p o ca s fu n cio n e s JNI cu a n d o
e xis t e u n a e xce p ció n p e n d ie n t e . Es t a s fu n cio n e s s o n : Ex c e p t io n Oc c u rre d ,
Ex c e p t io n D e s c rib e , y Ex c e p t io n Cle a r.

Oz it o
Referencias Locales y Globales
Ha s t a a h o ra , h e m o s u t iliza d o t ip o s d e d a t o s co m o jo b je c t , jc la s s , y js t rin g p a ra
d e n o t a r re fe re n cia s a o b je t o s Ja va . S in e m b a rg o , e l JNI cre a re fe re n cia s p a ra t o d o s
lo s a rg u m e n t o s p a s a d o s a lo s m é t o d o s n a t ivo s , a s í co m o d e lo s o b je t o s d e vu e lt o s
d e s d e fu n cio n e s JNI.
La s re fe re n cia s s irve n p a ra e vit a r q u e lo s o b je t o s Ja va s e a n re co le ct a d o s p o r e l
re co le ct o r d e b a s u ra . Po r d e fe ct o , e l JNI cre a re fe re n cia s lo ca le s p o rq u e é s t a s
a s e g u ra n q u e la Má q u in a Virt u a l p u e d a lib e ra r e ve n t u a lm e n t e lo s o b je t o s Ja va . La s
re fe re n cia s lo ca le s s e vu e lve n in vá lid a s cu a n d o la e je cu ció n d e l p ro g ra m a re t o rn a
d e s d e e l m é t o d o n a t ivo e n e l q u e s e cre ó . Po r lo t a n t o , u n m é t o d o n a t ivo n o
d e b e ría a lm a ce n ce r u n a re fe re n cia lo ca l y e s p e ra r u t iliza rla e n lla m a d a s
s u b s e cu e n t e s .
Po r e je m p lo , e l s ig u ie n t e p ro g ra m a , q u e e s u n a va ria ció n d e l m é t o d o n a t ivo d e
Fie ld Ac c e s s . c , e rró n e a m e n t e ca p t u ra e l ID d e l ca m p o Ja va p a ra n o t e n e r q u e
b u s ca rlo re p e t id a m e n t e b a s á n d o s e e n e l n o m b re y la firm a e n ca d a lla m a d a :

/* This code is illegal */


static jclass cls = 0;
static jfieldID fld;

JNIEXPORT void JNICALL


Java_FieldAccess_accessFields(JNIEnv *env, jobject obj)
{
...
if (cls == 0) {
cls = (*env)->GetObjectClass(env, obj);
if (cls == 0)
... /* error */
fid = (*env)->GetStaticFieldID(env, cls, "si", "I");
}
... /* access the field using cls and fid */
}
Es t e có d ig o e s ile g a l p o rq u e la re fe re n cia lo ca l d e vu e lt a d e s d e Ge t Ob je c t Cla s s e s
s ó lo vá lid a a n t e s d e q u e re t o rn e e l m é t o d o n a t ivo . Cu a n d o u n a a p lica ció n Ja va
lla m a a l m é t o d o n a t ivo Ja v a _ Fie ld Ac c e s s _ a c c e s s Fie ld u n a s e g u n d a ve z, e l
m é t o d o n a t ivo t ra t a d e u t iliza r u n a re fe re n cia n o vá lid a . Es t o a ca b a rá e n u n
re s u lt a d o e rró n e o o u n cu e lg u e d e la Má q u in a Virt u a l.
S e p u e d e s o lu cio n a r e s t e p ro b le m a cre a n d o u n a re fe re n cia g lo b a l. Un a re fe re n cia
g lo b a l p e rm a n e ce rá vá lid a h a s t a q u e s e lib e ré e xp lícit a m e n t e . El s ig u ie n t e có d ig o
re e s crib e e l p ro g ra m a a n t e rio r y u t iliza co rre ct a m e n t e la re fe re n cia g lo b a l p a ra
ca p t u ra r e l ID d e l o b je t o :
/* This code is OK */
static jclass cls = 0;
static jfieldID fld;

JNIEXPORT void JNICALL


Java_FieldAccess_accessFields(JNIEnv *env, jobject obj)
{
...
if (cls == 0) {
jclass cls1 = (*env)->GetObjectClass(env, obj);
if (cls1 == 0)
... /* error */
cls = (*env)->NewGlobalRef(env, cls1);
if (cls == 0)
... /* error */
fid = (*env)->GetStaticFieldID(env, cls, "si", "I");
}
... /* access the field using cls and fid */
}
Un a re fe re n cia g lo b a l e vit a q u e la Ma q u in a Virt u a l d e s ca rg u e la cla s e Ja va , y p o r lo
t a n t o t a m b ié n a s e g u ra q u e e l ID d e l ca m p o p e rm a n e zca vá lid o , co m o s e e xp licó e n
Acce d e r a Ca m p o s Ja va . S in Em b a rg o , e l có d ig o n a t ivo d e b e lla m a r a
D e le t e Glo b a lRe fs cu a n d o n o n e ce s it e a cce d e r m á s a la re fe re n cia g lo b a l. De o t ro
m o d o , la Má q u in a Virt u a l n u n ca d e s ca rg a rá e l o b je t o co rre s p o n d ie n t e .
En la m a yo ría d e lo s ca s o s , lo s p ro g ra m a d o re s n a t ivo s re le g a n e n la VM la
lib e ra ció n d e la s re fe re n cia s lo ca le s d e s p u é s d e re t o rn a r d e l m é t o d o n a t ivo . S in
e m b a rg o , e n cie rt a s s it u a cio n e s , e l có d ig o n a t ivo p o d ría n e ce s it a r lla m a r a la
fu n ció n D e le t e Lo c a lRe f p a ra b o rra r e xp lícit a m e n t e u n a re fe re n cia lo ca l. Es t a s
s it u a cio n e s s o n :
● Po d ría m o s s a b e r q u e e s t a m o s m a n t e n ie n d o la ú n ica re fe n cia a u n o b je t o Ja va
d e g ra n t a m a ñ o y n o q u e re m o s e s p e ra r h a s t a q u e e l m é t o d o n a t ivo re t o rn e
a n t e s d e q u e e l re co le ct o r d e b a s u ra re cla m e e s e o b je t o . Po r e je m p lo , e n e l
s ig u ie n t e fra g m e n t o d e có d ig o , e l co le ct o r d e b a s u ra p o d ría lib e ra r e l o b je t o
Ja va re fe re n cia d o p o r lre f cu a n d o e s t á d e n t ro d e le n g t h y Co m p u t a t io n :

lref = ... /* a large Java object */

... /* last use of lref */


(*env)->DeleteLocalRef(env, lref);

lengthyComputation(); /* may take some time */

return; /* all local refs will now be freed */


}
● Po d ría m o s n e ce s it a r cre a r u n g ra n n ú m e ro d e re fe re n cia s lo ca le s e n u n a s ó la
lla m a d a a u n m é t o d o n a t ivo . Es t o p o d ría re s u lt a r e n u n a s o b re ca rg a e n la
t a b la d e re fe re n cia s lo ca le s d e l JNI. Es u n a b u e n a id e a b o rra r a q u e lla s
re fe re n cia s lo ca le s q u e n o s e va n a n e ce s it a r. Po r e je m p lo , e n e l s ig u ie n t e
fra g m e n t o d e có d ig o , e l có d ig o n a t ivo it e ra a t ra vé s d e u n a rra y
p o t e n cia lm e n t e g ra n d e a rr q u e co n t ie n e s t rin g s Ja va . De s p u é s d e ca d a
it e ra ció n , e l p ro g ra m a p u e d e lib e ra r la re fe re n cia lo ca l d e l e le m e n t o s t rin g :

for(i = 0; i < len; i++) {


jstring jstr = (*env)->GetObjectArrayElement(env, arr, i);
... /* processes jstr */
(*env)->DeleteLocalRef(env, jstr); /* no longer needs jstr */
}

Oz it o
Threads y Métodos Nativos
Ja va e s u n s is t e m a m u lt i- t h re a d , p o r lo t a n t o lo s m é t o d o s n a t ivo s d e b e n s e r
s e g u ro s co n lo s t h re a d s , A m e n o s q u e t e n g a m o s in fo rm a ció n e xt ra ( p o r e je m p lo , s i
e l m é t o d o n a t ivo e s t á s in cro n iza d o ) , d e b e m o s a s u m ir q u e p u e d e n e xis t ir va rio s
t h re a d s d e co n t ro l e je cu t á n d o s e s o b re u n m is m o m é t o d o n a t ivo e n u n m o m e n t o
d a d o . Po r lo t a n t o , lo s m é t o d o s n a t ivo s n o d e b e ría n m o d ifica r va ria b le s g lo b a le s
s e n s ib le s d e u n a fo rm a d e s p ro t e g id a . Es t o e s , d e b e n co m p a rt ir y co o rd in a r s u
a cce s o a va ria b le s d e cie rt a s s e ccio n e s crít ica s d e có d ig o .
An t e s d e le e r e s t a s e cció n , d e b e ría s e s t a r fa m ilia riza d o co n lo s co n ce p t o s d e
t h re a d s d e co n t ro l y p ro g ra m a s m u lt i- t h re a d s . Th re a d s d e Co n t ro l cu b re la
p ro g ra m a ció n d e t h re a d s . En p a rt icu la r, la p á g in a Pro g ra m a s Mu lt i- Th re a d cu b re
e le m e n t o s re la cio n a d o s co n la e s crit u ra d e p ro g ra m a s q u e co n t ie n e n va rio s
t h re a d s , in clu ye n d o có m o s in cro n iza rlo s .

Los Threads y el JNI

El p u n t e ro a l in t e rfa c e JN I ( JN I En v * ) s ó lo e s v á lid o e n e l t h re a d a c t u a l. S e
d e b e p a s a r e l p u n t e ro a l in t e rca ce d e u n t h re a d a o t ro , o g u a rd a r e l p u n t e ro a l
in t e rfa ce y u t iliza rlo e n va rio s t h re a d s . La m á q u in a virt u a l Ja va p a s a e l m is m o
p u n t e ro a l in t e rfa ce e n lla m a d a s s u ce s iva s a u n m é t o d o n a t ivo d e s d e e l m is m o
t h re a d , p e ro d ife re n t e s t h re a d s p a s a n u n d ife re n t e p u n t e ro a l in t e rfa ce a lo s
m é t o d o s n a t ivo s .
N o s e d e b e n p a s a r re fe re n c ia s lo c a le s d e u n t h re a d a o t ro . En p a rt icu la r, u n a
re fe re n cia lo ca l s e p o d ría vo lve r n o vá lid a a n t e s d e q u e o t ro t h re a d t e n g a la
p o s ib ilid a d d e u t iliza rla . S e d e b e n co n ve rt ir s ie m p re e n re fe re n cia s g lo b a le s cu a n d o
h a ya a lg u n a d u d a s o b re q u e u n a re fe re n cia a u n o b je t o p u e d a s e r u it liza d a p o r
t h re a d s d ife re n t e s .
Ch e q u e a e l u s o d e v a ria b le s g lo b a le s c u id a d o s a m e n t e . Va rio s t h re a d s
p o d ría n a cce d e r a la s va ria b le s g lo b a le s a l m is m o t ie m p o . As e g u ra t e d e q u e p o n e s
lo s b lo q u e o s n o ce s a rio s p a ra a s e g u ra r la s e g u rid a d .

Sincronización de Threads en Métodos Nativos.

El JNI p ro p o rcio n a d o s fu n cio n e s d e s in cro n iza ció n q u e p e rm it e n im p le m e n t a r


b lo q u e s s in cro n iz a d o s . En Ja va , s o n im p le m e n t a d o s u t iliza n d o la s e n t e n cia
s y n c h ro n iz e d . Po r e je m p lo :

synchronized (obj) {
... /* synchronized block */
}
La Má q u in a Virt u a l Ja va g a ra n t iza q u e u n t h re a d d e b a a d q u irir e l m o n it o r a s o cia d o
co n e l o b je t o Ja va o b j a n t e s d e p o d e r e je cu t a r la s s e n t e n cia s d e l b lo q u e . Po r lo
t a n t o , e n u n m o m e n t o d a d o , s ó lo p u e d e h a b e r u n t h re a d e je cu t á n d o s e d e n t ro d e l
b lo q u e s in cro n iza d o .
El có d ig o n a t ivo p u e d e re a liza r u n a s in cro n iza ció n e q u iva le n t e d e o b je t o s u t iliza n d o
la s fu n cio n e s d e l JNI Mo n it o rEn t e r y Mo n it o rEx it . Po r e je m p lo :

(*env)->MonitorEnter(obj);
... /* synchronized block */
(*env)->MonitorExit(obj);
Un t h re a d d e b e in t ro d u cir e l m o n it o r a s o cia d o co n o b j a n t e s d e p o d e r co n t in u a r
co n la e je cu ció n . El m o n it o r co n t ie n e u n co n t a d o r q u e s e ñ a la cu a n t a s ve ce s h a s id o
in t ro d u cid o p o r u n t h re a d d a d o . Mo n it o rEn t e r in cre m e n t a e l co n t a d o r cu a n d o e l
t h re a d e n t ra u n m o n it o r q u e ya h a s id o in t ro d u cid o . Mo n it o rEx it d e cre m e n t a e l
co n t a d o r. S i e l co n t a d o r a lca n za e l va lo r 0 , o t ro s t h re a d s p u e d e n in t ro d u cir e l
m o n it o r.

Wait y Notify

Ot ro m e ca n is m o d e s in cro n iza ció n d e t h re a d s e s Ob je c t . w a it , Ob je c t . n o t ify , y


Ob je c t . n o t ify All. El JNI n o s o p o rt a d ire ct a m e n t e e s t a s fu n cio n e s . S in e m b a rg o , u n
m é t o d o n a t ivo p u e d e s e g u ir e l m e ca n is m o d e lla m a d a a m é t o d o s p a ra in vo ca r a
e stos m é todos.

Oz it o
Invocar a la Máquina Virtual Java
En e l JDK 1 . 1 , la Má q u in a Virt u a l Ja va e s t á a lm a ce n a d a co m o u n a lib re ría
co m p a rt id a ( o lib re ría d e e n la ce d in á m ico e n Win 3 2 ) . Po d e m o s in t ro d u cir la VM e n
n u e s t ra a p lica ció n n a t iva , e n la za n d o la a p lica ció n co n la lib re ría . El JNI s o p o rt a u n
API d e "In vo ca t io n " in vo ca ció n q u e p e rm it e ca rg a r, in icia liza r, y lla m a r a la Má q u in a
Virt u a l Ja va . De h e ch o , la fo rm a n o rm a l d e a rra n ca r e l in t é rp re t e Ja va , ja v a , n o e s
m á s q u e u n s e n cillo p ro g ra m a C q u e a n a liza lo s a rg u m e n t o s d e la lin é a d e
co m a n d o s y lla m a a la Má q u in a Virt u a l Ja va a t ra vé s d e l API In vo ca t io n .

Llamar a la Máquina Virtual Java

Pa ra ilu s t ra r co m o lla m a r a la Má q u in a Virt u a l Ja va , e s crib ire m o s u n p ro g ra m a C


q u e la in vo q u e y lla m e a l m é t o d o P ro g . m a in d e fin id o e n P ro g . ja v a :

public class Prog {


public static void main(String[] args) {
System.out.println("Hello World" + args[0]);
}
}
El có d ig o C d e in v o k e . c e m p ie za co n u n a lla m a d a a
JN I _ Ge t D e fa u lt Ja v a VMI n it Arg s p a ra o b t e n e r lo s a va lo re s p a ra la in icia liza ció n
p o r d e fe ct o ( t a m a ñ o d e la p ila , e t c) Lu e g o lla m a a JN I _ Cre a t e Ja v a VM p a ra ca rg a r
e in icia liza r la Má q u in a Virt u a l. JN I _ Cre a t e Ja v a VM re lle n a d o s va lo re s d e re t o rn o :
● jv m s e re fie re la Má q u in a Virt u a l cre a d a . S e p u e d e u t iliza r p a ra d e s t ru ir la
Má q u in a Virt u a l, p o r e je m p lo .
● e n v e s u n p u n t e ro a in t e rfa ce JNI q u e e l t h re a d a ct u a l p u e d e u t iliza r p a ra
a cce d e r a la s ca ra ct e rís it ca s Ja va , co m o lla m a r a u n m é t o d o Ja va .
Ob s e rva q u e d e s p u é s d e q u e JN I _ Cre a t e Ja v a VM h a ya re t o rn a d o
s a t is fa ct o ria m e n t e , e l t h re a d n a t ivo , s e in t ro d u ce a s í m is m o e n la Má q u in a Virt u a l
Ja va y p o r lo t a n t o s e e s t á e je cu t a n d o co m o s i fu e ra u n m é t o d o n a t ivo . La ú n ica
d ife re n cia e s q u e n o e xis t e e l co n ce p t o d e re t o rn o d e la Má q u in a Virt u a l Ja va . Po r lo
t a n t o , la s re fe re n cia s lo ca le s cre a d a s d e s p u é s n o s e rá n lib e ra d a s h a s t a q u e s e lla m e
a D e s t ro y Ja v a VM.
Un a ve z q u e s e h a cre a d o la Má q u in a Virt u a l Ja va , s e p u e d e n re a liza r lla m a d a s
n o rm a le s d e l JNI, p o r e je m p lo a P ro g . m a in . D e s t ro y Ja v a VM in t e n t a d e s ca rg a r la
MV. ( En e l JDK 1 . 1 la Má q u in a Virt u a l Ja va n o p u e d e s e r d e s ca rg a d a ; p o r lo t a n t o
De s t ro yJa va VM s ie m p re d e vu e lve u n có d ig o d e e rro r. )
S e n e ce s it a co m p ila r y e n la za r in v o k e . c co n la s lib re ría s Ja va d is t rib u id a s co n e l
JDK 1 . 1 . En S o la ris , s e p u e d e u t iliza r e l s ig u ie n t e co m a n d o p a ra co m p ila r y e n la za r
in v o k e . c :
cc -I<where jni.h is> -L<where libjava.so is> -ljava invoke.c
En Win 3 2 co n Micro s g t Vis u a l C+ + 4 . 0 , la lín e a d e co m a n d o s e s :

cl -I<where jni.h is> -MT invoke.c -link <where javai.lib is>\javai.lib


Aq u e llo s q u e t ra b a je n e n e l e n t o rn o Ma cOS d e b e rá n re fe rirs e a l API JMa n a g e r, q u e
fo rm a p a rt e d e l Ma cOS Ru n t im e fo r Ja va ( MRJ) . S e u t iliza e s t e API p a ra in clu ir
a p lica cio n e s Ja va e n a p lica cio n e s MAC.
Al e je cu t a r e l p ro g ra m a re s u lt a n t e d e s d e la lín e a d e co m a n d o s , e s p o s ib le q u e
o b t e n g a m o s e l s ig u ie n t e m e n s a je d e e rro r:

Unable to initialize threads: cannot find class java/lang/Thread


Can't create Java VM
Es t e m e n s a je d e e rro r in d ica q u e s e h a s e le ccio n a d o e rró n e a m e n t e e l va lo r p a ra la
va ria b le v m _ a rg s . c la s s p a t h . Po r o t ro la d o , s i e l e rro r in d ica q u e n o p u e d e
e n co n t ra r lib ja v a . s o ( e n S o la ris ) o ja v a i. d ll ( e n Win 3 2 ) , a ñ a d ire m o s lib ja v a . s o a
n u e s t ro LD _ LI BRARY_ P ATH e n S o la ris , o ja v a i. d ll e n n u e s t ro p a t h d e e je cu t a b le s
e n Win 3 2 . S i e l p ro g ra m a m u e s t ra u n e rro r d icie n d o q u e n o p u e d e e n co n t ra r la
cla s e P ro g , d e b e m o s a s e g u ra rn o s d e q u e e l d ire ct o rio q u e co n t ie n e P ro g . c la s s
t a m b ié n e s t á e n la va ria b le v m _ a rg s . c la s s p a t h .

Añadir Threads Nativos

El API In vo ca t io n t a m b ié n p e rm it e a ñ a d ir t h re a d s n a t ivo s a u n a VM Ja va q u e s e
e s t é e je cu t a n d o y co n ve rt ir lo s p ro p io s t h re a d s e n t h re a d s Ja va . Es t o re q u ie re q u e
la Má q u in a Virt u a l Ja va u t ilice in t e rn a m e n t e t h re a d s n a t ivo s . En e l JDK 1 . 1 , e s t a
ca ra ct e ris t ica s ó lo fu n cio n a e n Win 3 2 . La ve rs ió n S o la ris d e la Má q u in a Virt u a l Ja va
u t iliza s o p o rt e d e t h re a d s d e n ive l d e u s u a rio y p o r lo t a n t o e s in ca p a z d e a ñ a d ir
t h re a d s n a t ivo s . Un a fu t u ra ve rs ió n d e l JDK p a ra s o la ris s o p o rt a rá t h re a d s n a t ivo s .
Po r lo t a n t o , n u e s t ro p ro g ra m a d e e je m p lo , a t t a c h . c , s ó lo fu n cio n a rá e n Win 3 2 . Es
u n a va ria ció n d e in v o k e . c . En lu g a r d e lla m a r a P ro g . m a in e n e l t h re a d p rin cip a l,
e l có d ig o n a t ivo e s p a n d e cin co t h re a d s y e s p e ra a q u e fin a lice n a n t e s d e d e s t ru ir la
Má q u in a Virt u a l Ja va . Ca d a t h re a d s e a ñ a d e a s í m is m o a la Má q u in a Virt u a l Ja va ,
lla m a a l m é t o d o P ro g . m a in , y fin a lm e n t e s e b o rra d e la Má q u in a Virt u a l a n t e s d e
t e rm in a r. Ob s e rva q u e e l t e rce r a rg u m e n t o d e At t a c h Cu rre n t Th re a d e s t á
re s e rva d o y s ie m p re d e b e s e r N ULL.
Cu a n d o s e lla m a a D e t a c h Cu rre n t Th re a d , t o d a s la s re fe re n cia s lo ca le s
p e rt e n e cie n t e s a l t h re a d a ct u a l s e rá n lib e ra d a s .

Limitaciones del API Invocation en el JDK 1.1

Co m o s e m e n cio n ó a n t e rio rm e n t e , e xis t e u n n ú m e ro d e lim it a cio n e s e n la


im p le m e n t a ció n d e l API In vo ca t io n e n e l JDK 1 . 1 .
● La im p le m e n t a ció n d e t h re d a s a n ive l d e u s u a rio e n S o la ris re q u ie re q u e la
Má q u in a Virt u a l Ja va re d ire ccio n e cie rt a s lla m a d a s a l s is t e m a . El ju e g o d e
lla m a d a s re d ire ccio n a d a s re a lm e n t e in clu ye : re a d , re a d v , w rit e , w rit e v ,
g e t m s g , p u t m s g , p o ll, o p e n , c lo s e , p ip e , fc n t l, d u p , c re a t e , a c c e p t ,
re c v , s e n d , e t c. Es t o p o d ría ca u s a r e fe ct o s in d e s e a d o s e n a p lica cio n e s
n a t iva s , q u e t a m b ié n d e p e n d a n d e lla m a d a s a l s is t e m a .
● No s e p u e d e n a ñ a d ir t h re a d s n a rivo s a la Má q u in a Virt u a l Ja va b a jo S o la ris .
At t a c h Cu rre n t Th re a d s im p le m e n t e fa lla e n S o la ris ( a m e n o s q u e s e lla m e
d e s d e e l t h re a d p rin cip a l q u e cre ó la Má q u in a Virt u a l) .
● No s e p u e d e d e s t ru ir la Má q u in a Virt u a l Ja va s in t e rm in a r e l p ro ce s o . La
lla m a d a a D e s t ro y Ja v a VM s im p le m e n t e d e vu e lve u n có d ig o d e e rro r.
Es t o s p ro b le m a s s e rá n co rre g id o s e n fu t u ra s ve rs io n e s d e l JDK.

Oz it o
Programación JNI en C++
El JNI p ro p o rcio n a u n in t e rfa ce s e n cillo p a ra p ro g ra m a d o re s C+ + . El fich e ro jn i. h
co n t ie n e u n co n ju n t o d e fu n cio n e s C+ + p a ra q u e e l p ro g ra m a d o r d e l m é t o d o
n a t ivo p u e d a e s crib ir s o lo :

jclass cls = env->FindClass("java/lang/String");


e n lu g a r d e :

jclass cls = (*env)->FindClass(env, "java/lang/String");


El n ive l e xt ra d e in d ire cció n d e e n v y e l a rg u m e n t o e n v a Fin d Cla s s e s t á n o cu lt o s
p a ra e l p ro g ra m a d o r. El co m p ila d o r C+ + e xp a n d irá la s lla m a d a s a la s fu n cio n e s
m ie m b ro s d e C+ + , y p o r lo t a n t o e l có d ig o re s u lt a n t e e s e xa ct a m e n t e e l m is m o .
El fich e ro jn i. h t a m b ié n d e fin e u n co n ju n t o d e cla s e s in ú t ile s d e C+ + p a ra fo rza r la
re la ció n d e t ip a d o e n t re la s d ife re n t e s va ria cio n e s d e l t ip o jo b je c t :

class _jobject {};


class _jclass : public _jobject {};
class _jthrowable : public _jobject {};
class _jstring : public _jobject {};
... /* more on jarray */

typedef _jobject *jobject;


typedef _jclass *jclass;
typedef _jthrowable *jthrowable;
typedef _jstring *jstring;
... /* more on jarray */
Po r lo t a n t o , e l co m p ila d o r C+ + p u e d e d e t e ct a r s i s e le p a s a , u n jo b je c t a
Ge t Me t h o d I D , p o r e je m p lo :

jmethodID GetMethodID(jclass clazz, const char *name,


const char *sig);
ya q u e Ge t Me t h o d I D e s p e ra u n jc la s s . En C, jc la s s e s s im p le m e n t e lo m is m o
q u e jo b je c t :

typedef jobject jclass;


Po r lo t a n t o , u n co m p ila d o r C n o p u e d e d e t e ct a r q u e s e le h a p a s a d o e rró n a m e n t e
u n jo b je c t e n ve z d e u n jc la s s .
La a d ició n d e l t ip o s s e g u ro s e n C+ + t ie n e u n p e q u e ñ o in co n ve n ie n t e . Re co rd e m o s
d e Acce d e r a Arra ys Ja va q u e e n C, p o d e m o s cre a r u n S t rin g Ja va d e s d e u n a rra y
d e S t rin g s y d ire ct a m e n t e a s ig n a r e l re s u lt a d o a u n js t rin g :
jstring jstr = (*env)->GetObjectArrayElement(env, arr, i);
S in e m b a rg o , e n C+ + , n e ce s it a m o s in s e rt a r u n a co n ve rs ió n e xp lícit a :

jstring jstr = (jstring)env->GetObjectArrayElement(arr, i);


p o rq u e js t rin g e s u n s u b t ip o d e jo b je c t , e l t ip o d e re t o rn o d e
Ge t Ob je c t Arra y Ele m e n t .

Oz it o
JDBC - Acceso a Bases de Datos
JDBCt m fu e d is e ñ a d o p a ra m a n t e n e r s e n cilla s la s co s a s s e n cilla s . Es t o s ig n ifica q u e
e l API JDBC h a ce m u y s e n cilla s la s t a re a s d ia ria s d e u n a b a s e d e d a t o s , co m o u n a
s im p le s e n t e n cia S ELECT. Es t a s e cció n n o s lle va rá a t ra vé s d e e je m p lo s q u e u t iliza n
e l JDBC p a ra e je cu t a r s e n t e n cia s S QL co m u n e s , p a ra q u e p o d a m o s ve r lo s e n cilla
q u e e s la u t iliza ció n d e l API JDBC b á s ico .
Es t a s e cció n e s t á d ivid id a a s u ve z e n d o s s e ccio n e s :
JD BC Ba s ic o q u e cu b re e l API JDBC 1 . 0 , q u e e s t á in clu id o e n e l JDKt m 1 . 1 . La
s e g u n d a p a rt e cu b re e l API JDBC 2 . 0 API, q u e fo rm a p a rt e d e la ve rs ió n 1 . 2 d e l
JDK. Ta m b ié n d e s crib e b re ve m e n t e la s e xt e n s io n e s d e l API JDBC, q u e , a l ig u a l q u e
o t ra s e xt e n s io n e s e s t á n d a rd , s e rá n lib e ra d a s in d e p e n d ie n t e m e n t e .
Al fin a l d e e s t a p rim e ra s e cció n , s a b re m o s co m o u t iliza r e l API b á s ico d e l JDBC
p a ra cre a r t a b la s , in s e rt a r va lo re s e n e lla s , p e d ir t a b la s , re cu p e ra r lo s re s u lt a d o s
d e la s p e t icio n e s y a ct u a liza r la s t a b la s . En e s t e p ro ce s o , a p re n d e re m o s co m o
u t iliza r la s s e n t e n cia s s e n cilla s y s e n t e n cia s p re p a ra d a s , y ve re m o s u n e je m p lo d e
u n p ro ce d im ie n t o a lm a ce n a d o . Ta m b ié n a p re n d e re m o s co m o re a liza r t ra n s a cio n e s
y co m o ca p t u ra r e xce p cio n e s y a vis o s . En la ú lt im a p a rt e d e e s t e s e cció n ve re m o s
co m o cre a r u n Ap p le t .
N u e v a s Ca ra c t e rís t ic a s e n e l AP I JD BC 2 . 0 n o s e n s e ñ a co m o m o ve r e l cu rs o r
p o r u n a h o ja d e re s u lt a d o s , có m o a ct u a liza r la h o ja d e re s u lt a d o s u t iliza n d o e l API
JDBC 2 . 0 , y co m o h a ce r a ct u a liza cio n e s b a t ch . Ta m b ié n co n o ce re m o s lo s n u e vo s
t ip o s d e d a t o s d e S QL3 y co m o u t iliza rlo s e n a p lica cio n e s e s crit a s e n Ja va t m . La
p a rt e fin a l d e e s t a le cció n e n t re g a u n a vis ió n d e la e xt e n s ió n d e l API JDBC, co n
ca ra ct e rís it a s q u e s e a p ro ve ch a n d e la t e cn o lo g ía s Ja va Be a n s t m y En t e rp ris e
Ja va Be a n s t m .
Es t a s e cció n n o cu b re có m o u t iliza r e l API m e t a d a t a , q u e s e u t iliza e n p ro g ra m a s
m á s s o fis t ica d o s , co m o a p lica cio n e s q u e d e b a n d e s cu b rir y p re s e n t a r
d in á m ica m e n t e la e s t ru ct u ra d e u n a b a s e d e d a t o s fu e n t e .

Oz it o
Para empezar...
Lo p rim e ro q u e t e n e m o s q u e h a ce r e s a s e g u ra rn o s d e q u e d is p o n e m o s d e la
co n fig u ra ció n a p ro p ia d a . Es t o in clu ye lo s s ig u ie n t e s p a s o s :
1 . In s t a la r Ja va y e l JDBC e n n u e s t ra m á q u in a .
Pa ra in s t a la r t a n t o la p la t a fo rm a JAVA co m o e l API JDBC, s im p le m e n t e
t e n e m o s q u e s e g u ir la s in s t ru ccio n e s d e d e s ca rg a d e la ú lt im a ve rs ió n d e l JDK
( Ja va De ve lo p m e n t Kit ) . Ju n t o co n e l JDK t a m b ié n vie n e e l JDBC. . El có d ig o
d e e je m p lo d e d e s m o s t ra ció n d e l API d e l JDBC 1 . 0 fu e e s crit o p a ra e l JDK 1 . 1
y s e e je cu t a rá e n cu a lq u ie r ve rs ió n d e la p la t a fo rm a Ja va co m p a t ib le co n e l
JDK 1 . 1 , in clu ye n d o e l JDK1 . 2 . Te n ie n d o e n cu e n t a q u e lo s e je m p lo s d e l API
d e l JDBC 2 . 0 re q u ie re n e l JDK 1 . 2 y n o s e p o d rá n e je cu t a r s o b e e l JDK 1 . 1 .
Po d rá s e n co n t ra r la ú lt im a ve rs ió n d e l JDK e n la s ig u ie n t e d ire cció n : :
h t t p : / / ja va . s u n . co m / p ro d u ct s / JDK/ Cu rre n t Re le a s e
2 . In s t a la r u n d rive r e n n u e s t ra m á q u in a .
Nu e s t ro Drive r d e b e in clu ir in s t ru ccio n e s p a ra s u in s t a la ció n . Pa ra lo s d rive rs
JDBC e s crit o s p a ra co n t ro la d o re s d e b a s e s d e d a t o s e s p e cífico s la in s t a la ció n
co n s is t e s ó lo e n co p ia r e l d rive r e n n u e s t a m á q u in a ; n o s e n e ce s it a n in g u n a
co n fig u ra ció n e s p e cia l.
El d rive r "p u e n t e JDBC- ODBC" n o e s t a n s e n cillo d e co n fig u ra r. S i
d e s ca rg a m o s la s ve rs io n e s S o la ris o Win d o ws d e JDK 1 . 1 , a u t o m á t ica m e n t e
o b t e n d re m o s u n a ve rs ió n d e l d rive r Brid g e JDBC- ODBC, q u e t a m p o co re q u ie re
u n a co n fig u ra ció n e s p e cia l. S i e m b a rg o , ODBC, s i lo n e ce s it a . S i n o t e n e m o s
ODBC e n n u e s t ra m á q u in a , n e ce s it a re m o s p re g u n t a rle a l ve n d e d o r d e l d rive r
ODBC s o b re s u in s t a la ció n y co n fig u ra ció n .
3 . In s t a la r n u e s t ro Co n t ro la d o r d e Ba s e d e Da t o s s i e s n e ce s a rio .
S i n o t e n e m o s in s t a la d o u n co n t ro la d o r d e b a s e d e d a t o s , n e ce s it a re m o s
s e g u ir la s in s t ru ccio n e s d e in s t a la ció n d e l ve n d e d o r. La m a yo ría d e lo s
u s u a rio s t ie n e n u n co n t ro la d o r d e b a s e d e d a t o s in s t a la d o y t ra b a ja rá n co n u n
b a s e d e d a t o s e s t a b le cid a .

Oz it o
Seleccionar una Base de Datos
A lo la rg o d e la s e cció n a s u m ire m o s q u e la b a s e d e d a t o s COFFEEBREAK ya
e xis t e . ( cre a r u n a b a s e d e d a t o s n o e s n a d a d íficil, p e ro re q u ie re p e rm is o s
e s p e cia le s y n o rm a lm e n t e lo h a ce u n a d m in is t ra d o r d e b a s e s d e d a t o s ) . Cu a n d o
cre e m o s la s t a b la s u t iliza d a s co m o e je m p lo s e n e s t e t u t o ria l, s e rá n la b a s e d e
d a t o s p o r d e fe ct o . He m o s m a n t e n id o u n n ú m e ro p e q u e ñ o d e t a b la s p a ra m a n t e n e r
la s co s a s m a n e ja b le s .
S u p o n g a m o s q u e n u e s t ra b a s e d e d a t o s e s t á s ie n d o u t iliza d a p o r e l p ro p ie t a rio d e
u n p e q u e ñ o ca fé lla m a d o "Th e Co ffe e Bre a k", d o n d e lo s g ra n o s d e ca fé s e ve n d e n
p o r kilo s y e l ca fé liq u id o s e ve n d e p o r t a za s . Pa ra m a n t e n e r la s co s a s s e n cilla s ,
t a m b ié n s u p o n d re m o s q u e e l p ro p ie t a rio s ó lo n e ce s it a d o s t a b la s , u n a p a ra lo s
t ip o s d e ca fé y o t ra p a ra lo s s u m in is t ra d o re s .
Prim e ro ve re m o s co m o a b rir u n a co n e xió n co n n u e s t ro co n t ro la d o r d e b a s e d e
d a t o s , y lu e g o , ya q u e JDBC p u e d e e n via r co d ig o S QL a n u e s t ro co n t ro la d o r,
d e m o s t ra re m o s a lg ú n có d ig o S QL. De s p u é s , ve re m o s lo s e n cillo q u e e s u t iliza r
JDBC p a ra p a s a r e s a s s e n t e n cia s S QL a n u e s t ro co n t ro la d o r d e b a s e s d e d a t o s y
p ro ce s a r lo s re s u lt a d o s d e vu e lt o s .
Es t e có d ig o h a s id o p ro b a d o e n la m a yo ría d e lo s co n t ro la d o re s d e b a s e d e d a t o s .
S in e m b a rg o , p o d ría m o s e n co n t ra r a lg u n o s p ro b le m a s d e co m p a t ib ilid a d s u
u t iliza m o s a n t ig u o s d rive rs ODB co n e l p u e n t e JDBC. ODBC.

Oz it o
Establecer una Conexión
Lo p rim e ro q u e t e n e m o s q u e h a ce r e s e s t a b le ce r u n a co n e xió n co n e l co n t ro la d o r d e b a s e d e
d a t o s q u e q u e re m o s u t iliza r. Es t o im p lica d o s p a s o s : ( 1 ) ca rg a r e l d rive r y ( 2 ) h a ce r la
co n e xió n .

Cargar los Drivers

Ca rg a r e l d rive r o d rive rs q u e q u e re m o s u t iliza r e s m u y s e n cillo y s ó lo im p lica u n a


lín e a d e có d ig o . S i, p o r e je m p lo , q u e re m o s u t iliza r e l p u e n t e JDBC- ODBC, s e
ca rg a ría la s ig u ie n t e lín e a d e có d ig o :

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
La d o cu m e n t a ció n d e l d rive r n o s d a rá e l n o m b re d e la cla s e a u t iliza r. Po r e je m p lo ,
s i e l n o m b re d e la cla s e e s jd b c . D riv e rXYZ, ca rg a ría m o s e l d rive r co n e s t a lín e a d e
có d ig o :

Class.forName("jdbc.DriverXYZ");
No n e ce s it a m o s cre a r u n e je m p la r d e u n d rive r y re g is t ra rlo co n e l D riv e rMa n a g e r
p o rq u e la lla m a d a a Cla s s . fo rN a m e lo h a ce a u t o m á t ica m e n t e . S i h u b ié ra m o s
cre a d o n u e s t ro p ro p io e je m p la r, cre a ria m o s u n d u p lica d o in n e ce s a rio , p e ro n o
p a s a ría n a d a .
Un a ve z ca rg a d o e l d rive r, e s p o s ib le h a ce r u n a co n e xió n co n u n co n t ro la d o r d e
ba se de da tos.

Hacer la Conexión

El s e g u n d o p a s o p a ra e s t a b le ce r u n a co n e xió n e s t e n e r e l d rive r a p ro p ia d o
co n e ct a d o a l co n t ro la d o r d e b a s e d e d a t o s . La s ig u ie n t e lín e a d e có d ig o ilu s t ra la
id e a g e n e ra l:

Connection con = DriverManager.getConnection(url, "myLogin", "myPassword");


Es t e p a s o t a m b ié n e s s e n cillo , lo m á s d u ro e s s a b e r q u é s u m in is t ra r p a ra u rl. S i
e s t a m o s u t iliza n d o e l p u e n t e JDBC- ODBC, e l JDBC URL e m p e za rá co n jd b c :o d b c :.
e l re s t o d e la URL n o rm a lm e n t e e s la fu e n t e d e n u e s t ro s d a t o s o e l s is t e m a d e b a s e
d e d a t o s . Po r e s o , s i e s t a m o s u t iliza n d o ODBC p a ra a cce d e r a u n a fu e n t e d e d a t o s
ODBC lla m a d a "Fre d , " p o r e je m p lo , n u e s t ro URL p o d ría s e r jd b c :o d b c :Fre d . En
lu g a r d e "m y Lo g in " p o n d ría m o s e l n o m b re u t iliza d o p a ra e n t ra r e n e l co n t ro la d o r
d e la b a s e d e d a t o s ; e n lu g a r d e "m y P a s s w o rd " p o n d ría m o s n u e s t ra p a s s wo rd
p a ra e l co n t ro la d o r d e la b a s e d e d a t o s . Po r e s o s i e n t ra m o s e n e l co n t ro la d o r co n
e l n o m b re "Fe rn a n d o " y la p a s s wo rd o f "J8 , " e s t a s d o s lín e a s d e có d ig o
e s t a b le ce ra n u n a co n e xió n :

String url = "jdbc:odbc:Fred";


Connection con = DriverManager.getConnection(url, "Fernando", "J8");
S i e s t a m o s u t iliza n d o u n p u e n t e JDBC d e s a rro lla d o p o r u n a t e rce ra p a rt e , la
d o cu m e n t a ció n n o s d irá e l s u b p ro t o co lo a u t iliza r, e s d e cir, q u é p o n e r d e s p u e s d e
jd b c : e n la URL. Po r e je m p lo , s i e l d e s a rro lla d o r h a re g is t ra d o e l n o m b re "a cm e "
co m o e l s u b p ro t o co lo , la p rim e ra y s e g u n d a p a rt e d e la URL d e JDBC s e rá n
jd b c :a c m e :. La d o cu m e n t a ció n d e l d rive r t a m b ié n n o s d a rá la s g u ía s p a ra e l re s t o
d e la URL d e l JDBC. Es t a ú lt im a p a rt e d e la URL s u m in is t ra in fo rm a ció n p a ra la
id e n t ifica ció n d e lo s d a t o s fu e n t e .
S i u n o d e lo s d rive rs q u e h e m o s ca rg a d o re co n o ce la URL s u m in is t a d a p o r e l
m é t o d o D riv e rMa n a g e r. g e t Co n n e c t io n , d ich o d rive r e s t a b le ce rá u n a co n e xió n
co n e l co n t ro la d o r d e b a s e d e d a t o s e s p e cifica d o e n la URL d e l JDBC. La cla s e
D riv e rMa n a g e r, co m o s u n o m b re in d ica , m a n e ja t o d o s lo s d e t a lle s d e l
e s t a b le cim ie n t o d e la co n e xió n d e t rá s d e la e s ce n a . A m e n o s q u e e s t e m o s
e s crib ie n d o u n d rive r, p o s ib le m e n t e n u n ca u t iliza re m o s n in g ú n m é t o d o d e l in t e rfa ce
D riv e r, y e l ú n ico m é t o d o d e D riv e rMa n a g e r q u e re a lm e n t e n e ce s it a re m o s
co n o ce r e s D riv e rMa n a g e r. g e t Co n n e c t io n .
La co n e xió n d e vu e lt a p o r e l m é t o d o D riv e rMa n a g e r. g e t Co n n e c t io n e s u n a
co n e xió n a b ie rt a q u e s e p u e d e u t iliza r p a ra cre a r s e n t e n cia s JDBC q u e p a s e n
n u e s t ra s s e n t e n cia s S QL a l co n t ro la d o r d e la b a s e d e d a t o s . En e l e je m p lo a n t e rio r,
c o n e s u n a co n e xió n a b ie rt a , y s e u t iliza rá e n lo s e je m p lo s p o s t e rio re s .

Oz it o
Seleccionar Tablas
Crear una Tabla

Prim e ro , cre a re m o s u n a d e la s t a b la s d e n u e s t ro e je m p lo . Es t a t a b la , COFFEES ,


co n t ie n e la in fo rm a ció n e s e n cia l s o b re lo s ca fé s ve n d id o s e n "Th e Co ffe e Bre a k",
in clu ye n d o lo s n o m b re s d e lo s ca fé s , s u s p re cio s , e l n ú m e ro d e lib ra s ve n d id a s la
s e m a n a a ct u a l, y e l n ú m e ro d e lib ra s ve n d id a s h a s t a la fe ch a . Aq u í p u e d e s ve r la
t a b la COFFEES , q u e d e s crib ire m o s m á s a d e la n t e :
COF_NAME SUP_ID PRICE SALES TOTAL
Colombian 101 7.99 0 0
French_Roast 49 8.99 0 0
Espresso 150 9.99 0 0
Colombian_Decaf 101 8.99 0 0
French_Roast_Decaf 49 9.99 0 0

La co lu m n a q u e a lm a ce n a e l n o m b re d e l ca fé e s COF_ N AME, y co n t ie n e va lo re s co n
e l t ip o VARCHAR d e S QL y u n a lo n g it u d m á xim a d e 3 2 ca ra ct e re s . Co m o u t iliza m o s
n o m b re s d ife re n t e s p a ra ca d a t ip o d e ca fé ve n d id o , e l n o m b re s e rá u n ú n ico
id e n t ifica d o r p a ra u n ca fé p a rt icu la r y p o r lo t a n t o p u e d e s e rvir co m o cla ve p rim a ria .
La s e g u n d a co lu n m a , lla m a d a S UP _ I D , co n t ie n e u n n ú m e ro q u e id e n t ifica a l
s u m in is t ra d o r d e l ca fé ; e s t e n ú m e ro s e rá u n t ip o I N TEGER d e S QL. La t e rce ra
co lu m n a , lla m a d a P RI CE, a lm a ce n a va lo re s d e l t ip o FLOAT d e S QL p o rq u e n e ce s it a
co n t e n e r va lo re s d e cim a le s . ( Ob s e rva q u e e l d in e ro n o rm a lm e n t e s e a lm a ce n a e n u n
t ip o D ECI MAL o N UMERI C d e S QL, p e ro d e b id o a la s d ife re n cia s e n t re
co n t ro la d o re s d e b a s e s d e d a t o s y p a ra e vit a r la in co m p a t ib ilid a d co n vie ja s
ve rs io n e s d e JDBC, u t iliza m o s e l t ip o m á s e s t á n d a rd FLOAT. ) La co lu m n a lla m a d a
S ALES a lm a ce n a va lo re s d e l t ip o I N TEGER d e S QL e in d ica e l n ú m e ro d e lib ra s
ve n d id a s d u ra n t e la s e m a n a a ct u a l. La co lu m n a fin a l, TOTAL, co n t ie n e o t ro va lo r
I N TEGER d e S QL q u e co n t ie n e e l n ú m e ro t o t a l d e lib ra s ve n d id a s h a s t a la fe ch a .
S UP P LI ERS , la s e g u n d a t a b la d e n u e s t a b a s e d e d a t o s , t ie n e in fo rm a ció n s o b re
ca d a u n o d e lo s s u m in is t ra d o re s :
SUP_ID SUP_NAME STREET CITY STATE ZIP
101 Acm e , In c. 9 9 Ma rke t S t re e t Gro u n d s ville CA 95199
49 S u p e rio r Co ffe e 1 Pa rt y Pla ce Me n d o cin o CA 95460
150 Th e Hig h Gro u n d 1 0 0 Co ffe e La n e Me a d o ws CA 93966

La s t a b la s COFFEES y S UP P LI ERS co n t ie n e n la co lu m n a S UP _ I D , lo q u e s ig n ifica


q u e e s t a s d o s t a b la s p u e d e n u t iliza rs e e n s e n t e n cia s S ELECT p a ra o b t e n e r d a t o s
b a s a d o s e n la in fo rm a ció n d e a m b a s t a b la s . La co lu m n a S UP _ I D e s la cla ve p rim a ria
d e la t a b la S UP P LI ERS , y p o r lo t a n t o , e s u n id e n t ifica d o r ú n ico p a ra ca d a u n o d e
lo s s u m in is t ra d o re s d e ca fé . En la t a b la COFFEES , S UP _ I D e s lla m a d a cla ve
e xt ra n je ra . ( S e p u e d e p e n s a r e n u n a cla ve e xt ra n je ra e n e l s e n t id o e n q u e e s
im p o rt a d a d e s d e o t ra t a b la ) . Ob s e rva q u e ca d a n ú m e ro S UP _ I D a p a re ce s ó lo u n a
ve z e n la t a b la S UP P LI ERS ; e s t o e s n e ce s a rio p a ra s e r u n a cla ve p rim a ria . S in
e m b a rg o , e n la t a b la COFFEES , d o n d e e s u n a cla ve e xt ra n je ra , e s p e rfe ct a m e n t e
co rre ct o q u e h a ya n ú m e ro s d u p lica d o s d e S UP _ I D p o rq u e u n s u m in is t ra d o r p u e d e
ve n d e r va rio s t ip o s d e ca fé . Má s a d e la n t e e n e s t e ca p ít u lo p o d re m o s ve r có m o
u t iliza r cla ve s p rim a ria s y e xt ra n je ra s e n u n a s e n t e n cia S ELECT.
La s ig u ie n t e s e n t e n cia S QL cre a la t a b la COFFEES . La s e n t ra d a s d e n t ro d e lo s
p a ré n t e s is e xt e rio re s co n s is t e n e n e l n o m b re d e u n a co lu m n a s e g u id o p o r u n e s p a cio
y e l t ip o S QL q u e s e va a a lm a ce n a r e n e s a co lu m n a . Un a co m a s e p a ra la e n t ra d a d e
u n a co lu m n a ( q u e co n s is t e e n e l n o m b re d e la co lu m n a y e l t ip o S QL) d e o t ra . El t ip o
VARCHAR s e cre a co n u n a lo n g it u d m á xim a , p o r e s o t o m a u n p a rá m e t ro q u e in d ica
la lo n g it u d m á xim a . El p a rá m e t ro d e b e e s t a r e n t re p a ré n t e s is s ig u ie n d o a l t ip o . La
s e n t e n cia S QL m o s t ra d a a q u í, p o r e je m p lo , e s p e cífica q u e lo s n o m b re s d e la co lu m n a
COF- NAME p u e d e n t e n e r h a s t a 3 2 ca ra ct e re s d e lo n g it u d :

CREATE TABLE COFFEES


(COF_NAME VARCHAR(32),
SUP_ID INTEGER,
PRICE FLOAT,
SALES INTEGER,
TOTAL INTEGER)
Es t e có d ig o n o t e rm in a co n u n t e rm in a d o r d e s e n t e cia d e u n co n t ro la d o r d e b a s e d e
d a t o s , q u e p u e d e va ria r d e u n co n t ro la d o r a o t ro . Po r e je m p lo , Ora cle u t iliza u n
p u n t o y co m a ( ; ) p a ra fin a liza r u n a s e n t e n cia , y S yb a s e u t iliza la p la b ra g o . El d rive r
q u e e s t a m o s u t iliza d o p ro p o rcio n a rá a u t o m á t ica m e n t e e l t e rm in a d o r d e s e t e n cia
a p ro p ia d o , y n o n e ce s it a re m o s in t ro d u cirlo e n n u e s t ro có d ig o JDBC.
Ot ra co s a q u e d e b ía m o s a p u n t a r s o b re la s s e n t e n cia s S QL e s s u fo rm a . En la
s e n t e n cia CREATE TABLE, la s p a la b ra s cla ve s e h a n im p rim id o e n le t ra s
m á yu s cu la s , y ca d a ít e m e n u n a lín e a s e p a ra d a . S QL n o re q u ie re n a d a d e e s t o , e s t a s
co n ve n cio n e s s o n s ó lo p a ra u n a fá cil le ct u ra . El e s t á n d a rd S QL d ice q u e la p a la b ra s
cla ve s n o s o n s e n s ib le s a la s m a yú s cu la s , a s í, p o r e je m p lo , la a n t e rio r s e n t e n cia
S ELECT p u d e e s crib irs e d e va ria s fo rm a s . Y co m o e je m p lo , e s t a s d o s ve rs io n e s s o n
e q u iva le n t e s e n lo q u e co n cie rn e a S QL:

SELECT First_Name, Last_Name


FROM Employees
WHERE Last_Name LIKE "Washington"
select First_Name, Last_Name from Employees where
Last_Name like "Washington"
S in e m b a rg o , e l m a t e ria l e n t re co m illa s s i e s s e n s ib le a la s m a ýu s cu la s : e n e l
n o m b re "W a s h in g t o n ", "W " d e b e e s t a r e n m a ýu s cu la y e l re s t o d e la s le t ra s e n
m in ú s cu la .
Lo s re q u e rim ie n t o s p u e d e n va ria r d e u n co n t ro la d o r d e b a s e d e d a t o s a o t ro cu a n d o
s e t ra d a d e n o m b re s d e id e n t ifica d o re s . Po r e je m p lo , a lg u n o s co n t ro la d o re s ,
re q u ie re n q u e lo s n o m b re s d e co lu m n a y d e t a b la s e á n e xa ct a m e n t e lo s m is m o s q u e
s e cre a ro n e n la s s e n t e n cia s CREATE y TABLE, m ie n t ra s q u e o t ro s co n t ro la d o re s n o
lo n e ce s it a n . Pa ra a s e g u ra rn o s , u t iliza re m o s m a yú s cu la s p a ra id e n t ifica d o re s co m o
COFFEES y S UP P LI ERS p o rq u e a s í e s co m o lo s d e fin im o s .
Ha s t a a h o ra h e m o s e s crit o la s e n t e n cia S QL q u e cre a la t a b la COFFEES . Ah o ra le
p o n d re m o s co m illa s ( cre a re m o s u n s t rin g ) y a s ig n a re m o s e l s t rin g a la va ria b le
c re a t e Ta b le Co ffe e s p a ra p o d e r u t iliza rla e n n u e s t ro có d ig o JDBC m á s a d e la n t e .
Co m o h e m o s vis t o , a l co n t ro la d o r d e b a s e d e d a t o s n o le im p o rt a s i la s lín e a s e s t á n
d ivid id a s , p e ro e n e l le n g u a je Ja va , u n o b je t o S t rin g q u e s e e xt ie n d a m á s a llá d e
u n a lín e a n o s e rá co m p ila d o . Co n s e cu e n t e m e n t e , cu a n d o e s t a m o s e n t re g a n d o
ca d e n a s , n e ce s it a m o s e n ce rra r ca d a lín e a e n t re co m illa s y u t iliza r e l s ig n o m á s ( + )
p a ra co n ca t e n a rla s :

String createTableCoffees = "CREATE TABLE COFFEES " +


"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +
"SALES INTEGER, TOTAL INTEGER)";
Lo s t ip o s d e d a t o s q u e h e m o s u t iliza d o e n n u e s t ra s s e n t e n cia s CREATE y TABLE s o n
t ip o s g e n é rico s S QL ( t a m b ié n lla m a d o s t ip o s JDBC) q u e e s t á n d e fin id o s e n la cla s e
ja v a . s q l. Ty p e s . Lo s co n t ro la d o re s d e b a s e s d e d a t o s g e n e ra lm e n t e u t iliza n e s t o s
t ip o s e s t á n d a rd s , p o r e s o cu a n d o lle g u e e l m o m e n t o d e p ro b a r a lg u n a a p lica ció n ,
s ó lo p o d re m o s u t iliza r la a p lica ció n Cre a t e Co ffe e s . ja v a , q u e u t iliza la s s e n t e n cia s
CREATE y TABLE. S i t u co n t ro la d o r u t iliza s u s p ro p io s n o m b re s d e t ip o s , t e
s u m in is t ra re rm o s m á s a d e la n t e u n a a p lica ció n q u e h a ce e s o .
S in e m b a rg o , a n t e s d e e je cu t a r a lg u n a a p lica ció n , ve re m o s lo m á s b á s ico s o b re e l
JDBC.

Crear sentencias JDBC

Un o b je t o S t a t e m e n t e s e l q u e e n vía n u e s t ra s s e n t e n cia s S QL a l co n t ro la d o r d e la
b a s e d e d a t o s . S im p le m e n t e cre a m o s u n o b je t o S t a t e m e n t y lo e je cu t a m o s ,
s u m in is t a n d o e l m é t o d o S QL a p ro p ia d o co n la s e n t e n cia S QL q u e q u e re m o s e n via r.
Pa ra u n a s e n t e n cia S ELECT, e l m é t o d o a e je cu t a r e s e x e c u t e Qu e ry . Pa ra
s e n t e n cia s q u e cre a n o m o d ifica n t a b la s , e l m é t o d o a u t iliza r e s e x e c u t e Up d a t e .
S e t o m a u n e je m p la r d e u n a co n e xió n a ct iva p a ra cre a r u n o b je t o S t a t e m e n t . En e l
s ig u ie n t e e je m p lo , u t iliza m o s n u e s t ro o b je t o Co n n e c t io n : c o n p a ra cre a r e l o b je t o
Sta te m e nt: s tm t:

Statement stmt = con.createStatement();


En e s t e m o m e n t o s t m t e xis t e , p e ro n o t ie n e n in g u n a s e n t e n cia S QL q u e p a s a rle a l
co n t ro la d o r d e la b a s e d e d a t o s . Ne ce s it a m o s s u m in is t ra rle e l m e t o d o q u e
u t iliza re m o s p a ra e je cu t a r s t m t . Po r e je m p lo , e n e l s ig u ie n t e fra g m e n t o d e có d ig o ,
s u m in is t ra m o s e x e c u t e Up d a t e co n la s e n t e n cia S QL d e l e je m p lo a n t e rio r:

stmt.executeUpdate("CREATE TABLE COFFEES " +


"(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +
"SALES INTEGER, TOTAL INTEGER)");
Co m a ya h a b ía m o s cre a d o u n S t rin g co n la s e n t e n cia S QL y lo h a b ía m o s lla m a d o
c re a t e Ta b le Co ffe e s , p o d ría m o s h a b e r e s crit o e l có d ig o d e e s t a fo rm a a lt e rn a t iva :

stmt.executeUpdate(createTableCoffees);

Ejecutar Sentencias

Ut iliza m o s e l m é t o d o e x e c u t e Up d a t e p o rq u e la s e n t e n cia S QL co n t e n id a e n
c re a t e Ta b le Co ffe e s e s u n a s e n t e n cia DDL ( d a t a d e fin it io n la n g u a g e ) . La s
s e n t e n cia s q u e cre a n , m o d ifica n o e lim in a n t a b la s s o n t o d a s e je m p lo s d e s e n t e n cia s
DDL y s e e je cu t a n co n e l m é t o d o e x e c u t e Up d a t e . Có m o s e p o d ría e s p e ra r d e s u
n o m b re , e l m é t o d o e x e c u t e Up d a t e t a m b ié n s e u t iliza p a ra e je cu t a r s e n t e n cia s S QL
q u e a ct u a liza n u n t a b la . En la p rá ct ica e x e c u t e Up d a t e s e u t iliza m á s
fre cu e n t e m e n t e p a ra a ct u a liza r t a b la s q u e p a ra cre a rla s p o rq u e u n a t a b la s e cre a
s ó lo u n a ve z, p e ro s e p u e d e a ct u a liza r m u ch a s ve ce s .
El m é t o d o m á s u t iliza d o p a ra e je cu t a r s e n t e n cia s S QL e s e x e c u t e Qu e ry . Es t e
m é t o d o s e u t iliza p a ra e je cu t a r s e n t e n cia s S ELECT, q u e co m p re n d e n la a m p lia
m a yo ría d e la s s e n t e n cia s S QL. Pro n t o ve re m o s co m o u t iliza r e s t e m é t o d o .

Introducir Datos en una Tabla

He m o s vis t o co m o cre a r la t a b la COFFEES e s p e cifica n d o lo s n o m b re s d e co lu m n a s y


lo s t ip o s d e d a t o s a lm a ce n a d o s e n e s a s co lu m n a s , p e ro e s t o s ó lo co n fig u ra la
e s t ru ct u ra d e la t a b la . La t a b la n o co n t ie n e d a t o s t o d a vía . In t ro d u cire m o s d a t o s e n
n u e s t ra t a b la u n a fila ca d a ve z, s u m in is t ra n d o la in fo rm a ció n a a lm a ce n a r e n ca d a
co lu m n a d e la fila . Ob s e rva q u e lo s va lo re s in s e rt a d o s e n la s co lu m n a s s e lis t a n e n e l
m is m o o rd e n e n q u e s e d e cla ra ro n la s co lu m n a s cu a n d o s e cre ó la t a b la , q u e e s e l
o rd e n p o r d e fe ct o .
El s ig u ie n t e có d ig o is n e rt a u n a fila d e d a t o s co n Co lo m b ia n e n la co lu m n a
COF_ N AME, 1 0 1 e n S UP _ I D , 7 . 9 9 e n P RI CE, 0 e n S ALES , y 0 e n TOTAL. ( Co m o
a ca b a m o s d e in a u g u ra r "Th e Co ffe e Bre a k", la ca n t id a d ve n d id a d u ra n t e la s e m a n a y
la ca n t id a d t o t a l s o n ce ro p a ra t o d o s lo s ca fé s ) . Al ig u a l q u e h icim o s co n e l có d ig o
q u e cre a b a la t a b la COFFEES , cre a re m o s u n o b je t o S t a t e m e n t y lo e je cu t a re m o s
u t iliza n d o e l m é t o d o e x e c u t e Up d a t e .
Co m o la s e n t e n cia S QL e s d a m a s ia d o la rg a co m o p a ra e n t ra r e n u n a s ó la lín e a , la
h e m o s d ivid id o e n d o s s t rin g s co n ca t e n á n d o la s m e d ia n t e u n s ig n o m á s ( + ) p a ra q u e
p u e d a n co m p ila rs e . Pre s t a e s p e cia l a t e n ció n a la n e ce s id a d d e u n e s p a cio e n t re
COFFEES y VALUES . Es t e e s p a cio d e b e e s t a r d e n t ro d e la s co m illa s y d e b e e s t a r
d e s p u é s d e COFFEES y a n t e s d e VALUES ; s in u n e s p a cio , la s e n t e n cia S QL s e ría
le íd a e rró n e a m e n t e co m o "I N S ERT I N TO COFFEES VALUES . . . " y e l co n t ro la d o r
d e la b a s e d e d a t o s b u s ca ría la t a b la COFFEES VALUES . Ob s e rva t a m b ié n q u e
u t iliza m o s co m illa s im p le s a lre d e d o r d e l n o m b re d e l ca fé p o rq u e e s t á a n id a d o d e n t ro
d e la s co m illa s d o b le s . Pa ra la m a yo ría d e co n t ro la d o re s d e b a s e s d e d a t o s , la re g la
g e n e ra l e s a lt e rn a r co m illa s d o b le s y s im p le s p a ra in d ica r a n id a ció n .

Statement stmt = con.createStatement();


stmt.executeUpdate(
"INSERT INTO COFFEES " +
"VALUES ('Colombian', 101, 7.99, 0, 0)");
El s ig u ie n t e có d ig o in s e rt a u n a s e g u n d a lín e a d e n t ro d e la t a b la COFFEES . Ob s e rva
q u e h e m o s re u t iliza d o e l o b je t o S t a t e m e n t : s t m t e n ve z d e t e n e r q u e cre a r u n o
n u e vo p a ra ca d a e je cu ció n .

stmt.executeUpdate("INSERT INTO COFFEES " +


"VALUES ('French_Roast', 49, 8.99, 0, 0)");
Lo s va lo re s d e la s s ig u ie n t e s fila s s e p u e d e n in s e rt a r d e e s t a fo rm a :

stmt.executeUpdate("INSERT INTO COFFEES " +


"VALUES ('Espresso', 150, 9.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " +
"VALUES ('Colombian_Decaf', 101, 8.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " +
"VALUES ('French_Roast_Decaf', 49, 9.99, 0, 0)");

Obtener Datos desde una Tabla

Ah o ra q u e la t a b la COFFEES t ie n e va lo re s , p o d e m o s e s crib ir u n a s e n t e n cia S ELECT


p a ra a cce d e r a d ich o s va lo re s . El a s t e ris co ( * ) e n la s ig u ie n t e s e n t e n cia S QL in d ica
q u e la co lu m n a d e b e ría s e r s e le ccio n a d a . Co m o n o h a y cla ú s u la W HERE q u e lim it e
la s co lu m a s a s e le ccio n a r, la s ig u ie n t e s e n t e n cia S QL s e le cio n a la t a b la co m p le t a :

SELECT * FROM COFFEES


El re s u lt a d o , q u e e s la t a b la co m p le t a , s e p a re ce ría a e s t o :
COF_NAME SUP_ID PRICE SALES TOTAL
Co lo m b ia n 101 7.99 0 0
Fre n ch _ Ro a s t 49 8.99 0 0
Es p re s s o 150 9.99 0 0
Co lo m b ia n _ De ca f 101 8.99 0 0
Fre n ch _ Ro a s t _ De ca f 4 9 9.99 0 0

El re s u lt a d o a n t e rio r e s lo q u e ve ría m o s e n n u e s t ro t e rm in a l s i in t ro d u je ra m o s la
p e t ició n S QL d ire ct a m e n t e e n e l s is t e m a d e la b a s e d e d a t o s . Cu a n d o a cce d e m o s a
u n a b a s e d e d a t o s a t ra vé s d e u n a a p lica ció n Ja va , co m o ve re m o s p ro n t o ,
n e ce s it a m o s re cu p e ra r lo s re s u lt a d o s p a ra p o d e r u t iliza rlo s . Ve re m o s co m o h a ce r
e s t o e n la s ig u ie n t e p á g in a .
Aq u í t e n e m o s o t ro e je m p lo d e u n a s e n t e n cia S ELECT, é s t a o b t ie n e u n a lis t a d e cá fe s
y s u s re s p e ct ivo s p re cio s p o r lib ra :
SELECT COF_NAME, PRICE FROM COFFEES
El re s u lt a d o d e e s t a co n s u lt a s e p a re ce ría a e s t o :
COF_NAME ------------------- PRICE
Co lo m b ia n 7.99
Fre n ch _ Ro a s t 8.99
Es p re s s o 9.99
Co lo m b ia n _ De ca f 8.99
Fre n ch _ Ro a s t _ De ca f 9.99

La s e n t e n cia S ELECT g e n e ra lo s n o m b re s y p re cio s d e t o d o s lo s cá fe s d e la t a b la . La


s ig u ie n t e s e n t e n cia S QL lím it a lo s ca fé s s e le ccio n a d o s a a q u e llo s q u e cu e s t e n m e n o s
d e $ 9 . 0 0 p o r lib ra :

SELECT COF_NAME, PRICE


FROM COFFEES
WHERE PRICE < 9.00
El re s u lt a d o s e p a re ce ría e s e s t o :
COF_NAME -------------------- PRICE
Co lo m b ia n 7.99
Fre n ch _ Ro a s t 8.99
Co lo m b ia n De ca f 8.99

Oz it o
Recuperar Valores de una Hoja de Resultados
Ah o ra ve re m o s co m o e n via r la s e n t e n cia S ELECT d e la p á g in a a n t e rio r d e s d e u n p ro g ra m a e s crit o e n Ja va y co m o o b t e n e r lo s re s u lt a d o s q u e h e m o s m o s t ra d o .
JDBC d e vu e lve lo s re s u lt a d o s e n u n o b je t o Re s u lt S e t , p o r e s o n e ce s it a m o s d e cla ra r u n e je m p la r d e la cla s e Re s u lt S e t p a ra co n t e n e r lo s re s u lt a d o s . El s ig u ie n t e có d ig o p re s e n t a e l o b je t o Re s u lt S e t : rs
y le a s ig n a e l re s u lt a d o d e u n a co n s u lt a a n t e rio r:

ResultSet rs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");

Utilizar el Método next

La va ria b le rs , q u e e s u n e je m p la r d e Re s u lt S e t , co n t ie n e la s fila s d e ca fé s y s u s p re cio s m o s t ra d o s e n e l ju e g o d e re s u lt a d o s d e la p á g in a a n t e rio r. Pa ra a cce d e r a lo s n o m b re s y lo s p re cio s , ire m o s a la


fila y re cu p e ra re m o s lo s va lo re s d e a cu e rd o co n s u s t ip o s . El m é t o d o n e x t m u e ve a lg o lla m a d o cu rs o r a la s ig u ie n t e fila y h a ce q u e e s a fila ( lla m a d a fila a ct u a l) s e a co n la q u e p o d a m o s o p e ra r. Co m o e l
cu rs o r in icia lm e n t e s e p o s icio n a ju s t o e n cim a d e la p rim e ra fila d e u n o b je t o Re s u lt S e t , p rim e ro d e b e m o s lla m a r a l m é t o d o n e x t p a ra m o ve r e l cu rs o r a la p rim e ra fila y co n ve rt irla e n la fila a ct u a l.
S u ce s iva s in vo ca cio n e s d e l m é t o d o n e x t m o ve rá n e l cu rs o r d e lín e a e n lín e a d e a rrib a a a b a jo . Ob s e rva q u e co n e l JDBC 2 . 0 , cu b ie rt o e n la s ig u ie n t e s e cció n , s e p u e d e m o ve r e l cu rs o r h a cia a t rá s , h a cia
p o s icio n e s e s p e cífica s y a p o s icio n e s re la t iva s a la fila a ct u a l a d e m á s d e m o ve r e l cu rs o r h a cia a d e la n t e .

Utilizar los métodos getXXX

Lo s m é t o d o s g e t XXX d e l t ip o a p ro p ia d o s e u t iliza n p a ra re cu p e ra r e l va lo r d e ca d a co lu m n a . Po r e je m p lo , la p rim e ra co lu m n a d e ca d a fila d e rs e s COF_ N AME, q u e a lm a ce n a u n va lo r d e l t ip o


VARCHAR d e S QL. El m é t o d o p a ra re cu p e ra r u n va lo r VARCHAR e s g e t S t rin g . La s e g u n d a co lu m n a d e ca d a fila a lm a ce n a u n va lo r d e l t ip o FLOAT d e S QL, y e l m é t o d o p a ra re cu p e ra r va lo re s d e e s e
t ip o e s g e t Flo a t . El s ig u ie n t e có d ig o a cce d e a lo s va lo re s a lm a ce n a d o s e n la fila a ct u a l d e rs e im p rim e u n a lín e a co n e l n o m b re s e g u id o p o r t re s e s p a cio s y e l p re cio . Ca d a ve z q u e s e lla m a a l m é t o d o
n e x t , la s ig u ie n t e fila s e co n vie rt e e n la a ct u a l, y e l b u cle co n t in ú a h a s t a q u e n o h a ya m á s fila s e n rs :

String query = "SELECT COF_NAME, PRICE FROM COFFEES";


ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString("COF_NAME");
Float n = rs.getFloat("PRICE");
System.out.println(s + " " + n);
}
La s a lid a s e p a re ce rá a e s t o :

Colombian 7.99
French_Roast 8.99
Espresso 9.99
Colombian_Decaf 8.99
French_Roast_Decaf 9.99
Ve a m o s có m o fu n cio n a n lo s m é t o d o s g e t XXX e xa m in a n d o la s d o s s e n t e n cia s g e t XXX d e e s t e có d ig o . Prim e ro e xa m in a re m o s g e t S t rin g .

String s = rs.getString("COF_NAME");
El m é t o d o g e t S t rin g e s in vo ca d o s o b re e l o b je t o Re s u lt S e t : rs , p o r e s o g e t S t rin g re cu p e ra rá ( o b t e n d rá ) e l va lo r a lm a ce n a d o e n la co lu m n a COF_ N AME d e la fila a ct u a l d e rs . El va lo r re cu p e ra d o p o r
g e t S t rin g s e h a co n ve rt id o d e s d e u n VARCHAR d e S QL a u n S t rin g d e Ja va y s e h a a s ig n a d o a l o b je t o S t rin g s . Ob s e rva q u e u t iliza m o s la va ria b le s e n la e xp re s ió n p rin t ln m o s t ra d a a rrib a , d e e s t a
fo rm a : p rin t ln ( s + " " + n )
La s it u a ció n e s s im ila r co n e l m é t o d o g e t Flo a t e xce p t o e n q u e re cu p e ra e l va lo r a lm a ce n a d o e n la co lu m n a P RI CE, q u e e s u n FLOAT d e S QL, y lo co n vie rt e a u n flo a t d e Ja va a n t e s d e a s ig n a rlo a la
va ria b le n .
JDBC o fre ce d o s fo rm a s p a ra id e n t ifica r la co lu m n a d e la q u e u n m é t o d o g e t XXX o b t ie n e u n va lo r. Un a fo rm a e s d a r e l n o m b re d e la co lu m n a , co m o s e h a h e ch o a rrib a . La s e g u n d a fo rm a e s d a r e l ín d ice
d e la co lu m n a ( e l n ú m e ro d e co lu m n a ) , co n u n 1 s ig n ifica n d o la p rim e ra co lu m n a , u n 2 p a ra la s e g u n d a , e t c. S i u t ilizá ra m o s e l n ú m e ro d e co lu m n a e n ve z d e l n o m b re d e co lu m n a e l có d ig o a n t e rio r s e
p o d ría p a re ce r a e s t o :

String s = rs.getString(1);
float n = rs.getFloat(2);
La p rim e ra lín e a d e có d ig o o b t ie n e e l va lo r d e la p rim e ra co lu m n a d e la fila a ct u a l d e rs ( co lu m n a COF_ N AME) , co n virt ié n d o lo a u n o b je t o S t rin g d e Ja va y a s ig n á n d o lo a s . La s e g u n d a lín e a d e có d ig o
o b t ie n e e l va lo r d e la s e g u n d a co lu m n a d e la fila a ct u a l d e rs , lo co n vie rt e a u n flo a t d e Ja va y lo a s ig n a a n . Re cu e rd a q u e e l n ú m e ro d e co lu m n a s e re fie re a l n ú m e ro d e co lu m n a e n la h o ja d e
re s u lt a d o s n o e n la t a b la o rig in a l.
En s u m a , JDBC p e rm it e u t iliza r t a n t o e l n o m b re có m o e l n ú m e ro d e la co lu m n a co m o a rg u m e n t o a u n m é t o d o g e t XXX. Ut iliza r e l n ú m e ro d e co lu m n a e s u n p o co m á s e ficie n t e , y h a y a lg u n o s ca s o s
d o n d e e s n e ce s a rio u t iliza rlo .
JDBC p e rm it e m u ch a s la t e ra lid a d e s p a ra u t iliza r lo s m é t o d o s g e t XXX p a ra o b t e n e r d ife re n t e s t ip o s d e d a t o s S QL. Po r e je m p lo , e l m é t o d o g e t I n t p u e d e s e r u t iliza d o p a ra re cu p e ra r cu a lq u ie r t ip o
n u m é rico d e ca ra ct e re s . Lo s d a t o s re cu p e ra d o s s e rá n co n ve rt id o s a u n in t ; e s t o e s , s i e l t ip o S QL e s VARCHAR, JDBC in t e n t a rá co n ve rt irlo e n u n e n t e ro . S e re co m ie n d a u t iliza r e l m é t o d o g e t I n t s ó lo
p a ra re cu p e ra r I N TEGER d e S QL, s in e m b a rg o , n o p u e d e u t iliza rs e co n lo s t ip o s BI N ARY, VARBI N ARY, LON GVARBI N ARY, D ATE, TI ME, o TI MES TAMP d e S QL.
Mé t o d o s p a ra Re cu p e ra r Tip o s S QL m u e s t ra q u é m é t o d o s p u e d e n u t iliza rs e le g a lm e n t e p a ra re cu p e ra r t ip o s S QL, y m á s im p o rt a n t e , q u é m é t o d o s e s t á n re co m e n d a d o s p a ra re cu p e ra r lo s d is t in t o s t ip o s
S QL. Ob s e rva q u e e s t a t a b la u t iliza e l t é rm in o "JDBC t yp e " e n lu g a r d e "S QL t yp e . " Am b o s t é rm in o s s e re fie re n a lo s t ip o s g e n é rico s d e S QL d e fin id o s e n ja v a . s q l. Ty p e s , y a m b o s s o n in t e rca m b ia b le s .

Utilizar el método getString


Au n q u e e l m e t o d o g e t S t rin g e s t á re co m e n d a d o p a ra re cu p e ra r t ip o s CHAR y VARCHAR d e S QL, e s p o s ib le re cu p e ra r cu a lq u ie r t ip o b á s ico S QL co n é l. ( S in e m b a rg o , n o s e p u e d e n re cu p e ra r lo s n u e vo s
t ip o s d e d a t o a s d e l S QL3 . Exp lica re m o s e l S QL3 m á s a d e la n t e ) .
Ob t e n e r u n va lo r co n g e t S t rin g p u e d e s e r m u y ú t il, p e ro t ie n e s u s lim it a cio n e s . Po r e je m p lo , s i s e e s t á u t iliza n d o p a ra re cu p e ra r u n t ip o n u m é rico , g e t S t rin g lo co n ve rt irá e n u n S t rin g d e Ja va , y e l
va lo r t e n d rá q u e s e r co n ve rt id o d e n u e vo a n ú m e ro a n t e s d e p o d e r o p e ra r co n é l.

Utilizar los métodos de ResultSet.getXXX para Recuperar tipos JDBC

TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE DECIMAL NUMERIC BIT CHAR VARCHAR LONGVARCHAR BINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP
getByte X x x x x x x x x x x x x
getShort x X x x x x x x x x x x x
getInt x x X x x x x x x x x x x
getLong x x x X x x x x x x x x x
getFloat x x x x X x x x x x x x x
getDouble x x x x x X X x x x x x x
getBigDecimal x x x x x x x X X x x x x
getBoolean x x x x x x x x x X x x x
getString x x x x x x x x x x X X x x x x x x x
getBytes X X x
getDate x x x X x
getTime x x x X x
getTimestamp x x x x x X
getAsciiStream x x X x x x
getUnicodeStream x x X x x x
getBinaryStream x x X
getObject x x x x x x x x x x x x x x x x x x x

Un a "x" in d ica q u e e l m é t o d o g e t XXX s e p u e d e u t iliza r le g a lm e n t e p a ra re cu p e ra r e l t ip o JDBC d a d o .


Un a "X" in d ica q u e e l m é t o d o g e t XXX e s t á re co m e n d a d o p a ra re cu p e ra r e l t ip o JDBC d a d o .

Oz it o
Actualizar Tablas
S u p o n g a m o s q u e d e s p u é s d e u n a p rim e ra s e m a n a e xit o s a , e l p ro p ie t a rio d e "Th e Co ffe e
Bre a k" q u ie re a ct u a liza r la co lu m n a S ALES d e la t a b la COFFEES in t ro d u cie n d o e l n ú m e ro
d e lib ra s ve n d id a s d e ca d a t ip o d e ca fé . La s e n t e n cia S QL p a ra a ct u a liza r u n a co lu m n a s e
p o d ría p a re ce r a e s t o :

String updateString = "UPDATE COFFEES " +


"SET SALES = 75 " +
"WHERE COF_NAME LIKE 'Colombian'";
Uit liza n d o e l o b je t o s t m t , e s t e có d ig o JDBC e je cu t a la s e n t e n cia S QL co n t e n id a e n
u p d a t e S t rin g :

stmt.executeUpdate(updateString);
La t a b la COFFEES a h o ra s e p a re ce rá a e s t o :
COF_NAME SUP_ID PRICE SALES TOTAL
Colombian 101 7.99 75 0
French_Roast 49 8.99 0 0
Espresso 150 9.99 0 0
Colombian_Decaf 101 8.99 0 0
French_Roast_Decaf 49 9.99 0 0

Ob s e rva q u e t o d a vía n o h e m o s a ct u a liza d o la co lu m n a TOTAL, y p o r e s o t ie n e va lo r 0 .


Ah o ra s e le ccio n a re m o s la fila q u e h e m o s a ct u a liza d o , re cu p e ra n d o lo s va lo re s d e la s
co lu m n a s COF_ N AME y S ALES , e im p rim ie n d o e s o s va lo re s :

String query = "SELECT COF_NAME, SALES FROM COFFEES " +


"WHERE COF_NAME LIKE 'Colombian'";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString("COF_NAME");
int n = rs.getInt("SALES");
System.out.println(n + " pounds of " + s +
" sold this week.")
}
Es t o im p rim ira lo s ig u ie n t e :

75 pounds of Colombian sold this week.


Có m o la cla ú s u la W HERE lím it a la s e le cció n a u n a s ó la lín e a , s ó lo h a y u n a lín e a e n la
Re s u lt S e t : rs y u n a lín e a e n la s a lid a . Po r lo t a n t o , s e ría p o s ib le e s crib ir e l có d ig o s in u n
b u cle w h ile :

rs.next();
String s = rs.getString(1);
int n = rs.getInt(2);
System.out.println(n + " pounds of " + s + " sold this week.")
Au n q u e h a y u n a s ó la lín e a e n la h o ja d e re s u lt a d o s , n e ce s it a m o s u t iliza r e l m é t o d o n e x t
p a ra a cce d e r a e lla . Un o b je t o Re s u lt S e t s e cre a co n u n cu rs o r a p u n t a n d o p o r e n cim a d e
la p rim e ra fila . La p rim e ra lla m a d a a l m é t o d o n e x t p o s icio n a e l cu rs o r e n la p rim e ra fila
( y e n e s t e ca s o , la ú n ica ) d e rs . En e s t e có d ig o , s ó lo s e lla m a u n a ve z a n e x t , s i
s u ce d ie ra q u e e xis t ie ra u n a lín e a , n u n ca s e a cce d e ría a e lla .
Ah o ra a ct u a liza re m o s la co lu m n a TOTAL a ñ a d ie n d o la ca n t id a d ve n d id a d u ra n t e la
s e m a n a a la ca n t id a d t o t a l e xis t e n t e , y lu e g o im p rim ire m o s e l n ú m e ro d e lib ra s ve n d id a s
h a s t a la fe ch a :

String updateString = "UPDATE COFFEES " +


"SET TOTAL = TOTAL + 75 " +
"WHERE COF_NAME LIKE 'Colombian'";
stmt.executeUpdate(updateString);
String query = "SELECT COF_NAME, TOTAL FROM COFFEES " +
"WHERE COF_NAME LIKE 'Colombian'";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString(1);
int n = rs.getInt(2);
System.out.println(n + " pounds of " + s + " sold to date.")
}
Ob s e rva q u e e n e s t e e je m p lo , u t iliza m o s e l ín d ice d e co lu m n a e n ve z d e l n o m b re d e
co lu m n a , s u m in is t ra n d o e l ín d ice 1 a g e t S t rin g ( la p rim e ra co lu m n a d e la h o ja d e
re s u lt a d o s e s COF_ N AME) , y e l ín d ice 2 a g e t I n t ( la s e g u n d a co lu m n a d e la h o ja d e
re s u lt a d o s e s TOTAL) . Es im p o rt a n t e d is t in g u ir e n t re u n ín d ice d e co lu m n a e n la t a b la d e
la b a s e d e d a t o s co m o o p u e s t o a l ín d ice e n la t a b la d e la h o ja d e re s u lt a d o s . Po r e je m p lo ,
TOTAL e s la q u in t a co lu m n a e n la t a b la COFFEES p e ro e s la s e g u n d a co lu m n a e n la h o ja
d e re s u lt a d o s g e n e ra d a p o r la p e t ició n d e l e je m p lo a n t e rio r.

Oz it o
Utilizar Sentencias Prepared
Alg u n a s ve ce s e s m á s co n ve n ie n t e o e ficie n t e u t iliza r o b je t o s P re p a re d S t a t e m e n t p a ra e n via r
s e n t e n cia s S QL a la b a s e d e d a t o s . Es t e t ip o e s p e cia l d e s e n t e n cia s s e d e riva d e u n a cla s e m á s
g e n e ra l, S t a t e m e n t , q u e ya co n o ce m o s .

Cuándo utilizar un Objeto PreparedStatement

S i q u e re m o s e je cu t a r m u ch a s ve ce s u n o b je t o S t a t e m e n t , re d u cire m o s e l t ie m p o d e e je cu ció n s i
u t iliza m o s u n o b je t o P re p a re d S t a t e m e n t , e n s u lu g a r.
La ca ra ct e rís it ca p rin cip a l d e u n o b je t o P re p a re d S t a t e m e n t e s q u e , a l co n t ra rio q u e u n o b je t o
S t a t e m e n t , s e le e n t re g a u n a s e n t e n cia S QL cu a n d o s e cre a . La ve n t a ja d e e s t o e s q u e e n la
m a yo ría d e lo s ca s o s , e s t a s e n t e n cia S QL s e e n via rá a l co n t ro la d o r d e la b a s e d e d a t o s
in m e d ia t a m e n t e , d o n d e s e rá co m p ila d o . Co m o re s u lt a d o , e l o b je t o P re p a re d S t a t e m e n t n o s ó lo
co n t ie n e u n a s e n t e n cia S QL, s in o u n a s e n t e n cia S QL q u e h a s id o p re co m p ila d a . Es t o s ig n ifica q u e
cu a n d o s e e je cu t a la P re p a re d S t a t e m e n t , e l co n t ro la d o r d e b a s e d e d a t o s p u e d e e je cu t a rla s in
t e n e r q u e co m p ila rla p rim e ro .
Au n q u e lo s o b je t o s P re p a re d S t a t e m e n t s e p u e d e n u t iliza r co n s e n t e n cia s S QL s in p a rá m e t ro s ,
p ro b a b le m e n t e n o s o t ro s u t iliza re m o s m á s fre cu e n t e m e n t e s e n t e n cia s co n p a rá m e t ro s . La ve n t a jA d e
u t iliza r s e n t e n cia s S QL q u e u t iliza n p a rá m e t ro s e s q u e p o d e m o s u t iliza r la m is m a s e n t e n cia y
s u m in is t ra r d is t in t o s va lo re s ca d a ve z q u e la e je cu t e m o s . Ve re m o s u n e je m p lo d e e s t o e n la s p á g in a
s ig u ie n t e s .

Crear un Objeto PreparedStatement

Al ig u a l q u e lo s o b je t o s S t a t e m e n t , cre a m o s u n o b je t o P re p a re d S t a t e m e n t co n u n o b je t o
Co n n e c t io n . Ut iliza n d o n u e s t ra co n e xió n c o n a b ie rt a e n e je m p lo s a n t e rio re s , p o d ría m o s e s crib ir lo
s ig u ie n t e p a ra cre a r u n o b je t o P re p a re d S t a t e m e n t q u e t o m e d o s p a rá m e t ro s d e e n t ra d a :

PreparedStatement updateSales = con.prepareStatement(


"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
La va ria b le u p d a t e S a le s co n t ie n e la s e n t e n cia S QL, "UP D ATE COFFEES S ET S ALES = ? W HERE
COF_ N AME LI KE ? ", q u e t a m b ié n h a s id o , e n la m a yo ría d e lo s ca s o s , e n via d a a l co n t ro la d o r d e la
b a s e d e d a t o s , y h a s id o p re co m p ila d o .

Suministrar Valores para los Parámetros de un PreparedStatement

Ne ce s it a m o s s u m in is t ra r lo s va lo re s q u e s e u t iliza rá n e n lo s lu e g a re s d o n d e e s t á n la s m a rca s d e
in t e rro g a ció n , s i h a y a lg u n o , a n t e s d e e je cu t a r u n o b je t o P re p a re d S t a t e m e n t . Po d e m o s h a ce r e s t o
lla m a d o a u n o d e lo s m é t o d o s s e t XXX d e fin id o s e n la cla s e P re p a re d S t a t e m e n t . S i e l va lo r q u e
q u e re m o s s u s t it u ir p o r u n a m a rca d e in t e rro g a ció n e s u n in t d e Ja va , p o d e m o s lla m a r a l m é t o d o
s e t I n t . S i e l va lo r q u e q u e re m o s s u s t it u ir e s u n S t rin g d e Ja va , p o d e m o s lla m a r a l m é t o d o
s e t S t rin g , e t c. En g e n e ra l, h a y u n m é t o d o s e t XXX p a ra ca d a t ip o Ja va .
Ut iliza n d o e l o b je t o u p d a t e S a le s d e l e je m p lo a n t e rio r, la s ig u ie n t e lín e a d e có d ig o s e le ccio n a la
p rim e ra m a rca d e in t e rro g a ció n p a ra u n in t d e Ja va , co n u n va lo r d e 7 5 :

updateSales.setInt(1, 75);
Có m o p o d ría m o s a s u m ir a p a rt ir d e e s t e e je m p lo , e l p rim e r a rg u m e n t o d e u n m é t o d o s e t XXX in d ica
la m a rca d e in t e rro g a ció n q u e q u e re m o s s e le ccio n a r, y e l s e g u n d o a rg u m e n t o e l va lo r q u e q u e re m o s
p o n e rle . El s ig u ie n t e e je m p lo s e le ccio n a la s e g u n d a m a rca d e in t e rro g a ció n co n e l s t rin g
"Co lo m b ia n ":
updateSales.setString(2, "Colombian");
De s p u é s d e q u e e s t o s va lo re s h a ya n s id o a s ig n a d o s p a ra s u s d o s p a rá m e t ro s , la s e n t e n cia S QL d e
u p d a t e S a le s s e rá e q u iva le n t e a la s e n t e n cia S QL q u e h a y e n s t rin g u p d a t e S t rin g q u e u t iliza n d o
e n e l e je m p lo a n t e rio r. Po r lo t a n t o , lo s d o s fra g m e n t o s d e có d ig o s ig u ie n t e s co n s ig u e n la m is m a
co s a :
Có d ig o 1 :

String updateString = "UPDATE COFFEES SET SALES = 75 " +


"WHERE COF_NAME LIKE 'Colombian'";
stmt.executeUpdate(updateString);
Có d ig o 2 :

PreparedStatement updateSales = con.prepareStatement(


"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate():
Ut iliza m o s e l m é t o d o e x e c u t e Up d a t e p a ra e je cu t a r a m b a s s e n t e n cia s s t m t u p d a t e S a le s .
Ob s e rva , s in e m b a rg o , q u e n o s e s u m in is t ra n a rg u m e n t o s a e x e c u t e Up d a t e cu a n d o s e u t iliza p a ra
e je cu t a r u p d a t e S a le s . Es t o e s cie rt o p o rq u e u p d a t e S a le s ya co n t ie n e la s e n t e n cia S QL a e je cu t a r.
Mira n d o e s t o e je m p lo s p o d ría m o s p re g u n t a rn o s p o r q u é u t iliza r u n o b je t o P re p a re d S t a t e m e n t co n
p a rá m e t ro s e n ve z d e u n a s im p le s e n t e n cia , ya q u e la s e n t e n cia s im p le im p lica m e n o s p a s o s . S i
a ct u a lizá ra m o s la co lu m n a S ALES s ó lo u n a o d o s ve ce s , n o s e ría n e ce s a rio u t iliza r u n a s e n t e n cia
S QL co n p a rá m e t ro s . S i p o r o t ro la d o , t u vie ra m o s q u e a ct u a liza rla fre cu e n t e m e n t e , p o d ría s e r m á s
fá cil u t iliza r u n o b je t o P re p a re d S t a t e m e n t , e s p e cia lm e n t e e n s it u a cio n e s cu a n d o la u t iliza m o s co n
u n b u cle wh ile p a ra s e le ccio n a r u n p a rá m e t ro a u n a s u ce s ió n d e va lo re s . Ve re m o s e s t e e je m p lo m á s
a d e la n t e e n e s t a s e cció n .
Un a ve z q u e a u n p a rá m e t ro s e h a a s ig n a d o u n va lo r, e l va lo r p e rm a n e ce h a s t a q u e lo re s e t e e o t ro
va lo r o s e lla m e a l m é t o d o c le a rP a ra m e t e rs . Ut iliza n d o e l o b je t o P re p a re d S t a t e m e n t :
u p d a t e S a le s , e l s ig u ie n t e fra g m e n t o d e có d ig o re u t iliza u n a s e n t e n cia p re p a re d d e s p u é s d e re s e t a r
e l va lo r d e u n o d e s u s p a rá m e t ro s , d e ja n d o e l o t ro ig u a l:

updateSales.setInt(1, 100);
updateSales.setString(2, "French_Roast");
updateSales.executeUpdate();
// changes SALES column of French Roast row to 100
updateSales.setString(2, "Espresso");
updateSales.executeUpdate();
// changes SALES column of Espresso row to 100 (the first
// parameter stayed 100, and the second parameter was reset
// to "Espresso")

Utilizar una Bucle para asignar Valores

No rm a lm e n t e s e co d ifica m á s s e n cillo u t iliza n d o u n b u cle fo r o w h ile p a ra a s ig n a r va lo re s d e lo s


p a rá m e t ro s d e e n t ra d a .
El s ig u ie n t e fra g m e n t o d e có d ig o d e m u e s t ra la u t iliza ció n d e u n b u cle fo r p a ra a s ig n a r lo s
p a rá m e t ro s e n u n o b je t o P re p a re d S t a t e m e n t : u p d a t e S a le s . El a rra y s a le s Fo rW e e k co n t ie n e la s
ca n t id a d e s ve n d id a s s e m a n a lm e n t e . Es t a s ca n t id a d e s co rre s p o n d e n co n lo s n o m b re s d e lo s ca fé s
lis t a d o s e n e l a rra y c o ffe e s , p o r e s o la p rim e ra ca n t id a d d e s a le s Fo rW e e k ( 1 7 5 ) s e a p lica a l
p rim e r n o m b re d e ca fé d e c o ffe e s ( "Co lo m b ia n ") , la s e g u n d a ca n t id a d d e s a le s Fo rW e e k ( 1 5 0 ) s e
a p lica a l s e g u n d o n o m b re d e ca fé e n c o ffe e s ( "Fre n c h _ Ro a s t ") , e t c. Es t e fra g m e n t o d e có d ig o
d e m u e s t ra la a ct u a liza ció n d e la co lu m n a S ALES p a ra t o d o s lo s ca fé s d e la t a b la COFFEES

PreparedStatement updateSales;
String updateString = "update COFFEES " +
"set SALES = ? where COF_NAME like ?";
updateSales = con.prepareStatement(updateString);int [] salesForWeek = {175, 150, 60,
155, 90};
String [] coffees = {"Colombian", "French_Roast", "Espresso",
"Colombian_Decaf", "French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
updateSales.setInt(1, salesForWeek[i]);
updateSales.setString(2, coffees[i]);
updateSales.executeUpdate();
}
Cu a n d o e l p ro p ie t a rio q u ie ra a ct u a liza r la s ve n t a s d e la s e m a n a s ig u ie n t e , p u e d e u t iliza r e l m is m o
có d ig o co m o u n a p la n t illa . To d o lo q u e t ie n e q u e h a ce s e s in t ro d u cir la s n u e va s ca n t id a d e s e n e l
o rd e n a p ro p ia d o e n e l a rra y s a le s Fo rW e e k . Lo s n o m b re s d e ca fé s d e l a rra y c o ffe e s p e rm a n e ce n
co n s t a n t e s , p o r e s o n o n e ce s it a n ca m b ia rs e . ( En u n a a p lica ció n re a l, lo s va lo re s p ro b a b le m e n t e
s e ría n in t ro d u cid o s p o r e l u s u a rio e n ve z d e d e s d e u n a rra y in icia liza d o ) .

Valores de retorno del método executeUpdate

S ie m p re q u e e x e c u t e Qu e ry d e vu e lve u n o b je t o Re s u lt S e t q u e co n t ie n e lo s re s u lt a d o s d e u n a
p e t ició n a l co n t ro la d o r d e la b a s e d a t o s , e l va lo r d e vu e lt o p o r e x e c u t e Up d a t e e s u n in t q u e in d ica
cu á n t a s lín e a s d e la t a b la fu e ro n a ct u a liza d a s . Po r e je m p lo , e l s ig u ie n t e có d ig o m u e s t ra e l va lo r d e
re t o rn o d e e x e c u t e Up d a t e a s ig n a d o a la va ria b le n :

updateSales.setInt(1, 50);
updateSales.setString(2, "Espresso");
int n = updateSales.executeUpdate();
// n = 1 because one row had a change in it
La t a b la COFFEES s e h a a ct u a lzia d o p o n ie n d o e l va lo r 5 0 e n la co lu m n a S ALES d e la fila
co rre s p o n d ie n t e a Es p re s s o . La a ct u a liza ció n a fe ct a s ó lo a u n a lín e a d e la t a b la , p o r e s o n e s ig u a l
a 1.
Cu a n d o e l m é t o d o e x e c u t e Up d a t e e s u t iliza d o p a ra e je cu t a r u n a s e n t e cia DDL, co m o la cre a ció n d e
u n a t a b la , d e vu e lve e l in t : 0 . Co n s e cu e n t e m e n t e , e n e l s ig u ie n t e fra g m e n t o d e có d ig o , q u e e je cu t a
la s e n t e n cia DDL u t iliza d a p ra cre a r la t a b la COFFEES , n t e n d rá e l va lo r 0 :

int n = executeUpdate(createTableCoffees); // n = 0
Ob s e rva q u e cu a n d o e l va lo r d e vu e lt o p o r e x e c u t e Up d a t e s e a 0 , p u e d e s ig n ifica r d o s co s a s : ( 1 ) la
s e n t e n cia e je cu t a d a n o h a a ct u a liza d o n in g u n a fila , o ( 2 ) la s e n t e n cia e je cu t a d a fu e u n a s e n t e n cia
DDL.

Oz it o
Utilizar Joins
Alg u n a s ve ce s n e ce s it a m o s u t iliza r u n a o m á s t a b la s p a ra o b t e n e r lo s d a t o s q u e q u e re m o s . Po r
e je m p lo , s u p o n g a m o s q u e e l p ro p ie t a rio d e l "Th e Co ffe e Bre a k" q u ie re u n a lis t a d e lo s ca fé s q u e le
co m p ra a Acm e , In c. Es t o im p lica in fo rm a ció n d e la t a b la COFFEES y t a m b ié n d e la q u e va m o s a
cre a r S UP P LI ERS . Es t e e s e l ca s o e n q u e s e n e ce s it a n lo s "jo in s " ( u n ió n ) . Un a u n ió n e s u n a
o p e ra ció n d e b a s e d e d a t o s q u e re la cio n a d o s o m á s t a b la s p o r m e d io d e lo s va lo re s q u e co m p a rt e n .
En n u e s t ro e je m p lo , la s t a b la s COFFEES y S UP P LI ERS t ie n e n la co lu m n a S UP _ I D , q u e p u e d e s e r
u t iliza d a p a ra u n irla s .
An t e s d e ir m á s a llá , n e ce s it a m o s cre a r la t a b la S UP P LI ERS y re lle n a rla co n va lo re s .
El s ig u e in t e có d ig o cre a la t a b la S UP P LI ERS :

String createSUPPLIERS = "create table SUPPLIERS " +


"(SUP_ID INTEGER, SUP_NAME VARCHAR(40), " +
"STREET VARCHAR(40), CITY VARCHAR(20), " +
"STATE CHAR(2), ZIP CHAR(5))";
stmt.executeUpdate(createSUPPLIERS);
El s ig u ie n t e có d ig o in s e rt a fila s p a ra t re s s u m in is t ra d o re s d e n t ro d e S UP P LI ERS :

stmt.executeUpdate("insert into SUPPLIERS values (101, " +


"'Acme, Inc.', '99 Market Street', 'Groundsville', " + "'CA',
'95199'");
stmt.executeUpdate("Insert into SUPPLIERS values (49," +
"'Superior Coffee', '1 Party Place', 'Mendocino', 'CA', " +
"'95460'");
stmt.executeUpdate("Insert into SUPPLIERS values (150, " +
"'The High Ground', '100 Coffee Lane', 'Meadows', 'CA', " +
"'93966'");
El s ig u ie n t e có d ig o s e le ccio n a la t a b la y n o s p e rm it e ve rla :

ResultSet rs = stmt.executeQuery("select * from SUPPLIERS");


El re s u lt a d o s e ría a lg o s im ila r a e s t o :
SUP_ID S UP_ NAME S TREET CITY S TATE ZIP
---------- - - - - - - - - - - - - - - - - - - - - - - --------------------- ---------------- --------- ---------
101 Acm e , In c. 9 9 Ma rke t S t re e t Gro u n d s ville CA 95199
49 S u p e rio r Co ffe e 1 Pa rt y Pla ce Me n d o cin o CA 95460
150 Th e Hig h Gro u n d 1 0 0 Co ffe e La n e Me a d o ws CA 93966

Ah o ra q u e t e n e m o s la s t a b la s COFFEES y S UP P LI ERS , p o d re m o s p ro ce d e r co n e l e s ce n a rio e n q u e


e l p ro p ie t a rio q u e ría u n a lis t a d e lo s ca fé s co m p ra d o s a u n s u m in is t ra d o r p a rt icu la r. Lo s n o m b re s d e
lo s s u m in s t ra d o re s e s t á n e n la t a b la S UP P LI ERS , y lo s n o m b re s d e lo s ca fé s e n la t a b la COFFEES .
Co m o a m b a s t a b la s t ie n e n la co lu m n a S UP _ I D , p o d e m o s u t iliza r e s t a co lu m n a e n u n a u n ió n . Lo
s ig u ie n t e q u e n e ce s it a m o s e s la fo rm a d e d is t in g u ir la co lu m n a S UP _ I D a la q u e n o s re fe rim o s . Es t o
s e h a ce p re ce d ie n d o e l n o m b re d e la co lu m n a co n e l n o m b re d e la t a b la , "COFFEES . S UP _ I D " p a ra
in d ica r q u e q u e re m o s re fe rirn o s a la co lu m n a S UP _ I D d e la t a b la COFFEES . En e l s ig u ie n t e có d ig o ,
d o n d e s t m t e s u n o b je t o S t a t e m e n t , s e le ccio n a m o s lo s ca fé s co m p ra d o s a Acm e , In c. :

String query = "


SELECT COFFEES.COF_NAME " +
"FROM COFFEES, SUPPLIERS " +
"WHERE SUPPLIERS.SUP_NAME LIKE 'Acme, Inc.'" +
"and SUPPLIERS.SUP_ID = COFFEES.SUP_ID";

ResultSet rs = stmt.executeQuery(query);
System.out.println("Coffees bought from Acme, Inc.: ");
while (rs.next()) {
String coffeeName = getString("COF_NAME");
System.out.println(" " + coffeeName);
}
Es t o p ro d u cirá la s ig u ie n t e s a lid a :

Coffees bought from Acme, Inc.:


Colombian
Colombian_Decaf

Oz it o
Utilizar Transaciones
Ha y ve ce s q u e n o q u e re m o s q u e u n a s e n t e n cia t e n g a e fe ct o a m e n o s q u e o t ra t a m b ié n
s u ce d a . Po r e je m p lo , cu a n d o e l p ro p ie t a rio d e l "Th e Co ffe e Bre a k" a ct u a liza la ca n t id a d d e
ca fé ve n d id a s e m a n a lm e n t e , t a m b ié n q u e rrá a ct u a liza r la ca n t id a d t o t a l ve n d id a h a s t a la
fe ch a . S in e m b a rg o , e l n o q u e rrá a ct u a liza r u n a s in a ct u a liza r la o t ra ; d e o t ro m o d o , lo s
d a t o s s e ría n in co n s is t e n t e s . La fo rm a p a ra a s e g u ra rn o s q u e o cu rre n la s d o s a ccio n e s o q u e
n o o cu rre n in g u n a e s u t iliza r u n a t ra n s a ció n . Un a t ra n s a ció n e s u n co n ju n t o d e u n a o m á s
s e n t e n cia s q u e s e e je cu t a n co m o u n a u n id a d , p o r e s o o s e e je cu t a n t o d a s o n o s e e je cu t a
n in g u n a .

Desactivar el modo Auto-entrega

Cu a n d o s e cre a u n a co n e xió n , e s t á e n m o d o a u t o - e n t re g a . Es t o s ig n ifica q u e ca d a s e n t e n cia


S QL in d ivid u a l e s t ra t a d a co m o u n a t ra n s a ció n y s e rá a u t o m á t ica m e n t e e n t re g a d a ju s t o
d e s p u é s d e s e r e je cu t a d a . ( Pa ra s e r m á s p re cis o , p o r d e fe ct o , u n a s e n t e n cia S QL s e rá
e n t re g a d a cu a n d o e s t á co m p le t a , n o cu a n d o s e e je cu t a . Un a s e n t e n cia e s t á co m p le t a
cu a n d o t o d a s s u s h o ja s d e re s u lt a d o s y cu e n t a s d e a ct u a liza ció n h a n s id o re cu p e ra d a s . S in
e m b a rg o , e n la m a yo ría d e lo s ca s o s , u n a s e n t e n cia e s t á co m p le t a , y p o r lo t a n t o ,
e n t re g a d a , ju s t o d e s p u é s d e s e r e je cu t a d a ) .
La fo rm a d e p e rm it ir q u e d o s o m á s s e n t e n cia s e a n a g ru p a d a s e n u n a t ra n s a ció n e s
d e s a ct iva r e l m o d o a u t o - e n t re g a . Es t o s e d e m u e s t ra e n e l s ig u ie n t e có d ig o , d o n d e c o n e s
u n a co n e xió n a ct iva :

con.setAutoCommit(false);

Entregar una Transación

Un a ve z q u e s e h a d e s a ct iva d o la a u t o - e n t re g a , n o s e e n t re g a rá n in g u n a s e n t e n cia S QL
h a s t a q u e lla m e m o s e xp lícit a m e n t e a l m é t o d o c o m m it . To d a s la s s e n t e n cia s e je cu t a d a s
d e s p u é s d e la a n t e rio r lla m a d a a l m é t o d o c o m m it s e rá n in clu id a s e n la t ra n s a ció n a ct u a l y
s e rá n e n t re g a d a s ju n t a s co m o u n a u n id a d . El s ig u ie n t e có d ig o , e n e l q u e c o n e s u n a
co n e xió n a ct iva , ilu s t ra u n a t ra n s a ció n :

con.setAutoCommit(false);
PreparedStatement updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
updateSales.setInt(1, 50);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();
PreparedStatement updateTotal = con.prepareStatement(
"UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?");
updateTotal.setInt(1, 50);
updateTotal.setString(2, "Colombian");
updateTotal.executeUpdate();
con.commit();
con.setAutoCommit(true);
En e s t e e je m p lo , e l m o d o a u t o - e n t re g a s e d e s a ct iva p a ra la co n e xió n c o n , lo q u e s ig n ifica
q u e la s d o s s e n t e n cia s p re p a re d u p d a t e S a le s y u p d a t e To t a l s e rá n e n t re g a d a s ju n t a s
cu a n d o s e lla m e a l m é t o d o c o m m it . S ie m p re q u e s e lla m e a l m é t o d o c o m m it ( b ie n
a u t o m á t ica m e n t e , cu a n d o e s t á a ct iva d o e l m o d o a u t o - co m m it o e xp lícit a m e n t e cu a n d o e s t á
d e s a ct iva d o ) , t o d o s lo s ca m b io s re s u lt a n t e s d e la s s e n t e n cia s d e la t ra n s a ció n s e rá n
p e rm a n e n t e s . En e s t e ca s o , s ig n ifica q u e la s co lu m n a s S ALES y TOTAL p a ra e l ca fé
Co lo m b ia n h a n s id o ca m b ia d a s a 5 0 ( s i TOTAL h a s id o 0 a n t e rio rm e n t e ) y m a n t e n d rá e s t e
va lo r h a s t a q u e s e ca m b ie co n o t ra s e n t e n cia d e a ct u a liza ció n .
La lín e a fin a l d e l e je m p lo a n t e rio r a ct iva e l m o d o a u t o - co m m it , lo q u e s ig n ifica q u e ca d a
s e n t e n cia s e rá d e n u e vo e n t re g a d a a u t o m á t ica m e n t e cu a n d o e s t é co m p le t a . Vo lve m o s p o r
lo t a n t o a l e s t a d o p o r d e fe ct o , e n e l q u e n o t e n e m o s q u e lla m a r a l m é t o d o c o m m it . Es
b u e n o d e s a ct iva r e l m o d o a u t o - co m m it s ó lo m ie n t ra s q u e ra m o s e s t a r e n m o d o t ra n s a ció n .
De e s t a fo rm a , e vit a m o s b lo q u e a r la b a s e d e d a t o s d u ra n t e va ria s s e n t e n cia s , lo q u e
in cre m e n t a lo s co n flict o s co n o t ro s u s u a rio s .

Utilizar Transaciones para Preservar al Integridad de los Datos

Ad e m á s d e a g ru p a r la s s e n t e n cia s p a ra e je cu t a rla s co m o u n a u n id a d , la s t ra n s a cio n e s


p u e d e n a yu d a rn o s a p re s e rva r la in t e g rid a d d e lo s d a t o s d e u n a t a b la . Po r e je m p lo ,
s u p o n g a m o s q u e u n e m p le a d o s e h a p ro p u e s t o in t ro d u cir lo s n u e vo s p re cio s d e lo s ca fé s e n
la t a b la COFFEES p e ro lo re t ra s a u n o s d ía s . Mie n t ra s t a n t o , lo s p re cio s h a n s u b id o , y h o y e l
p ro p ie t a rio e s t á in t ro d u cie n d o lo s n u e vo s p re cio s . Fin a lm e n t e e l e m p le a d o e m p ie za a
in t ru d ir lo s p re cio s a h o ra d e s fa s a d o s a l m is m o t ie m p o q u e e l p ro p ie t a rio in t e n t a a ct u a liza r la
t a b la . De s p u é s d e in s e rt a r lo s p re cio s d e s fa s a d o s , e l e m p le a d o s e d a cu e n t a d e q u e ya n o
s o n vá lid o s y lla m a e l m é t o d o ro llb a c k d e la Co n n e c t io n p a ra d e s h a ce r s u s e fe ct o s . ( El
m é t o d o ro llb a c k a b o rt a la t ra n s a ció n y re s t a u ra lo s va lo re s q u e h a b ía a n t e s d e in t e n t a r la
a ct u a lzia ció n . Al m is m o t ie m p o , e l p ro p ie t a rio e s t á e je cu t a n d o u n a s e n t e n cia S ELECT e
im p rim e lo s n u e vo s p re cio s . En e s t a s it u a ció n , e s p o s ib le q u e e l p ro p ie t a rio im p rim a lo s
p re cio s q u e m á s t a rd e s e ría n d e vu e lt o s a s u s va lo re s a n t e rio re s , h a cie n d o q u e lo s p re cio
im p re s o s s e a n in co rre ct o s .
Es t a cla s e d e s it u a cio n e s p u e d e e vit a rs e u t iliza n d o Tra n s a cio n e s . S i u n co n t ro la d o r d e b a s e
d e d a t o s s o p o rt a t ra n s a cio n e s , y ca s i t o d o s lo h a ce n , p ro p o rcio n a rá a lg ú n n ive l d e
p ro t e cció n co n t ra co n flict o s q u e p u e d e n s u rg ir cu a n d o d o s u s u a rio s a cce d e n a lo s d a t o s a la
m is m a ve z.
Pa ra e vit a r co n flict o s d u ra n t e u n a t ra n s a ció n , u n co n t ro la d o r d e b a s e d e d a t o s u t iliza
b lo q u e o s , m e ca n is m o s p a ra b lo q u e a r e l a cce s o d e o t ro s a lo s d a t o s q u e e s t á n s ie n d o
a cce d id o s p o r u n a t ra n s a ció n . ( Ob s e rva q u e e n e l m o d o a u t o - co m m it , d o n d e ca d a s e n t e n cia
e s u n a t ra n s a ció n , e l b lo q u e o s ó lo s e m a n t ie n e d u ra n t e u n a s e n t e n cia ) . Un a ve z a ct iva d o , e l
b lo q u e o p e rm a n e ce h a s t a q u e la t ra n s a ció n s e a e n t re g a d a o a n u la d a . Po r e je m p lo , u n
co n t ro la d o r d e b a s e d e d a t o s p o d ría b lo q u e a r u n a fila d e u n a t a b la h a s t a q u e la
a ct u a liza ció n s e h a ya e n t re g a d o . El e fe ct o d e e s t e b lo q u e o e s e vit a r q u e u s u a rio o b t e n g a
u n a le ct u ra s u cia , e s t o e s , q u e le a u n va lo r a n t e s d e q u e s e a p e rm a n e n t e . ( Acce d e r a u n
va lo r a ct u a liza d o q u e n o h a ya s id o e n t re g a d o s e co n s id e ra u n a le ct u ra s u cia p o rq u e e s
p o s ib le q u e e l va lo r s e a d e vu e lt o a s u va lo r a n t e rio r. S i le e m o s u n va lo r q u e lu e g o e s
d e vu e lt o a s u va lo r a n t ig u o , h a b re m o s le íd o u n va lo r n u lo ) .
La fo rm a e n q u e s e co n fig u ra n lo s b lo q u e o s e s t á d e t e rm in a d o p o r lo q u e s e lla m a n ive l d e
a is la m ie n t o d e t ra n s a ció n , q u e p u d e va ria r d e s d e n o s o p o rt a r t ra n s a cio n e s e n a b s o lu t o a
s o p o rt a r t o d a s la s t ra n s a cio n e s q u e fu e rza n u n a re g la s d e a cce s o m u y e s t rict a s .
Un e je m p lo d e n ive l d e a is la m ie n t o d e t ra n s a ció n e s TRAN S ACTI ON _ READ _ COMMI TTED ,
q u e n o p e rm it e q u e s e a cce d a a u n va lo r h a s t a q u e h a ya s id o e n t re g a d o . En o t ra s p a la b ra s ,
s i n ive l d e a is la m ie n t o d e t ra n s a ció n s e s e le ccio n a a TRAN S ACTI ON _ READ _ COMMI TTED ,
e l co n t ro la d o r d e la b a s e d e d a t o s n o p e rm it irá q u e o cu rra n le ct u ra s s u cia s . El in t e rfa ce
Co n n e c t io n in clu ye cin co va lo re s q u e re p re s e n t a n lo s n ive le s d e a is la m ie n t o d e t ra n s a ció n
q u e s e p u e d e n u t iliza r e n JDBC.
No rm a lm e n t e , n o s e n e ce s it a ca m b ia r e l n ive l d e a is la m ie n t o d e t ra n s a ció n ; p o d e m o s
u t iliza r e l va lo r p o r d e fe ct o d e n u e s t ro co n t ro la d o r. JDBC p e rm it e a ve rig u a r e l n ive l d e
a is la m ie n t o d e t ra n s a ció n d e n u e s t ro co n t ro la d o r d e la b a s e d e d a t o s ( u t iliza n d o e l m é t o d o
g e t Tra n s a c t io n I s o la t io n d e Co n n e c t io n ) y p e rm it e co n fig u ra rlo a o t ro n ive l ( u t iliza n d o e l
m é t o d o s e t Tra n s a c t io n I s o la t io n d e Co n n e c t io n ) . S in e m b a rg o , t e n e n cu e n t a , q u e
a u n q u e JDBC p e rm it e s e le ccio n a r u n n ive l d e a is la m ie n t o , h a ce r e s t o n o t e n d rá n in g ú n
e fe ct o a n o s e r q u e e l d rive r d e l co n t ro la d o r d e la b a s e d e d a t o s lo s o p o rt e .

Cuándo llamar al método rollback

Co m o s e m e n cio n ó a n t e rio rm e n t e , lla m a r a l m é t o d o ro llb a c k a b o rt a la t ra n s a ció n y


d e vu e lve cu a lq u ie r va lo r q u e fu e ra m o d ifica d o a s u s va lo re s a n t e rio re s . S i e s t a m o s
in t e n t a n d o e je cu t a r u n a o m á s s e n t e n cia s e n u n a t ra n s a ció n y o b t e n e m o s u n a
S QLEx c e p t io n , d e b e ría m o s lla m a r a l m é t o d o ro llb a c k p a ra a b o rt a r la t ra n s a ció n y
e m p e za rla d e n u e vo . Es t a e s la ú n ica fo rm a p a ra a s e g u ra rn o s d e cu á l h a s id o e n t re g a d a y
cu á l n o h a s id o e n t re g a d a . Ca p t u ra r u n a S QLEx c e p t io n n o s d ice q u e h a y a lg o e rró n e o ,
p e ro n o n o s d ice s i fu e o n o fu e e n t re g a d a . Co m o n o p o d e m o s co n t a r co n e l h e ch o d e q u e
n a d a fu e e n t re g a d o , lla m a r a l m é t o d o ro llb a c k e s la ú n ica fo rm a d e a s e g u ra rn o s .

Oz it o
Procedimientos Almacenados
Un p ro ce d im ie n t o a lm a ce n a d o e s u n g ru p o d e s e n t e n cia s S QL q u e fo rm a n u n a
u n id a d ló g ica y q u e re a liza n u n a t a re a p a rt icu la r. Lo s p ro ce d im ie n t o s a lm a ce n a d o s
s e u t iliza n p a ra e n ca p s u la r u n co n ju n t o d e o p e ra cio n e s o p e t icio n e s p a ra e je cu t a r
e n u n s e rvid o r d e b a s e d e d a t o s . Po r e je m p lo , la s o p e ra cio n e s s o b re u n a b a s e d e
d a t o s d e e m p le a d o s ( s a la rio s , d e s p id o s , p ro m o cio n e s , b lo q u e o s ) p o d ría n s e r
co d ifica d o s co m o p ro ce d im ie n t o s a lm a ce n a d o s e je cu t a d o s p o r e l có d ig o d e la
a p lica ció n . Lo s p ro ce d im ie n t o s a lm a ce n a d o s p u e d e n co m p ila rs e y e je cu t a rs e co n
d ife re n t e s p a rá m e t ro s y re s u lt a d o s , y p o d ría n t e n e r cu a lq u ie r co m b in a ció n d e
p a rá m t ro s d e e n t ra d a / s a lid a .
Lo s p ro ce d im ie n t o s a lm a ce n a d o s e s t á n s o p o rt a d o s p o r la m a yo ría d e lo s
co n t ro la d o re s d e b a s e s d e d a t o s , p e ro e xis t e u n a g ra n ca n t id a d d e va ria cio n e s e n
s u s ín t a xis y ca p a cid a d e s . Po r e s t a ra zó n , s ó lo m o s t ra re m o s u n e je m p lo s e n cillo d e
lo q u e p o d ría s e r u n p ro ce d im ie n t o a lm a ce n a d o y có m o lla m a rlo s d e s d e JDBC, p e ro
e s t e e je m p lo n o e s t á d is e ñ a d o p a ra e je cu t a rs e .

Oz it o
Sentencias SQL para crear un Procedimiento Almacenado
Es t a p á g in a m u e s t ra u n p ro ce d im ie n t o a lm a ce n a d o m u y s e n cillo q u e n o t ie n e p a rá m e t ro s .
Au n q u e la m a yo ría d e lo s p ro ce d im ie n t o s a lm a ce n a d o s h a ce n co s a s m á s co m p le ja s q u e e s t e
e je m p lo , s irve p a ra ilu s t ra r a lg u n o s p u n t o s b á s ico s s o b re e llo s . Co m o p a s o p ré vio , la s in t a xis
p a ra d e fin ir u n p ro ce d im ie n t o a lm a ce n a d o e s d ife re n t e d e u n co n t ro la d o r d e b a s e d e d a t o s a
o t ro . Po r e je m p lo , a lg u n o s u t iliza n b e g in . . . e n d u o t ra s p a la b ra s cla ve p a ra in d ica r e l
p rin cip io y fin a l d e la d e fin ició n d e p ro ce d im ie n t o . En a lg u n o s co n t ro la d o re s , la s ig u ie n t e
s e n t e n cia S QL cre a u n p ro ce d im ie n t o a lm a ce n a d o :

create procedure SHOW_SUPPLIERS


as
select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME
from SUPPLIERS, COFFEES
where SUPPLIERS.SUP_ID = COFFEES.SUP_ID
order by SUP_NAME
El s ig u ie n t e có d ig o p o n e la s e n t e n cia S QL d e n t ro d e u n s t rin g y lo a s ig n a a la va ria b le
c re a t e P ro c e d u re , q u e u t iliza re m o s m á s a d e la n t e :

String createProcedure = "create procedure SHOW_SUPPLIERS " +


"as " +
"select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +
"from SUPPLIERS, COFFEES " +
"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
"order by SUP_NAME";
El s ig u ie n t e fra g m e n t o d e có d ig o u t iliza e l o b je t o Co n n e c t io n , c o n p a ra cre a r u n o b je t o
S t a t e m e n t , q u e e s u t iliza d o p a ra e n via r la s e n t e n cia S QL q u e cre a e l p ro ce d im ie n t o
a lm a ce n a d o e n la b a s e d e d a t o s :

Statement stmt = con.createStatement();


stmt.executeUpdate(createProcedure);
El p ro ce d im ie n t o S HOW _ S UP P LI ERS s e rá co m p ila d o y a lm a ce n a d o e n la b a s e d e d a t o s co m o
u n o b je t o d e la p ro p ia b a s e y p u e d e s e r lla m a d o , co m o s e lla m a ría a cu a lq u ie r o t ro m é t o d o .

Llamar a un Procedimiento Almacenado desde JDBC

JDBC p e rm it e lla m a r a u n p ro ce d im ie n t o a lm a ce n a d o e n la b a s e d e d a t o s d e s d e u n a a p lica ció n


e s crit a e n Ja va . El p rim e r p a s o e s cre a r u n o b je t o Ca lla b le S t a t e m e n t . Al ig u a l q u e co n lo s
o b je t o s S t a t e m e n t y P re p a re d S t a t e m e n t , e s t o s e h a ce co n u n a co n e xió n a b ie rt a ,
Co n n e c t io n . Un o b je t o Ca lla b le S t a t e m e n t co n t ie n e u n a lla m a d a a u n p ro ce d im ie n t o
a lm a ce n a d o ; n o co n t ie n e e l p ro p io p ro ce d im ie n t o . La p rim e ra lín e a d e l có d ig o s ig u ie n t e cre a
u n a lla m a d a a l p ro ce d im ie n t o a lm a ce n a d o S HOW _ S UP P LI ERS u t iliza n d o la co n e xió n c o n . La
p a rt e q u e e s t á e n ce rra d a e n t re co rch e t e s e s la s in t a xis d e e s ca p e p a ra lo s p re ce d im ie n t o s
a lm a ce n a d o s . Cu a n d o u n co n t ro la d o r e n cu e n t ra "{ c a ll S HOW _ S UP P LI ERS } ", t ra d u cirá e s t a
s in t a xis d e e s ca p e a l S QL n a t ivo u t iliza d o e n la b a s e d e d a t o s p a ra lla m a r a l p ro ce d im ie n t o
a lm a ce n a d o lla m a d o S HOW _ S UP P LI ERS :

CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}");


ResultSet rs = cs.executeQuery();
La h o ja d e re s u lt a d o s d e rs s e rá s im ila r a e s t o :
SUP_NAME COF_NAME
---------------- -----------------------
Acme, Inc. Colombian
Acme, Inc. Colombian_Decaf
Superior Coffee French_Roast
Superior Coffee French_Roast_Decaf
The High Ground Espresso
Ob s e rva q u e e l m é t o d o u t iliza d o p a ra e je cu t a r c s e s e x e c u t e Qu e ry p o rq u e c s lla m a a u n
p ro ce d im ie n t o a lm a ce n a d o q u e co n t ie n e u n a p e t ició n y e s t o p ro d u ce u n a h o ja d e re s u lt a d o s .
S i e l p ro ce d im ie n t o h u b ie ra co n t e n id o u n a s e n t e n cia d e a ct u a lzia ció n o u n a s e n t e n cia DDL, s e
h u b ie ra u t iliza d o e l m é t o d o e x e c u t e Up d a t e . S in e m b a rg o , e n a lg u n o s ca s o s , cu a n d o e l
p ro ce d im ie n t o a lm a ce n a d o co n t ie n e m á s d e u n a s e n t e n cia S QL p ro d u cirá m á s d e u n a h o ja d e
re s u lt a d o s , o cu a n d o co n t ie n e m á s d e u n a cu e n t a d e a ct u a liza ció n m o a lg u n a co m b in a ció n d e
h o ja s d e re s u lt a d o s y a ct u a liza cio n e s . e n e s t o s ca s o s , d o n d e e xis t e n m ú lt ip le s re s u lt a d o s , s e
d e b e ría u t iliza r e l m é t o d o e x e c u t e p a ra e je cu t a r Ca lla b le S t a t e m e n t .
La cla s e Ca lla b le S t a t e m e n t e s u n a s u b cla s e d e P re p a re d S t a t e m e n t , p o r e s o u n o b je t o
Ca lla b le S t a t e m e n t p u e d e t o m a r p a rá m e t ro s d e e n t ra d a co m o lo h a ría u n o b je t o
P re p a re d S t a t e m e n t . Ad e m á s , u n o b je t o Ca lla b le S t a t e m e n t p u e d e t o m a r p a rá m e t ro s d e
s a lid a , o p a rá m e t ro s q u e s o n t a n t o d e e n t ra d a co m o d e s a lid a . Lo s p a rá m e t ro s INOUT y e l
m é t o d o e x e c u t e s e u t iliza n ra ra m e n t e .

Oz it o
Crear Aplicaciones JDBC Completas
Ha s t a a h o ra s ó lo h e m o s vis t o fra g m e n t o s d e có d ig o . Má s a d e la n t e ve re m o s p ro g ra m a s d e e je m p lo q u e
s o n a p lica cio n e s co m p le t a s q u e p o d re m o s e je cu t a r.
El p rim e r có d ig o d e e je m p lo cre a la t a b la COFFEES ; e l s e g u n d o in s e rt a va lo re s e n la t a b la e im p rim e lo s
re s u lt a d o s d e u n a p e t ició n . La t e re ce ra a p lica ció n cre a la t a b la S UP P LI ERS , y e l cu a rt o la re lle n a co n
va lo re s . De s p u é s d e h a b e r e je cu t a d o e s t e có d ig o , p o d e m o s in t e n t a r u n a p e t ició n q u e u n a la s t a b la s
COFFEES y S UP P LI ERS , co m o e n e l q u in t o có d ig o d e e je m p lo . El s e xt o e je m p lo d e có d ig o e s u n a
a p lica ció n q u e d e m u e s t ra u n a t ra n s a ció n y t a m b ié n m u e s t ra co m o co n fig u ra r la s p o s icio n e s d e lo s
p a rá m e t ro s e n u n o b je t o P re p a re d S t a t e m e n t u t iliza n d o u n b u cle fo r.
Co m o s o n a p lica cio n e s co m p le t a s , in clu ye n a lg u n o s e le m e n t o s d e l le n g u a je Ja va q u e n o h e m o s vis t o e n
lo s fra g m e n t o s a n t e rio re s . Aq u í e xp lica re m o s e s t o s e le m e n t o s b re ve m e n t e .

Poner Código en una Definición de Clase

En e l le n g u a je Ja va , cu a lq u ie r có d ig o q u e q u e rra m o s e je cu t a r d e b e e s t a r d e n t ro d e u n a
d e fin ició n d e cla s e . Te cle a m o s la d e fin ició n d e cla s e e n u n fich e ro y a é s t e le d a m o s e l n o m b re
d e la cla s e co n la e xt e n s ió n . ja v a . Po r e s o s i t e n e m o s u n a cla s e lla m a d a My S QLS t a t e m e n t ,
s u d e fin ició n d e b e ría e s t a r e n u n fich e ro lla m a d o My S QLS t a t e m e n t . ja v a

Importar Clases para Hacerlas Visibles

Lo p rim e ro e s im p o rt a r lo s p a q u e t e s o cla s e s q u e s e va n a u t iliza r e n la n u e va cla s e . To d a s la s


cla s e s d e n u e s t ro s e je m p lo s u t iliza n e l p a q u e t e ja v a . s q l ( e l API JDBC) , q u e s e h a ce vis ib le
cu a n d o la s ig u ie n t e lín e a d e có d ig o p re ce d e a la d e fin ició n d e cla s e :

import java.sql.*;
El a s t e ris co ( * ) in d ica q u e t o d a s la s cla s e s d e l p a q u e t e ja v a . s q l s e rá n im p o rt a d a s . Im p o rt a r
u n a cla s e la h a ce vis ib le y s ig n ifica q u e n o t e n d re m o s q u e e s crib ir s u n o m b re t o t a lm e n t e
cu a lifica d o cu a n d o u t ilice m o s u n m é t o d o o u n ca m p o d e e s a cla s e . S i n o in clu im o s "im p o rt
ja v a . s q l. * ;" e n n u e s t ro có d ig o , t e n d ría m o s q u e e s crib ir "ja v a . s q l. " m á s e l n o m b re d e la cla s e
d e la n t e d e t o d o s lo s ca m p o s o m é t o d o s JDBC q u e u t ilice m o s ca d a ve z q u e lo s u t ilice m o s .
Ob s e rva q u e t a m b ié n p o d e m o s im p o rt a r cla s e s in d ivid u a le s s e le ct iva m e n t e e n ve z d e im p o rt a r
u n p a q u e t e co m p le t o . Ja va n o re q u ie re q u e im p o rt e m o s cla s e s o p a q u e t e s , p e ro a l h a ce rlo e l
có d ig o s e h a ce m u ch o m á s co n ve n ie n t e .
Cu a lq u ie r lín e a q u e im p o rt e cla s e s a p a re ce e n la p a rt e s u p e rio r d e lo s e je m p lo s d e có d ig o , q u e
e s d o n d e d e b e n e s t a r p a ra h a ce r vis ib le s la s cla s e s im p o rt a d a s a la cla s e q u e e s t á s ie n d o
d e fin id a . La d e fin ició n re a l d e la cla s e s ig u e a cu a lq u ie r lín e a q u e im p o rt e cla s e s .

Utilizar el Método main()

S i u n a cla s e s e va a e je cu t a r, d e b e co n t e n e r u n m é t o d o s t a t ic p u b lic m a in . Es t e m é t o d o
vie n e ju s t o d e s p u é s d e la lín e a q u e d e cla ra la cla s e y lla m a a lo s o t ro s m é t o d o s d e la cla s e . La
p a la b ra cla ve s t a t ic in d ica q u e e s t e m é t o d o o p e ra a n ive l d e cla s e e n ve z s o b re e je m p la re s
in d ivid u a le s d e la cla s e . La p a la b ra cla ve p u b lic s ig n ifica q u e lo s m ie m b ro s d e cu a lq u ie r cla s e
p u e d e n a cce d e r a e s t e m é t o d o . Co m o n o e s t a m o s d e fin ie n d o cla s e s s ó lo p a ra s e r e je cu t a d a s
p o r o t ra s cla s e s s in o q u e q u e re m o s e je cu t a rla s , la s a p lica cio n e s d e e je m p lo d e e s t e ca p ít u lo
in clu ye n u n m é t o d o m a in .

Utilizar bloques try y catch

Alg o q u e t a m b ié n in clu ye n t o d a s la s a p lica cio n e s d e e je m p lo s o n lo s b lo q u e s t ry y c a t c h . Es t e


e s u n m e ca n is m o d e l le n g u a je Ja va p a ra m a n e ja r e xce p cio n e s . Ja va re q u ie re q u e cu a n d o u n
m é t o d o la n za u n e xce p ció n e xis t a u n m e ca n is m o q u e la m a n e je . Ge n e ra lm e n t e u n b lo q u e
c a t c h ca p t u ra rá la e xce p ció n y e s p e cifica rá lo q u e s u ce d e rá ( q u e p o d ría s e r n o h a ce r n a d a ) . En
e l có d ig o d e e je m p lo , u t iliza m o s d o s b lo q u e s t ry y d o s b lo q u e s c a t c h . El p rim e r b lo q u e t ry
co n t ie n e e l m é t o d o Cla s s . fo rN a m e , d e l p a q u e t e ja v a . la n g . Es t e m é t o d o la n za u n a
Cla s s N o t Fo u n d Ex c e p t io n , p o r e s o e l b lo q u e c a t c h q u e le s ig u e m a n e ja e s a e xce p ció n . El
s e g u n d o b lo q u e t ry co n t ie n e m é t o d o s JDBC, t o d o s e llo s la n za n S QLEx c e p t io n , p o r e s o e l
b lo q u e c a t c h d e l fin a l d e la a p lica ció n p u e d e m a n e ja r e l re s t o d e la s e xce p cio n e s q u e p o d ría n
la n za rs e ya q u e t o d a s s e ría n o b je t o s S QLEx c e p t io n .

Recuperar Excepciones

JDBC p e rm it e ve r lo s a vis o s y e xce p cio n e s g e n e ra d o s p o r n u e s t ro co n t ro la d o r d e b a s e d e d a t o s


y p o r e l co m p ila d o r Ja va . Pa ra ve r la s e xce p cio n e s , p o d e m o s t e n e r u n b lo q u e c a t c h q u e la s
im p rim a . Po r e je m p lo , lo s d o s b lo q u e s c a t c h d e l s ig u ie n t e có d ig o d e e je m p lo im p rim e n u n
m e n s a je e xp lica n d o la e xce p ció n :

try {
// Aquí va el código que podría generar la excepción.
// Si se genera una excepción, el bloque catch imprimirá
// información sobre ella.
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}

try {
Class.forName("myDriverClassName");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
S i e je cu t a rá m o s Cre a t e COFFEES . ja v a d o s ve ce s , o b t e n d ría m o s u n m e n s a je d e e rro r s im ila r a
é ste :

SQLException: There is already an object named 'COFFEES' in the database.


Severity 16, State 1, Line 1
Es t e e je m p lo ilu s t ra la im p re s ió n d e l co m p o n e n t e m e n s a je d e u n o b je t o S QLEx c e p t io n , lo q u e
e s s u ficie n t e p a ra la m a yo ría d e la s s it u a cio n e s .
S in e m b a rg o , re a lm e n t e e xis t e n t re s co m p o n e n t e s , y p a ra s e r co m p le t o s , p o d e m o s im p rim irlo s
t o d o s . El s ig u ie n t e fra g m e n t o d e có d ig o m u e s t ra u n b lo q u e c a t c h q u e s e h a co m p le t a d o d e d o s
fo rm a s . Prim e ro , im p rim e la s t re s p a rt e s d e u n o b je t o S QLEx c e p t io n : e l m e n s a je ( u n s t rin g
q u e d e s crib e e l e rro r) , e l S QLS t a t e ( u n s t rin g q u e id e n t ifica e l e rro r d e a cu e rd o a lo s
co n ve n cio n e s X/ Op e n d e S QLS t a t e ) , y u n có d ig o d e e rro r d e l ve n d e d o r ( u n n ú m e ro q u e e s e l
có d ig o d e e rro r d e l ve n d e d o r d e l d rive r) . El o b je t o S QLEx c e p t io n , e x e s ca p t u ra d o y s e
a cce d e a s u s t re s co m p o n e n t e s co n lo s m é t o d o s g e t Me s s a g e , g e t S QLS t a t e , y
g e t Erro rCo d e .
La s e g u n d a fo rm a d e l s ig u ie n t e b lo q u e c a t c h co m p le t o o b t ie n e t o d a s la s e xe p cio n e s q u e
p o d ría n h a b e r s id o la n za d a . S i h a y u n a s e g u n d a e xce p ció n , s e ría e n ca d e n a d a a e x , p o r e s o s e
lla m a a e x . g e t N e x t Ex c e p t io n p a ra ve r s i h a y m á s e xce p cio n e s . S i la s h a y, e l b u cle w h ile
co n t in ú a e im p rim e e l m e n s a je d e la s ig u ie n t e e xce cp ció n , e l S QLS t a t e , y e l có d ig o d e e rro r d e l
ve n d e d o r. Es t o co n t in ú a h a s t a q u e n o h a ya m á s e xce p cio n e s .

try {
// Aquí va el código que podría generar la excepción.
// Si se genera una excepción, el bloque catch imprimirá
// información sobre ella.
} catch(SQLException ex) {
System.out.println("\n--- SQLException caught ---\n");
while (ex != null) {
System.out.println("Message: " + ex.getMessage ());
System.out.println("SQLState: " + ex.getSQLState ());
System.out.println("ErrorCode: " + ex.getErrorCode ());
ex = ex.getNextException();
System.out.println("");
}
}
S i h u b ie ra m o s s u s t it u id o e l b lo q u e c a t c h a n t e rio r e n e l Có d ig o d e e je m p lo 1 ( Cre a t e Co ffe e s )
y lo h u b ie ra m o s e je cu t a d o d e s p u é s d e q u e la t a b la COFFEES ya s e h u b ie ra cre a d o ,
o b t e n d ría m o s la s ig u ie n t e in fo rm a ció n :

--- SQLException caught ---


Message: There is already an object named 'COFFEES' in the database.
Severity 16, State 1, Line 1
SQLState: 42501
ErrorCode: 2714
S QLS t a t e e s u n có d ig o d e fin id o e n X/ Op e n y ANS I- 9 2 q u e id e n t ifica la e xce p ció n . Aq u í
p o d e m o s ve r d o s e je m p lo s d e có d ig o s S QLS t a t e :

08001 -- No suitable driver


HY011 -- Operation invalid at this time
El có d ig o d e e rro r d e l ve n d e d o r e s e s p e cífico d e ca d a d rive r, p o r lo q u e d e b e m o s re vis a r la
d o cu m e n t a ció n d e l d rive r b u s ca n d o u n a lis t a co n e l s ig n ifica d o d e e s t o s có d ig o s d e e rro r.

Recuperar Avisos

Lo s o b je t o s S QLW a rn in g s o n u n a s u b cla s e d e S QLEx c e p t io n q u e t ra t a lo s a vis o s d e a cce s o s


a b a s e s d e d a t o s . Lo s Avis o s n o d e t ie n e n la e je cu ció n d e u n a a p lica ció n , co m o la s e xce p cio n e s ;
s im p le m e n t e a le rt a n a l u s u a rio d e q u e a lg o n o h a s a lid o co m o s e e s p e ra b a . Po r e je m p lo , u n
a vis o p o d ría h a ce rn o s s a b e r q u e u n p rivile g io q u e q u e ria m o s re vo ca r n o h a fu e re vo ca d o . O u n
a vis o p o d ría d e cirn o s q u e h a o cu rrid o a lg ú n e rro r d u ra n t e u n a p e t ició n d e d e s co n e xió n .
Un a vis o p u e d e re p o rt a rs e s o b re u n o b je t o Co n n e c t io n , u n o b je t o S t a t e m e n t ( in clu ye n d o
o b je t io s P re p a re d S t a t e m e n t y Ca lla b le S t a t e m e n t ) , o u n o b je t o Re s u lt S e t . Ca d a u n a d e
e s a s cla s e s t ie n e u n m é t o d o g e t W a rn in g s , a l q u e d e b e m o s lla m a r p a ra ve r e l p rim e r a vis o
re p o rt a d o e n la lla m a d a a l o b je t o . S i g e t W a rn in g s d e vu e lve u n a vis o , p o d e m o s lla m a r a l
m é t o d o g e t N e x t W a rn in g d e S QLW a rn in g p a ra o b t e n e r a vis o s a d icio n a le s . Al e je cu t a r u n a
s e n t e n cia s e b o rra n a u t o m á t ica m e n t e lo s a vis o s d e la s e n t e n cia a n t e rio r, p o r e s o n o s e a p ila n .
S in e m b a rg o , e s t o s ig n ifica q u e s i q u e re m o s re cu p e ra r lo s a vis o s re p o rt a d o s p o r u n a s e n t e n cia ,
d e b e m o s h a ce rlo a n t e s d e e je cu t a r o t ra s e n t e n cia .
El s ig u ie n t e fra g m e n t o d e có d ig o ilu s t ra co m o o b t e n e r in fo rm a ció n co m p le t a s o b re lo s a vis o s
re p o rt a d o s p o r e l o b je t o S t a t e m e n t , s t m t y t a m b ié n p o r e l o b je t o Re s u lt S e t , rs :

Statement stmt = con.createStatement();


ResultSet rs = stmt.executeQuery("select COF_NAME from COFFEES");
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
System.out.println("Coffees available at the Coffee Break: ");
System.out.println(" " + coffeeName);
SQLWarning warning = stmt.getWarnings();
if (warning != null) {
System.out.println("\n---Warning---\n");
while (warning != null) {
System.out.println("Message: " + warning.getMessage());
System.out.println("SQLState: " + warning.getSQLState());
System.out.print("Vendor error code: ");
System.out.println(warning.getErrorCode());
System.out.println("");
warning = warning.getNextWarning();
}
}
SQLWarning warn = rs.getWarnings();
if (warn != null) {
System.out.println("\n---Warning---\n");
while (warn != null) {
System.out.println("Message: " + warn.getMessage());
System.out.println("SQLState: " + warn.getSQLState());
System.out.print("Vendor error code: ");
System.out.println(warn.getErrorCode());
System.out.println("");
warn = warn.getNextWarning();
}
}
}
Lo s a vis o s n o s o n m u y co m u n e s , De a q u e llo s q u e s o n re p o rt a d o s , e l a vis o m á s co m ú n e s u n
D a t a Tru n c a t io n , u n a s u b cla s e d e S QLW a rn in g . To d o s lo s o b je t o s D a t a Tru n c a t io n t ie n e n u n
S QLS t a t e 0 1 0 0 4 , in d ica n d o q u e h a h a b id o u n p ro b le m a a l le e r o e s crib ir d a t o s . Lo s m é t o d o s
d e D a t a Tru n c a t io n p e rm it e n e n co n t ra r e n q u e co lu m n a o p a rá m e t ro s e t ru n ca ro n lo s d a t o s , s i
la ru p t u ra s e p ro d u jo e n u n a o p e ra ció n d e le ct u ra o d e e s crit u ra , cu á n t o s b yt e s d e b e ría n h a b e r
s id o t ra n s m it id o s , y cu á n t o s b yt e s s e t ra n s m it ie ro n re a lm e n t e .

Oz it o
Ejecutar las Aplicaciones de Ejemplo
Ah o ra e s t a m o s lis t o s p a ra p ro b a r a lg ú n có d ig o d e e je m p lo . El d ire ct o rio
b o o k . h t m l, co n t ie n e u n a a p lica ció n co m p le t a , e je cu t a b le , q u e ilu s t ra lo s co n ce p t o s
p re s e n t a d o s e n e s t e ca p ít u lo y e l s ig u ie n t e . Pu e d e s d e s ca rg a r e s t e co d ig o d e
e je m p lo d e l s it e d e JDBC s it u a d o e n :
h t t p : / / www. ja va s o ft . co m / p ro d u ct s / jd b c/ b o o k. h t m l

An t e s d e p o d e r e je cu t a r u n a d e e s a s a p lica cio n e s , n e ce s it a m o s e d it a r e l fich e ro


s u s t it u ye n d o la in fo rm a ció n a p ro p ia d a p a ra la s s ig u ie n t e s va ria b le s :
u rl
La URL JDBC, la s p a rt e s u n o y d o s s o n s u m in is t ra d a s p o r e l d rive r, y la
t e rce ra p a rt e e s p e cifica la fu e n t e d e d a t o s .
m y Lo g in
Tu n o m b re d e u s u a rio o lo g in .
m y P a s s w o rd
Tu p a s s wo rd p a ra e l co n t ro la d o r d e b a s e d e d a t o s .
m y D riv e r. Cla s s N a m e
El n o m b re d e cla s e s u m in is t ra d o co n t u d rive r
La p rim e ra a p lica ció n d e e je m p lo e s la cla s e Cre a t e Co ffe e s , q u e e s t á e n e l fich e ro
lla m a d o Cre a t e Co ffe e s . ja v a . Ab a jo t ie n e s la s in s t ru ccio n e s p a ra e je cu t a r
Cre a t e Co ffe e s . ja v a e n la s d o s p la t a fo rm a s p rin cip a le s .
La p rim e ra lín e a co m p ila e l có d ig o d e l fich e ro Cre a t e Co ffe e s . ja v a . S i la
co m p ila ció n t ie n e é xit o , s e p ro d u cirá u n fich e ro lla m a d o Cre a t e Co ffe e s . c la s s , q u e
co n t e n d rá lo s b yt e co d e s t ra d u cid o s d e s d e e l fich e ro Cre a t e Co ffe e s . ja v a . Es t o s
b yt e co d e s s e rá n in t e rp re t a d o s p o r la m á q u in a virt u a l Ja va , q u e e s la q u e h a ce
p o s ib le q u e e l có d ig o Ja va s e p u e d a e je cu t a r e n cu a lq u ie r m á q u in a q u e la t e n g a
in s t a la d a .
La s e g u n d a lín e a d e có d ig o e je cu t a e l có d ig o . Ob s e rva q u e s e u t iliza e l n o m b re d e
la cla s e , Cre a t e Co ffe e s , n o e l n o m b re d e l fich e ro Cre a t e Co ffe e s . c la s s .
UN I X

javac CreateCoffees.java
java CreateCoffees
W in d o w s 9 5 / N T

javac CreateCoffees.java
java CreateCoffees
Oz it o
Crear un Applet desde una Aplicación
S u p o n g a m o s q u e e l p ro p ie t a rio d e "Th e Co ffe e Bre a k" q u ie re m o s t ra r lo s p re cio s
a ct u a le s d e lo s ca fé s e n u n a p p le t e n s u p á g in a We b . Pu e d e a s e g u ra rs e d e q u e
e s t á m o s t ra n d o lo s p re cio s a ct u a le s h a cie n d o q u e a p p le t o b t e n g a lo s p re cio s
d ire ct a m e n t e d e s d e s u b a s e d e d a t o s .
Pa ra h a ce r e s t o n e ce s it a cre a r d o s fich e ro s d e có d ig o , u n o co n e l có d ig o d e l a p p le t
y o t ro co n e l có d ig o HTML. El có d ig o d e l a p p le t co n t ie n e e l có d ig o JDBC q u e p o d ría
a p a re ce r e n u n a a p lica ció n n o rm a l m á s e l có d ig o a d icio n a l p a ra e je cu t a r e l a p p le t y
m o s t ra r e l re s u lt a d o d e la p e t ició n a la b a s e d e d a t o s . En n u e s t ro e je m p lo e l có d ig o
d e l a p p le t e s t á e n e l fich e ro Ou t p u t Ap p le t . ja v a . Pa ra m o s t ra r e l a p p le t e n u n a
p á g in a HTML, e l fich e ro Ou t p u t Ap p le t . h t m l le d ice a l n a ve g a d o r q u é m o s t ra r y
d ó n d e m o s t ra rlo .
El re s t o d e e s t a p á g in a e xp lica rá a lg u n o s e le m e n t o s q u e s e e n cu e n t ra n e n e l
có d ig o d e l a p p le t y q u e n o e s t á n p re s e n t e s e n e l có d ig o d e la s a p lica cio n e s .
Alg u n o s d e e s t o s e je m p lo s in vo lu cra n a s p e ct o s a va n za d o s d e l le n g u a je Ja va .
Da re m o s a lg u n a e xp lica ció n b á s ica y ra cio n a l, ya q u e u n a e xp lica ció n co m p le t a va
m á s a llá d e e s t e t u ro ria l. El p ro p ó s it o d e e s t e a p p le t e s d a r u n a id e a g e n e ra l, p a ra
p o d e r u t iliza rlo co m o p la n t illa , s u s t it u ye n d o n u e s t ra s co n s u lt a s p o r la s d e l a p p le t .

Escribir el Código del Applet

Pa ra e m p e za r, lo s a p p le t s im p o rt a n cla s e s q u e n o s o n u t iliza d a s p o r la s
a p lica cio n e s . Nu e s t ro a p p le t im p o rt a d o s cla s e s q u e s o n e s p e cia le s p a ra
lo s a p p le t s : la cla s e Ap p le t , q u e fo rm a p a rt e d e l p a q u e t e ja v a . a p p le t , y
la cla s e Gra p h ic s , q u e fo rm a p a rt e d e l p a q u e t e ja v a . a w t . Es t e a p p le t
t a m b ié n im p o rt a la cla s e d e p ro p ó s it o g e n e ra l ja v a . u t il. Ve c t o r q u e s e
u t iliza p a ra a cce d e r a u n co n t e n e d o r t ip o a rra y cu yo t a m a ñ o p u e d e s e r
m o d ifica d o . Es t e có d ig o u t iliza o b je t o s Ve c t o r p a ra a lm a ce n a r lo s
re s u lt a d o s d e la s p e t icio n e s p a ra p o d e r m o s t ra rla s d e s p u é s .
To d o s lo s a p p le t s d e s cie n d e n d e la cla s e Ap p le t ; e s d e cir, s o n s u b cla s e s
d e Ap p le t . Po r lo t a n t o , t o d a d e fin ició n d e a p p le t d e b e co n t e n e r la s
p a la b ra s e x t e n d s Ap p le t ; co m o s e vé a q u í:

public class MyAppletName extends Applet {


. . .
}
En n u e s t ro e je m p lo , e s t a lín e a t a m b ié n in clu ye la s p a la b ra s im p le m e n t s
Ru n n a b le , p o r lo q u e s e p a re ce a e s t o :

public class OutputApplet extends Applet implements Runnable {


. . .
}
Ru n n a b le e s u n in t e rfa ce q u e h a ce p o s ib le e je cu t a r m á s d e u n t h re a d a
la ve z. Un t h re a d e s u n flu jo s e cu e n cia l d e co n t ro l, y u n p ro g ra m a p u e d e
t e n e r m u ch o s t h re a d s h a cie n d o co s a s d ife re n t e s co n cu rre n t e m e n t e . La
cla s e Ou t p u t Ap p le t im p le m e n t a e l in t e rfa ce Ru n n a b le d e fin ie n d o e l
m é t o d o ru n ; e l ú n ico m é t o d o d e Ru n n a b le . En n u e s t ro e je m p lo e l
m é t o d o ru n co n t ie n e e l có d ig o JDBC p a ra a b rir la co n e xió n , e je cu t a r u n a
p e t ició n , y o b t e n e r lo s re s u lt a d o s d e s d e la h o ja d e re s u lt a d o s . Co m o la s
co n e xio n e s a la s b a s e s d e d a t o s p u e d e n s e r le n t a s , y a lg u n a s ve ce s
p u e d e n t a rd a r va rio s s e g u n d o s , e s u n a b u e n a id e a e s t ru ct u ra r u n a p p le t
p a ra q u e p u e d a m a n e ja r e l t ra b a jo co n b a s e s d e d a t o s e n u n t h re a d
s e p a ra d o .
Al ig u a l q u e la s a p lica cio n e s d e b e n t e n e r u n m é t o d o m a in , u n a p p le t
d e b e im p le m e n t a r a l m e n o s u n o d e e s t o s m é t o d o s in it , s t a rt , o p a in t .
Nu e s t ro e je m p lo d e fin e u n m é t o d o s t a rt y u n m é t o d o p a in t . Ca d a ve z
q u e s e lla m a a s t a rt , cre a u n n u e vo t h re a d ( w o rk e r) p a ra re - e va lu a r la
p e t ició n a la b a s e d e d a t o s . Ca d a ve z q u e s e lla m a a p a in t , s e m u e s t ra o
b ie n e l re s u lt a d o d e la p e t ició n o u n s t rin g q u e d e s crib e e l e s t a d o a ct u a l
d e l a p p le t .
Co m o s e m e n cio n ó a n t e rio rm e n t e , e l m é t o d o ru n d e fin id o e n
Ou t p u t Ap p le t co n t ie n e e l có d ig o JDBC, Cu a n d o e l t h re a d w o rk e r lla m a
a l m é t o d o s t a rt , s e lla m a a u t o m á t ica m e n t e a l m é t o d o ru n , y é s t e
e je cu t a e l có d ig o JDBC e n e l t h re a d w o rk e r. El có d ig o d e ru n e s m u y
s im ila r a l có d ig o q u e h e m o s vis t o e n o t ro s e je m p lo s co n t re s
e xce p cio n e s . Prim e ro , u t iliza la cla s e Ve c t o r p a ra a lm a ce n a r lo s
re s u lt a d o s d e la p e t ició n . S e g u n d o , n o im p rim e lo s re s u lt a d o s , s in o q u e
lo s a ñ a d e a l Ve c t o r, re s u lt s p a ra m o s t ra rlo s m á s t a rd e . Te rce ro ,
t a m p o co m u e s t ra n in g u n a e xce p ció n , e n s u lu g a r a lm a ce n a lo s m e n s a je s
d e e rro r p a ra m o s t ra rlo s m á s t a rd e .
Lo s a p p le t s t ie n e n va ria s fo rm a s d e d ib u ja r, o m o s t ra r, s u co n t e n id o .
Es t e a p p le t , e s u n o m u y s im p le q u e s ó lo u t iliza t e xt o , u t iliza e l m é t o d o
d ra w S t rin g ( u n a p a rt e d e la cla s e Gra p h ic s ) p a ra m o s t ra r t e xt o . El
m é t o d o d ra w S t rin g t ie n e t re s a rg u m e n t o s : ( 1 ) e l s t rin g a m o s t ra r, ( 2 )
la co o rd e n a d a x , in d ica n d o la p o s ició n h o rizo n t a l d e in icio d e l s t rin g , y
( 3 ) la co o rd e n a d a y , in d ica n d o la p o s ició n ve rt ica l d e in icio d e l s t rin g
( q u e e s t á e n la p a rt e in fe rio r d e l t e xt o ) .
El m é t o d o p a in t e s e l q u e re a lm e n t e d ib u ja la s co s a s e n la p a n t a lla , y e n
Ou t p u t Ap p le t . ja v a , e s t á d e fin id o p a ra co n t e n e r lla m a d a s a l m é t o d o
d ra w S t rin g . La co s a p rin cip a l q u e m u e s t ra d ra w S t rin g e s e l co n t e n id o
d e l Ve c t o r, re s u lt s ( lo s re s u lt a d o s a lm a ce n a d o s ) . Cu a n d o n o h a y
re s u lt a d o s q u e m o s t ra r, d ra w S t rin g m u e s t ra e l e s t a d o a ct u a l co n t e n id o
e n e l S t rin g , m e s s a g e . Es t e s t rin g s e rá "In it ia lizin g " p a ra e m p e za r.
S e rá "Co n n e ct in g t o d a t a b a s e " cu a n d o s e lla m e a l m é t o d o s t a rt , y e l
m é t o d o s e t Erro r p o n d rá e n é l u n m e n s a je d e e rro r cu a n d o ca p t u re u n a
e xce p ció n . As í, s i la co n e xió n a la b a s e d e d a t o s t a rd a m u ch o t ie m p o , la
p e rs o n a q u e e s t á vie n d o e l a p p le t ve rá e l m e n s a je "Co n n e ct in g t o
d a t a b a s e " p o rq u e e s e s e rá e l co n t e n id o d e m e s s a g e e n e s e m o m e n t o .
( El m é t o d o p a in t e s lla m a d o p o r e l AWT cu a n d o q u ie re q u e e l a p p le t
m u e s t re s u e s t a d o a ct u a l e n la p a n t a lla ) .
Al m e n o s d o s m é t o d o s d e fin id o s e n la cla s e Ou t p u t Ap p le t , s e t Erro r y
s e t Re s u lt s s o n p riva d o s , lo q u e s ig n fica q u e s ó lo p u e d e n s e r u t iliza d o s
p o r Ou t p u t Ap p le t . Es t o s m é t o d o s lla m a n e l m é t o d o re p a in t , q u e b o rra
la p a n t a lla y lla m a a p a in t . Po r e s o s i s e t Re s u lt s lla m a a re p a in t , s e
m o s t ra rá n lo s re s u lt a d o s d e la p e t ició n , y s i s e t Erro r lla m a a re p a in t ,
s e m o s t ra rá u n m e n s a je d e e rro r.
Ot ro p u n t o e s h a ce r q u e t o d o s lo s m é t o d o s d e fin id o s e n Ou t p u t Ap p le t
e xce p t o ru n s o n s y n c h ro n iz e d . La p a la b ra cla ve s y n c h ro n iz e d in d ica
q u e m ie n t ra s q u e u n m é t o d o e s t é a cce d ie n d o a u n o b je t o , o t ro s m é t o d o s
s y n c h ro n iz e d e s t á n b lo q u e a d o s p a ra a cce d e r a e s e o b je t o . El m é t o d o
ru n n o s e d e cla ra s y n c h ro n iz e d p a ra q u e e l a p p le t p u e d a d ib u ja rs e e n
la p a n t a lla m ie n t ra s s e p ro d u ce la co n e xió n a la b a s e d e d a t o s . S i lo s
m é t o d o s d e a cce s o a la b a s e d e d a t o s fu e ra n s y n c h ro n iz e d , e vit a ría n
q u e e l a p p le t s e re d ib u ja ra m ie n t ra s s e e s t á n e je cu t a n d o , lo q u e p o d ría
re s u lt a r e n re t ra s o s s in a co m p a ñ a m ie n t o d e m e n s a je d e e s t a d o .
Pa ra s u m a riza r, e n u n a p p le t , e s u n a b u e n a p rá ct ica d e p ro g ra m a ció n e s
h a ce r a lg u n a s co s a s q u e n o n e ce s it a ría m o s h a ce r e n u n a a p lica ció n .
1 . Po n e r n u e s t ro có d ig o JDBC e n u n t h re a d s e p a ra d o .
2 . Mo s t ra r m e n s a je s d e e s t a d o d u ra n t e lo s re t a rd o s , co m o cu a n d o la
co n e xió n a la b a s e d e d a t o s t a rd a m u ch o t ie m p o .
3 . Mo s t ra r lo s m e n s a je s d e e rro r e n la p a n t a lla e n lu g a r d e im p rim irlo s
e n S y s t e m . o u t o S y s t e m . e rr.

Ejecutar un Applet

An t e s d e e je cu t a r n u e s t ro a p p le t , n e ce s it a m o s co m p ila r e l fich e ro
Ou t p u t Ap p le t . ja v a . Es t o cre a e l fich e ro Ou t p u t Ap p le t . c la s s , q u e e s
re fe re n cia d o p o r e l fich e ro Ou t p u t Ap p le t . h t m l.
La fo rm a m á s fá cil d e e je cu t a r u n a p p le t e s u t iliza r e l a p p le t vie we r, q u e
s e in clu ye e n e l JDK. S ó lo d e b e m o s s e g u ir la s in s t ru ccio n e s p a ra n u e s t ra
p la t a fo rm a :
UN I X

javac OutputApplet.java
appletviewer OutputApplet.html
W in d o w s 9 5 / N T
javac OutputApplet.java
appletviewer OutputApplet.html
Lo s a p p le t s d e s ca rg a d o s a t ra vé s d e la re d e s t á n s u je t o s a d is t in t a s
re s t riccio n e s d e s e g u rid a d . Au n q u e e s t o p u e d e p a re ce r m o le s t o , e s
a b s o lu t a m e n t e n e ce s a rio p a ra la s e g u rid a d d e la re d , y la s e g u rid a d e s
u n a d e la s m a yo re s ve n t a ja s d e u t iliza r Ja va . Un a p p le t n o p u e d e h a ce r
co n e xio n e s e n la re d e xce p t o co n e l h o s t d e l q u e s e d e s ca rg ó a m e n o s
q u e e l n a ve g a d o r s e lo p e rm it a . S i u n o p u e d e t ra t a r co n a p p le t s
in s t a la d o s lo ca lm e n t e co m o a p p le t s "t ru s t e d " ( firm a d o s ) t a m b ié n
d e p e n d e n d e re s t riccio n e s d e s e g u rid a d im p u e s t a s p o r e l n a ve g a d o r. Un
a p p le t n o rm a lm e n t e n o p u e d e le e r o e s crib ir fich e ro s e n e l h o s t e n e l q u e
s e e s t á e je cu a n d o , y n o p u e d e ca rg a r lib re ría s n i d e fin ir m é t o d o s n a t ivo s .
Lo s a p p le t s p u e d e n h a ce r co n e xio n e s co n e l h o s t d e l q u e vin ie ro n , p o r
e s o p u e d e n t ra b a ja r m u y b ie n e n in t ra n e t s .
El d rive r p u e n t e JDBC- ODBC e s d e a lg u n a fo rm a u n ca s o e s p e cia l. Pu e d e
u t iliza rs e s a t is fa ct o ria m e n t e p a ra a cce d e r a in t ra n e t , p e ro re q u ie re q u e
ODBC, e l p u e n t e , la lib re ría n a t iva , y e l JDBC e s t e n in s t a la d o s e n ca d a
clie n t e . Co n e s t a co n fig u ra ció n , lo s a cce s o s a in t ra n e t fu n cio n a n co n
a p lica cio n e s Ja va y co n a p p le t s firm a d o s . S in e m b a rg o , co m o lo s p u e n t e s
re q u ie re n co n fig u ra cio n e s e s p e cia le s d e l clie n t e , n o e s p rá ct ico p a ra
e je cu t a r a p p le t s e n In t e rn e t co n e l p u e n t e JDBC- ODBC. Ob s e rva q u e
e s t a lim it a cio n e s s o n p a ra e l p u e n t e JDBC- ODBC, n o p a ra JDBC. Co n u n
d rive r JDBC p u ro Ja va , n o s e n e ce s it a n in g u n a co n fig u ra ció n e s p e cia l
p a ra e je cu t a r a p p le t s e n In t e rn e t .

Oz it o
Nuevas Características en el API JDBC 2.0
El p a q u e t e ja v a . s q l q u e e s t á in clu id o e n la ve rs ió n JDB 1 . 2 ( co n o cid o co m o e l API
JDBC 2 . 0 ) in clu ye m u ch a s n u e va s ca ra ct e rís t ica s n o in clu id a s e n e l p a q u e t e
ja v a . s q l q u e fo rm a p a rt e d e la ve rs ió n JDK 1 . 1 ( re fe re n cia d o co m o e l API JDBC
1.0).
Co n e l API JDBC 2 . 0 , p o d re m o s h a ce r la s s ig u ie n t e s co s a s :
● Ir h a cia a d e la n t e o h a cia a t rá s e n u n a h o ja d e re s u lt a d o s o m o ve rn o s a u n fila
e s p e cífica .
● Ha ce r a ct u a liza cio n e s d e la s t a b la s d e la b a s e d a t o s u t iliza n d o m é t o d o s Ja va
e n lu g a r d e u t iliza r co m a n d o s S QL.
● En via r m ú lt ip le s s e cu e n cia s S QL a la b a s e d e d a t o s co m o u n a u n id a d , o b a t ch .

● Uit liza r lo s n u e vo s t ip o s d e d a t o s S QL3 co m o va lo re s d e co lu m n a s .

Configuración del API JBDC 2.0

Mover el Cursor en una Hoja de Resultados

Hacer Actualizaciones en una Hoja de Resultados Actualizable

Actualizar una Hoja de Resultados Programáticamente

Insertar y Borrar Filas Programáticamente

Código de ejemplo para Insertar una Fila

Borrar un Fila

Hacer Actualizaciones Batch

Utilizar Tipos de Datos SQL3

Características de Extensión Estándard

Oz it o
Configuración del API JDBC 2.0
S i q u e re m o s e je cu t a r có d ig o q u e e m p le e a lg u n a d e la s ca ra ct e rís t ica s d e l JDBC
2 . 0 , n e ce s it a m o s h a ce r lo s ig u ie n t e :
1 . De s ca rg a r e l JDK 1 . 2 s ig u ie n d o la s in s t ru ccio n e s d e d e s ca rg a
2 . In s t a la r u n Drive r JDBC q u e im p le m e n t e la s ca ra ct e rís t ica s d e l JDBC 2 . 0
u t iliza d a s e n e l có d ig o .
3 . Acce d e r a u n co n t ro la d o r d e b a s e d e d a t o s q u e im p le m e n t e la s ca ra ct e rís t ica s
d e l JDBC u t iliza d a s e n e l có d ig o .
En e l m o m e n t o d e e s crib ir e s t o , n o s e h a b ía im p le m e n t a d o n in g ú n d rive r q u e
s o p o rt a ra la s n u e va s ca ra ct e rís t ica s , p e ro h a y m u ch o s e n d e s a rro llo . Co m o
co n s e cu e n cia , n o e s p o s ib le p ro b a r e l có d ig o d e d e s m o s t ra ció n d e la s
ca ra ct e rís t ica s d e l JDBC 2 . 0 . Po d e m o s a p re n d e r d e lo s e je m p lo s , p e ro n o s e
a s e g u ra q u e é s t o s fu n cio n e n .

Oz it o
Mover el Cursor en una Hoja de Resultados
Un a d e la s n u e va s ca ra ct e rís t ica s d e l API JDBC 2 . 0 e s la h a b ilid a d d e m o ve r e l cu rs o r e n u n a h o ja d e
re s u lt a d o s t a n t o h a cia a t rá s co m o h a cia a d e la n t e . Ta m b ié n h a y m é t o d o s q u e n o s p e rm it e n m o ve r e l
cu rs o r a u n a fila p a rt icu la r y co m p ro b a r la p o s ició n d e l cu rs o r. La h o ja d e re s u lt a d o s S cro lla b le h a ce
p o s ib le cre a r u n a h e rra m ie n t a GUI ( In t e rfa ce Grá fico d e Us u a rio ) p a ra n a ve g a r a t ra vé s d e e lla , lo
q u e p ro b a b le m e n t e s e rá u n o d e lo s p rin cip a le s u s o s d e e s t a ca ra ct e rís t ica . Ot ro u s o s e rá m o ve rn o s
a u n a fila p a ra a ct u a liza rla .
An t e s d e p o d e r a p ro ve ch a r e s t a s ve n t a ja s , n e ce s it a m o s cre a r u n o b je t o Re s u lt S e t S cro lla b le :

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,


ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
Es t e có d ig o e s s im ila r a l u t iliza d o a n t e rio rm e n t e , e xce p t o e n q u e a ñ a d e d o s a rg u m e n t o s a l m é t o d o
c re a t e S t a t e m e n t . El p rim e r a rg u m e n t o e s u n a d e la s t re s co n s t a n t e s a ñ a d id a s a l API Re s u lt S e t
p a ra in d ica r e l t ip o d e u n o b je t o Re s u lt S e t : TYP E_ FORW ARD _ ON LY,
TYP E_ S CROLL_ I N S EN S I TI VE, y TYP E_ S CROLL_ S EN S I TI VE. El s e g u n d o a rg u m e n t o e s u n a d e
la s d o s co n s t a n t e s d e Re s u lt S e t p a ra e s p e cifica r s i la h o ja d e re s u lt a d o s e s d e s ó lo le ct u ra o
a ct u a liza b le : CON CUR_ READ _ ON LY y CON CUR_ UP D ATABLE. Lo q u e d e b e m o s re co rd a r a q u í e s
q u e s i e s p e cifica m o s u n t ip o , t a m b ié n d e b e m o s e s p e cifica r s i e s d e s ó lo le ct u ra o a ct u a liza b le .
Ta m b ié n , d e b e m o s e s p e cifica r p rim e ro e l t ip o , y co m o a m b o s p a rá m e t ro s s o n in t , e l co m p ila d o r n o
co m p ro b a rá s i lo s h e m o s in t e rca m b ia d o .
Es p e cifica n d o la co n s t a n t e TYP E_ FORW ARD _ ON LY s e cre a u n a h o ja d e re s u lt a d o s n o d e s p la za b le ,
e s d e cir, u n a h o ja e n la q u e e l cu rs o r s ó lo s e m u e ve h a cia a d e la n t e . S i n o s e e s p e cifica n co n s t a n t e s
p a ra e l t ip o y a ct u a liza ció n d e u n o b je t o Re s u lt S e t , o b t e n d re m o s a u t o m á t ica m e n t e u n a
TYP E_ FORW ARD _ ON LY y CON CUR_ READ _ ON LY ( e xa ct a m e n t e ig u a l q u e e n e l API d e l JDBC
1.0).
Ob t e n d re m o s u n o b je t o Re s u lt S e t d e s p la za b le s i u t iliza m o s u n a d e e s t a s
co n s t a n t e s : TYP E_ S CROLL_ I N S EN S I TI VE o TYP E_ S CROLL_ S EN S I TI VE. La d ife re n cia e n t re
e s t a s d o s e s s i la h o ja d e re s u lt a d o s re fle ja lo s ca m b io s q u e s e h a n h e ch o m ie n t ra s e s t a b a a b ie rt a y
s i s e p u e d e lla m a r a cie rt o s m é t o d o s p a ra d e t e ct a r e s t o s ca m b io s . Ge n e ra lm e n t e h a b la n d o , u n a h o ja
d e re s u lt a d o s TYP E_ S CROLL_ I N S EN S I TI VE n o re fle ja lo s ca m b io s h e ch o s m ie n t ra s e s t a b a a b ie rt a
y e n u n a h o ja TYP E_ S CROLL_ S EN S I TI VE s i s e re fle ja n . Lo s t re s t ip o s d e h o ja s d e re s u lt a d o s
h a rá n vis ib le s lo s re s u lt a d o s s i s e cie rra n y s e vu e lve a a b rir. En e s t e m o m e n t o , n o n e ce s it a m o s
p re o cu p a rn o s d e lo s p u n t o s d e lica d o s d e la s ca p a cid a d e s d e u n o b je t o Re s u lt S e t , e n t ra re m o s e n
m á s d e t a lle m á s a d e la n t e . Au n q u e d e b e ría m o s t e n e r e n m e n t e e l h e ch o d e q u e n o im p o rt a e l t ip o d e
h o ja d e re s u lt a d o s q u e e s p e cifiq u e m o s , s ie m p re e s t a re m o s lim it a d o s p o r n u e s t ro co n t ro la d o r d e
b a s e d e d a t o s y e l d rive r u t iliza d o s .
Un a ve z q u e t e n g a m o s u n o b je t o Re s u lt S e t d e s p la za b le , s rs e n e l e je m p lo a n t e rio r, p o d e m o s
u t iliza rlo p a ra m o ve r e l cu rs o r s o b re la h o ja d e re s u lt a d o s . Re cu e rd a q u e cu a n d o cre a b a m o s u n
o b je t o Re s u lt S e t a n t e rio rm e n t e , t e n ía e l cu rs o r p o s icio n a d o a n t e s d e la p rim e ra fila . In clu s o a u n q u e
u n a h o ja d e re s u lt a d o s s e s e le ccio n e d e s p la za b le , e l cu rs o r t a m b ié n s e p o s icio n a in icia lm e n t e
d e la n t e d e la p rim e ra fila . En e l API JDBC 1 . 0 , la ú n ica fo rm a d e m o ve r e l cu rs o r e ra lla m a r a l
m é t o d o n e x t . Es t e m é t o d o t o d a vía e s a p ro p ia d o s i q u e re m o s a cce d e r a la s fila s u n a a u n a , ye n d o
d e la p rim e ra fila a la ú lt im a , p e ro a h o ra t e n e m o s m u ch a s m á s fo rm a s p a ra m o ve r e l cu rs o r.
La co n t ra p a rt id a d e l m é t o d o n e x t , q u e m u e ve e l cu rs o r u n a fila h a cia d e la n t e ( h a cia e l fin a l d e la
h o ja d e re s u lt a d o s ) , e s e l n u e vo m é t o d o p re v io u s , q u e m u e ve e l cu rs o r u n a fila h a cia a t rá s ( h a cia
e l in icio d e la h o ja d e re s u lt a d o s ) . Am b o s m é t o d o s d e vu e lve n fa ls e cu a n d o e l cu rs o r s e s a le d e la
h o ja d e re s u lt a d o s ( p o s ició n a n t e s d e la p rim e ra o d e s p u é s d e la ú lt im a fila ) , lo q u e h a ce p o s ib le
u t iliza rlo s e n u n b u cle w h ile . Ye h e m o s u t iliza d o u n m é t o d o n e x t e n u n b u cle wh ile , p e ro p a ra
re fre s ca r la m e m o ria , a q u í t e n e m o s u n e je m p lo q u e m u e ve e l cu rs o r a la p rim e ra fila y lu e g o a la
s ig u ie n t e ca d a ve z q u e p a s a p o r e l b u cle wh ile . El b u cle t e rm in a cu a n d o a lca n za la ú lt im a fila ,
h a cie n d o q u e e l m é t o d o n e x t d e vu e lva fa ls e . El s ig u ie n t e fra g m e n t o d e có d ig o im p rim e lo s va lo re s
d e ca d a fila d e s rs , co n cin co e s p a cio s e n b la n co e n t re e l n o m b re y e l p re cio :

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,


ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
while (srs.next()) {
String name = srs.getString("COF_NAME");
float price = srs.getFloat("PRICE");
System.out.println(name + " " + price);
}
La s a lid a s e p o d ría p a re ce r a e s t o :

Colombian 7.99
French_Roast 8.99
Espresso 9.99
Colombian_Decaf 8.99
French_Roast_Decaf 9.99
Al ig u a l q u e e n e l fra g m e n t o a n t e rio r, p o d e m o s p ro ce s a r t o d a s la s fila s d e s rs h a cia a t rá s , p e ro p a ra
h a ce r e s t o , e l cu rs o r d e b e e s t a r d e t rá s d e la ú lt im a fila . S e p u e d e m o ve r e l cu rs o r e xp lícit a m e n t e a
e s a p o s icó n co n e l m é t o d o a ft e rLa s t . Lu e g o e l m é t o d o p re v io u s m u e ve e l cu rs o r d e s d e la p o s icó n
d e t rá s d e la ú lt im a fila a la ú lt im a fila , y lu e g o a la fila a n t e rio r e n ca d a it e ra cció n d e l b u cle w h ile . El
b u cle t e rm in a cu a n d o e l cu rs o r a lca n za la p o s ició n a n t e rio r a la p rim e ra fila , cu a n d o e l m é t o d o
p re v io u s d e vu e lve fa ls e .

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,


ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
srs.afterLast();
while (srs.previous()) {
String name = srs.getString("COF_NAME");
float price = srs.getFloat("PRICE");
System.out.println(name + " " + price);
}
La s a lid a s e p o d ría p a re ce r a e s t o :

French_Roast_Decaf 9.99
Colombian_Decaf 8.99
Espresso 9.99
French_Roast 8.99
Colombian 7.99
Co m o s e p u e d e ve r, la s d o s s a lid a s t ie n e n lo s m is m o s va lo re s , p e ro la s fila s e s t á n e n o rd e n in ve rs o .
S e p u e d e m o ve r e l cu rs o r a u n a fila p a rt icu la r e n u n o b je t o Re s u lt S e t . Lo s m é t o d o s firs t , la s t ,
b e fo re Firs t , y a ft e rLa s t m u e ve n e l cu rs o r a la fila in d ica d a e n s u s n o m b re s . El m é t o d o a b s o lu t e
m o ve rá e l cu rs o r a l n ú m e ro d e fila in d ica d o e n s u a rg u m e n t o . S i e l n ú m e ro e s p o s it ivo , e l cu rs o r s e
m u e ve a l n ú m e ro d a d o d e s d e e l p rin cip io , p o r e s o lla m a r a a b s o lu t e ( 1 ) p o n e e l cu rs o r e n la
p rim e ra fila . S i e l n ú m e ro e s n e g a t ivo , m u e ve e l cu rs o r a l n ú m e ro d a d o d e s d e e l fin a l, p o r e s o
lla m a r a a b s o lu t e ( - 1 ) p o n e e l cu rs o r e n la ú lt im a fila . La s ig u ie n t e lín e a d e có d ig o m u e ve e l cu rs o r
a la cu a rt a fila d e s rs :

srs.absolute(4);
S i s rs t u vie ra 5 0 0 fila s , la s ig u ie n t e lín e a d e có d ig o m o ve ría e l cu rs o r a la fila 4 9 7 :

srs.absolute(-4);
Tre s m é t o d o s m u e ve n e l cu rs o r a u n a p o s ició n re la t iva a s u p o s ició n a ct u a l. Co m o h e m o s p o d id o
ve r, e l m é t o d o n e x t m u e ve e l cu rs o r a la fila s ig u ie n t e , y e l m é t o d o p re v io u s lo m u e ve a la fila
a n t e rio r. Co n e l m é t o d o re la t iv e , s e p u e d e e s p e cifica r cu á n t a s fila s s e m o ve rá d e s d e la fila a ct u a l y
t a m b ié n la d ire cció n e n la q u e s e m o ve rá . Un n ú m e ro p o s it ivo m u e ve e l cu rs o r h a cia a d e la n t e e l
n ú m e ro d e fila s d a d o ; u n n ú m e ro n e g a t ivo m u e ve e l cu rs o r h a cia a t rá s e l n ú m e ro d e fila s d a d o . Po r
e je m p lo , e n e l s ig u ie n t e fra g m e n t e d e có d ig o , e l cu rs o r s e m u e ve a la cu a rt a fila , lu e g o a la p rim e ra
y p o r ú lt im o a la t e rce ra :

srs.absolute(4); // cursor está en la cuarta fila


. . .
srs.relative(-3); // cursor está en la primera fila
. . .
srs.relative(2); // cursor está en la tercera fila
El m é t o d o g e t Ro w p e rm it e co m p ro b a r e l n ú m e ro d e fila d o n d e e s t á e l cu rs o r. Po r e je m p lo , s e
p u e d e u t iliza r g e t Ro w p a ra ve rifica r la p o s ició n a ct u a l d e l cu rs o r e n e l e je m p lo a n t e rio r:

srs.absolute(4);
int rowNum = srs.getRow(); // rowNum debería ser 4
srs.relative(-3);
int rowNum = srs.getRow(); // rowNum debería ser 1
srs.relative(2);
int rowNum = srs.getRow(); // rowNum debería ser 3
Exis t e n cu a t ro m é t o d o s a d icio n a le s q u e p e rm it e n ve rifica r s i e l cu rs o r s e e n cu e n t ra e n u n a p o s ició n
p a rt icu la r. La p o s ició n s e in d ica e n s u s n o m b re s : is Firs t , is La s t , is Be fo re Firs t , is Aft e rLa s t . To d o s
e s t o s m é t o d o s d e vu e lve n u n b o o le a n y p o r lo t a n t o p u e d e n s e r u t iliza d o s e n u n a s e n t e n cia
co n d icio n a l. Po r e je m p lo , e l s ig u ie n t e fra g m e n t o d e có d ig o co m p ru e b a s i e l cu rs o r e s t á d e s p u é s d e
la ú lt im a fila a n t e s d e lla m a r a l m é t o d o p re v io u s e n u n b u cle w h ile . S i e l m é t o d o is Aft e rLa s t
d e vu e lve fa ls e , e l cu rs o r n o e s t a rá d e s p u é s d e la ú lt im a fila , p o r e s o s e lla m a a l m é t o d o a ft e rLa s t .
Es t o g a ra n t iza q u e e l cu rs o r e s t á ra d e s p u é s d e la ú lt im a fila a n t e s d e u t iliza r e l m é t o d o p re v io u s e n
e l b u cle w h ile p a ra cu b rir t o d a s la s fila s d e s rs .

if (srs.isAfterLast() == false) {
srs.afterLast();
}
while (srs.previous()) {
String name = srs.getString("COF_NAME");
float price = srs.getFloat("PRICE");
System.out.println(name + " " + price);
}
En la s ig u ie n t e p á g in a , ve re m o s có m o u t iliza r o t ro s d o s m é t o d o s d e Re s u lt S e t p a ra m o ve r e l
cu rs o r, m o v e To I n s e rt Ro w y m o v e To Cu rre n t Ro w . Ta m b ié n ve re m o s e je m p lo s q u e ilu s t ra n p o r
q u é p o d ría m o s q u e re r m o ve r e l cu rs o r a cie rt a s p o s icio n e s .

Oz it o
Hacer Actualizaciones en una Hoja de Resultados
Actualizable
Ot ra n u e va ca ra ct e rís t ica d e l API JDBC 2 . 0 e s la h a b ilid a d d e a ct u a liza r fila s e n u n a h o ja d e
re s u lt a d o s u t iliza n d o m é t o d o s Ja va e n ve z d e t e n e r q u e e n via r co m a n d o s S QL. Pe ro a n t e s
d e p o d e r a p ro ve ch a r e s t a ca p a cid a d , n e ce s it a m o s cre a r u n o b je t o Re s u lt S e t a ct u a liza b le .
Pa ra h a ce r e s t o , s u m in is t ra m o s la co n s t a n t e CON CUR_ UP D ATABLE d e Re s u lS e t a l
m é t o d o c re a t e S t a t e m e n t , co m o s e h a vis t o e n e je m p lo s a n t e rio re s . El o b je t o S t a t e m e n t
cre a d o p ro d u cirá u n o b je t o Re s u lt S e t a ct u a liza b le ca d a ve z q u e s e e je cu t e u n a p e t ició n . El
s ig u ie n t e fra g m e n t o d e có d ig o ilu s t ra la cre a cció n d e u n o b je t o Re s u lt S e t a ct u a liza b le ,
u p rs . Ob s e rva q u e e l có d ig o t a m b ié n lo h a ce d e s p la za b le . Un o b je t o Re s u lt S e t
a ct u a liza b le n o t ie n e p o rq u e s e r d e s p la za b le , p e ro cu a n d o s e h a ce n ca m b io s e n u n a h o ja
d e re s u lt a d o s , g e n e ra lm e n t e q u e re m o s p o d e r m o ve rn o s p o r e lla . Co n u n a h o ja d e
re s u lt a d o s d e s p la za b le , p o d e m o s m o ve rn o s a la s fila s q u e q u e re m o s ca m b ia r, y s i e l t ip o
e s TYP E_ S CROLL_ S EN S I TI VE, p o d e m o s o b t e n e r e l n u e vo va lo r d e u n a fila d e s p u é s d e
h a b e rlo ca m b ia d o .

Connection con = DriverManager.getConnection("jdbc:mySubprotocol:mySubName");


Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
El o b je t o Re s u lt S e t , u p rs re s u lt a n t e s e p o d ría p a re ce r a e s t o :

COF_NAME PRICE
------------------ -----
Colombian 7.99
French_Roast 8.99
Espresso 9.99
Colombian_Decaf 8.99
French_Roast_Decaf 9.99
Po d e m o s u t iliza r lo s n u e vo s m é t o d o s d e l JDBC 2 . 0 e n e l in t e rfa ce Re s u lt S e t p a ra in s e rt a r
u n a n u e va fila e n u p rs , b o rra r u n a fila d e u p rs , o m o d ifica r u n va lo r d e u n a co lu m n a d e
u p rs .

Oz it o
Actualizar una Hoja de Resultados
Programáticamente
Un a a ct u a liza ció n e s la m o d ifica ció n d e l va lo r d e u n a co lu m n a d e la fila a ct u a l.
S u p o n g a m o s q u e q u e re m o s a u m e n t a r e l p re cio d e l ca fé "Fre n ch Ro a s t De ca f" a
1 0 . 9 9 . u t iliza n d o e l API JDBC 1 . 0 , la a ct u a liza ció n p o d ría s e r a lg o co m o e s t o :

stmt.executeUpdate("UPDATE COFFEES SET PRICE = 10.99" +


"WHERE COF_NAME = FRENCH_ROAST_DECAF");
El s ig u ie n t e fra g m e n t o d e có d ig o m u e s t a o t ra fo rm a d e re a liza r la a ct u a liza ció n ,
e s t a ve z u t iliza n d o e l API JDBC 2 . 0 :

uprs.last();
uprs.updateFloat("PRICE", 10.99);
La s o p e ra cio n e s d e a ct u a liza ció n e n e l API JDBC 2 . 0 a fe ct a n a lo s va lo re s d e
co lu m n a d e la fila e n la q u e s e e n cu e n t ra e l cu rs o r, p o r e s o e n le p rim e ra lín e a s e
lla m a a l m é t o d o la s t p a ra m o ve r e l cu rs o r a la ú lt im a fila ( la fila d o n d e la co lu m n a
COF_ N AME t ie n e e l va lo r FREN CH_ ROAS T_ D ECAF) . Un a ve z s it u a d o e l cu rs o r,
t o d o s lo s m é t o d o s d e a ct u a liza ció n q u e lla m e m o s o p e ra rá n s o b re e s a fila h a s t a q u e
m o va m o s e l cu rs o r a o t ra fila . La s e g u n d a lín e a d e có d ig o ca m b ia e l va lo r d e la
co lu m n a P RI CE a 1 0 . 9 9 lla m a n d o a l m é t o d o u p d a t e Flo a t . S e u t iliza e s t e m é t o d o
p o rq u e e l va lo r d e la co lu m n a q u e q u e re m o s a ct u a liza r e s u n flo a t Ja va .
Lo s m é t o d o s u p d a t e XXX d e Re s u lt S e t t o m a n d o s p a rá m e t ro s : la co lu m n a a
a ct u a liza r y e l n u e vo va lo r a co lo ca r e n e lla . Al ig u a l q u e e n lo s m é t o d o s g e t XXX
d e Re s u lt S e t . , e l p a rá m e t ro q u e d e s ig n a la co lu m n a p o d ría s e r e l n o m b re d e la
co lu m n a o e l n ú m e ro d e la co lu m n a . Exis t e u n m é t o d o u p d a t e XXX d ife re n t e p a ra
ca d a t ip o ( u p d a t e S t rin g , u p d a t e Big D e c im a l, u p d a t e I n t , e t c. )
En e s t e p u n t o , e l p re cio e n u p rs p a ra "Fre n ch Ro a s t De ca f" s e rá 1 0 . 9 9 , p e ro e l
p re cio e n la t a b la COFFEES d e la b a s e d e d a t o s s e rá t o d a vía 9 . 9 9 . Pa ra q u e la
a ct u a liza ció n t e n g a e fe ct o e n la b a s e d e d a t o s y n o s ó lo e n la h o ja d e re s u lt a d o s ,
d e b e m o s lla m a r a l m é t o d o u p d a t e Ro w d e Re s u lt S e t . Aq u í e s t á e l có d ig o p a ra
a ct u a liza r t a n t o u p rs co m o COFFEES :

uprs.last();
uprs.updateFloat("PRICE", 10.99);
uprs.updateRow();
S i h u b ié ra m o s m o vid o e l cu rs o r a u n a fila d ife re n t e a n t e s d e lla m a r a l m é t o d o
u p d a t e Ro w , la a ct u a liza ció n s e h a b ría p e rd id o . S i, p o r e l co n t ra rio , n o s d a m o s
cu e n t a d e q u e e l p re cio d e b e ría h a b e r s id o 1 0 . 7 9 e n ve z d e 1 0 . 9 9 p o d ría m o s h a b e r
ca n ce la d o la a ct u a liza ció n lla m a n d o a l m é t o d o c a n c e lRo w Up d a t e s . Te n e m o s q u e
lla m a r a l m é t o d o c a n c e lRo w Up d a t e s a n t e s d e lla m a r a l m é t o d o u p d a t e Ro w ;
u n a ve z q u e s e lla m a a u p d a t e Ro w , lla m a r a c a n c e lRo w Up d a t e s n o h a rá n a d a .
Ob s e rva q u e c a n c e lRo w Up d a t e s ca n ce la t o d a s la s a ct u a liza cio n e s e n u n a fila , p o r
e s o , s i h a b ía m u ch a s lla m a d a s a m é t o d o u p d a t e XXX e n la m is m a fila , n o p o d e m o s
ca n ce la r s ó lo u n a d e e lla s . El s ig u ie n t e fra g m e n t o d e có d ig o p rim e ro ca n ce la e l
p re cio 1 0 . 9 9 y lu e g o lo a ct u a liza a 1 0 . 7 9 :

uprs.last();
uprs.updateFloat("PRICE", 10.99);
uprs.cancelRowUpdates();
uprs.updateFloat("PRICE", 10.79);
uprs.updateRow();
En e s t e e je m p lo , s ó lo s e h a b ía a ct u a liza d o u n a co lu m n a , p e ro p o d e m o s lla m a r a u n
m é t o d o u p d a t e XXX a p ro p ia d o p a ra ca d a u n a d e la s co lu m n a s d e la fila . El
co n ce p t o a re co rd a r e s q u e la s a ct u a liza cio n e s y la s o p e ra cio n e s re la cio n a d a s s e
a p lica n s o b re la fila e n la q u e s e e n cu e n t ra e l cu rs o r. In clu s o s i h a y m u ch a s
lla m a d a s a m é t o d o s u p d a t e XXX, s ó lo s e h a ce u n a lla m a d a a l m é t o d o u p d a t e Ro w
p a ra a ct u a liza r la b a s e d e d a t o s co n t o d o s lo s ca m b io s re a liza d o s e n la fila a ct u a l.
S i t a m b ié n q u e re m o s a ct u a liza r e l p re cio d e COLOMBI AN _ D ECAF, t e n e m o s q u e
m o ve r e l cu rs o r a la fila q u e co n t ie n e e s e ca fé . Có m o la fila d e
COLOMBI AN _ D ECAF p re ce d e in m e d ia t a m e n t e a la fila d e
FREN CH_ ROAS T_ D ECAF, p o d e m o s lla m a r a l m é t o d o p re v io u s p a ra p o s icio n a r e l
cu rs o r e n la fila d e COLOMBI AN _ D ECAF. El s ig u ie n t e fra g m e n t o d e có d ig o ca m b ia
e l p re cio d e e s a fila a 9 . 7 9 t a n t o e n la h o ja d e re s u lt a d o s co m o e n la b a s e d e
da tos:

uprs.previous();
uprs.updateFloat("PRICE", 9.79);
uprs.updateRow();
To d o s lo s m o vim ie n t o s d e cu rs o r s e re fie re n a fila s d e l o b je t o Re s u lt S e t , n o a fila s
d e la t a b la d e la b a s e d e d a t o s . S i u n a p e t ició n s e le ccio n a cin co fila s d e la t a b la d e
la b a s e d e d a t o s , h a b rá cin co fila s e n la h o ja d e re s u lt a d o s , co n la p rim e ra fila
s ie n d o la fila 1 , la s e n g u n d a s ie n d o la fila 2 , e t c. La fila 1 p u e d e s e r id e n t ifica d a
co m o la p rim e ra , y, e n u n a h o ja d e re s u lt a d o s co n cin co fila s , la fila 5 s e rá la
ú lt im a .
El o rd e n d e la s fila s e n la h o ja d e re s u lt a d o s n o t ie n e n a d a q u e ve r co n e l o rd e n d e
la s fila s e n la t a b la s d e la b a s e d e d a t o s . De h e ch o , e l o rd e n d e la s fila s e n la t a b la
d e la b a s e d e d a t o s e s in d e t e rm in a d o . El co n t ro la d o r d e la b a s e d e d a t o s s ig u e la
p is t a d e la s fila s s e le ccio n a d a s , y h a ce la s a ct u a liza cio n e s e n la fila a p ro p ia d a , p e ro
p o d ría n e s t a r lo ca liza d a s e n cu a lq u ie r lu g a r d e la t a b la . Cu a n d o s e in s e rt a u n a fila ,
p o r e je m p lo , n o h a y fo rm a d e s a b e r d o n d e s e rá in s e rt a d a d e n t ro d e la t a b la .

Oz it o
Insertar y Borrar Filas Programáticamente
En la s e cció n a n t e rio r h e m o s vis t o có m o m o d ifica r e l va lo r d e u n a co lu m n a u t iliza n d o
m é t o d o s d e l API JDBC 2 . 0 e n ve z d e u t iliza r co m a n d o s S QL. Co n e l API JDBC 2 . 0 t a m b ié n
p o d e m o s in s e rt a r u n a fila e n u n a t a b la o b o rra r u n a fila e xis t e n t e p ro g ra m á t ica m e n t e .
S u p o n g a m o s q u e n u e s t ro p ro p ie t a rio d e l ca fé h a o b t e n id o u n a n u e va va rie d a d d e ca fé d e
u n o d e s u s s u m in is t ra d o re s . El "Hig h Gro u n d ", y q u ie re a ñ a d irlo a s u b a s e d e d a t o s .
Ut iliza n d o e l API JDBC 1 , 0 p o d ría e s crib ir e l có d ig o q u e p a s a u n a s e n t e n cia in s e rt d e S QL a l
co n t ro la d o r d e la b á s e d e d a t o s . El s ig u ie n t e fra g m e n t o d e có d ig o , e n e l q u e s t m t e s u n
o b je t o S t a t e m e n t , m u e s t ra e s t a a p ro xim a ció n :

stmt.executeUpdate("INSERT INTO COFFEES " +


"VALUES ('Kona', 150, 10.99, 0, 0)");
S e p u e d e h a ce r e s t o m is m o s in co m a n d o s S QL u t iliza n d o lo s m é t o d o s d e Re s u lt S e t d e l
API JDBC 2 . 0 . Bá s ica m e n t e , d e s p u é s d e t e n e r u n o b je t o Re s u lt S e t co n lo s re s u lt a d o s d e
la t a b la COFFEES , p o d e m o s co n s t u ir u n a n u e va fila in s e rt á n d o la t a n t o e n la h o ja d e
re s u lt a d o s co m o e n la t a b la COFFEES e n u n s ó lo p a s o . S e co n s t ru ye u n a n u e va fila e n u n a
lla m a d a "fila d e in s e rció n ", u n a fila e s p e cia l a s o cia d a co n ca d a o b je t o Re s u lt S e t . Es t a fila
re a lm e n t e n o fo rm a p a rt e d e la h o ja d e re s u lt a d o s ; p o d e m o s p e n s a r e n e lla co m o u n
b u ffe r s e p a ra d o e n e l q u e co m p o n e r u n a n u e va fila .
El p rim e r p a s o s e rá m o ve r e l cu rs o r a la fila d e in s e rció n , lo q u e p o d e m o s h a ce r lla m a n d o
a l m é t o d o m o v e To I n s e rt Ro w . El s ig u ie n t e p a s o s e rá s e le ccio n a r u n va lo r p a ra ca d a
co lu m n a d e la fila . Ha ce m o s e s t o lla m a n d o a lo s m é t o d o s u p d a t e XXX a p ro p ia d o s p a ra
ca d a va lo r. Ob s e rva q u e e s t o s s o n lo s m is m o s m é t o d o s u p d a t e XXX u t iliza d o s e n la p á g in a
a n t e rio r p a ra ca m b ia r e l va lo r d e u n a co lu m n a . Fin a lm e n t e , p o d e m o s lla m a r a l m é t o d o
in s e rt Ro w p a ra in s e rt a r la fila q u e h e m o s re lle n a d o e n la h o ja d e re s u lt a d o s . Es t e ú n ico
m é t o d o in s e rt a la fila s im u lt á n e a m e n t e t a n t o e n e l o b je t o Re s u lt S e t co m o e n la t a b la d e
la b a s e d e d a t o s d e la q u e la h o ja d e d a t o s fu e s e le ccio n a d a .
El s ig u ie n t e fra g m e n t o d e có d ig o cre a u n o b je t o Re s u lt S e t a ct u a liza b le y d e s p la za b le ,
u p rs , q u e co n t ie n e t o d a s la s fila s y co lu m n a s d e la t a b la COFFEES :

Connection con = DriverManager.getConnection("jdbc:mySubprotocol:mySubName");


Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
El s ig u ie n t e fra g m e n t o d e có d ig o u t iliza e l o b je t o Re s u lt S e t , u p rs p a ra in s e rt a r la fila p a ra
"ko n a ", m o s t ra d a e n e l e je m p lo S QL. Mu e ve e l cu rs o r a la fila d e in s e rció n , s e le ccio n a lo s
cin co va lo re s d e co lu m n a e in s e rt a la fila d e n t ro d e u p rs y COFFEES :

uprs.moveToInsertRow();
uprs.updateString("COF_NAME", "Kona");
uprs.updateInt("SUP_ID", 150);
uprs.updateFloat("PRICE", 10.99);
uprs.updateInt("SALES", 0);
uprs.updateInt("TOTAL", 0);
uprs.insertRow();
Co m o p o d e m o s u t iliza r e l n o m b re o e l n ú m e ro d e la co lu m n a p a ra in d ica r la co lu m n a
s e le ccio n a d a , n u e s t ro có d ig o p a ra s e le ccio n a r lo s va lo re s d e co lu m n a s e p o d ría p a re ce r a
e sto:

uprs.updateString(1, "Kona");
uprs.updateInt(2, 150);
uprs.updateFloat(3, 10.99);
uprs.updateInt(4, 0);
uprs.updateInt(5, 0);
Po d ría m o s h a b e rn o s p re g u n t a d o p o r q u é lo s m é t o d o s u p d a t e XXX p a re ce n t e n e r u n
co m p o rt a m ie n t o d is t in t o a co m o lo h a cía n e n lo s e je m p lo s d e a ct u a liza ció n . En a q u e llo s
e je m p lo s , e l va lo r s e le ccio n a d o co n u n m é t o d o u p d a t e XXX re e m p la za b a in m e d ia t a m e n t e
e l va lo r d e la co lu m n a e n la h o ja d e re s u lt a d o s . Es t o e ra p o rq u e e l cu rs o r e s t a b a s o b re u n a
fila d e la h o ja d e re s u lt a d o s . Cu a n d o e l cu rs o r e s t á s o b re la fila d e in s e rció n , e l va lo r
s e le ccio n a d o co n u n m é t o d o u p d a t e XXX t a m b ié n e s a u t o m á t ica m e n t e s e le ccio n a d o , p e ro
lo e s e n la fila d e in s e rció n y n o e n la p ro p ia h o ja d e re s u lt a d o s . Ta n t o e n a ct u a liza cio n e s
co m o e n in s e rcio n e s , lla m a r a lo s m é t o d o s u p d a t e XXX n o a fe ct a n a la t a b la d e la b a s e d e
d a t o s . S e d e b e lla m a r a l m é t o d o u p d a t e Ro w p a ra h a ce r q u e la s a ct u a liza cio n e s o cu rra n
e n la b a s e d e d a t o s . Pa ra e l in s e rcio n e s , e l m é t o d o in s e rt Ro w in s e rt a la n u e va fila e n la
h o ja d e re s u lt a d o s y e n la b a s e d e d a t o s a l m is m o t ie m p o .
Po d ría m o s p re g u n t a rn o s q u e s u ce d e ría s i in s e rt á ra m o s u n a fila p e ro s in s u m in is t ra r lo s
va lo re s p a ra ca d a co lu m n a . S i n o s u m in is t ra m o s va lo re s p a ra u n a co lu m n a q u e e s t a b a
d e fin id a p a ra a ce p t a r va lo re s N ULL d e S QL, e l va lo r a s ig n a d o a e s a co lu m n a e s N ULL. S i
la co lu m n a n o a ce p t a va lo re s n u ll, o b t e n d re m o s u n a S QLEx c e p t io n . Es t o t a m b ié n e s
cie rt o s i fa lt a u n a co lu m n a d e la t a b la e n n u e s t ro o b je t o Re s u lt S e t . En e l e je m p lo
a n t e rio r, la p e t ició n e ra S ELECT * FROM COFFEES , lo q u e p ro d u cía u n a h o ja d e
re s u lt a d o s co n t o d a s la s co lu m n a s y t o d a s la s fila s . Cu a n d o q u e re m o s in s e rt a r u n a o m á s
fila s , n u e s t ra p e t ició n n o t ie n e p o rq u e s e le ccio n a r t o d a s la s fila s , p e ro s í t o d a s la s
co lu m n a s . Es p e cia lm e n t e s i n u e s t ra t a b la t ie n e cie n t o s o m ile s d e fila s , q u e rre m o s u t iliza r
u n a cla ú s u la W HERE p a ra lím it a r e l n ú m e ro d e fila s d e vu e lt a s p o r la s e n t e n cia S ELECT.
De s p u é s d e h a b e r lla m a d o a l m é t o d o in s e rt Ro w , p o d e m o s co n s t ru ir o t ra fila , o p o d e m o s
m o ve r e l cu rs o r d e n u e vo a la h o ja d e re s u lt a d o s . Po r e je m p lo , p o d e m o s , lla m a r a
cu a lq u ie r m é t o d o q u e p o n g a e l cu rs o r e n u n a fila e s p e cífica , co m o firs t , la s t , b e fo re Firs t ,
a ft e rLa s t , y a b s o lu t e . Ta m b ié n p o d e m o s u t iliza r lo s m é t o d o s p re v io u s , re la t iv e , y
m o v e To Cu rre n t Ro w . Ob s e rva q u e s ó lo p o d e m o s lla m a r a m o v e To Cu rre n t Ro w cu a n d o
e l cu rs o r e s t á e n la fila d e in s e rció n .
Cu a n d o lla m a m o s a l m é t o d o m o v e To I n s e rt Ro w , la h o ja d e re s u lt a d o s g ra b a la fila e n la
q u e s e e n co n t ra b a e l cu rs o r, q u e p o r d e fin ició n e s la fila a ct u a l. Co m o co n s e cu e n cia , e l
m é t o d o m o v e To Cu rre n t Ro w p u e d e m o ve r e l cu rs o r d e s d e la fila d e in s e rció n a la fila e n
la q u e s e e n co n t ra b a a n t e rio rm e n t e . Es t o t a m b ié n e xp lica p o rq u e p o d e m o s u t iliza r lo s
m é t o d o s p re v io u s y re la t iv e , q u e re q u ie re n m o vim ie n t o s re la t ivo s a la fila a ct u a l.

Oz it o
Código de Ejemplo para Insertar una Fila
El s ig u ie n t e e je m p lo d e có d ig o e s u n p ro g ra m a co m p le t o q u e d e b e ría fu n cio n a r s i t e n e m o s u n d rive r
JDBC 2 . 0 q u e im p le m e n t e u n a h o ja d e re s u lt a d o s d e s p la za b le .
Ha y a lg u n a s co s a s q u e p o d ría m o s o b s e rva r s o b re e l có d ig o :
1 . El o b je t o Re s u lt S e t , u p rs e s a ct u a liza b le , d e s p la za b le y s e n s ib le a lo s ca m b io s h e ch o s p o r e lla
y p o r o t ro s . Au n q u e e s TYP E_ S CROLL_ S EN S I TI VE, e s p o s ib le q u e lo s m é t o d o s g e t XXX
lla m a d o s d e s p u é s d e la s in s e rcio n e s n o re cu p e re n lo s va lo re s d e la n u e va s fila s . Ha y m é t o d o s
e n e l in t e rfa ce D a t a b a s e Me t a D a t a q u e n o s d irá n q u é e s vis ib le y q u é s e rá d e t e ct a d o e n lo s
d ife re n t e s t ip o s d e h o ja s d e re s u lt a d o s p a ra n u e s t ro d rive r y n u e s t ro co n t ro la d o r d e b a s e d e
da tos.
2 . De s p u é s d e h a b e r in t ro d u cid o lo s va lo re s d e u n a fila co n lo s m é t o d o s u p d a t e XXX, e l có d ig o
in s e rt a la fila e n la h o ja d e re s u lt a d o s y e n la b a s e d e d a t o s co n e l m é t o d o in s e rt Ro w . Lu e g o ,
e s t á n d o t o d a vía e n la "fila d e in s e rció n ", s e le ccio n a va lo re s p a ra o t ra n u e va fila .

import java.sql.*;

public class InsertRows {


public static void main(String args[]) {
String url = "jdbc:mySubprotocol:myDataSource";
Connection con;
Statement stmt;
try {
Class.forName("myDriver.ClassName");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url, "myLogin", "myPassword");
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
uprs.moveToInsertRow();
uprs.updateString("COF_NAME", "Kona");
uprs.updateInt("SUP_ID", 150);
uprs.updateFloat("PRICE", 10.99f);
uprs.updateInt("SALES", 0);
uprs.updateInt("TOTAL", 0);
uprs.insertRow();
uprs.updateString("COF_NAME", "Kona_Decaf");
uprs.updateInt("SUP_ID", 150);
uprs.updateFloat("PRICE", 11.99f);
uprs.updateInt("SALES", 0);
uprs.updateInt("TOTAL", 0);
uprs.insertRow();
uprs.beforeFirst();
System.out.println("Table COFFEES after insertion:");
while (uprs.next()) {
String name = uprs.getString("COF_NAME");
int id = uprs.getInt("SUP_ID");
float price = uprs.getFloat("PRICE");
int sales = uprs.getInt("SALES");
int total = uprs.getInt("TOTAL");
System.out.print(name + " " + id + " " + price);
System.out.println(" " + sales + " " + total);
}

uprs.close();
stmt.close();
con.close();

} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}
}

Oz it o
Borrar una Fila
Ha s t a a h o ra , h e m o s vis t o có m o a ct u a liza r u n va lo r y có m o in s e rt a r u n a n u e va fila .
Bo rra r u n a fila e s la t e rce ra fo rm a d e m o d ifica r u n o b je t o Re s u lt S e t , y e s la m á s
s im p le . To d o lo q u e t e n e m o s q u e h a ce r e s m o ve r e l cu rs o r a la fila q u e q u e re m o s
b o rra r y lu e g o lla m a r a l m é t o d o d e le t e Ro w . Po r e je m p lo , s i q u e re m o s b o rra r la
cu a rt a fila d e la h o ja d e re s u lt a d o s u p rs , n u e s t ro có d ig o s e p a re ce ría a e s t o :

uprs.absolute(4);
uprs.deleteRow();
La cu a rt a fila h a s id o e lim in a d a d e u p rs y d e la b a s e d e d a t o s .
El ú n ico p ro b le m a co n la s e lim in a cio n e s e s lo q u e Re s u lt S e t re a lm e n t e h a ce cu a n d o
s e b o rra u n a fila . Co n a lg u n o s d rive r JDBC, u n a lín e a b o rra d a e s e lim in a d a y ya n o e s
vis ib le e n u n a h o ja d e re s u lt a d o s . Alg u n o s d rive s JDBC u t iliza n u n a fila e n b la n co e n
s u lu g a r p o n e ( u n "h o le ") d o n d e la fila b o rra d a fu e ra u t iliza d a . S i e xis t e u n a fila e n
b la n co e n lu g a r d e la fila b o rra d a , s e p u e d e u t iliza r e l m é t o d o a b s o lu t e co n la
p o s ició n o rig in a l d e la fila p a ra m o ve r e l cu rs o r, p o rq u e e l n ú m e ro d e fila s e n la h o ja
d e re s u lt a d o s n o h a ca m b ia d o .
En cu a lq u ie r ca s o , d e b e ría m o s re co rd a r q u e lo s d rive rs JDBC m a n e ja n la s
e lim in a cio n e s d e fo rm a d ife re n t e . Po r e je m p lo , s i e s crib im o s u n a a p lica ció n p a ra
e je cu t a rs e co n d ife re n t e s b a s e s d e d a t o s , n o d e b e ría m o s e s crib ir có d ig o q u e
d e p e n d ie ra d e s i h a y u n a fila va cía e n la h o ja d e re s u lt a d o s .

Ver los cambios en una Hoja de Resultados

S i m o d ifica m o s lo s d a t o s e n u n o b je t o Re s u lt S e t , lo s ca m b io s s e h a rá n vis ib le s s i lo
ce rra m o s y lo a b rim o s d e n u e vo . En o t ra s p a la b ra s , s i re - e je cu t a m o s la m is m a
p e t ició n , p ro d u cirá u n a n u e va h o ja d e re s u lt a d o s , b a s a d a e n lo s d a t o s a ct u a le s d e la
t a b la . Es t a h o ja d e re s u lt a d o s re fle ja ra n a t u ra lm e n t e lo s ca m b io s q u e h a ya m o s
h e ch o a n t e rio rm e n t e .
La cu e s t ió n e s s i p o d e m o s ve r lo s ca m b io s q u e h a ya m o s re a liza d o m ie n t ra s e l o b je t o
Re s u lt S e t e s t é t o d a vía a b ie rt o . ( Ge n e ra lm e n t e , e s t a re m o s m á s in t e re s a d o s e n lo s
ca m b io s h e ch o s p o r o t ro s ) . La re s p u e s t a d e p e n d e d e l co n t ro la d o r d e la b a s e d e
d a t o s , d e l d rive r, y d e l t ip o d e l o b je t o Re s u lt S e t u t iliza d o .
Co n u n o b je t o Re s u lt S e t q u e s e a TYP E_ S CROLL_ S EN S I TI VE, s ie m p re p o d re m o s
ve r la s a ct u a liza cio n e s q u e a lg u ie n h a g a e n lo s va lo re s d e la s co lu m n a s .
No rm a lm e n t e ve re m o s in s e rcio n e s y e lim in a cio n e s , p e ro la ú n ica fo rm a d e e s t a r
s e g u ro s e s u t iliza r lo s m é t o d o s D a t a b a s e Me t a D a t a q u e d e vu e lve n e s t a
in fo rm a ció n .
Po d e m o s re g u la r la e xt e n s ió n d e q u e lo s ca m b io s s e a n vis ib le s a u m e n t a n d o o
b a ja n d o e l n ive l d e a is la m ie n t o d e la t ra n s a ció n co n la b a s e d e d a t o s . Po r e je m p lo , la
s ig u ie n t e lín e a d e có d ig o , d o n d e c o n e s u n o b je t o Co n n e c t io n a ct ivo , s e le ccio n a e l
n ive l d e a is la m ie n t o d e la co n e xió n a TRAN S ACTI ON _ READ _ COMMI TTED :
con.setTransactionIsolation(TRANSACTION_READ_COMMITTED);
Co n e s t e n ive l d e a is la m ie n t o , n u e s t ro o b je t o Re s u lt S e t n o m o s t ra rá n in g ú n ca m b io
a n t e s d e s e r e n via d o , p e ro p u e d e m o s t ra r lo s ca m b io s q u e p o d ría n t e n e r p ro b le m a s
d e co n s is t e n cia . Pa ra p e rm it ir m e n o re s n ive le s d e in co n s is t e n cia , p o d ría m o s s u b ir e l
n ive d e a is la m ie n t o a TRAN S ACTI ON _ REP EATABLE_ READ . El p ro b le m a e s q u e a
n ive le s m á s a lt o s d e a is la m ie n t o , e l re n d im ie n t o s e e m p o b re ce . Y s ie m p re e s t a m o s
lim it a d o s p o r lo q u e p ro p o rcio n a n la s b a s e s d e d a t o s y lo s d rive rs .
En u n o b je t o Re s u lt S e t q u e s e a TYP E_ S CROLL_ I N S EN S I TI VE, g e n e ra lm e n t e n o
p o d re m o s ve r lo s ca m b io s h e ch o s m ie n t ra s e s t é a b ie rt a . Alg u n o s p ro g ra m a d o re s
u t iliza n s ó lo e s t e t ip o d e o b je t o Re s u lt S e t p o rq u e q u ie re n u n a vis t a co n s is t e n t e d e
lo s d a t o s y n o q u ie re n ve r lo s ca m b io s h e ch o s p o r o t ro s .
S e p u e d e u t iliza r e l m é t o d o re fre s h Ro w p a ra o b t e n e r lo s ú lt im o s va lo re s d e u n a fila
e n la b a s e d e d a t o s . Es t e m é t o d o p u e d e u t iliza r m u ch o s re cu rs o s , e s p e cia lm e n t e s i e l
co n t ro la d o r d e la b a s e d e d a t o s d e vu e lve m ú lt ip le s fila s ca d a ve z q u e s e lla m a a
re fre s h Ro w . De t o d a s fo rm a s , p u e d e u t iliza rs e cu a n d o e s crít ico t e n e r lo s ú lt im o s
d a t o s . In clu s o a u n q u e u n a h o ja d e re s u lt a d o s s e a s e n s ib le y lo s ca m b io s s e a n
vis ib le s , u n a a p lica ció n n o p o d ría ve r s ie m p re lo s ú lt im o s ca m b io s s i e l d rive r
re cu p e ra va ria s fila s a la ve z y la s a lm a ce n a . Po r e s o , u t iliza r e l m é t o d o re fre s h Ro w
e s e l ú n ico m é t o d o p a ra a s e g u ra rn o s q u e e s t a m o s vie n d o lo s ú lt im o s d a t o s .
El s ig u ie n t e có d ig o ilu s t ra có m o u n a a p lica ció n p o d ría u t iliza r e l m é t o d o re fre s h Ro w
cu a n d o e s a b s o lu t a m e n t e crít ico ve r lo s ú lt im o s va lo re s . Ob s e rva q u e la h o ja s e
re s u lt a d o s d e b e ría s e r s e n s ib le ; s i q u e re m o s u t iliza r e l m é t o d o re fre s h Ro w co n u n
o b je t o Re s u lt S e t q u e s e a TYP E_ S CROLL_ I N S EN S I TI VE, n o h a rá n a d a . ( La
u rg e n cia d e o b t e n e r lo s ú lt im o s d a t o s e s b a s t a n t e im p ro va b le e n la t a b la COFFEES ,
p e ro la fo rt u n a d e u n in ve rs o r, d e p e n d e d e co n o ce r lo s ú lt im o s p re cio s e n la a m p lia
flu ct u a ció n d e l m e rca d o d e l ca fé . O, p o r e je m p lo , q u e rria m o s a s e g u ra rn o s d e q u e e l
n u e s t ro a s ie n t o re s e rva d o e n e l a vió n d e re g re s o t o d a vía e s t á d is p o n ib le ) .

Statement stmt = con.createStatement(


ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery(SELECT COF_NAME, PRICE FROM COFFEES);
uprs.absolute(4);
Float price1 = uprs.getFloat("PRICE");
// do something. . .
uprs.absolute(4);
uprs.refreshRow();
Float price2 = uprs.getFloat("PRICE");
if (price2 > price1) {
// do something. . .
}
Oz it o
Hacer Actualizaciones por Lotes
Un a a ct u a liza ció n p o r lo t e s e s u n co n ju n t o d e va ria s s e n t e n cia s d e a ct u a liza ció n
q u e s o n e n via d a s a la b a s e d e d a t o s p a ra s e r p ro ce s a d a s co m o u n lo t e . En via r
m ú lt ip le s s e n t e n cia s d e a ct u a liza icó n ju n t a s a la b a s e d e d a t o s p u e d e , e n a lg u n a s
s it u a cio n e s , s e r m u ch o m á s e ficie n t e q u e e n via r ca d a s e n t e n cia s e p a ra d a m e n t e .
Es t a p o s ib ilid a d d e e n via r a ct u a liza cio n e s co m o u n a u n id a d , re fe rid a co m o fa cilid a d
d e a ct u a liza ció n p o r lo t e s , e s u n a d e la s ca ra ct e rís t ica s p ro p o rcio n a d a s p o r e l API
JDBC 2 . 0 .

Utilizar Objetos Statement para Actualizaciones por Lotes

En e l API JDBC 1 . 0 , lo s o b je t o s S t a t e m e n t e n via b a n a ct u a liza cio n e s a la b a s e d e


d a t o s in d ivid u a lm e n t e co n e l m é t o d o e x e c u t e Up d a t e . S e p u e d e n e n via r va ria s
s e n t e n cia s e x e c u t e Up d a t e e n la m is m a t ra n s a ció n , p e ro a u n q u e s o n e n via d a s
co m o u n a u n id a d , s o n p ro ce s a d a s in d ivid u a lm e n t e . Lo s in t e rfa ce s d e riva d o s d e
S t a t e m e n t , P re p a re d S t a t e m e n t y Ca lla b le S t a t e m e n t , t ie n e n la s m is m a s
ca p a cid a d e s , u t iliza n d o s u s p ro p ia s ve rs io n e s d e e x e c u t e Up d a t e .
Co n e l API JDBC 2 . 0 , lo s o b je t o s S t a t e m e n t , P re p a re d S t a t e m e n t y
Ca lla b le S t a t e m e n t t ie n e n la h a b ilid a d d e m a n t e n e r u n a lis t a d e co m a n d o s q u e
p u e d e n s e r e n via d o s ju n t o s co m o u n lo t e . Ello s s o n cre a d o s co n u n a lis t a a s o cia d a ,
q u e in icia lm e n t e e s t á va cía . S e p u e d e n a ñ a d ir co m a n d o s S QL a e s t a lis t a co n e l
m é t o d o a d d Ba t c h , y p o d e m o s va cia r la lis t a co n e l m é t o d o c le a rBa t c h . To d o s lo s
co m a n d o s d e la lis t a s e e n vía n a la b a s e d e d a t o s co n e l m é t o d o e x e c u t e Ba t c h .
Ah o ra ve a m o s co m o fu n cio n a n e s t o s m é t o d o s .
S u p o n g a m o s q u e n u e s t ro p ro p ie t a rio d e l ca fé q u ie re t ra e r n u e vo s ca fé s . Ha
d e t e rm in a d o q u e s u m e jo r fu e n t e e s u n o d e s u s a ct u a le s s u m in is t ra d o re s , S u p e rio r
Co ffe e , y q u ie re a ñ a d ir cu a t ro n u e vo s ca fé s a la t a b la COFFEES . Có m o s ó lo va a
in s e rt a r cu a t ro n u e va s fila s , la a ct u a liza ció n p o r lo t e s p o d ría n o a u m e n t a r e l
re n d im ie n t o s ig n ifica t iva m e n t e , p e ro e s u n a b u e n a o p o rt u n id a d p a ra d e m o s t ra r la
a ct u a liza ció n p o r lo t e s . Re co rd a m o s q u e la t a b la COFFEES t ie n e cin co co lu m n a s :
COF_ N AME d e l t ip o VARCHAR( 3 2 ) , S UP _ I D d e l t ip o I N TEGER, P RI CE d e l t ip o
FLOAT, S ALES d e l t ip o I N TEGER, y TOTAL d e l t ip o I N TEGER. Ca d a fila in s e rt a d a
t e n d rá va lo re s p a ra la s cin co co lu m n a s e n o rd e n . El có d ig o p a ra in s e rt a r u n a n u e va
fila co m o u n lo t e s e p o d ría p a re ce r a e s t o :

con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Amaretto', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Hazelnut', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Amaretto_decaf', 49, 10.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Hazelnut_decaf', 49, 10.99, 0, 0)");
int [] updateCounts = stmt.executeBatch();
Ah o ra e xá m in e m o s e l có d ig o lín e a p o r lín e a .

con.setAutoCommit(false);
Es t a lín e a d e s a ct iva e l m o d o a u t o - co m m it p a ra e l o b je t o Co n n e c t io n , c o n p a ra
q u e la t ra n s a ció n n o s e a e n via d a o a n u la d a a u t o m á t ica m e n t e cu a n d o s e lla m e a l
m é t o d o e x e c u t e Ba t c h . ( S i n o re cu e rd a s q u é e ra u n a t ra n s a ció n , d e b e ría s re vis a r
la p á g in a Tra n s a cio n e s ) . Pa ra p e rm it ir u n m a n e jo d e e rro re s co rre ct o , t a m b ié n
d e b e ría m o s a ct u a liza r e l m o d o a u t o - co m m it a n t e s d e e m p e za r u n a a ct u a liza ció n
p o r lo t e s .

Statement stmt = con.createStatement();


Es t a lín e a d e có d ig o cre a e l o b je t o S t a t e m e n t , s t m t . Al ig u a l q u e t o d o s lo s n u e vo s
o b je t o s S t a t e m e n t re cie n cre a d o s , s t m t t ie n e u n a lis t a d e co m a n d o s a s o cia d o s y
é s t a lis t a e s t á va cía .

stmt.addBatch("INSERT INTO COFFEES" +


"VALUES('Amaretto', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Hazelnut', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Amaretto_decaf', 49, 10.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES" +
"VALUES('Hazelnut_decaf', 49, 10.99, 0, 0)");
Ca d a u n a d e e s t a s lín e a s d e có d ig o a ñ a d e u n co m a n d o a la lis t a d e co m a n d o s
a s o cia d o s co n s t m t . Es t o s co m a n d o s s o n t o d o s s e n t e n cia s I N S ERT I N TO, ca d a
u n a a ñ a d e u n a n u e va fila q u e co n s is t e e n cin co va lo re s d e co lu m n a . Lo s va lo re s
p a ra la s co lu m n a s COF_ NAME y PRICE s e e xp lica n a s í m is m o s . e l s e g u n d o va lo r d e
ca d a fila e s 4 9 p o rq u e e s e l n ú m e ro d e id e n t ifica ció n d e l s u m in is t ra d o r, S u p e rio r
Co ffe e . Lo s ú lt im o s d o s va lo re s , la s e n t ra d a s p a ra la s co lu m n a s S ALES y TOTAL,
t o d a s e m p ie za n s ie n d o ce ro p o rq u e t o d a vía n o s e h a ve n d id o n a d a . ( S ALES e s e l
n ú m e ro d e lib ra s d e l ca fé d e e s a co lu m n a ve n d id a s la s e m a n a a ct u a l; y TOTAL e s
e l n ú m e ro t o t a l d e lib ra s ve n d id a s d e e s t e ca fé ) .

int [] updateCounts = stmt.executeBatch();


En e s t a lín e a , s t m t e n vía a la b a s e d e d a t o s lo s cu a t ro co m a n d o s S QL q u e fu e ro n
a ñ a d id o s a s u lis t a d e co m a n d o s p a ra q u e s e a n e je cu t a d o s co m o u n lo t e . Ob s e rva
q u e s t m t u t iliza e l m é t o d o e x e c u t e Ba t c h p a ra e l lo t e d e in s e rcio n e s , n o e l
m é t o d o e x e c u t e Up d a t e , q u e e n vía s ó lo u n co m a n d o y d e vu e lve u n a s ó la cu e n t a
d e a ct u a liza ció n . El co n t ro la d o r d e la b a s e d e d a t o s e je cu t a lo s co m a n d o s e n e l
o rd e n e n q u e fu e ro n a ñ a d id o s a la lis t a d e co m a n d o s , p o r e s o p rim e ro a ñ a d irá la
fila d e va lo re s a p ra Am a re t t o , lu e g o a ñ a d e la fila d e Ha ze ln u t , lu e g o Am a re t t o
d e ca f, y fin a lm e n t e Ha ze ln u t d e ca f. S i lo s cu a t ro co m a n d o s s e e je cu t a n
s a t is fa ct o ria m e n t e , e l co n t ro la d o r d e la b a s e d e d a t o s d e vo lve rá u n a cu e n t a d e
a ct u a liza ció n p a ra ca d a co m a n d o e n e l o rd e n e n q u e fu e e je cu t a d o . La s cu e n t a s d e
a ct u a liza ció n , in d ica rá n cu á n t a s lín e a s s e vie ro n a fe ct a d a s p o r ca d a co m a n d o , y s e
a lm a ce n a n e n e l a rra y d e e n t e ro s u p d a t e Co u n t s .
En e s t e p u n t o , u p d a t e Co u n t s d e b e ría co n t e n e r cu a t ro e le m e n t o s d e l t ip o in t . En
e s t e ca s o , ca d a u n o d e e llo s s e rá 1 p o rq u e u n a in s e rció n a fe ct a a u n fila . La lis t a
d e co m a n d o s a s o cia d o s co n s t m t a h o ra e s t a rá va cía p o rq u e lo s cu a t ro co m a n d o s
a ñ a d id o s a n t e rio rm e n t e fu e ro n e n via d o s a la b a s e d e d a t o s cu a n d o s t m t lla m ó a l
m é t o d o e x e c u t e Ba t c h . En cu a lq u ie r m o m e n t o p o d e m o s va cia r la lis t a d e
co m a n d o s co n e l m é t o d o c le a rBa t c h .

Excepciones en las Actualizaciones por Lotes

Exis t e n d o s e xce p cio n e s q u e p u e d e n s e r la n za d a s d u ra n t e u n a a ct u a liza ció n p o r


lo t e s : S QLEx c e p t io n y Ba t c h Up d a t e Ex c e p t io n .
To d o s lo s m é t o d o s d e l API JDBC la n za rá n u n o b je t o S QLEx c e p t io n s i e xis t e a lg ú n
p ro b le m a d e a cce s o a la b a s e d e d a t o s . Ad e m á s , e l m é t o d o e x e c u t e Ba t c h la n za rá
u n a S QLEx c e p t io n s i h e m o s u t iliza d o e l m é t o d o a d d Ba t c h p a ra a ñ a d ir u n
co m a n d o y d e vu e lve u n a h o ja d e re s u lt a d o s a l lo t e d e co m a n d o s q u e e s t á s ie n d o
e je cu t a d o . Típ ica m e n t e u n a p e t ició n ( u n a s e n t e n cia S ELECT) d e vo lve rá u n a h o ja
d e re s u lt a d o s , p e ro a lg u n o s m é t o d o s , co m o a lg u n o s d e D a t a b a s e Me t a D a t a
p u e d e n d e vo lve r u n a h o ja d e d a t o s .
S ó lo u t iliza r e l m é t o d o a d d Ba t c h p a ra a ñ a d ir u n co m a n d o q u e p ro d u ce u n a h o ja
d e re s u lt a d o s n o h a ce q u e s e la n ce u n a e xce p ció n . No h a y p ro b le m a m ie n t ra s e l
co m a n d o e s t á s ie n d o s it u a d o e n la lis t a d e co m a n d o s d e u n o b je t o S t a t e n m e n t .
Pe ro h a b rá p ro b le m a s cu a n d o e l m é t o d o e x e c u t e Ba t c h e n víe e l lo t e a l co n t ro la d o r
d e la b a s e d e d a t o s p a ra e je cu t a rlo . Cu a n d o s e e je cu t a ca d a co m a n d o , d e b e
d e vo lve r u n a cu e n t a d e a ct u a liza ció n q u e p u e d a s e r a ñ a d id a a l a rra y d e cu e n t a s d e
a ct u a liza ció n d e vu e lt o p o r e l m é t o d o e x e c u t e Ba t c h . In t e n t a r p o n e r u n a h o ja d e
re s u lt a d o s e n u n a rra y d e cu e n t a s d e a ct u a liza ció n ca u s a rá u n e rro r y h a rá q u e
e x e c u t e Ba t c h la n ce u n a S QLEx c e p t io n . En o t ra s p a la b ra s , s ó lo lo s co m a n d o s
q u e d e vu e lve n cu e n t a s d e a ct u a liza ció n ( co m a n d o s co m o I N S ERT I N TO,
UP D ATE, D ELETE, CREATE TABLE, D ROP TABLE, ALTER TABLE, e t c) p u e d e n
s e r e je cu t a d o s co m o u n lo t e co n e l m é t o d o e x e c u t e Ba t c h .
S i n o s e la n zó u n a S QLEx c e p t io n , s a b re m o s q u e n o h u b o p ro b le m a s d e a cce s o y
q u e t o d o s lo s co m a n d o s p ro d u je ro n cu e n t a s d e a ct u a liza ció n . S i u n o d e lo s
co m a n d o s n o p u e d e s e r e je cu t a d o p o r a lg u n a ra zó n , e l m é t o d o e x e c u t e Ba t c h
la n za rá u n a Ba t c h Up d a t e Ex c e p t io n . Ad e m á s d e la in fo rm a ció n q u e t ie n e n t o d a s
la s e xce p cio n e s , e s t e e xce p ció n co n t ie n e u n a rra y d e cu e n t a s d e a ct u a liza ció n p a ra
lo s co m a n d o s q u e s e e je cu t a ro n s a t is fa ct o ria m e n t e a n t e s d e q u e s e la n za ra la
e xce p ció n . Có m o la s cu e n t a s d e a ct u a liza ció n e s t á n e n e l m is m o o rd e n q u e lo s
co m a n d o s q u e la s p ro d u je ro n , p o d re m o s d e cir cu á n t o s co m a n d o s fu e ro n
e je cu t a d o s y cu á le s fu e ro n .
Ba t c h Up d a t e Ex c e p t io n d e s cie n d e d e S QLEx c e p t io n . Es t o s ig n ifica q u e u t iliza
t o d o s lo s m é t o d o s d is p o n ib le s e n u n o b je t o S QLEx c e p t io n . El s ig u ie n t e fra g m e n t o
d e có d ig o im p rim e la in fo rm a ció n d e S QLEx c e p t io n y la s cu e n t a s d e a ct u a liza ció n
co n t e n id a s e n u n o b je t o Ba t c h Up d a t e Ex c e p t io n . Co m o g e t Up d a t e Co u n t s
d e vu e lve u n a rra y d e in t , u t iliza u n b u cle fo r p a ra im p rim ir t o d a s la s cu e n t a s d e
a ct u a liza ció n .

try {
// make some updates
} catch(BatchUpdateException b) {
System.err.println("SQLException: " + b.getMessage());
System.err.println("SQLState: " + b.getSQLState());
System.err.println("Message: " + b.getMessage());
System.err.println("Vendor: " + b.getErrorCode());
System.err.print("Update counts: ");
int [] updateCounts = b.getUpdateCounts();
for (int i = 0; i < updateCounts.length; i++) {
System.err.print(updateCounts[i] + " ");
}
}
Pa ra ve r u n p ro g ra m a co m p le t o d e a ct u a liza ció n p o r lo t e s , p u e d e s ve r
Ba t c h Up d a t e . ja v a . El có d ig o p o n e ju n t o s lo s fra g m e n t o s d e có d ig o d e la s p á g in a s
a n t e rio re s y cre a u n p ro g ra m a co m p le t o . Po d ría s o b s e rva r q u e h a y d o s b lo q u e s
c a t c h a l fin a l d e l có d ig o . S i h a y u n o b je t o Ba t c h Up d a t e Ex c e p t io n e l p rim e r
b lo q u e lo ca p t u ra rá . El s e g u n d o b lo q u e ca p t u ra rá u n o b je t o S QLEx c e p t io n q u e n o
s e a u n o b je t o Ba t c h Up d a t e Ex c e p t io n .

Oz it o
Utilizar Tipos de Datos SQL3
Lo s t ip o s d e d a t o s co m u n m e n t e re fe rid o s co m o t ip o s S QL3 s o n lo s n u e vo s t ip o s d e d a t o s q u e e s t á n
s ie n d o a d o p t a d o s e n la n u e va ve rs ió n d e l e s t á n d a rd ANS I/ IS O d e S QL. El JDBC 2 . 0 p ro p o rcio n a
in t e rfa ce s q u e re p re s e n t a n u n m a p e a d o d e e s t o s t ip o s d e d a t o s S QL3 d e n t ro d e l le n g u a je Ja va . Co n
e s t o s n u e vo s in t e rfa ce s , p o d re m o s t ra b a ja r co n t ip o s S QL3 ig u a l q u e co n o t ro s t ip o s .
Lo s n u e vo s t ip o s S QL3 le d a n a u n a b a s e d e d a t o s re la cio n a l m á s fle xib ilid a d e n lo q u e p u e d e n
u t iiza r co m o t ip o s p a ra u n a co lu m n a d e u n a t a b la . Po r e je m p lo , u n a co lu m n a p o d ría a h o ra
a lm a ce n a r e l n u e vo t ip o d e d a t o BLOB ( Bin a ry La rg e Ob je ct ) , q u e p u e d e a lm a ce n a r g ra n d e s
ca n t id a d e s d e d a t o s co m o u n a fila d e b yt e s . Un a co lu m n a t a m b ié n p u e d e s e r d e l t ip o CLOB
( Ch a ra ct e r La rg e Ob je ct ) , q u e e s ca p a z d e a lm a ce n a r g ra n d e s ca n t id a d e s d e d a t o s e n fo rm a t o
ca ra ct e r. El n u e vo t ip o ARRAY h a ce p o s ib le e l u s o d e u n a rra y co m o u n va lo r d e co lu m n a . In clu s o
la s n u e va s e s t ru ct u ra s d e t ip o s - d e fin id o s - p o r- e l- u s u a rio ( UDTs ) d e S QL p u e d e n a lm a ce n a rs e co m o
va lo re s d e co lu m n a .
La s ig u ie n t e lis t a t ie n e lo s in t e rfa ce s d e l JDBC 2 . 0 q u e m a p e a n lo s t ip o s S QL3 . Lo s e xp lica re m o s e n
m á s d e t a lle m á s a d e la n t e .
● Un e je m p la r Blo b m a p e a u n BLOB d e S QL.

● Un e je m p la r Clo b m a p e a u n CLOB d e S QL.

● Un e je m p a r Arra y m a p e a u n ARRAY d e S QL.

● Un e je m p la r S t ru c t m a p e a u n t ip o Es t ru ct u ra d o d e S QL.

● Un e je m p la r Re f m a p e a u n REF d e S QL.

Uitlizar tipos de datos SQL3

S e re cu p e ra n , a lm a ce n a n , y a ct u a liza n t ip o s d e d a t o s S QL3 d e la m is m a fo rm a q u e lo s o t ro s t ip o s .
S e u t iliza n lo s m é t o d o s Re s u lt S e t . g e t XXX o Ca lla b le S t a t e m e n t . g e t XXX p a ra re cu p e ra rlo s , lo s
m é t o d o s P re p a re d S t a t e m e n t . s e t XXXp a ra a lm a ce n a rlo s y u p d a t e XXX p a ra a ct u a liza rlo s .
Pro b a b le m e n t e e l 9 0 % d e la s o p e ra cu in e s re a liza d a s co n t ip o s S QL3 im p lica n e l u s o d e lo s m é t o d o s
g e t XXX, s e t XXX, y u p d a t e XXX. La s ig u ie n t e t a b la m u e s t ra q u é m é t o d o s u t iliza r:
Tipo SQL3 Método getXXX Método setXXX Método updateXXX
BLOB g e t Blo b s e t Blo b u p d a t e Blo b
CLOB g e t Clo b s e t Clo b u p d a t e Clo b
ARRAY g e t Arra y s e t Arra y u p d a t e Arra y
Tipo Structured g e t Ob je c t s e t Ob je c t u p d a t e Ob je ct
REF(Tipo Structured) g e t Re f s e t Re f u p d a t e Re f

Po r e je m p lo , e l s ig u ie n t e fra g m e n t o d e có d ig o re cu p e ra u n va lo r ARRAY d e S QL. Pa ra e s t e e je m p lo ,


la co lu m n a S CORES d e la t a b la S TUD EN TS co n t ie n e va lo re s d e l t ip o ARRAY. La va ria b le s t m t e s
u n o b je t o S t a t e m e n t .

ResultSet rs = stmt.executeQuery("SELECT SCORES FROM STUDENTS WHERE ID = 2238");


rs.next();
Array scores = rs.getArray("SCORES");
La va ria b le s c o re s e s u n p u n t e ro ló g ico a l o b je t o ARRAY d e S QL a lm a ce n a d o e n la t a b la
S TUD EN TS e n la fila d e l e s t u d ia n t e 2 2 3 8 .
S i q u e re m o s a lm a ce n a r u n va lo r e n la b a s e d e d a t o s , u t iliza m o s e l m é t o d o s e t XXX a p ro p ia d o . Po r
e je m p lo , e l s ig u ie n t e fra g m e n t o d e có d ig o , e n e l q u e rs e s u n o b je t o Re s u lt S e t , a lm a ce n a u n
o b je t o Clo b :

Clob notes = rs.getClob("NOTES");


PreparedStatement pstmt = con.prepareStatement("UPDATE MARKETS
SET COMMENTS = ? WHERE SALES <
1000000",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
pstmt.setClob(1, notes);
Es t e có d ig o co n fig u ra n o t e s co m o e l p rim e r p a rá m e t ro d e la s e n t e n cia d e a ct u a liza ció n q u e e s t á
s ie n d o e n via d a a la b a s e d e d a t o s . El va lo r CLOB d e s ig n a d o p o r n o t e s s e rá a lm a ce n a d o e n la t a b la
MARKETS e n la co lu m n a COMMEN TS e n ca d a co lu m n a e n q u e e l va lo r d e la co lu m n a S ALES s e a
m e n o r d e u n m illó n .

Objetos Blob, Clob, y Array

Un a ca ra ct e rís t ica im p o rt a n t e s o b re lo s o b je t o s Blo b , Clo b , y Arra y e s q u e s e p u e d e n m a n ip u la r s in


t e n e r q u e t ra e r t o d o s lo s d a t o s d e s d e e l s e rvid o r d e la b a s e d e d a t o s a n u e s t ra m á q u in a clie n t e . Un
e je m p la r d e cu a lq u ie ra d e e s o s t ip o s e s re a lm e n t e u n p u n t e ro ló g ico a l o b je t o e n la b a s e d e d a t o s
q u e re p re s e n t a e l e je m p la r. Co m o lo s o b je t o s S QL BLOB, CLOB, o ARRAY p u e d e n s e r m u y
g ra n d e s , e s t a ca ra ct e rís t ica p u e d e a u m e n t a r d rá s t ica m e n t e e l re n d im ie n t o .
S e p u e d e n u t iliza r lo s co m a n d o s S QL y lo s API JDBC 1 . 0 y 2 . 0 co n o b je t o s Blo b , Clo b , y Arra y
co m o s i e s t u vie ra m o s o p e ra n d o re a lm e n t e co n e l o b je t o d e la b a s e d e d a t o s . S in e m b a rg o , s i
q u e re m o s t ra b a ja r co n cu a lq u ie ra d e e llo s co m o u n o b je t o Ja va , n e ce s it a m o s t ra e r t o d o s lo s d a t o s a l
clie n t e , co n lo q u e la re fe re n cia s e m a t e ria liza e n e l o b je t o . Po r e je m p lo , s i q u e re m o s u t iliza r u n
ARRAY d e S QL e n u n a a p lica ció n co m o s i fu e ra u n a rra y Ja va , n e ce s it a m o s m a t e ria liza r e l o b je t o
ARRAY e n e l clie n t e p a ra co n ve rt irlo e n u n a rra y d e Ja va . En t o n ce s p o d re m o s u t iliza r lo s m é t o d o s
d e a rra ys d e Ja va p a ra o p e ra r co n lo s e le m e n t o s d e l a rra y. To d o s lo s in t e rfa ce s Blo b , Clo b , y Arra y
t ie n e n m é t o d o s p a ra m a t e ria liza r lo s o b je t o s q u e re p re s e n t a n .

Tipos Struct y Distinct

Lo s t ip o s e s t ru ct u ra d o s y d is t in ct d e S QL s o n d o s t ip o s d e d a t o s q u e e l u s u a rio p u e d e d e fin ir.


No rm a lm e n t e n o s re fe rim o s a e llo s co m o UDTs ( u s e r- d e fin e d t yp e s ) , y s e cre a n co n u n s e n t e n cia
CREATE TYP E d e S QL.
Un t ip o e s t ru ct u ra d o d e S QL s e p a re ce a lo s t ip o s e s t ru ct u ra d o s d e Ja va e n q u e t ie n e n m ie m b ro s ,
lla m a d o s a t rib u t o s , q u e p u e d e s e r cu a lq u ie r t ip o d e d a t o s . De e ch o , u n a t rib u t o p o d ría s e r a s u ve z
u n t ip o e s t ru ct u ra d o . Aq u í t ie n e s u n e je m jp lo d e u n a s im p le d e fin ició n d e u n n u e vo t ip o d e d a t o
S QL:

CREATE TYPE PLANE_POINT


(
X FLOAT,
Y FLOAT
)
Al co n t ra rio q u e lo s o b je t o s Blo b , Clo b , y Arra y , u n o b je t o S t ru c t co n t ie n e va lo re s p a ra ca d a u n o
d e lo s a t rib u t o s d e l t ip o e s t ru ct u ra d o d e S QL y n o e s s ó lo u n p u n t e ro ló g ico a l o b je t o e n la b a s e d e
d a t o s . Po r e je m p lo , s u p o n g a m o s q u e u n o b je t o P LAN E_ P OI N T e s t á a lm a ce n a d o e n la co lu m n a
P OI N TS d e la t a b la P RI CES .

ResultSet rs = stmt.executeQuery("SELECT POINTS FROM PRICES WHERE PRICE > 3000.00");


while (rs.next()) {
Struct point = (Struct)rs.getObject("POINTS");
// do something with point
}
S i e l o b je t o P LAN E_ P OI N T re cu p e ra d o t ie n e u n va lo r X d e 3 y u n va lo r Y d e - 5 , e l o b je t o S t ru c t ,
p o in t co n t e n d rá lo s va lo re s 3 y - 5 .
Po d ría m o s h a b e r o b s e rva d o r q u e S t ru c t e s e l ú n ico t ip o q u e n o t ie n e m é t o d o s g e t XXX y s e t XXX
co n s u n o m b re co m o XXX. De b e m o s u t iliza r g e t Ob je c t y s e t Ob je c t co n e je m p la re s S t ru c t . Es t o
s ig n ifica q u e cu a n d o re cu p e re m o s u n va lo r u t iliza n d o e l m é t o d o g e t Ob je c t , o b t e n d re m o s u n Ob je c t
Ja va q u e p o d re m o s fo rza r a S t ru c t , co m o s e h a h e ch o e n e l e je m p lo d e có d ig o a n t e rio r.
El s e g u n d o t ip o S QL q u e u n u s u a rio p u e d e d e fin ir co n u n a s e n t e n cia CREATE TYP E d e S QL e s u n
t ip o Dis t in ct . Es t e t ip o s e p a re ce a l t y p e d e f d e C o C+ + e n q u e e s u n t ip o b a s a d o e n u n t ip o
e xis t e n t e . Aq u í t e n e m o s u n e je m p lo d e cre a cció n d e u n t ip o d is t in ct :

CREATE TYPE MONEY AS NUMERIC(10, 2)


Es t a d e fin ició n cre a u n n u e vo t ip o lla m a d o MON EY, q u e e s u n n ú m e ro d e l t ip o N UMERI C q u e
s ie m p re e s t á e n b a s e 1 0 co n d o s d íg it o s d e s p u é s d e la co m a d e cim a l. MON EY e s a h o ra u n t ip o d e
d a t o s e n e l e s q u e m a e n e l q u e fu e d e fin id o , y p o d e m o s a lm a ce n a r e je m p la re s d e MON EY e n u n a
t a b la q u e t e n g a u n a co lu m n a d e l t ip o MON EY.
Un t ip o d is t in ct S QL s e m a p e a e n Ja va a l t ip o e n e l q u e s e m a p e a ría le t ip o o rig in a l. Po r e je m p lo ,
N UMERI C m a p e a a ja v a . m a t h . Big D e c im a l, p o rq u e e l t ip o MON EY m a p e a a
ja v a . m a t h . Big D e c im a l. Pa ra re cu p e ra r u n o b je t o MON EY, u t iliza m o s Re s u lt S e t . g e t Big D e c im a l o
Ca lla b le S t a t e m e n t . g e t Big D e c im a l; p a ra a lm a ce n a rlo u t iliza m o s
P re p a re d S t a t e m e n t . s e t Big D e c im a l.

Características Avanzadas de SQL3

Alg u n o s a s p e ct o s d e l t ra b a jo co n lo s t ip o s S QL3 p u e d e n p a re ce r b a s t a n t e co m p le jo s . Me n cio n a m o s


a lg u n a d e la s ca ra ct e rís t ica s m á s a va n za d a s p a ra q u e la s co n o zca s , p e ro u n a e xp lica ció n p ro fu n d a
n o e s a p ro p ia d a p a ra u n t u t o ria l b á s ico .
El in t e rfa ce S t ru c t e s e l m a p e o e s t á n d a rd p a ra u n t ip o e s t ru ct u ra d o d e S QL. S i q u e re m o s t ra b a ja r
fá cilm e n t e co n u n t ip o e s t ru ct u ra d o d e Ja va , p o d e m o s m a p e a rlo a u n a cla e Ja va . El t ip o s t ru ct u ra d o
s e co n vie rt e e n u n a cla s e , y s u s a t rib u t o s e n ca m p o s . No t e n e m o s p o rq u e u t iliza r u n m a p e a d o
p e rs o n a liza d o , p e ro n o rm a lm e n t e e s m á s co n ve n ie n t e .
Alg u n a s ve ce s p o d ría m o s q u e re r t ra b a ja r co n u n p u n t e ro ló g ico a u n t ip o e s t ru ct u ra d o d e S QL e n
ve z d e co n t o d o s lo s va lo re s co n t e n id o s e n e l p ro p io t ip o , Es t o p o d ría s u ce d e r, p o r e je m p lo , s i e l t ip o
e s t ru ct u ra d o t ie n e m u ch o s a t rib u t o s o s i lo s a t rib u t o s s o n m u y g ra n d e s . Pa ra re fe re n cia r u n t ip o
e s t ru ct u ra d o , p o d e m o s d e cla ra r u n t ip o REF d e S QL q u e re p re s e n t e u n t ip o e s t ru ct u ra d o p a rt icu la r.
Un o b je t o REF d e S QL s e m a p e a e n u n o b je t o Re f d e Ja va , y p o d e m o s o p e ra r co n e lla co m o s i lo
h icie ra m o s co n e l o b je t o d e l t ip o e s t ru ct u ra d o a l q u e re p re s e n t a .

Oz it o
Características de Extensión Estándard
El p a q u e t e ja v a x . s q l e s u n a e xt e n s ió n e s t á n d a rd a l le n g u a je Ja va . La
e xp e cifica ció n fin a l n o e s t á t e rm in a d a p e ro p o d e m o s ve r a lg u n a s d e la s
fu n cio n a lid a d e s b á s ica s q u e p ro p o rcio n a rá . Es t a s s o n la s ca ra ct e rís t ica s d e la
e xt e n s ió n e s t á n d a rd d e l JDBC 2 . 0 :
Ro w s e t s
Es t e o b je t o e n ca p s u la u n co n ju n t o d e fila s d e u n a h o ja d e re s u lt a d o s y p o d ría
m a n t e n e r a b ie rt a la co n e xió n co n la b a s e d e d a t o s o d e s co n e ct a rs e d e la
fu e n t e . Un ro w s e t e s u n co m p o n e n t e Ja va Be a n ; p u e d e s e r cre a d o e n e l
m o m e n t o d e l d is e ñ o y p u e d e u t iliza rs e co n o t ro s Ja va Be a n s e n u n a
h e rra m ie n t a vis u a l.
JN D I t m p a ra N o m b ra r Ba s e s d e D a t o s
El in t e rfa ce JNDI ( No m b ra d o y Dire ccio n a d o ) d e Ja va h a ce p o s ib le co n e ct a r a
u n a b a s e d e d a t o s u t iliza n d o u n n o m b re ló g ico e n lu g a r d e co d ifica r u n
n o m b re d e b a s e d e d a t o s y d e d rive r.
Co n n e c t io n P o o lin g
Un Co n n e ct io n Po o l e s u n ca ch é p a ra co n e xio n e s fre cu e n t e s q u e p u e d e n s e r
u t iliza d a s y re u t iliza d a s , e s t o re co rt a la s o b re ca rg a d e cre a r y d e s t ru ir
co n e xio n e s a b a s e s d e d a t o s .
S o p o rt e d e Tra n s a c ió n D is t rib u id a
Es t e s o p o rt e p e rm it e a l d rive r JDBC s o p o rt a r e l p ro t o co lo e s t á n d a rd d e
d o s - fa s e s u t iliza d o s e n e l API Ja va Tra n s a ct io n ( JTA) . Es t a ca ra ct e rís it ca
fa cilit a e l u s o d e la s fu n cio n a lid a d e s JDBC e n co m p o n e n t e s Ja va Be a n s d e
En t e rp ris e .

Oz it o
Utilizar el RMI (Invocación Remota de Métodos)
El s is t e m a d e In vo ca ció n Re m o t a d e Mé t o d o s ( RMI) d e Ja va p e rm it e a u n o b je t o
q u e s e e s t á e je cu t a n d o e n u n a Má q u in a Virt u a l Ja va ( VM) lla m a r a m é t o d o s d e o t ro
o b je t o q u e e s t á e n o t ra VM d ife re n t e .
N o t a : RMI p ro p o rcio n a co m u n ica ció n re m o t a e n t re p ro g ra m a s e s crit o s
e n Ja va . S i u n o s d e n u e s t ro s p ro g ra m a s e s t á e s crit o e n o t ro le n g u a je ,
d e b e re m o s co n s id e ra r la u t iliza ció n d e IDL e n s u lu g a r.

Es t a s e cció n o fre ce u n a b re ve d e s crip ció n d e l s is t e m a RMI q u e p a s e a a t ra vé s d e


u n e je m p lo co m p le t o clie n t e / s e rvid o r q u e u t iliza la ca p a cid a d e s ú n ica s d e RMI p a ra
ca rg a r y e je cu t a r t a re a s d e fin id a s p o r e l u s u a rio e n t ie m p o d e e je cu ció n . El
s e rvid o r d e l e je m p lo im p le m e n t a u n m o t o r d e cá lcu lo g e n e ra l. El clie n t e u t iliza e l
m o t o r d e cá lcu lo p a ra ca lcu la r e l va lo r d e l n ú m e ro p i.
I n t ro d u c c ió n a la s Ap lic a c io n e s RMI
De s crib e e l s is t e m a RMI y lis t a s u s ve n t a ja s . Ad e m á s , e s t a le cció n p ro p o rcio n a r
u n a d e s crip ció n d e u n a a p lica ció n t íp ica d e RMI, co m p u e s t a p o r u n s e rvid o r y u n
clie n t e , y p re s e n t a lo s t é rm in o s im p o rt a n t e s .
Es c rib ir u n S e rv id o r RMI
Mu e s t ra e l có d ig o d e l s e rvid o r d e l m o t o r d e cá lcu lo . A t ra vé s d e e s t e e je m p lo ,
a p re n d e re m o s có m o d is e ñ a r e im p le m e n t a t u n s e rvid o r RMI.
Cre a r u n P ro g ra m a Clie n t e
Ech a u n vis t a zo a u n p o s ib le clie n t e d e l m o t o r d e cá lcu lo y lo u t iliza p a ra ilu s t ra r la s
ca ra ct e rís t ica s im p o rt a n t e s d e u n clie n t e RMI.
Co m p ila r y Eje c u t a r e l Eje m p lo
Mu e s t ra có m o co m p ila r y e je cu t a r t a n t o e l s e rvid o r d e l m o t o r d e cá lcu lo co m o s u
clie n t e .

Oz it o
Introducción a las Aplicaciones RMI
La s a p lica cio n e s RMI n o rm a lm e n t e co m p re n d e n d o s p ro g ra m a s s e p a ra d o s : u n
s e rvid o r y u n clie n t e . Un a a p lica ció n s e rvid o r t íp ica cre a u n m o n t ó n d e o b je t o s
re m o t o s , h a ce a cce s ib le s u n a s re fe re n cia s a d ich o s o b je t o s re m o t o s , y e s p e ra a
q u e lo s clie n t e s lla m e n a e s t o s m é t o d o s u o b je t o s re m o t o s . Un a a p lica ció n clie n t e
t íp ica o b t ie n e u n a re fe re n cia re m o t a d e u n o o m á s o b je t o s re m o t o s e n e l s e rvid o r y
lla m a a s u s m é t o d o s . RMI p ro p o rcio n a e l m e ca n is m o p o r e l q u e s e co m u n ica n y s e
p a s a n in fo rm a ció n d e l clie n t e a l s e rvid o r y vice ve rs a . Cu a n d o e s u n a a p lica ció n
a lg u n a s ve ce s n o s re fe rim o s a e lla co m o Ap lic a c ió n d e Ob je t o s D is t rib u id o s .
La s a p lica cio n e s d e o b je t o s d is t rib u id o s n e ce s it a n :
Lo c a liz a r Ob je t o s Re m o t o s
La s a p lica cio n e s p u e d e n u t iliza r u n o d e lo s d o s m e ca n is m o s p a ra o b t e n e r
re fe re n cia s a o b je t o s re m o t o s . Pu e d e re g is t ra r s u s o b je t o s re m o t o s co n la
fa cilid a d d e n o m b ra d o d e RMI rm ire g is t ry . O p u e d e p a s a r y d e vo lve r
re fe re n cia s d e o b je t o s re m o t o s co m o p a rt e d e s u o p e ra ció n n o rm a l.
Co m u n ic a r c o n Ob je t o s Re m o t o s
Lo s d e t a lle s d e la co m u n ica ció n e n t re o b je t o s re m o t o s s o n m a n e ja d o s p o r e l
RMI; p a ra e l p ro g ra m a d o r, la co m u n ica ció n re m o t a s e p a re ce rá a u n a llá m a d a
e s t á n d a rd a u n m é t o d o Ja va .
Ca rg a r By t e c o d e s p a ra o b je t o s q u e s o n e n v ia d o s .
Co m o RMI p e rm it e a l lla m a d o r p a s a r o b je t o s Ja va a o b je t o s re m o t o s , RMI
p ro p o rcio n a e l m e ca n is m o n e ce s a rio p a ra ca rg a r e l có d ig o d e l o b je t o , a s í
co m o la t ra n s m is ió n d e s u s d a t o s .
La s ig u ie n t e ilu s t ra ció n m u e s t ra u n a a p lica ció n RMI d is t rib u id a q u e u t iliza e l
re g is t ro p a ra o b t e n e r re fe re n cia s a o b je t o s re m o t o s . El s e rvid o r lla m a a l re g is t ro
p a ra a s o cia r u n n o m b re co n u n o b je t o re m o t o . El clie n t e b u s ca e l o b je t o re m o t o
p o r s u n o m b re e n e l re g is t ro d e l s e rvid o r y lu e g o lla m a a u n m é t o d o . Es t a
ilu s t ra ció n t a m b ié n m u e s t ra q u e e l s is t e m a RMI u t iliza u n a s e rvid o r We b e xis t e n t e
p a ra ca rg a r lo s b yt e co d e s d e la cla s e Ja va , d e s d e e l s e rvid o r a l clie n t e y d e s d e e l
clie n t e a l s e rvid o r, p a ra lo s o b je t o s q u e n e ce s it a .

El s is t e m a RMI u t iliza u n s e rvid o r We b p a ra ca rg a r lo s b yt e co d e s d e la cla s e Ja va ,


d e s d e e l s e rvid o r a l clie n t e y d e s d e e l clie n t e a l s e rvid o r.

Ventajas de la Carga Dinámica de Código

Un a d e la s p rin cip a le s y ú n ica s ca ra ct e rís t ica s d e RMI e s la h a b ilid a d d e d e s ca rg a r


lo s b y t e c o d e s ( o s im p le m e n t e , c ó d ig o ) d e u n a cla s e d e u n o b je t o s i la cla s e n o
e s t á d e fin id a e n la m á q u in a virt u a l d e l re cib id o r. Lo s t ip o s y co m p o rt a m ie n t o s d e
u n o b je t o , a n t e rio rm e n t e s ó lo d is p o n ib le s e n u n a s ó la m á q u in a virt u a l, a h o ra
p u e d e n s e r t ra n s m it id o s a o t ra m á q u in a virt u a l, p o s ib le m e n t e re m o t a . RMI p a s a lo s
o b je t o s p o r s u t ip o ve rd a d e ro , p o r e s o e l co m p o rt a m ie n t o d e d ich o s o b je t o s n o
ca m b ia cu a n d o s o n e n via d o s a o t ra m á q u in a virt u a l. Es t o p e rm it e q u e lo s n u e vo s
t ip o s s e a n in t ro d u cid o s e n m á q u in a s virt u a le s re m o t a s , y a s í e xt e n d e r e l
co m p o rt a m ie n t o d e u n a a p lica ció n d in á m ica m e n t e . El e je m p lo d e l m o t o r d e cá lcu lo
d e e s t e ca p ít u lo u t iliza la s ca p a cid a d d e RMI p a ra in t ro d u cir u n n u e vo
co m p o rt a m ie n t o e n u n p ro g ra m a d is t rib u id o .

Interfaces, Objetos y Métodos Remotos

Un a a p lica ció n d is t rib u id a co n s t ru id a u t iliza n d o RMI d e Ja va , a l ig u a l q u e o t ra s


a p lica cio n e s Ja va , e s t á co m p u e s t a p o r in t e rfa ce s y cla s e s . Lo s in t e rfa ce s d e fin e n
m é t o d o s , m ie n t ra s q u e la s cla s e s im p le m e n t a n lo s m é t o d o s d e fin id o s e n lo s
in t e rfa ce s y, q u izá s , t a m b ié n d e fin e n a lg u n o s m é t o d o s a d icio n a le s . En u n a
a p lica ció n d is t rib u id a , s e a s u m e q u e a lg u n a s im p le m e n t a cio n e s re s id e n e n
d ife re n t e s m á q u in a s virt u a le s . Lo s o b je t o s q u e t ie n e n m é t o d o s q u e p u e d e n
lla m a rs e p o r d is t in t a s m á q u in a s virt u a le s s o n lo s o b je t o s re m o t o s .
Un o b je t o s e co n vie rt e e n re m o t o im p le m e n t a n d o u n in t e rfa c e re m o t o , q u e t e n g a
e s t a s ca ra ct e rís it ca s :
● Un in t e rfa ce re m o t o d e s cie n d e d e l in t e rfa ce ja v a . rm i. Re m o t e .

● Ca d a m é t o d o d e l in t e rfa ce d e cla ra q u e la n z a u n a
ja v a . rm i. Re m o t e Ex c e p t io n a d e m á s d e cu a lq u ie r e xce p ció n e s p e cífica d e la
a p lica ció n .
El RMI t ra t a a u n o b je t o re m o t o d e fo rm a d ife re n t e a co m o lo h a ce co n lo s o b je t o s
n o - re m o t o s cu a n d o e l o b je t o e s p a s a d o d e s d e u n a m á q u in a virt u a l a o t ra . En ve z
d e h a ce r u n a co p ia d e la im p le m e n t a ció n d e l o b je t o e n la m á q u in a virt u a l q u e lo
re cib e , RMI p a s a u n s t u b p a ra u n o b je t o re m o t o . El s t u b a ct ú a co m o la
re p re s e n t a ció n lo ca l o p ro xy d e l o b je t o re m o t o y b á s ica m e n t e , p a ra e l lla m a d o r, e s
la re fe re n cia re m o t a . El lla m a d o r in vo ca u n m é t o d o e n e l s t u b lo ca l q u e e s
re s p o n s a b le d e lle va r a ca b o la lla m a d a a l o b je t o re m o t o .
Un s t u b p a ra u n o b je t o re m o t o im p le m e n t a e l m is m o co n ju n t o d e in t e rfa ce s
re m o t o s q u e e l o b je t o re m o t o . Es t o p e rm it e q u e e l s t u b s e a t ip a d o a cu a lq u ie ra d e
lo s in t e rfa ce s q u e e l o b je t o re m o t o im p le m e n t a . S in e m b a rg o , e s t o t a m b ié n
s ig n ifica q u e s ó lo a q u e llo s m é t o d o s d e fin id o s e n u n in t e rfa ce re m o t o e s t á n
d is p o n ib le s p a ra s e r lla m a d o s e n la m á q u in a virt u a l q u e lo re cib e .
Crear Aplicaciones Distribuidas utilizando RMI

Cu a n d o s e u t iliza RMI p a ra d e s a rro lla r u n a a p lica ció n d is t rib u id a , d e b e m o s s e g u ir


e s t o s p a s o s g e n e ra le s :
1 . Dis e ñ a r e im p le m e n t a r lo s co m p o n e n t e s d e n u e s t ra a p lica ció n d is t rib u id a .
2 . Co m p ila r lo s Fu e n t e s y g e n e ra r s t u b s .
3 . Ha ce r la s cla s e s Acce s ib le s a la Re d .
4 . Arra n ca r la Ap lica ció n .

Diseñar e implementar los componentes de nuestra aplicación distribuida.

Prim e ro , d e cid im o s la a rq u it e ct u ra d e n u e s t ra a p lica ció n y d e t e rm in a m o s q u é


co m p o n e n t e s s o n o b je t o s lco a le s y cu a le s d e b e ría n s e r a cce s ib le s re m o t a m e n t e .
Es t e p a s o in clu ye :
● D e fin ir lo s I n t e rfa c e s Re m o t o s . Un in t e rfa ce re m o t o e s p e cifica lo s m é t o d o s
q u e p u e d e n s e r lla m a d o s re m o t a m e n t e p o r u n clie n t e . Lo s clie n t e s p ro g ra m a n
lo s in t e rfa ce s re m o t o s , n o la im p le m e n t a ció n d e la s cla s e s d e d ich o s
in t e rfa ce s . Pa rt e d e l d is e ñ o d e d ich o s in t e rfa ce s e s la d e t e rm in a ció n d e
cu a lq u ie r o b je t o lo ca l q u e s e a u t iliza d o co m o p a rá m e t ro y lo s va lo re s d e
re t o rn o d e e s o s m é t o d o s ; s i a lg u n o d e e s o s in t e rfa ce s o cla s e s n o e xis t e n a ú n
t a m b ié n t e n e m o s q u e d e fin irlo s .
● I m p le m e n t a r lo s Ob je t o s Re m o t o s . Lo s o b je t o s re m o t o s d e b e n
im p le m e n t a r u n o o va rio s in t e rfa ce s re m o t o s . La cla s e d e l o b je t o re m o t o
p o d ría in clu ir im p le m e n t a cio n e s d e o t ro s in t e rfa ce s ( lo ca le s o re m o t o s ) y o t ro s
m é t o d o s ( q u e s ó lo e s t a rá n d is p o n ib le s lo ca lm e n t e ) . S i a lg u n a cla s e lo ca l va a
s e r u t iliza d a co m o p a rá m e t ro o có m o va lo r d e re t o rn o d e a lg u n o d e e s o s
m é t o d o s , t a m b ié n d e b e s e r im p le m e n t a d a .
● I m p le m e n t a r lo s Clie n t e s . Lo s clie n t e s q u e u t iliza n o b je t o s re m o t o s p u e d e n
s e r im p le m e n t a d o s d e s p u é s d e h a b e r d e fin id o lo s in t e rfa ce s re m o t o s , in clu s o
d e s p u é s d e q u e lo s o b je t o s re m o t o s h a ya n s id o d e s p le g a d o s .

Compilar los Fuentes y Generar stubs.

Es t e e s u n p ro ce s o d e d o s p a s o s . En e l p rim e r p a s o , s e u t iliza e l co m p ila d o r ja v a c


p a ra co m p ila r lo s fich e ro s fu e n t e s d e Ja va , lo s cu a le s co n t ie n e n la s
im p le m e n t a cio n e s d e lo s in t e rfa ce s re m o t o s , la s cla s e s d e l s e rvid o r, y d e l clie n t e .
En e l s e g u n d o p a s o e s u t iliza r e l co m p ila d o r rm ic p a ra cre a r lo s s t u b s d e lo s
o b je t o s re m o t o s . RMI u t iliza u n a cla s e s t u b d e l o b je t o re m o t o co m o u n p ro xy e n e l
clie n t e p a ra q u e lo s clie n t e s p u e d a n co m u n ica rs e co n u n o b je t o re m o t o p a rt icu la r.

Hacer accesibles las Clases en la Red.

En e s t e p a s o , t e n m o s q u e h a ce r q u e t o d o - lo s fich e ro s d e cla s e s Ja va a s o cia d o s


co n lo s in t e rfa ce s re m o t o s , lo s s t u b s , y o t ra s cla s e s q u e n e ce s it e m o s d e s ca rg a r e n
lo s clie n t e s - s e a n a cce s ib le s a t ra vé s d e u n s e rvid o r We b .

Arrancar la Aplicación.

Arra n ca r la a p lica ció n in clu ye e je cu t a r e l re g is t ro d e o b je t o s re m o t o s d e RMI, e l


s e rvid o r y e l clie n t e .
El re s t o d e e s t e ca p ít u lo m u e s t ra có m o s e g u ir e s t o s p a s o s p a ra cre a r u n m o t o r d e
cá lcu lo .

Construir un Motor de Cálculo Genérico

Es t a s e cció n s e e n fo ca a u n a s e n cilla p e ro p o t e n t e a p lica ció n d is t rib u id a lla m a d a


m o t o r d e cá lcu lo . Es t e m o t o r d e cá lcu lo e s u n o b je t o re m o t o e n e l s e rvid o r q u e
t o m a t a re a s d e clie n t e s , la s e je cu t a , y d e vu e lve lo s re s u lt a d o s . La s t a re a s s e
e je cu t a n e n la m á q u in a e n la q u e s e e s t á e je cu t a n d o e l s e rvid o r. Es t e t ip o d e
a p lica ció n d is t rib u id a p o d ría p e rm it ir q u e u n n ú m e ro d e m á q u in a s clie n t e s
u t iliza ra n u n a m á q u in a p o t e n t e , o u n a q u e t u vie ra h a rd wa re e s p e cia liza d o .
El a s p e ct o n o ve d o s o d e l m o t o r d e cá lcu lo e s q u e la s t a re a s q u e e je cu t a n o
n e ce s it a n e s t a r d e fin id a s cu a n d o s e e s crib e e l m o t o r d e cá lcu lo . S e p u e d e n cre a r
n u e va s cla s e s d e t a re a s e n cu a lq u ie r m o m e n t o y lu e g o e n t re g a rla s e l m o t o r d e
cá lcu lo p a ra e je cu t a rla s . To d o lo q u e u n a t a re a re q u ie re e s q u e s u cla s e
im p le m e n t e u n in t e rfa ce p a rt icu la r. Po r e s o u n a t a re a p u e d e s e r e n via d a a l m o t o r
d e cá lcu lo y e je cu t a d a , in clu s o s i la cla s e q u e d e fin e la t a re a fu e e s crit a m u ch o
d e s p u é s d e q u e e l m o t o r d e cá lcu lo fu e ra e s crit o y a rra n ca d o . El có d ig o n e ce s it a
co n s e g u ir q u e u n a t a re a s e a d e s ca rg a d a p o r e l s is t e m a RMI a l m o t o r d e cá lcu lo , y
q u e é s t e e je cu t e la t a re a u t iliza n d o lo s re cu rs o s d e la m á q u in a e n la q u e e s t á
e je cu t a n d o e l m o t o r d e cá lcu lo .
La h a b ilid a d p a ra re a liza r t a re a s a rb it ra ria s e s t a p e rm it id a p o r la n a t u ra le za
d in á m ica d e la p la t a fo rm a Ja va , q u e s e e xt ie n d e a t ra vé s d e la re d m e d ia n t e RMI.
El RMI ca rg a d in á m ica m e n t e e l có d ig o d e la s t a re a s e n la m á q u in a virt u a l d e l m o t o r
d e cá lcu lo y e je cu t a la t a re a s i t e n e r u n co n o cim ie n t o a n t e rio r d e la cla s e q u e
im p le m e n t a la t a re a . Un a a p lica ció n co m o é s t a q u e t ie n e la h a b ilid a d d e d e s ca rg a r
có d ig o d in á m ica m e n t e re cib e e l n o m b re d e "a p lica ció n b a s a d a e n
co m p o rt a m ie n t o ". Dich a s a p lica cio n e s n o rm a lm e n t e re q u ie re n in fra e s t ru ct u ra s q u e
p e rm it a n a g e n t e s . Co n RMI, d ich a s a p lica cio n e s s o n p a rt e d e l m a ca n is m o b á s ico d e
p ro g ra m a ció n d is t rib u id a d e Ja va .

Oz it o
Escribir un Servidor RMI
El s e rvid o r d e l m o t o r d e cá lcu lo a ce p t a t a re a s d e lo s clie n t e s , la s e je cu t a , y
d e vu e lve lo s re s u lt a d o s . El s e rvid o r e s t á co m p u e s t o p o r u n in t e rfa ce y u n a cla s e . El
in t e rfa ce p ro p o cio n a la d e fin ició n d e lo s m é t o d o s q u e p u e d e n s e r lla m a d o s d e s d e e l
clie n t e . Es e n cia lm e n t e , e l in t e rfa ce d e fin e lo q u e e l clie n t e ve d e l o b je t o re m o t o . La
cla s e p ro p o rcio n a la im p le m e n t a ció n .
Dis e ñ a r u n In t e rfa ce Re m o t o
Es t a p á g in a m u e s t ra có m o e l in t e rfa ce Co m p u t e e s e l p e g a m e n t o q u e
co n e ct a e l clie n t e y e l s e rvid o r. Ta m b ié n a p re n d e re m o s s o b re e l API d e
RMI q u e s o p o rt a e s t a co m u n ica ció n .
Im p le m e n t a r u n In t e rfa ce Re m o t o
En e s t a p á g in a e xp lo ra re m o s la cla s e q u e im p le m e n t a e l in t e rfa ce
Co m p u t e , q u e im p le m e n t a u n o b je t o re m o t o . Es t a cla s e t a m b ié n
p ro p o cio n a e l re s t o d e l có d ig o q u e co n fig u ra e l p ro g ra m a s e rvid o r: u n
m é t o d o m a in q u e cre a u n e je m p la r d e l o b je t o re m o t o , lo re g is t ra co n la
fa cilid a d d e n o m b ra d o , y co n fig u ra u n co n t ro la d o r d e s e g u rid a d .

Oz it o
Diseñar un Interface Remoto
En e l co ra zó n d e l m o t o r d e cá lcu lo h a y u n p ro t o co lo q u e p e rm it e q u e s e le p u e d a n
e n via r t ra b a jo s , e l m o t o r d e cá lcu lo e je cu t a e s o s t ra b a jo s , y lo s re s u lt a d o s s o n
d e vu e lt o s a l clie n t e . Es t e p ro t o co lo e s t á e xp re s a d o e n in t e rfa ce s s o p o rt a d o s p o r e l
m o t o r d e cá lcu lo y p o r lo s o b je t o s q u e le s o n e n via d o s .

El p ro t o co lo d e l m o t o r d e cá lcu lo e n a cció n .
Ca d a u n o d e lo s in t e rfa ce s co n t ie n e u n s ó lo m é t o d o . El in t e rfa ce d e l m o t o r d e
cá lcu lo Co m p u t e , p e rm it e q u e lo s t ra b a jo s s e a n e n via d o s a l m o t o r, m ie n t ra s q u e
e l in t e rfa ce Ta s k d e fin e có m o e l m o t o r d e cá lcu lo e je cu t a u n a t a re a e n via d a .
El in t e rfa ce c o m p u t e . Co m p u t e d e fin e la p a rt e a cce s ib le re m o t a m e n t e - e l p ro p io
m o t o r d e cá lcu lo . Aq u í e s t á e l in t e rfa ce re m o t o co n s u ú n ico m é t o d o :

package compute;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Compute extends Remote {


Object executeTask(Task t) throws RemoteException;
}
Al e xt e n d e r e l in t e rfa ce ja v a . rm i. Re m o t e , e s t e in t e rfa ce s e m a rca a s í m is m o
co m o u n o d e a q u e llo s m é t o d o s q u e p u e d e n s e r lla m a d o s d e s d e cu a lq u ie r m á q u in a
virt u a l. Cu a lq u ie r o b je t o q u e im p le m e n t e e s t e in t e rfa ce s e co n vie rt e e n u n o b je t o
re m o t o .
Co m o m ie m b ro d e u n in t e rfa ce re m o t o , e l m é t o d o e x e c u t e Ta s k e s u n m é t o d o
re m o t o . Po r lo t a n t o , e l m é t o d o d e b e s e r d e fin id o co m o ca p a z d e la n za r u n a
ja v a . rm i. Re m o t e Ex c e p t io n . Es t a e xce p ció n e s la n za d a p o r e l s is t e m a RMI
d u ra n t e u n a lla m a d a a u n m é t o d o re m o t o p a ra in d ica r q u e h a fa lla d o la
co m u n ica ció n o q u e h a o cu rrid o u n e rro r d e p ro t o co lo . Un a Re m o t e Ex c e p t io n e s
u n a e xce p ció n ch e q u e a d a , p o r e s o cu a lq u ie r m é t o d o Ja va q u e h a g a u n a lla m a d a a
u n m é t o d o re m o t o r n e ce s it a m a n e ja r e s t a e xce p ció n , ca p t u rá n d o la o d e cla rá n d o la
e n s u s cla u s u la t h ro w s .
El s e g u n d o in t e rfa ce n e ce s it a d o p o r e l m o t o r d e cá lcu lo d e fin e e l t ip o Ta s k . Es t e
t ip o e s u t iliza d o co m o u n a rg u m e n t o d e l m é t o d o e x e c u t e Ta s k d e l in t e rfa ce
Co m p u t e . El in t e rfa ce c o m p u t e . Ta s k d e fin e e l in t e rfa ce e n t re e l m o t o r d e cá lcu lo
y e l t ra b a jo q u e n e ce s it a h a ce r, p ro p o rcio n a n d o la fo rm a d e in icia r e l t ra b a jo :
package compute;

import java.io.Serializable;

public interface Task extends Serializable {


Object execute();
}
El in t e rfa ce Ta s k d e fin e u n s ó lo m é t o d o , e x e c u t e . Es t e m é t o d o d e vu e lve u n
Ob je c t , y n o t ie n e p a rá m e t ro s n i la n za e xce p cio n e s . Co m o e s t e in t e rfa ce n o
e xt ie n d e Re m o t e , e l m é t o d o n o n e ce s it a lis t a r ja v a . rm i. Re m o t e Ex c e p t io n e n s u
cla u s u la t h ro w s .
El va lo r d e re t o rn o d e lo s m é t o d o s e x e c u t e Ta s k d e Co m p u t e y e x e c u t e d e Ta s k
e s d e cla ra d o co m o d e l t ip o Ob je c t . Es t o s ig n ifica q u e cu a lq u ie ra t a re a q u e q u ie ra
d e vo lve r u n va lo r d e u n o d e lo s t ip o s p rim it ivo s d e Ja va ( co m o u n in t o u n flo a t )
n e ce s it a cre a r u n e je m p la r d e la cla s e e n vo lve n t e e q u iva le n t e p a ra e s e t ip o ( co m o
u n I n t e g e r o u n Flo a t ) y d e vo lve r e s e o b je t o e n s u lu g a r.
Ob s e rva m o s q u e e l in t e rfa ce Ta s k e xt ie n d e e l in t e rfa ce ja v a . io . S e ria liz a b le . El
RMI u t iliza e l m e ca n is m o d e s e ria liza ció n d e o b je t o s p a ra t ra n s p o rt a r o b je t o s e n t re
m á q u in a s virt u a le s . Im p le m e n t a r S e ria liz a b le h a ce q u e la cla s e s e a ca p a z d e
co n ve rt irs e e n u n s t re a m d e b yt e s a u t o - d e s crip t o r q u e p u e d e s e r u t iliza d o p a ra
re co n s t ru ir u n a co p ia e xa ct a d e l o b je t o s e ria liza d o cu a n d o e l o b je t o e s le íd o d e s d e
e l s t re a m .
S e p u e d e n e je cu t a r d ife re n t e s t ip o s d e t a re a s e n u n o b je t o Co m p u t e s ie m p re q u e
s e a n im p le m e n t a cio n e s d e l t ip o Ta s k . La s cla s e s q u e im p le m e n t e n e s t e in t e rfa ce
p u e d e n co n t e n e r cu a lq u ie r d a t o n e ce s a rio p a ra e l cá lcu lo d e la t a re a , y cu a lq u ie r
o t ro m é t o d o n e ce s a rio p a ra e s e cá lcu lo .
As í e s có m o RMI h a ce p o s ib le e s t e s e n cillo m o t o r d e cá lcu lo . Co m o RMI p u e d e
a s u m ir q u e lo s o b je t o s Ta s k e s t á n e s crit o s e n Ja va , la s im p le m e n t a cio n e s d e lo s
o b je t o s Ta s k q u e a n t e rio rm e n t e e ra n d e s co n o cid a s p a ra e l m o t o r d e cá lcu lo s o n
d e s ca rg a d a s p o r e l RMI d e n t ro d e la m á q u in a virt u a l d e l m o t o r d e cá lcu lo cu a n d o
s e a n e ce s a rio . Es t o p e rm it e a lo s clie n t e s d e l m o t o r d e cá lcu lo d e fin ir n u e vo s t ip o s
d e t a re a s p a ra s e r e je cu t a d a s e n e l s e rvid o r s in n e ce s it a r q u e e l có d ig o s e a
in s t a la d o e xp lícit a m e n t e e n d ich a m á q u in a . Ad e m á s , co m o e l m é t o d o
e x e c u t e Ta s k d e vu e lve u n ja v a . la n g . Ob je c t , cu a lq u ie r t ip o d e o b je t o Ja va p u e d e
s e r p a s a d o co m o va lo r d e re t o rn o e n u n a lla m a d a re m o t a .
El m o t o r d e cá lcu lo , im p le m e n t a d o p o r la cla s e Co m p u t e En g in e , im p le m e n t a e l
in t e rfa ce Co m p u t e , p e rm it ie n d o q u e d ife re n t e s t a re a s le s e a n e n via d a s m e d ia n t e
lla m a d a s a s u m é t o d o e x e c u t e Ta s k . Es t a s t a re a s s e e je cu t a n u t iliza n d o la
im p le m e n t a ció n d e t a s k d e l m é t o d o e x e c u t e . El m o t o r d e cá lcu lo d e vu e lve lo s
re s u lt a d o s a s u lla m a d o r a t ra vé s d e s u va lo r d e re t o rn o : u n Ob je c t .

Oz it o
Implementar un Interface Remoto
Em p e ce m o s la t a re a d e im p le m e n t a r u n a cla s e p a ra e l m o t o r d e cá lcu lo . En g e n e ra l, la
im p le m e n t a ció n d e la cla s e p a ra u n in t e rfa ce re m o t o d e b e ría a l m e n o s :
● De cla ra r lo s In t e rfa ce s re m o t o s q u e e s t á n s ie n d o im p le m e n t a d o s .

● De fin ir e l co n s t ru ct o r d e l o b je t o re m o t o .

● Pro p ro rcio n a r u n a im p le m e n t a ció n p a ra ca d a m é t o d o re m o t o d e ca d a in t e rfa ce re m o t o .

El s e rvid o r n e ce s it a cre a r e in s t a la r lo s o b je t o s re m o t o s . Es t e p ro ce s o d e co n fig u ra ció n p u e d e s e r


e n ca p s u la d o e n u n m é t o d o m a in e n la p ro p ia cla s e d e im p le m e n t a ció n d e l o b je t o re m o t o , o p u e d e
s e r in clu id o co m p le t a m e n t e e n o t ra cla s e . El p ro ce s o d e co n fig u ra ció n d e b e ría :
● Cre a r e in s t a la r u n co n t ro la d o r d e s e g u rid a d .

● Cre a r u n o o m á s e je m p la re s d e l o b je t o re m o t o .

● Re g is t ra r a l m e n o s u n o d e lo s o b je t o s re m o t o s co n e l re g is t ro d e o b je t o s re m o t o s d e RMI ( a
a lg ú n o t ro s e rvicio d e n o m b ra d o q u e u t ilice JNDI) .
Ab a jo p o d e m o s ve r la im p le m e n t a ció n co m p le t a d e l m o t o r d e cá lcu lo . La cla s e
e n g in e . Co m p u t e En g in e im p le m e n t a e l in t e rfa ce re m o t o Co m p u t e y t a m b ié n in clu ye e l m é t o d o
m a in p a ra co n fig u ra r e l m o t o r d e cá lcu lo :

package engine;

import java.rmi.*;
import java.rmi.server.*;
import compute.*;

public class ComputeEngine extends UnicastRemoteObject


implements Compute
{
public ComputeEngine() throws RemoteException {
super();
}
public Object executeTask(Task t) {
return t.execute();
}

public static void main(String[] args) {


if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
String name = "//localhost/Compute";
try {
Compute engine = new ComputeEngine();
Naming.rebind(name, engine);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngine exception: " + e.getMessage());
e.printStackTrace();
}
}
}
Ah o ra e ch a re m o s u n a m ira d a m á s ce rca n a a ca d a u n o d e lo s co m p o n e n t e s d e la im p le m e n t a ció n d e l
m o t o r d e cá lcu lo .
Declarar los Interfaces Remotos que están siendo Implementados

La cla s e q u e im p le m e n t a e l m o t o r d e cá lcu lo s e d e cla ra co m o :

public class ComputeEngine extends UnicastRemoteObject


implements Compute
Es t a d e cla ra ció n in d ica q u e la cla s e im p le m e n t a e l in t e rfa ce re m o t o Co m p u t e ( y, p o r lo t a n t o ,
d e fin e u n o b je t o re m o t o ) y e xt ie n d e la cla s e ja v a . rm i. s e rv e r. Un ic a s t Re m o t e Ob je c t .
Un ic a s t Re m o t e Ob je c t e s u n a cla s e d e co n ve n ie n cia , d e fin id a e n e l API p ú b lico d e l RMI, q u e p u e d e
s e r u t iliza d a co m o s u p e rcla s e p a ra la im p le m e n t a ció n d e o b je t o s re m o t o s . La s u p e rcla s e
Un ic a s t Re m o t e Ob je c t s u m in is t ra im p le m e n t a ció n p a ra u n g ra n n ú m e ro d e m é t o d o s d e
ja v a . la n g . Ob je c t ( e q u a ls , h a s h Co d e , t o S t rin g ) p a ra q u e e s t é n d e fin id o s a p ro p ia d a m e n t e p a ra
o b je t o s re m o t o s . Un ic a s t Re m o t e Ob je c t t a m b ié n in clu ye co n s t ru ct o re s y m é t o d o s e s t á t ico s
u t iliza d o s p a ra e x p o rt a r u n o b je t o re m o t o , e s d e cir, h a ce r q u e e l o b je t o re m o t o p u e d a re cib ir
lla m a d a s d e lo s clie n t e s .
Un a im p le m e n t a ció n d e o b je t o re m o t o n o t ie n e p o rq u e e xt e n d e r Un ic a s t Re m o t e Ob je c t , y n in g u n a
im p le m e n t a ció n q u e lo h a g a d e b e s u m in is t ra r la s im p le m e n t a cio n e s a p ro p ia d a s d e lo s m é t o d o s d e
ja v a . la n g . Ob je c t . Ad e m á s , u n a im p le m e n t a ció n d e u n o b je t o re m o t o d e b e h a ce r u n a lla m a d a
e xp lícit a a u n o d e lo s m é t o d o s e x p o rt Ob je c t d e Un ic a s t Re m o t e Ob je c t p a ra q u e e l e n t o rn o RMI
s e d e cu e n t a d e l o b je t o re m o t o p a ra q u e é s t e p u e d a a ce p t a r lla m a d a s .
Al e xt e n d e r Un ic a s t Re m o t e Ob je c t , la Co m p u t e En g in e p u e d e s e r u t iliza d a p ra cre a r u n s ó lo
o b je t o re m o t o q u e s o p o rt e co m u n ica ció n re m o t a ( p u n t o a p u n t o ) y q u e u t ilice e l t ra n s p o rt e d e
co m u n ica ció n b a s a d o e n s o cke t s q u e t ie n e p o r d e fe ct o e l RMI.
S i e le g im o s e xt e n d e r u n o b je t o re m o t o d e o t ra cla s e d is t in t a d e Un ic a s t Re m o t e Ob je c t , o ,
a lt e rn a t iva m e n t e , lo s e xt e n d e m o s d e la n u e va cla s e ja v a . rm i. a c t iv a t io n . Ac t iv a t a b le d e l JDK 1 . 2
( u t iliza d a p ra co n s t ru ir o b je t o s re m o t o s q u e p u e d a n s e r e je cu t a d o s s o b re d e m a n d a ) , n e ce s it a m o s
e xp o rt a r e xp lícit a m e n t e e l o b je t o re m o t o lla m a n d o a u n o d e lo s m é t o d o s
Un ic a s t Re m o t e Ob je c t . e x p o rt Ob je c t o Ac t iv a t a b le . e x p o rt Ob je c t d e s d e e l co n s t ru ct o r d e
n u e s t ra cla s e ( o cu a lq u ie r o t ro m é t o d o d e in icia liza ció n , cu a n d o s e a a p ro p ia d o ) .
El e je m p lo d e l m o t o r d e cá lcu lo d e fin e u n o b je t o re m o t o q u e im p le m e n t a u n s ó lo in t e rfa ce re m o t o y
n in g ú n o t ro in t e rfa ce . La cla s e Co m p u t e En g in e t a m b ié n co n t ie n e a lg u n o s m é t o d o s q u e s ó lo
p u e d e n s e r lla m a d o s lo ca lm e n t e . El p rim e ro d e e llo s e s u n co n s t ru ct o r p a ra o b je t o s
Co m p u t e En g in e ; e l s e g u n d o e s u n m é t o d o m a in q u e e s u t iliza d o p a ra cre a r u n o b je t o
Co m p u t e En g in e y p o n e rlo a d is p o s ició n d e lo s clie n t e s .

Definir el Constructor

La cla s e Co m p u t e En g in e t ie n e u n ú n ico co n s t ru ct o r q u e n o t o m a a rg u m e n t o s :

public ComputeEngine() throws RemoteException {


super();
}
Es t e co n s t ru ct o r s ó lo lla m a a l co n s t ru ct o r d e s u s u p e rcla s e , q u e e s e l co n s t ru ct o r s in a rg u m e n t o s d e
la cla s e Un ic a s t Re m o t e Ob je c t . Au n q u e e l co n s t ru ct o r d e la s u p e rcla s e o b t ie n e la lla m a d a in clu s o
s i la o m it im o s e n e l co n s t ru ct o r d e Co m p u t e En g in e , la h e m o s in clu id o p o r cla rid a d .
Du ra n t e la co n s t ru cció n , u n o b je t o Un ic a s t Re m o t e Ob je c t e s e x p o rt a d o , lo q u e s ig n ifica q u e e s t á
d is p o n ib le p a ra a ce p t a r p e t icio n e s d e e n t ra d a a l e s cu ch a r la s lla m a d a s d e lo s clie n t e s e n u n p u e rt o
a n ó n im o .
N o t a : En e l JDK 1 . 2 , p o d ría m o s in d ica r e l p u e rt o e s p e cífico q u e u n o b je t o re m o t o u t iliza
p a ra a ce p t a r p e t icio n e s .
El co n s t ru ct o r s in a rg u m e n t o s d e la s u p e rcla s e , Un ic a s t Re m o t e Ob je c t , d e cla ra la e xce p ció n
Re m o t e Ex c e p t io n e n s u cla u s u la t h ro w s , p o r e s o e l co n s t ru ct o r d e Co m p u t e En g in e t a m b ié n
d e b e d e cla ra r q u e la n za u n a Re m o t e Ex c e p t io n . Es t a e xce p ció n p u e d e o cu rrir d u ra n t e la
co n s t ru cció n s i fa lla e l in t e n t o d e e xp o rt a r e l o b je t o ( d e b id o a q u e , p o r e je m p lo , n o e s t á n d is p o n ib le s
lo s re cu rs o s d e co m u n ica ció n o a q u e la cla s e s t u b a p ro p ia d a n o s e e n cu e n t ra ) .

Proporcionar una Implementación para cada Método Remoto

La cla s e p a ra u n o b je t o re m o t o p ro p o rcio n a im p le m e n t a cio n e s p a ra t o d o s lo s m é t o d o s re m o t o s


e s p e cifica d o s e n lo s in t e rfa ce s re m o t o s . El in t e rfa ce Co m p u t e co n t ie n e u n s ó lo m é t o d o re m o t o ,
e x e c u t e Ta s k , q u e s e im p le m e n t a d e e s t a fo rm a :

public Object executeTask(Task t) {


return t.execute();
}
Es t e m é t o d o im p le m e n t a e l p ro t o co lo e n t re e l Co m p u t e En g in e y s u s clie n t e s . Lo s clie n t e s
p ro p o rcio n a n a l Co m p u t e En g in e u n o b je t o Ta s k , q u e t ie n e u n a im p le m e n t a ció n d e l m é t o d o
e x e c u t e d e t a s k. El Co m p u t e En g in e e je cu t a la t a re a y d e vu e lve e l re s u lt a d o d e l m é t o d o
d ire ct a m e n t e a s u lla m a d o r.
El m é t o d o e x e c u t e Ta s k n o n e ce s it a s a b e r n a d a m á s s o b re e l re s u lt a d o d e l m é t o d o e x e c u t e s ó lo
q u e e s u n Ob je c t . El lla m a d o r p re s u m ib le m e n t e s a b e a lg o m á s s o b re e l t ip o p re cis o d e l Ob je c t
d e vu e lt o y p u e d e t ip a r e l re s u lt a d o a l t ip o a p ro p ia d o .

Pasar Objetos en RMI

Lo s a rg u m e n t o s y lo s t ip o s d e re t o rn o d e lo s m é t o d o s re m o t o s p u e d e n s e r d e ca s i cu a lq u ie r t ip o
Ja va , in clu ye n d o o b je t o s lo ca le s , o b je t o s re m o t o s y t ip o s p rim it ivo s . Má s p re cis a m e n t e , u n a e n t id a d
d e cu a lq u ie r t ip o Ja va p u e d e s e r p a s a d a co m o u n a rg u m e n t o o d e vu e lt a p o r u n m é t o d o re m o t o
s ie m p re q u e la e n t id a d s e a u n e je m p la r d e u n t ip o q u e s e a :
● Un t ip o p rim it ivo d e Ja va ,

● u n o b je t o re m o t o , o

● u n o b je t o s e ria liz a b le lo q u e s ig n ifica q u e im p le m e n t a e l in t e rfa ce ja v a . io . S e ria liz a b le

Un o s p o co s t ip o s d e o b je t o s n o cu m p le n co n e s t o s crit e rio s y p o r lo t a n t o n o p u e d e n s e r p a s a d o s n i
d e vu e lt o s p o r u n m é t o d o re m o t o . La m a yo ría d e e s t o s o b je t o s ( co m o u n d e s crip t o r d e fich e ro )
e n ca p s u la n in fo rm a ció n q u e s ó lo t ie n e s e n t id o e n u n e s p a cio d e d ire cció n ú n ica . Mu ch a s cla s e d e l
co ra zó n Ja va , in clu s o a lg u n a s d e ja v a . la n g y ja v a . u t il, im p le m e n t a n e l in t e rfa ce S e ria liz a b le .
Es t a s s o n la s re g la s q u e g o b ie rn a n e l p a s o y re t o rn o d e va lo re s :
● Lo s o b je t o s re m o t o s s e p a s a n e s e n cia lm e n t e p o r re fe re n cia . Un a re fe re n cia a u n o b je t o re m o t o
e s re a lm e n t e u n s t u b , q u e e s u n p ro xy d e l la d o d e l clie n t e q u e im p le m e n t a e l co n ju n t o
co m p le t o d e in t e rfa ce s re m o t o s q u e im p le m e n t a e l o b je t o re m o t o .
● Lo s o b je t o s lo ca le s s o n p a s a d o s p o r co p ia u t iliza n d o e l m a ca n is m o d e s e ria liza ció n d e o b je t o s
d e Ja va . Po r d e fe ct o , t o d o s lo s ca m p o s s e co p ia n , e xce p t o a q u e llo s q u e e s t á n m a rca d o s co m o
s t a t ic o t ra n s ie n t . El co m p o rt a m ie n d o d e la s e ria liza ció n p o r d e fe ct o p u e d e s e r s o b re ca rg a d o
e n u n a b á s ica cla s e - p o r- cla s e .
Pa s a r u n o b je t o p o r re fe re n cia ( co m o s e h a ce co n lo s o b je t o s re m o t o s ) s ig n ifica q u e cu a lq u ie r
ca m b io h e ch o e n e l e s t a d o d e l o b je t o p o r e l m é t o d o re m o t o e s re fle ja d o e n e l o b je t o re m o t o
o rig in a l. Cu a n d o s e p a s a u n o b je t o re m o t o , s ó lo a q u e llo s in t e rfa ce s q u e s o n in t e rfa ce s re m o t o s
e s t á n d is p o n ib le s p a ra e l re ce p t o r, cu a lq u ie r o t ro m é t o d o d e fin id o e n la im p le m e n t a ció n d e la cla s e o
d e fin id o e n u n in t e rfa ce n o re m o t o n o e s t a rá d is p o n ib le p a ra e l re ce p t o r.
Po r e je m p lo , s i p a s a rá m o s p o r re fe re n cia u n e je m p la r d e la cla s e Co m p u t e En g in e , e l re ce p t o r
t e n d ría a cce s o s ó lo a l m é t o d o e x e c u t e Ta s k . El re ce p t o r n o ve ría n i e l co n s t ru ct o r Co m p u t e En g in e
n i s u m é t o d o m a in n i cu a lq u ie r o t ro m é t o d o d e ja v a . la n g . Ob je c t .
En la s lla m a d a s a m é t o d o re m o t o s s , lo s o b je t o s - p a rá m e t o s , va lo re s d e re t o rn o y e xcp e cio n e s - q u e
n o s o n o b je t o s re m o t o s s o n p a s a d o s p o r va lo r. Es t o s ig n ifica q u e s e cre a u n a co p ia d e l o b je t o e n la
m á q u in a virt u a l d e l re ce p t o r. Cu a lq u ie r ca m b io e n e l e s t a d o d e l o b je t o e n e l re ce p t o r s e rá re fle ja d o
s ó lo e n la co p ia d e l re ce p t o r, n o e n e l e je m p la r o rig in a l.

El método main() del Servidor

El m é t o d o m á s co m p lica d o d e la im p le m e n t a ció n d e Co m p u t e En g in e e s e l m é t o d o m a in . Es t e
m é t o d o e s u t iliza d o p a ra a rra n ca r e l Co m p u t e En g in e , y, p o r lo t a n t o , n e ce s it a h a ce r la
in icia liza ció n n e ce s a ria p a ra p re p a ra r e l s e rvid o r p a ra a ce p t a r lla m a d a s d e lo s clie n t e s . Es t e m é t o d o
n o e s u n m é t o d o re m o t o , lo q u e s ig n ifica q u e n o p u e d e s e r lla m a d o d e s d e o t ra m á q u in a virt u a l q u e
n o s e a la s u ya . Có m o e l m é t o d o m a in s e d e cla ra s t a t ic , n o e s t á a s o cia d o co n n in g ú n o b je t o , s in o
co n la cla s e Co m p u t e En g in e .

Crear e Instalar un Controlador de Seguridad

Lo p rim e ro q u e h a ce e l m é t o d o m a in e s cre a r e in s t a la r u n co n t ro la d o r d e s e g u rid a d . És t e p ro t e g e


lo s a cce s o s a lo s re cu rs o s d e l s is t e m a p o r p a rt e d e có d ig o n o firm a d o q u e s e e je cu t e d e n t ro d e la
m á q u in a virt u a l. El co n t ro la d o r d e s e g u rid a d d e t e rm in a s i e l có d ig o d e s ca rg a d o t ie n e a cce s o a l
s is t e m a d e fich e ro s lo ca l o p u e d e re a liza r cu a lq u ie r o t ra o p e ra ció n p rivile g ia d a .
To d o s lo s p ro g ra m a s q u e u t ilice n RMI d e b e n in s t a la r u n co n t ro la d o r d e s e g u rid a d o e l RMI n o
d e s ca rg a rá la s cla s e s ( la s q u e n o s e e n cu e n t re n e l e l p a t h lo ca l) p a ra lo s o b je t o s q u e s e re cib a n
co m o p a rá m e t ro s . Es t a s re s t ricio n e s a s e g u ra n q u e la s o p e ra cio n e s re a liza d a s p o r e l có d ig o
d e s ca rg a d o p a s a rá n a t ra vé s d e u n a s p ru e b a s d e s e g u rid a d .
El Co m p u t e En g in e u t iliza u n e je m p lo d e co n t ro la d o r d e s e g u rid a d s u m in is t ra d o co m o p a rt e d e l
RMI, e l RMI S e c u rit y Ma n a g e r. Es t e co n t ro la d o r d e s e g u rid a d fu e rza u n a p o lít ica d e s e g u rid a d
s im ila r a l co n t ro la d o r d e s e g u rid a d t íp ico d e lo s a p p le t s ( e s d e cir, e s m u y co n s e rva d o r co n lo s
a cce s o s q u e p e rm it e ) . Un a a p lica ció n RMI p o d ría d e fin ir y u t iliza r o t ra cla s e S e c u rit y Ma n a g e r q u e
d ie ra u n a cce s o m á s lib e ra l a lo s re cu rs o s d e l s is t e m a , o , e n e l JDK 1 . 2 , u t iliza r u n fich e ro d e
vig ila n cia q u e o fre zca m á s p e rm is o s .
Aq u í t e m o s e l có d ig o q u e cre a e in s t a la e l co n t ro la d o r d e s e g u rid a d :

if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}

Poner el Objeto Remoto a Disposición de los Clientes

Lu e g o , e l m é t o d o m a in cre a u n e je m p la r d e Co m p u t e En g in e . Es t o s e h a ce co n la s e n t e n cia :

Compute engine = new ComputeEngine();


Co m o s e m e n cio n ó a n t e rio rm e n t e , e s t e co n s t ru ct o r lla m a a l co n s t ru ct o r d e s u s u p e rcla s e
Un ic a s t Re m o t e Ob je c t , q u e e xp o rt a e l o b je t o re cie n cre a d o a l s is t e m a RMI. Un a ve z co m p le t a d a la
e xp o rt a ció n , e l o b je t o re m o t o Co m p u t e En g in e e s t a lis t o p a ra a ce p t a r lla m a d a s d e lo s clie n t e s e n
u n p u e rt o a n ó n im o ( e le g id o p o r e l RMI o p o r e l s is t e m a o p e ra t ivo ) . Ob s e rva q u e e l t ip o d e la
va ria b le e n g in e e s Co m p u t e , y n o Co m p u t e En g in e . Es t a d e cla ra ció n e n fa t iza q u e e l in t e rfa ce
d is p o n ib le p a ra lo s clie n t e s e s e l in t e rfa ce Co m p u t e y s u s m é t o d o s , n o la cla s e Co m p u t e En g in e y
sus m é todos.
An t e s d e q u e u n lla m a d o r p u e d a in vo ca r u n m é t o d o d e u n o b je t o re m o t o , d e b e o b t e n e r u n a
re fe re n cia a l o b je t o re m o t o . Es t e p u e d e h a ce rs e d e la m is m a fo rm a q u e e n q u e s e o b t ie n e cu a lq u ie r
o t ra re fe re n cia e n u n p ro g ra m a Ja va , q u e e s o b t e n ié n d o lo co m o p a rt e d e l va lo r d e re t o rn o d e u n
m é t o d o o co m o p a rt e d e u n a e s t ru ct u ra d e d a t o s q u e co n t e n g a d ich a re fe re n cia .
El s is t e m a p ro p o rcio n a u n o b je t o re m o t o p a rt icu la r, e l re g is t ro RMI, p a ra e n co n t ra r re fe re n cia s a
o b je t o s re m o t o s . El re g is t ro RMI e s u n s e n cillo s e rvicio d e n o m b ra d o p a ra o b je t o s re m o t o s q u e
p e rm it e a lo s clie n t e s re m o t o s o b t e n e r u n a re fe re n cia a u n o b je t o re m o t o p o r s u n o m b re . El re g is t ro
s e u t iliza t íp ica m e n t e p a ra lo ca liza r e l p rim e r o b je t o re m o t o q u e u n clie n t e RMI n e ce s it a u t iliza r. Es t e
p rim e r o b je t o re m o t o , lu e g o p ro p o rcio n a s o p o rt e p a ra e n co n t ra r o t ro s o b je t o s .
El in t e rfce ja v a . rm i. N a m in g e s u t iliza d o co m o u n API fin a l p a ra la e n t re g a ( o re g is t ra d o ) y
b ú s q u e d a d e o b je t o s re m o t o s e n e l re g is t ro . Un a ve z re g is t ra d o u n o b je t o re m o t o e n e l re g is t ro RMI
e n e l h o s t lo ca l, lo s lla m a d o re s d e cu a lq u ie r h o s t p u e d e n b u s a r e l o b je t o re m o t o p o r e l n o m b re ,
o b t e n e r s u re fe re n cia , y lu e g o lla m a r a lo s m é t o d o s d e l o b je t o . El re g is t ro p o d ría s e r co m p a rt id o p o r
t o d o s lo s s e rvid o re s e je cú t a n d o s e e n u n h o s t , o u n p ro ce s o s e rvid o r in d ivid u a l p o d ría cre a r y u t iliza r
s u p ro p io re g is t ro s i a s í lo d e s e a .
La cla s e Co m p u t e En g in e cre a u n n o m b re p a ra e l o b je t o co n la s e n t e n cia :

String name = "//localhost


/Compute";
Es t e n o m b re in clu ye e l n o m b re d e l h o s t lo c a lh o s t , e n e l q u e s e e s t á n e je cu t a n d o e l re g is t ro y e l
o b je t o re m o t o , y u n n o m b re Co m p u t e , q u e id e n t ifica e l o b je t o re m o t o e n e l re g is t ro . Lu e g o e s t á e l
có d ig o n e ce s a rio p a ra a ñ a d ir e l n o m b re a l re g is t ro RMI q u e s e e s t á e je cu t a n d o e n e l s e rvid o r. Es t o
s e h a ce d e s p u é s ( d e n t ro d e l b lo q u e t ry co n la s e n t e n cia :

Naming.rebind(name, engine);
Al lla m a r a l m é t o d o re b in d s e h a ce u n a lla m a d a re m o t a a l re g is t ro RMI d e l h o s t lo ca l. Es t a lla m a d a
p u e d e p ro vo ca r q u e s e g e n e ra u n e Re m o t e Ex c e p t io n , p o r e s o t e n e m o s q u e m a n e ja r la e xce p ció n .
La cla s e Co m p u t e En g in e m a n e ja la e xce p ció n d e n t ro d e lo s b lo q u e s t ry / c a t c h . S i la e xce p ció n n o
fu e s e m a n e ja d a d e e s t a m a n e ra , t e n d ría m o s q u e a ñ a d ir Re m o t e Ex c e p t io n a la cla u s u la t h ro w s
( a h o ra in e xis t e n t e ) d e l m é t o d o m a in .
Ob s e rve m o s lo s ig u ie n t e s o b re lo s a rg u m e n t o s d e la lla m a d a a N a m in g . re b in d :
● El p rim e r p a rá m e t ro e s u n ja v a . la n g . S t rin g fo rm a t e a d o co m o URL re p re s e n t a n d o la
lo ca liza ció n y e l n o m b re d e l o b je t o re m o t o :
❍ Po d ría m o s n e ce s it a r ca m b ia r e l va lo r d e lo c a lh o s t p o r e l n o m b re o d ire cció n IP d e
n u e s t ro s e rvid o r. S i s e o m it e e l Ho s t e n la URL, e l h o s t p o r d e fe ct o e s e l h o s t lo ca l.
Ta m p o co n e ce s it a m o s e s p e cifica r e l p ro t o co lo , Po r e je m p lo , e s t á p e rm it id o s u m in is t ra r
"Co m p u t e " co m o e l n o m b re e n la lla m a d a a N a m in g . re b in d .
❍ Op cio n a lm e n t e s e p u e d e s u m in is t a r u n n ú m e ro d e p u e rt o e n la URL, p o r e je m p lo e l
n o m b re "/ / h o s t :1 2 3 4 / o b je c t n a m e " e s le g a l. S i s e o m it e e l p u e rt o , p o r d e fe ct o s e t o m a
e l 1 0 9 9 . De b e m o s e s p e cifica r e l p u e rt o s i u n s e rvid o r cre a u n re g is t ro e n o t ro p u e rt o q u e
n o s e a e l 1 0 9 9 . El p u e rt o p o r d e fe ct o e s ú t il p o rq u e p ro p o rcio n a u n lu g a r b ie n co n o cid o
p a ra b u s ca r lo s o b je t o s re m o t o s q u e o fre ce n s e rvicio s e n u n h o s t p a rt icu la r.
● El s is t e m a RMI s u s it u ye u n a re fe re n cia a l s t u b p o r la re fe re n cia re a l a l o b je t o e s p e cifica d o e n e l
a rg u m e n t o . La im p le m e n t a ció n d e o b je t o s re m o t o s co m o e je m p la re s d e Co m p u t e En g in e
n u n ca a b a n d o n a n la m á q u in a virt u a l e n q u e s e cre a ro n , p o r e s o , cu a n d o u n clie n t e re a liza u n
b ú s q u e d a e n e l re g is t ro d e o b je t o s re m o t o s d e l s e rvid o r, s e le d e vu e lve u n a re fe re n cia a l s t u b .
Co m o s e e xp licó a n t e rio rm e n t e , lo s o b je t o s re m o t o s e n d ich o s ca s o s s e p a s a n p o r re fe re n cia ,
n o p o r va lo r.
● Ob s e ve m o s q u e p o r ra zo n e s d e s e g u rid a d , u n a a p lica ció n p u e d e e n t re g a r o e lim in a r
re fe re n cia s a o b je t o s re m o t o s s ó lo e n u n re g is t ro q u e s e e je cu t e e n e l m is m o h o s t . Es t a
re s t ricció n e vit a q u e u n clie n t e re m o t o e lim in e o s o b re e s cib a cu a lq u ie r e n t ra d a e n e l re g is t ro
d e l s e rvid o r.
Un a ve z q u e e l s e rvid o r s e h a re g is t ra d o e n e l re g is t ro RMI lo ca l, im p rim e u n m e n s a je in d ica n d o q u e
e s t á lis t o p a ra e m p e za r a m a n e ja r lla m a d a s , y s a le d e l m é t o d o m a in . No e s n e ce s a rio t e n e r u n
t h re a d e s p e ra n d o p a ra m a n t e n e r vivo e l s e rvid o r. S ie m p re q u e h a ya u n a re fe re n cia a l o b je t o
Co m p u t e En g in e e n a lg ú n lu g a r d e la m á q u in a virt u a l ( lo ca l o re m o t a ) e l o b je t o Co m p u t e En g in e
n o s e rá e lim in a d o . Co m o e l p ro g ra m a e n t re g a u n a re fe re n cia d e Co m p u t e En g in e e n e l re g is t ro ,
é s t e e s a lca n za b le p o r u n clie n t e re m o t o ( ¡e l p ro p io re g is t ro !) . El s is t e m a RMI t ie n e cu id a d o d e
m a n t e n e r vivo e l p ro ce s o Co m p u t e En g in e . El Co m p u t e En g in e e s t á d is p o n ib le p a ra a ce p t a r
lla m a d a s y n o s e rá re cla m a d o h a s t a q u e :
● s u n o m b re s e a e lim in a d o d e l re g is t ro , y

● n in g ú n clie n t e re m o t o m a n t e n g a u n a re fe re n cia a l o b je t o Co m p u t e En g in e .

La p ie za fin a l d e có d ig o d e l m é t o d o Co m p u t e En g in e . m a in m a n e ja cu a lq u ie r e xce p ció n q u e p u d ie ra


p ro d u cirs e . La ú n ica e xce p ció n q u e p o d ría s e r la n za d a e n e l có d ig o e s Re m o t e Ex c e p t io n , q u e
p o d ría s e r la n za d a p o r e l co n s t ru ct o r d e la cla s e Co m p u t e En g in e o p o r la lla m a d a a l re g is t ro p a ra
e n t re g a r e l n o m b re d e l o b je t o "Co m p u t e ". En cu a lq u ie r ca s o , e l p ro g ra m a n o p u e d e h a ce r n a d a
m á s q u e s a lir e im p rim ir u n m e n s a je d e e rro r. En a lg u n a s a p lica cio n e s d is t rib u id a s , e s p o s ib le
re cu p e ra r u n fa llo a l h a ce r u n a lla m a d a re m o t a . Po r e je m p lo , la a p lica ció n p o d ría e le g ir o t ro s e rvid o r
y co n t in u a r co n la o p e ra ció n .

Oz it o
Crear un Programa Cliente
El m o t o r d e cá lcu lo e s u n b o n it o y s e n cillo p ro g ra m a - e je cu t a la s t a re a s q u e le s o n
e n via d a s . Lo s clie n t e s d e l m o t o r d e cá lcu lo s o n m á s co m p le jo s . Un clie n t e n e ce s it a
lla m a r a l m o t o r d e cá lcu lo , p e ro t a m b ié n t ie n e q u e d e fin ir la t a re a q u e é s t e va a
re a liza r.
Nu e s t ro e je m p lo e s t á co m p u e s t o p o r d o s cla s e s s e p a ra d a s . la p rim e ra cla s e
Co m p u t e P i, b u s ca y lla m a a u n o b je t o Co m p u t e . La s e g u n d a cla s e P i, im p le m e n t a e l
in t e rfa ce Ta s k y d e fin e e l t ra b a jo q u e va a h a ce r e l m o t o r d e cá lcilo . El t ra b a jo d e la
cla s e P i e s ca lcu la r e l va lo r d e l n ú m e ro p i, co n a lg ú n n ú m e ro d e p o s icio n e s d e cim a le s .
Co m o re co rd a re m o s , e l in t e rfa ce n o - re m o t o Ta s k s e d e fin e d e e s t a fo rm a :

package compute;
public interface Task extends java.io.Serializable {
Object execute();
}
El in t e rfa ce Ta s k e xt ie n d e ja v a . io . S e ria liz a b le p o r lo q u e cu a lq u ie r o b je t o q u e lo
im p le m e n t e p u e d e s e r s e ria liza d o p o r e l s is t e m a RMI y e n via d o a u n a m á q u in a virt u a l
re m o t a co m o p a rt e d e u n a lla m a d a a u n m é t o d o re m o t o . Po d ría m o s h a b e r e le g id o
h a ce r q u e la im p le m e n t a ció n d e n u e s t ra cla s e im p le m e n t a ra lo s in t e rfa ce s Ta s k y
S e ria liz a b le , y h u b ie ra t e n id o e l m is m o e fe ct o . S in e m b a rg o , e l ú n ico p ro p o s it o d e l
in t e rfa ce Ta s k e s p e rm it ir q u e la s im p le m e n t a cio n e s d e e s t e in t e rfa ce s e a n p a s a d a s a
o b je t o s Co m p u t e , p o r e s o , u n a cla s e q u e im p le m e n t e e l in t e rfa ce Ta s k n o t ie n e
s e n t id o q u e t a m b ié n im p le m e n t e e l in t e rfa ce S e ria liz a b le . Da d o e s t o , h e m o s
a s o cia d o e xp lícit a m e n t e lo s d o s in t e rfa ce s e n e l t ip o s ys t e m , a s e g u ra n d o q u e t o d o s
lo s o b je t o s Ta s k s e a n s e ria liza b le s .
El có d ig o q u e lla m a a lo s m é t o d o s d e l o b je t o Co m p u t e d e b e o b t e n e r u n a re fe re n cia a
e s e o b je t o , cre a r u n o b je t o Ta s k , y lu e g o p e d ir q u e s e e je cu t e la t a re a . Má s a d e la n t e
ve re m o s la d e fin ició n d e la t a re a P i. Un o b je t o P i s e co n s t ru ye co n u n s ó lo
a rg u m e n t o , la p re cis ió n d e s e a d a e n e l re s u lt a d o . El re s u lt a d o d e la e je cu ció n d e la
t a re a e s u n ja v a . m a t h . Big D e c im a l q u e re p re s e n t a e l n ú m e ro p i ca lcu la d o co n la
p re cis ió n e s p e cifica d a .
La cla s e clie n t e Co m p u t e P i:

package client;

import java.rmi.*;
import java.math.*;
import compute.*;

public class ComputePi {


public static void main(String args[]) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
String name = "//" + args[0] + "/Compute";
Compute comp = (Compute) Naming.lookup(name);
Pi task = new Pi(Integer.parseInt(args[1]));
BigDecimal pi = (BigDecimal) (comp.executeTask(task));
System.out.println(pi);
} catch (Exception e) {
System.err.println("ComputePi exception: " + e.getMessage());
e.printStackTrace();
}
}
}
Al ig u a l q u e e l s e rvid o r Co m p u t e En g in e , e l clie n t e e m p ie za in s t a la n d o u n co n t ro la d o r
d e s e g u rid a d . Es t o e s n e ce s a rio p o rq u e RMI p o d ría d e s ca rg a r có d ig o e n e l clie n t e . En
e s t e e je m p lo , e l s t u b Co m p u t e En g in e e s d e s ca rg a d o a l clie n t e . S ie m p re q u e e l RMI
d e s ca rg u e có d ig o , d e b e p re s e n t a rs e u n co n t ro la d o r d e s e g u rid a d . Al ig u a l q u e e l
s e rvid o r, e l clie n t e u t iliza e l co n t ro la d o r d e s e g u rid a d p ro p o rcio n a d o p o r e l s is t e m a
RMI p a ra e s t e p ro p ó s it o .
De s p u é s d e lla m a r a l co n t ro la d o r d e s e g u rid a d , e l clie n t e co n s t ru ye u n n o m b re
u t iliza d o p a ra b u s ca r u n o b je t o re m o t o Co m p u t e . El va lo r d e l p rim e r a rg u m e n t o d e la
lín e a d e co m a n d o s a rg s [ 0 ] , e s e l n o m b re d e l h o s t re m o t o , e n e l q u e s e e s t á n
e je cu t a n d o lo s o b je t o s Co m p u t e . Us a n d o e l m é t o d o N a m in g . lo o k u p , e l clie n t e
b u s ca e l o b je t o re m o t o p o r s u n o m b re e n e l re g is t ro d e l h o s t re m o t o . Cu a n d o s e h a ce
la b ú s q u e d a d e l n o m b re , e l có d ig o cre a u n a URL q u e e s p e cífica e l h o s t d o n d e s e e s t á
e je cu t a n d o e l s e rvid o r. El n o m b re p a s a d o e n la lla m a d a a N a m in g . lo o k u p t ie n e la
m is m a s ín t a xis URL q u e e l n o m b re p a s a d o a la lla m a d a N a m in g . re b in d q u e
e xp líca m o s e n p á g in a s a n t e rio re s .
Lu e g o , e l clie n t e cre a u n o b je t o P i p a s a n d o a l co n s t ru ct o r d e P i e l s e g u n d o a rg u m e n t o
d e la lín e a d e co m a n d o s , a rg s [ 1 ] , q u e in d ica e l n ú m e ro d e d e cim a le s u t iliza d o s e n e l
cá lcu lo . Fin a lm e n t e , e l clie n t e lla m a a l m é t o d o e x e c u t e Ta s k d e l o b je t o re m o t o
Co m p u t e . El o b je t o p a s a d o e n la lla m a d a a e x e c u t e Ta s k d e vu e lve u n o b je t o d e l t ip o
ja v a . m a t h . Big D e c im a l, p o r e s o e l p ro g ra m a fu e rza e l re s u lt a d o a e s e t ip o y
a lm a ce n a e n re s u lt a d o e n la va ria b le re s u lt . Fin a lm e n t e e l p ro g ra m a im p rim e e l
re s u lt a d o .

Flu jo d e m e n s a je s e n t re e l clie n t e Co m p u t e P i, e l rm ire g is t ry , y e l Co m p u t e En g in e .


Fin a lm e n t e , e ch e m o s u n vis t a zo a la cla s e P i. Es t a cla s e im p le m e n t a e l in t e rfa ce Ta s k
y cá lcu la e l va lo r d e l n ú m e ro p i co n u n n ú m e ro d e d e cim a le s e s p e cifica d o . De s d e e l
p u n t o d e vis t a d e e s t e e je m p lo , e l a lg o rit m o re a l n o e s im p o rt a n t e ( e xce p t o , p o r
s u p u e s t o , p a ra la fia b ilid a d d e l cá lcu lo ) . To d o lo im p o rt a n t e e s q u e e l cá lcu lo co n s u m e
n u m é rica m e n e m u ch o s re cu rs o s ( y p o r e s o e s e l t ip o q u e co s a q u e q u e rría m o s h a ce r
e n u n s e rvid o r p o t e n t e ) .
Aq u í t e n e m o s e l có d ig o d e la cla s e P i, q u e im p le m e n t a Ta s k :

package client;
import compute.*;
import java.math.*;

public class Pi implements Task {

/** constantes utilizadas en el cálculo de pi*/


private static final BigDecimal ZERO =
BigDecimal.valueOf(0);
private static final BigDecimal ONE =
BigDecimal.valueOf(1);
private static final BigDecimal FOUR =
BigDecimal.valueOf(4);

/** modo de redondeo utilizado durante el cálculo*/


private static final int roundingMode =
BigDecimal.ROUND_HALF_EVEN;

/** número de dígitos tras el punto decimal*/


private int digits;

/**
* Construye una tarea para calcular el núemro pi
* con la precisión específicada.
*/
public Pi(int digits) {
this.digits = digits;
}

/**
* Calcula pi.
*/
public Object execute() {
return computePi(digits);
}

/**
* Calcula el valor de Pi con el número de decimales especificados.
* El valor se calcula utilizando la fórmula de Machin:
*
* pi/4 = 4*arctan(1/5) - arctan(1/239)
*
* y una poderoas serie de expansiones de arctan(x)
* para una precisión suficiente.
*/
public static BigDecimal computePi(int digits) {
int scale = digits + 5;
BigDecimal arctan1_5 = arctan(5, scale);
BigDecimal arctan1_239 = arctan(239, scale);
BigDecimal pi =
arctan1_5.multiply(FOUR).subtract(arctan1_239).multiply(FOUR);
return pi.setScale(digits,
BigDecimal.ROUND_HALF_UP);
}

/**
* Calcula el valor, en radianes, de la arcotangente de la
* inversa del entero suministrado para el número de decimales.
* El valor se calcula utilizando la poderosa serie de
* expansiones de arcotangente:
*
* arctan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 +
* (x^9)/9 ...
*/
public static BigDecimal arctan(int inverseX,
int scale)
{
BigDecimal result, numer, term;
BigDecimal invX = BigDecimal.valueOf(inverseX);
BigDecimal invX2 =
BigDecimal.valueOf(inverseX * inverseX);

numer = ONE.divide(invX, scale, roundingMode);

result = numer;
int i = 1;
do {
numer =
numer.divide(invX2, scale, roundingMode);
int denom = 2 * i + 1;
term =
numer.divide(BigDecimal.valueOf(denom),
scale, roundingMode);
if ((i % 2) != 0) {
result = result.subtract(term);
} else {
result = result.add(term);
}
i++;
} while (term.compareTo(ZERO) != 0);
return result;
}
}
La ca ra ct e rís t ica m á s in t e re s a n t e d e e s t e e je m p lo e s q u e e l o b je t o Co m p u t e n o
n e ce s it a u n a d e fin ició n d e la cla s e P i h a s t a q u e s e le p a s a u n o b je t o P i co m o u n
a rg u m e n t o d e l m é t o d o e x e c u t e Ta s k . Ha s t a e s t e p u n t o , e l có d ig o d e la cla s e s e h a
ca rg a d o p o r e l RMI d e n t ro d e la m á q u in a virt u a l d e l o b je t o Co m p u t e , s e h a lla m a d o
a l m é t o d o e x e c u t e , y s e h a e je cu t a d o e l có d ig o d e la t a re a . El Ob je c t re s u lt a n t e ( q u e
e n e l ca s o d e la t a re a P i e s re a lm e n t e u n o b je t o ja v a . m a t h . Big D e c im a l) e s e n via d o
d e vu e lt a a l clie n t e , d o n d e s e u t iliza p a ra im p rim ir e l re s u lt a d o .
El h e ch o d e q u e e l o b je t o Ta s k s u m in is t ra d o ca lcu le e l va lo r d e P i e s irre le va n t e p a ra
e l o b je t o Co m p u t e En g in e . Po r e je m p lo , t a m b ié n p o d ría m o s im p le m e n t a r u n a t a re a
q u e g e n e ra ra u n n ú m e ro p rim o a le a t o rio u t iliza n d o u n a lg o rit m o p ro b a b ilis t ico . ( Es t o
t a m b ié n co n s u m e m u ch o s re cu rs o s y p o r t a n t o e s u n ca n d id a t o p a ra s e r e n via d o a l
Co m p u t e En g in e ) . Es t e có d ig o t a m b ié n p o d ría s e r d e s ca rg a d o cu a n d o e l o b je t o Ta s k
fu e ra p a s a d o a l o b je t o Co m p u t e . To d o lo q u e e l o b je t o Co m p u t e s a b e e s q u e ca d a
o b je t o q u e re cib e im p le m e n t a e l m é t o d o e x e c u t e , n o s a b e ( y t a m p o co le in t e re s a )
q u é h a ce la im p le m e n t a ció n .

Oz it o
Compilar y Ejecutar el Ejemplo
Ah o ra q u e h e m o s vis t o e l có d ig o q u e cre a e l clie n t e y e l s e rvid o r p a ra e l e je m p lo
d e l m o t o r d e cá lcu lo , va m o s a co m p ila rlo y e je cu t a rlo .
Co m p ilia r lo s Pro g ra m a s d e Eje m p lo
En e s t á p á g in a a p re n d e re m o s có m o co m p ila r lo s p ro g ra m a s clie n t e y
s e rvid o r q u e co m p o n e n e l e je m p lo d e l m o t o r d e cá lcu lo .
Eje cu t a r lo s Pro g ra m a s d e Eje m p lo
Fin a lm e n t e , e je cu t a re m o s lo s p ro g ra m a s d e l s e rvid o r y d e l clie n t e y
co n s e cu e n t e m e n t e , o b t e n d re m o s e l va lo r d e l n ú m e ro p i.

Oz it o
Compilar el Programa de Ejemplo
En u n e s ce n a rio d e l m u n d o re a l d o n d e s e d e s a rro lla ra u n s e rvicio co m o e l d e l m o t o r d e
cá lcu lo , u n d e s a rro lla d o r q u e rría cre a r u n fich e ro JAR q u e co n t e n g a lo s in t e rfa ce s
Co m p u t e y Ta s k p a ra q u e lo s im p le m e n t a n la s cla s e s s e rvid o r y p a ra q u e lo s u t ilice n lo s
p ro g ra m a s clie n t e s .
Lu e g o , u n d e s a rro lla d o r ( q u izá s e l m is m o q u e cre o e l fich e ro JAR co n lo s in t e rfa ce s )
e s crib iría u n a im p le m e n t a ció n d e l in t e rfa ce Co m p u t e y d e s a rro lla ría e s e s e rvicio e n u n a
m á q u in a d is p o n ib le p a ra lo s clie n t e s .
Lo s d e s a rro lla d o re s d e lo s p ro g ra m a s clie n t e s p u e d e n u t iliza r lo s in t e rfa ce s Co m p u t e y
Ta s k ( co n t e n id o s e n e l fich e ro JAR) e in d e p e n d ie n t e m e n t e d e s a rro lla r u n a t a re a y u n
p ro g ra m a clie n t e q u e u t ilice u n s e rvicio Co m p u t e .
En e s t a p á g in a , a p re n d e re m o s có m o cre a r u n fich e ro JAR, la s cla s e s d e l s e rvid o r, y la s
cla s e s d e l clie n t e . Ve re m o s co m o la cla s e P i s e rá d e s ca rg a d a a l s e rvid o r d u ra n t e la
e je cu ció n . Ta m b ié n ve re m o s co m o e l s t u b re m o t o Co m p u t e En g in e s e rá d e s ca rg a d o
d e s d e e l s e rvid o r h a s t a e l clie n t e d u ra n t e la e je cu ció n .
El e je m p lo s e p a ra lo s in t e rfa ce s , la im p le m e n t a ció n d e lo s o b je t o s re m o t o s y e l có d ig o d e l
clie n t e e n t re s p a q u e t e s d ife re n t e s :
● c o m p u t e ( Lo s in t e rfa ce s Co m p u t e y Ta s k )

● e n g in e ( Im p le m e n t a ció n d e la cla s e , e l in t e rfa ce y e l s t u b d e Co m p u t e En g in e )


● c lie n t ( la im p le m e n t a ció n d e l clie n t e Co m p u t e P i y d e la t a re a P i)
Prim e ro co n s t ru ire m o s e l fich e ro JAR p a ra p ro p o rcio n a r lo s in t e rfa ce s d e l s e rvid o r y d e l
clie n t e a lo s d e s a rro lla d o re s .

Construir un Fichero JAR con las Clases de Interfaces

Prim e ro n e ce s it a m o s co m p ila r lo s fich e ro s fu e n t e d e lo s in t e rfa ce s d e l p a q u e t e c o m p u t e


q u e co n s t ru ir u n fich e ro JAR q u e co n t e n g a lo s fich e ro s cla s s . S u p o n g a m o s q u e e l u s u a rio
w a ld o h a e s crit o e s t o s in t e rfa ce s p a rt icu la re s y h a s it u a d o lo s fich e ro s fu e n t e e n
c :\ h o m e \ w a ld o \ s rc \ c o m p u t e ( e n UNIX s e ría , / h o m e / w a ld o / s rc / c o m p u t e ) . Co n
e s t o s p a t h s p o d e m o s u t iliza r lo s s ig u ie n t e s co m a n d o s p a ra co m p ila r lo s in t e fa ce s y cre a r e l
fich e ro JAR

D e t a lle s e s p e c ífic o s d e la P la t a fo rm a : Co n s t ru ir u n Fic h e ro JAR


W in d o w s :

cd c:\home\waldo\src
javac compute\Compute.java
javac compute\Task.java
jar cvf compute.jar compute\*.class
UN I X:

cd /home/waldo/src
javac compute/Compute.java
javac compute/Task.java
jar cvf compute.jar compute/*.class
El co m a n d o ja r m u e s t ra la s ig u ie n t e s a lid a ( d e b id o a la o p ció n - v ) :

added manifest
adding: compute/Compute.class (in=281) (out=196)
(deflated 30%)
adding: compute/Task.class (in=200) (out=164)
(deflated 18%)

Ah o ra p o d e m o s d is t rib u ir e l fich e ro c o m p u t e . ja r a lo s d e s a rro lla d o re s d e la s a p lica cio n e s


d e l clie n t e y d e l s e rvid o r p a ra q u e p u e d a n h a ce r u s o d e lo s in t e rfa ce s .
En g e n e ra l, cu a n d o co s n t ru im o s la s cla s e s d e l s e rvid o r o d e l clie n t e co n lo s co m p ila d o re s
ja v a c y rm ic , n e ce s it a re m o s e s p e cifica r d o n d e d e b e ría n re s id ir lo s fich e ro s d e cla s e
re s u lt a n t e s p a ra q u e s e a n a cce s ib le s a la re d . En e s t e e je m p lo , e s t a lo ca liza ció n e s , p a ra
Un ix, / h o m e / u s e r/ p u b lic _ h t m l/ c la s s e s p o rq u e a lg u n o s s e rvid o re s we b p e rm it e n e l
a cce s o a p u b lic _ h t m l m e d ia n t e u n a URL HTTP co n s t ru id a co m o h t t p :/ / h o s t / ~ u s e r/ . S i
n u e s t ro s e rvid o r we b n o s o p o rt a e s t a co n ve n ció n , p o d ría m o s u t iliza r u n fich e ro URL e n s u
lu g a r. El fich e ro d e URL t o m a la fo rm a file :/ h o m e / u s e r/ p u b lic _ h t m l/ c la s s e s / e n
UNIX, o file :/ c :\ h o m e \ u s e r\ p u b lic _ h t m l\ c la s s e s / e n Win d o ws . Ta m b ié n s e p u e d e
s e le ccio n a r o t ro t ip o d e URL a p ro p ia d o .
La a cce s ib ilid a d e n la re d d e lo s fich e ro s d e cla s e s p e rm it e a l s is t e m a RMI d e s ca rg a r có d ig o
cu a n d o s e a n e ce s a rio . En ve z d e d e fin ir s u p ro p io p ro t o co lo p a ra d e s ca rg a r có d ig o , RMI
u t iliza u n p ro t o co lo URL s o p o rt a d o p o r Ja va ( p o r e je m p lo , HTTP) p a ra d e s ca rg a r e l có d ig o .
Ob s e rva q u e u n s e rvid o r we b co m p le t o y p o d e ro s o n o n e ce s it a re a liza r e s t a d e s ca rg a d e
fich e ro cla s s . De h e ch o , u n s e n cillo s e rvid o r HTTP p ro p o rcio n a t o d a la fu n cio n a lid a d
n e ce s a ria p a ra h a ce r q u e la s cla s e s e s t é n d is p o n ib le s p a ra s u d e s ca rg a e n RMI m e d ia n t e
HTTP, p u e d e s e n co n t ra r u n o e n :

ftp://java.sun.com/pub/jdk1.1/rmi/class-server.zip

Construir las Clases del Servidor

El p a q u e t e e n g in e s ó lo co n t ie n e la im p le m e n t a ció n d e la cla s e d e l la d o d e l s e rvid o r,


Co m p u t e En g in e , la im p le m e n t a ció n d e l o b je t o re m o t o d e l in t e rfa ce Co m p u t e . Co m o
Co m p u t e En g in e e s u n a im p le m e n t a ció n d e u n in t e rfa ce re m o t o , n e ce s it a m o s g e n e ra r u n
s t u b p a ra e l o b je t o re m o t o p a ra q u e lo s clie n t e s p u e d a n co n t a ct a r co n é l.
Dig a m o s q u e , a n a , la d e s a rro lla d o ra d e la cla s e Co m p u t e En g in e , h a s it u a d o
Co m p u t e En g in e . ja v a e n e l d ire ct o rio c :\ h o m e \ a n a \ s rc \ e n g in e , y h a co lo ca d o e l
fich e ro cla s s p a ra q u e lo u s e n lo s clie n t e s e n u n s u b d ire ct o rio d e s u d ire ct o rio
p u b lic _ h t m l, c :\ h o m e \ a n a \ p u b lic _ h t m l\ c la s s e s ( e n UNIX p o d ría s e r
/ h o m e / a n a / p u b lic _ h t m l/ c la s s e s , a cce s ib le m e n d ia n t e a lg ú n s e rvid o r we b co m o
h t t p :/ / h o s t / ~ a n a / c la s s e s / ) .
As u m a m o s q u e e l fich e ro c o m p u t e . ja r e s t a lo ca liza d o e n e l d ire ct o rio
c :\ h o m e \ a n a \ p u b lic _ h t m l\ c la s s e s . Pa ra co m p ila r la cla s e Co m p u t e En g in e , n u e s t ro
p a t h d e cla s e s d e b e in clu ir e l fich e ro c o m p u t e . ja r y e l p ro p io d ire ct o rio fu e n t e .
Un a n o t a s o b re e l p a t h d e c la s e s : No rm a lm e n t e , re co m e n d a m o s s e le ccio n a r
e l p a t h d e cla s e s e n la lin e a d e co m a n d o s u t iliza n d o la o p ció n - c la s s p a t h . S in
e m b a rg o , p o r va ria s ra zo n e s , e s t e e je m p lo u t iliza la va ria b le d e e n t o rn o
CLAS S P ATH ( p o rq u e t a n t o ja v a c co m o rm ic n e ce s it a n u n p a t h d e cla s e s y la
o p ció n - c la s s p a t h s e t ra t a d e fo rm a d ife re n t e e n e l JDK 1 . 1 y e l JDK 1 . 2 ) .
Re co m e n d a m o s q u e n o s e le ccio n e s e l CLAS S P ATH e n u n fich e ro d e lo g in o d e
a rra n q u e y q u e lo s d e s a ct ive s d e s p u é s d e h a b e r t e rm in a d o co n e s t e e je m p lo .
Pa ra m á s in fo rm a ció n s o b re CLAS S P ATH p u e d e s vis it a r
h t t p : / / ja va . s u n . co m / p ro d u ct s / jd k/ 1 . 2 / d o cs / in s t a ll. h t m l

Aq u í p o d e m o s ve r có m o s e le ccio n a r la va ria b le d e e n t o rn o CLAS S P ATH:

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : S e le c io n a r e l CLAS S P ATH


W in d o w s :

set CLASSPATH=c:\home\ana\src;c:\home\ana\public_html\classes\compute.jar
Un ix :

setenv CLASSPATH /home/ana/src:/home/ana/public_html/classes/compute.jar

Ah o ra co m p ila m o s e l fich e ro fu e n t e Co m p u t e En g in e . ja v a y g e n e ra m o s u n s t u b p a ra la
cla s e Co m p u t e En g in e y co lo ca e l s t u b a cce s ib le a la re d . Pa ra cre a r e l s t u b ( y
o p cio n a lm e n t e lo s fich e ro s e s q u e le t o ) e je cu t a m o s e l co m p ila d o r rm ic s o b re lo s n o m b re s
t o t a lm e n t e cu a lifica d o s d e la s cla s e s d e im p le m e n t a ció n d e lo s o b je t o s re m o t o s q u e
d e b e ría n e n co n t ra rs e e n e l p a t h d e cla s e s . El co m a n d o rm ic t o m a u n o o m á s n o m b re s d e
cla s e co m o e n t ra d a y p ro d u ce , co m o s a lid a , fich e ro s d e cla s e s co n la fo rm a
Cla s s N a m e _ S t u b . c la s s ( y o p cio n a lm e n t e Cla s s N a m e _ S k e l. c la s s ) . El fich e ro e s q u e le t o
n o s e rá g e n e ra d o s i lla m a m o s a rm ic co n la o p ció n - v 1 . 2 . Es t a o p ció n s ó lo d e b e ría
u t iliza rs e s i t o d o s n u e s t ro s clie n t e s va n a u t iliza r e l JDK 1 . 2 o p o s t e rio r.

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : Co m p ila r e l Mo t o r d e Cá lc u lo y s u s S t u b s


W in d o w s :

cd c:\home\ana\src
javac engine\ComputeEngine.java
rmic -d . engine.ComputeEngine
mkdir c:\home\ana\public_html\classes\engine
cp engine\ComputeEngine_*.class
c:\home\ana\public_html\classes\engine
Un ix :

cd /home/ana/src
javac engine/ComputeEngine.java
rmic -d . engine.ComputeEngine
mkdir /home/ana/public_html/classes/engine
cp engine/ComputeEngine_*.class
/home/ana/public_html/classes/engine

La o p ció n - d le d ice a l co m p ila d o r rm ic q u e s it u e lo s fich e ro s d e cla s e s g e n e ra d o s ,


Co m p u t e En g in e _ S t u b y Co m p u t e En g in e _ S k e l, e n e l d ire ct o rio
c: \ h o m e \ a n a \ s rc \ e n g in e . Ta m b ié n n e ce s it a m o s p o n e r e s t o s fich e ro s a cce s ib le s e n la
re d , p o r e s o d e b e m o s co p ia rlo s e n e l á re a p u b lic _ h t m l\ c la s s e s .
Co m o e l s t u b d e Co m p u t e En g in e im p le m e n t a e l in t e rfa ce Co m p u t e , q u e re fe re n cia a l
in t e rfa ce Ta s k , t a m b ié n n e ce s it a m o s p o n e r e s t a s cla s e s d is p o n ib le s e n la re d . Po r e s o , e l
p a s o fin a l e s d e s e m p a q u e t a r e l fich e ro c o m p u t e . ja r e n e l d ire ct o rio
c :\ h o m e \ a n n \ p u b lic _ h t m l\ c la s s e s p a ra h a ce r q u e lo s in t e rfa ce s Co m p u t e y Ta s k
e s t é n d is p o n ib le s p a ra s u d e s ca rg a .

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : D e s e m p a q u e t a r e l Fic h e ro JAR


W in d o w s :

cd c:\home\ana\public_html\classes
jar xvf compute.jar
Un ix :

cd /home/ana/public_html/classes
jar xvf compute.jar
El co m a n d o ja r m u e s t ra e s t a s a lid a :

created: META-INF/
extracted: META-INF/MANIFEST.MF
extracted: compute/Compute.class
extracted: compute/Task.class

Construir las clases del Cliente

As u m a m o s q u e e l u s u a rio jo n e s h a cre a d o e l có d ig o d e l clie n t e e n e l d ire ct o rio


c :\ h o m e \ jo n e s \ s rc \ c lie n t y co lo ca rá la cla s e P i ( p a ra q u e s e a d e s ca rg a d a p o r e l m o t o r
d e cá lcu lo ) e n e l d ire ct o rio a cce s ib le a la re d c :\ h o m e \ jo n e s \ p u b lic _ h t m l\ c la s s e s
( t a m b ié n d is p o n ib le m e d ia n t e a lg u n o s s e rvid o re s co m o h t t p :/ / h o s t / ~ jo n e s / c la s s e s / ) .
La s d o s cla s e s d e l la d o d e l clie n t e e s t á n co n t e n id a s e n lo s fich e ro s P i. ja v a y
Co m p u t e P i. ja v a e n e l s u b d ire ct o rio c lie n t .
Pa ra co n s t ru ir e l có d ig o d e l clie n t e , n e ce s it a m o s e l fich e ro c o m p u t e . ja r q u e co n t ie n e lo s
in t e rfa ce s Co m p u t e y Ta s k q u e u t iliza e l clie n t e . Dig a m o s q u e e l fich e ro c o m p u t e . ja r
e s t á s it u a d o e n c :\ h o m e \ jo n e s \ p u b lic _ h t m l\ c la s s e s . La s cla s e s d e l clie n t e s e p u e d e n
co n s t ru ir a s í:

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : Co m p ila r e l Clie n t e


W in d o w s :
set CLASSPATH=c:\home\jones\src;c:\home\jones\public_html\classes\compute.jar
cd c:\home\jones\src
javac client\ComputePi.java
javac -d c:\home\jones\public_html\classes client\Pi.java
UN I X:

setenv CLASSPATH /home/jones/src:/home/jones/public_html/classes/compute.jar


cd /home/jones/src
javac client/ComputePi.java
javac -d /home/jones/public_html/classes client/Pi.java

S ó lo n e ce s it a m o s s it u a r la cla s e P i e n e l d ire ct o rio p u b lic _ h t m l\ c la s s e s \ c lie n t ( e l


d ire ct o rio c lie n t lo cre a e l ja v a c s i n o e xis t e ) . Es t o e s a s í p o r e s t a cla s e e s la ú n ica q u e
n e ce s it a s e r d e s a ca rg a d a p o r la m á q u in a virt u a l d e l m o t o r d e cá lcu lo .
Ah o ra p o d e m o s e je cu t a r e l s e rvid o r y lu e g o e l clie n t e .

Oz it o
Ejecutar los Programas de Ejemplo
Una Nota sobre la Seguridad

El m o d e lo d e s e g u rid a d d e l JDK 1 . 2 e s m á s s o fis t ica d o q u e e l m o d e lo u t iliza d o e n e l JDK


1 . 1 . Co n t ie n e a m p lia cio n e s p a ra s e g u rid a d d e g ra n o fin o y re q u ie re có d ig o q u e p e rm it a lo s
p e rm is o s e s p e cífico s p a ra re a liza r cie rt a s o p e ra cio n e s .
En e l JDK 1 . 1 , t o d o e l có d ig o q u e h a ya e n e l p a t h d e cla s e s s e co n s id e ra firm a d o y p u e d e
re a liza r cu a lq u ie r o p e ra ció n , e l có d ig o d e s ca rg a d o e s t á g o b e rn a d o p o r la s re g la s d e l
co n t ro la d o r d e s e g u rid a d in s t a la d o . S i e je cu t a m o s e s t e e je m p lo e n e l JDK 1 . 2
n e ce s it a re m o s e s p e cifica r u n fich e ro d e p o licía cu a n d o e je cu t e m o s e l s e rvid o r y e l clie n t e .
Aq u í t e n e m o s u n fich e ro d e p o licía g e n e ra l q u e p e rm it e a l có d ig o d e s ca rg a d o d e s d e
cu a lq u ie r co d e b a s e , h a ce r d o s co s a s :
● co n e ct a r o a cce p t a r co n e xio n e s e n p u e rt o s n o p rivile g ia d o s ( p u e rt o s p o r e n cim a d e l
1 0 2 4 ) d e cu a lq u ie r h o s t , y
● co n e ct a r co n e l p u e rt o 8 0 ( e l p u e rt o HTTP) .

grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.net.SocketPermission "*:80", "connect";
};
S i h a ce m o s n u e s t ro có d ig o d is p o n ib le m e d ia n t e URLs HTTP, d e b e ría m o s e je cu t a r e l fich e ro
d e p o licía a n t e rio r cu a n d o e je cu t e m o s e s t e e je m p lo . S in e m b a rg o , s i u t iliza rá m o s u n
fich e ro d e URLs e n s u lu g a r, p o d e m o s u t iliza r e l fich e ro d e p o licía s ig u ie n t e . Ob s e rva q u e
e n e n t o rn o s win d o ws , la b a rra in ve rt id a n e ce s it a s e r re p re s e n t a d a co n d o s b a rra s
in ve rt id a s e n e l fich e ro d e p o licía :

grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.io.FilePermission
"c:\\home\\ana\\public_html\\classes\\-", "read";
permission java.io.FilePermission
"c:\\home\\jones\\public_html\\classes\\-", "read";
};
Es t e e je m p lo a s u m e q u e e l fich e ro d e p o licía s e lla m a ja v a . p o lic y y co n t ie n e lo s p e rm is o s
a p ro p ia d o s . S i e je cu t a m o s e s t e e je m p lo e n e l JDK 1 . 1 , n o n e ce s it a m o s u n fich e ro d e
p o licía ya q u e e l RMI S e c u rit y Ma n a g e r p ro p o rcio n a t o d a la p ro t e cció n q u e n e ce s it a m o s .

Arrancar el Servidor

An t e s d e a rra n ca r e l m o t o r d e cá lcu lo , n e ce s it a m o s a rra n ca r e l re g is t ro d e RMI co n e l


co m a n d o rm ire g is t ry . Co m o e xp lica m o s e n p á g in a s a n t e rio re s e l re g is t ro RMI e s u n a
fa cilid a d d e n o m b ra d o q u e p e rm it e a lo s clie n t e s o b t e n e r u n a re fe re n cia a u n o b je t o
re m o t o .
Ob s e rva q u e a n t e s d e a rra n ca r e l rm ire g is t ry , d e b e m o s a s e g u ra rn o s d e q u e e l s h e ll o
ve n t a n a e n la q u e e je cu t a re m o s rm ire g is t ry n o t ie n e la va ria b le d e e n t o rn o CLAS S P ATH,
o s i la t ie n e é s t a n o in clu ye e l p a t h a n in g u n a cla s e , in clu ye n d o lo s s t u b s d e n u e s t ra s
cla s e s d e im p le m e n t a ció n d e lo s o b je t o s re m o t o s , q u e q u e rra m o s d e s ca rg a r a lo s clie n t e s
d e n u e s t ro s o b je t o s re m o t o s .
S i a rra n ca m o s e l rm ire g is t ry y é s t e p u e d e e n co n t ra r n u e s t ra s cla s e s s t u b e n e l
CLAS S P ATH, n o re co rd a rá q u e la s cla s e s s t u b ca rg a d a s p u e d e n s e r ca rg a d a s d e s d e e l
co d e b a s e d e n u e s t ro s e rvid o r ( q u e fu e e s p e cifica d o p o r la p ro p ie d a d
ja v a . rm i. s e rv e r. c o d e b a s e cu a n d o s e a rra n có la a p lica ció n s e rvid o r) . Co m o re s u lt a d o , e l
rm ire g is t ry n o e n via rá a lo s clie n t e s u n co d e b a s e a s o cia d o co n la s cla s e s s t u b , y
co n s e cu e n t e m e n t e , n u e s t ro s clie n t e s n o p o d rá n lo ca liza r y ca rg a r la s cla s e s s t u b ( u o t ra s
cla s e s d e l la d o d e l s e rvid o r) .
Pa ra a rra n ca r e l re g is t ro e n e l s e rvid o r, s e e je cu t a e l co m a n d o rm ire g is t ry . Es t e co m a n d o
n o p ro d u ce n in g u n a s a lid a y n o rm a lm e n t e s e e je cu t a e n s e g u n d o p la n o .

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : Arra n c a r e l Re g is t ro e n e l P u e rt o p o r


D e fe c t o
W in d o w s ( u t iliza r ja v a w s i n o e s t á d is p o n ib le s t a rt ) :

unset CLASSPATH
start rmiregistry
UN I X:

unsetenv CLASSPATH
rmiregistry &

Po r d e fe ct o e l re g is t ro s e e je cu t a s o b re e l p u e rt o 1 0 9 9 . Pa ra a rra n ca r e l re g is t ro s o b re u n
p u e rt o d ife re n t e , s e e s p e cifica e l n ú m e ro d e p u e rt o e n la lín e a d e co m a n d o s . No o lvid e m o s
b o rra r e l CLAS S P ATH.

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : Arra n c a r e l Re g is t ro e n e l P u e rt o 2 0 0 1


W in d o w s :

start rmiregistry 2001


UN I X:

rmiregistry 2001 &

Un a ve z a rra n ca d o e l re g is t ro , p o d e m o s a rra n ca r e l s e rvid o r. Prim e ro , n e ce s it a m o s


a s e g u ra rn o s d e q u e e l fich e ro c o m p u t e . ja r y la im p le m e n t a ció n d e l o b je t o re m o t o ( q u e e s
lo q u e va m o s a a rra n ca r) e s t á n e n n u e s t ro p a t h d e cla s e s .

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a - S e le c c io n a r la v a ria b le CLAS S P ATH


W in d o w s :
set CLASSPATH=c:\home\ana\src;c:\home\ana\public_html\classes\compute.jar
Un ix :

setenv CLASSPATH /home/ana/src:/home/ana/public_html/classes/compute.jar

Cu a n d o a rra n ca m o s e l m o t o r d e cá lcu lo , n e ce s it a m o s e s p e cifica r, u t iliza n d o la p ro p ie d a d


ja v a . rm i. s e rv e r. c o d e b a s e , d o n d e e s t á n d is p o n ib le s la s cla s e s d e l s e rvid o r. En e s t e
e je m p lo , la s cla s e s d e l la d o d e l s e rvid o r d is p o n ib le s s o n e l s t u b d e Co m p u t e En g in e y lo s
in t e rfa ce s Co m p u t e y Ta s k d is p o n ib le s e n e l d ire ct o rio p u b lic _ h t m l\ c la s s e s d e a n a .

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : Arra n c a r e l Mo t o r d e Cá lc u lo


W in d o w s :

java -Djava.rmi.server.codebase=file:/c:\home\ana\public_html\classes/
-Djava.rmi.server.hostname=zaphod.east.sun.com
-Djava.security.policy=java.policy
engine.ComputeEngine
UN I X:

java -Djava.rmi.server.codebase=http://zaphod/~ana/classes/
-Djava.rmi.server.hostname=zaphod.east.sun.com
-Djava.security.policy=java.policy
engine.ComputeEngine

El co m a n d o ja v a a n t e rio r d e fin e va ria s p ro p ie d a d e s :


● ja v a . rm i. s e rv e r. c o d e b a s e , u n a p ro p ie d a d q u e e s p e cifica u n a lo ca liza ció n , u n a URL
co d e b a s e , d e la s cla s e s o rig in a ria s d e s d e e s t e s e rvid o r p a ra q u e la in fo rm a ció n d e la s
cla s e s e n via d a s a o t ra s m á q u in a s virt u a le s in clu ya la lo ca liza ció n d e la cla s e q u e e l
re ce p t o r p u e d a d e s ca rg a r. S i e l co d e b a s e e s p e cifica u n d ire ct o rio ( co m o o p o s ició n a
u n fich e ro JAR) , d e b e m o s in clu ir la b a rra in clin a d a e n la URL.
● ja v a . rm i. s e rv e r. h o s t n a m e , u n a p ro p ie d a d q u e in d ica e l n o m b re t o t a lm e n t e
cu a lifica d o d e n u e s t ro s e rvid o r. En a lg u n o s e n t o rn o s d e re d , e l n o m b re t o t a lm e n t e
cu a lifica d o d e l h o s t n o s e p u e d e o b t e n e r u t iliza n d o e l API d e Ja va . RMI h a ce e l m e jo r
e s fu e rzo p a ra o b t e n e r e s e n o m b re . S i u n o d e e llo s n o p u e d e s e r d e t e rm in a d o , fa lla rá
y u t iliza rá la d ire cció n IP. Pa ra a s e g u ra rn o s d e q u e e l RMI u t iliza rá u n n o m b re d e
Ho s t , p o d ría m o s s e le ccio n a r la p ro p ie d a d ja v a . rm i. s e rv e r. h o s t n a m e co m o m e d id a
d e s e g u rid a d .
● ja v a . s e c u rit y . p o lic y , u n a p ro p ie d a d u t iliza d a p a ra e s p e cifica r e l fich e ro d e p o licía
q u e co n t ie n e lo s p e rm is o s co n ce d id o s a lo s co d e b a s e s e s p e cífica d o s .
La cla s e s t u b d e Co m p u t e En g in e s e ca rg a d in á m ica m e n t e e n la m á q u in a virt u a l d e l
clie n t e s ó lo cu a n d o la cla s e n o e s t á d is p o n ib le lo ca lm e n t e y la p ro p ie d a d
ja v a . rm i. s e rv e r. c o d e b a s e h a s id o co n fig u ra d a a p ro p ia d a m e n t e , p a ra la lo ca liza ció n d e la
cla s e s t u b , cu a n d o s e a rra n có e l s e rvid o r. Un a ve z ca rg a d a la cla s e s t u b n o n e ce s it a m o s
re ca rg a rla m á s ve ce s p a ra re fe re n cia s a d icio n a le s a o b je t o s Co m p u t e En g in e .
Arrancar el Cliente

Un a ve z q u e e l re g is t ro y e l m o t o r s e e s t á n e je cu t a n d o , p o d e m o s a rra n ca r e l clie n t e ,
e s p e cifica n d o :
● la lo ca liza ció n d o n d e e l clie n t e s irve s u s cla s e s ( la cla s e P i) u t iliza n d o la p ro p ie d a d
ja v a . rm i. s e rv e r. c o d e b a s e .
● co m o a rg u m e n t o s d e la lín e a d e co m a n d o s , e l n o m b re d e l h o s t ( p a ra q u e e l clie n t e
s e p a d o n d e lo ca liza r e l o b je t o re m o t o ) y e l n ú m e ro d e d e cim a le s u t iliza d o e n e l
cá lcu lo d e l n ú m e ro Pi.
● ja v a . s e c u rit y . p o lic y , u n a p ro p ie d a d u t iliza d a p a ra e s p e cifica r e l fich e ro d e p o licía
q u e co n t ie n e lo s p e rm is o s a d e cu a d o s .
Prim e ro s e le ccio n a m o s e l CLAS S P ATH p a ra ve r e l clie n t e d e jo n e s y e l fich e ro JAR q u e
co n t ie n e lo s in t e rfa ce s . Lu e g o s e a rra n ca e l clie n t e d e e s t a fo rm a :

D e t a lle s Es p e c ífic o s d e la P la t a fo rm a : Arra n c a r e l Clie n t e


W in d o w s :

set CLASSPATH c:\home\jones\src;c:\home\jones\public_html\classes\compute.jar


java -Djava.rmi.server.codebase=file:/c:\home\jones\public_html\classes/
-Djava.security.policy=java.policy
client.ComputePi localhost 20
UN I X:

setenv CLASSAPTH /home/jones/src:/home/jones/public_html/classes/compute.jar


java -Djava.rmi.server.codebase=http://ford/~jones/classes/
-Djava.security.policy=java.policy
client.ComputePi zaphod.east.sun.com 20

De s p u é s d e a rra n ca r e l clie n t e , d e b e ría m o s ve r la s ig u ie n t e s a lid a e n n u e s t a p a n t a lla :

3.14159265358979323846
La s ig u ie n t e fig u ra m u e s t ra d e d ó n d e o b t ie n e n la s cla s e s e l rm ire g is t ry , e l s e rvid o r
Co m p u t e En g in e y e l clie n t e Co m p u t e P i d u ra n t e la e je cu ció n d e l p ro g ra m a :

Cu a n d o e l s e rvid o r Co m p u t e En g in e co lo ca s u re fe re n cia a l o b je t o re m o t o e n e l re g is t ro ,
é s t e d e s ca rg a e l Co m p u t e En g in e _ S t u b , y t a m b ié n lo s in t e rfa ce s Co m p u t e y Ta s k d e lo s
q u e la cla s e s t u b d e p e n d e . Es t a s cla s e s s o n d e s ca rg a d a s d e l s e rvid o r we b d e l
Co m p u t e En g in e ( o d e l s is t e m a d e fich e ro s , d a d o e l ca s o ) .
El clie n t e Co m p u t e P i t a m b ié n ca rg a Co m p u t e En g in e _ S t u b , d e s d e e l s e rvid o r we b d e
Co m p u t e En g in e , co m o re s u lt a d o d e la lla m a d a a N a m in g . lo o k u p . Co m o e l clie n t e t ie n e
lo s d o s in t e fa ce s d is p o n ib le s e n s u p a t h d e cla s e s , e s t a s cla s e s s o n ca rg a d a s d e s d e a llí, n o
d e la lo ca liza ció n re m o t a .
Fin a lm e n t e , la cla s e P i s e ca rg a e n la m á q u in a virt u a l d e Co m p u t e En g in e cu a d o e l o b je t o
P i e s p a s a d o e n la lla m a d a a l m é t o d o re m o t o e x e c u t e Ta s k d e l o b je t o Co m p u t e En g in e .
La cla s e P i s e ca rg a d e s d e la p á g in a we b d e l clie n t e .

Oz it o
Hacia el 1.1 -- y posteriores
Es t a le cció n d e s crib e e l API q u e s e h a a ñ a d id o a l JDK d e s d e e l 1 . 0 . Prin cip a lm e n t e ,
t ra t a s o b re a l ve rs ió n 1 . 1 y s u s d ife re n cia s co n la ve rs ió n 1 . 0 , có m o u t iliza r la s
ca ra ct e rís it ica s d e la 1 . 1 , e t c. Ta m b ié n o fre ce u n a vis ió n s o b re lo q u e p o d rá s
e xp e ra r d e s p u e s d e l 1 . 1 .
N o t a : El JDK 1 . 1 fu e lib e ra d o e n Dicie m b re d e 1 9 9 6 . Y fu e rá p id a m e n t e
s e g u id a p o r e l jd k 1 . 1 . 1 q u e co rre g ia a lg u n o s e rro re s . Ge n e ra lm e n t e
h a b la n d o , la s ve rs io n e s co rre ct o ra s d e e rro re s n o a ñ a d e n ca ra ct e rís it ica s
n u e va s s o b re s u s p re d e ce s o re s . Es p o r e s o , q u e e s t a d o c u m e n t a c ió n
q u e d e s c rib e e l JD K 1 . 1 s e p u e d e a p lic a r ig u a lm e n t e a la s fu t u ra s
v e rs io n e s c o rre c t o ra s d e e rro re s .

¿ Qu é h a y d e n u e v o e n la 1 . 1 ? s e rá e l lu g a r p a ra a p re n d e r s o b re la ve rs ió n 1 . 1 .
Es t a p o d ría s e r t u p rim e ra p a ra d a s i u t iliza r 1 . 0 . In clu s o s i n o lo u t iliza s ,
p ro b a b le m e n t e e n co n t ra rá s e s t a le cció n m u y ú t il co m o in t ro d u cció n a la s
ca p a cid a d e s q u e p ro p o rcio n a e s t a ve rs ió n d e l JDK. Ha s t a q u e s e t e rm in e e s t a
le cció n p u e d e s e n co n t a r in fo rm a ció n e n la d o cu m e n t a ció n d e S u n p a ra la ve rs ió n
1 . 1 d e l JDK. Pa ra m á s in fo rm a ció n s o b re co m o e s crib ir p ro g ra m a s q u e p u e d a n
u t iliza r la s ca ra ct e rís t ica s d e l 1 . 1 y a ú n a s í fu n cio n e s e n la s ve rs ió n ru n t im e d e la
1 . 0 , p u e d e s ve r Es crib ir Pro g ra m a s Co m p a t ib le s .

Ca m b io s e n e l GUI : El AW T c re c e De s crib e có m o t ra b a ja n la s cla s e s


re la cio n a d a s co n e l GUI - - e n p a rt icu la r e l AWT - - , y la s n u e va s ca ra ct e rís t ica s q u e
p u e d e s e s p e ra r d e s p u é s d e la 1 . 1 . Es t a le cció n in clu ye in fo rm a ció n d e t a lla d a s o b re
la u t iliza ció n d e l n u e vo s is t e m a d e e ve n t o s , e s crib ir co m p o n e n t e s d e p e s o lig e ro , y
co m o co n ve rt ir p ro g ra m a s q u e u t iliza n e l AWt 1 . 0 a l 1 . 1 .
[ P EN D I EN TE. . . ] Co n v e rt ir P ro g ra m a s 1 . 0 a 1 . 1 . . . Es t a e n co n s t ru cció n .
Mie n t ra s t a n t o p u e d e s ve r la d o cu m e n t a ció n s o b re e l 1 . 1 q u e d e s crib e Có m o
co n ve rt ir p ro g ra m a s a l API d e l AWT 1 . 1 . .

Oz it o
¿Qué hay nuevo en el JDK 1.1?
La ve rs ió n 1 . 1 d e l JDK a ñ a d e u n m o n t ó n d e n u e va s ca ra ct e rís t ica s q u e h a n s id o
re cla m a d a s p o r lo s p ro g ra m a d o re s d e Ja va . Es t a le cció n lis t a y d e s crib e
b re ve m e n t e e s t a s n u e va s ca ra ct e rís t ica s , t e m u e s t ra d o n d e e n co n t ra r in fo rm a ció n
s o b re e lla s , y a p u n t a la in fo rm a ció n d e e s t e t u t o ria l q u e e s a fe ct a d a p o r e s t o s
ca m b io s .

Nuevas características en el JDK 1.1

Aq u í s e lis t a n la s n u e va s ca ra ct e rís t ica s d e la ve rs ió n 1 . 1 d e l JDK, Pu ls a


s o b re lo s e n la ce s p a ra o b t e n e r u n b re ve s u m a rio s o b re e s a
ca ra ct e rís t ica .
● In t e rn a cio n a liza ció n

● S e g u rid a d y Ap p le t s Firm a d o s
● AWT Am p lia d o
● Ja va Be a n s ( t m )
● Fo rm a t o d e Fich e ro s JAR
● Am p lia cio n e s d e l Tra b a jo e n Re d
● Am p lia cio n e s d e la I/ O
● El p a q u e t e Ma t h
● In vo ca ció n d e Mé t o d o s Re m o t o s
● S e ria liza ció n d e Ob je t o s
● Re fle xió n
● Co n e ct ivid a d a Ba s e s d e Da t o s e n Ja va
● Cla s e s In t e rn a s
● El In t e rfa ce Na t ivo
● Au m e n t o s d e Re n d im ie n t o
● Mis ce la n e a

Cómo afecta la versión 1.1 a las lecciones existentes

La ve rs ió n 1 . 1 d e l JDK ca m b ia a lg u n a s ca ra ct e rís t ica s q u e ya fu e ro n


d o cu m e n t a d a s e n e l t u t o ria l p a ra la ve rs ió n 1 . 0 . 2 . Co m o la m a yo ría d e
lo s n a ve g a d o re s m á s p o p u la re s n o s o p o rt a n t o d a vía la ve rs ió n , 1 . 1 , e s
u n p o co p re m a t u ro a ct u a liza r co m p le t a m e n t e e l t u t o ria l a e s t a ve rs ió n .
En s u lu g a r, e n a q u e llo s lu g a re s e n q u e e l t u t o ria l d e s crib e
ca ra ct e rís t ica s q u e h a n ca m b ia d o p a ra la ve rs ió n 1 . 1 , s e p ro p o rcio n a rá n
e n la ce s a la s n o t a s q u e d e s crib e n e s t o s ca m b io s , có m o m ig ra r t u có d ig o
a e s t a n u e va t e cn o lo g ía , y a lg u n a s ve ce s , e je m p lo s d e có d ig o .
Po d rá s e n co n t ra r e s t a s n o t a s e n e l co n t e xt o d e la le cció n .

Oz it o
Internacionalización
La In t e rn a cio n a liza ció n fu e u n a d e la s ca ra ct e rís t ica s m á s a m p lia m e n t e s o licit a d a s
p o r lo s clie n t e s d e Ja va . Ja va S o ft h a lice n cia d o la s o lu ció n d e in t e rn a cio n a liza ció n
p ro p o rcio n a d a e n e l JDK 1 . 1 p o r Ta lig e n t .

La ca ra ct e rís it ca d e in t e rn a cio n a liza ció n d e l JDK e s t á t o t a lm e n t e in t e g ra d a y h a ce


q u e lo s p ro g ra m a d o re s t e n g a n m á s s e n cillo e l e s crib ir p ro g ra m a s y a p p le t s g o b a le s
d e s d e e l p rin cip io ( n o có m o u n s o b re e s fu e rzo ) .
La s a p lica cio n e s in clu ye n e l d is p la y d e ca ra ct e re s UNICODE, u n m e ca n is m o lo ca l,
s o p o rt e d e m e n s a je s lo ca le s , fe ch a , h o ra y zo n a h o ra ria s e n s ib le s y m a n e jo d e
n ú m e ro s , co n ve rs o re s d e ju e g o s d e ca ra ct e re s , fo rm a t e o d e p a rá m e t ro s y s o p o rt e
p a ra e n co n t ra r lo s lím it e s d e ca ra ct e r/ p a la b ra / s e n t e n cia .

¿Dónde encontrar documentación?

● La n u e va le cció n Es crib ir p ro g ra m a s g lo b a le s , d o cu m e n t a e s t a s n u e va s
ca ra ct e rís t ica s , y m u e s t ra có m o in t e rn a cio n a liza r u n p ro g ra m a e xis t e n t e .
● Ad e m a s , e m la s it e s u n p o d rá s e n co n t ra r in fo rm a ció n s o b re có m o a ñ a d ir
fu e n t e s a la ru n t im e d e Ja va , y a lg u n a s d e m o s d e Ap p le t s d e l JDK
1 . 1 . In t e rn a cio n a liza ció n .

Oz it o
Seguridad y Applets Firmados
El API d e s e g u rid a d d e Ja va e s t á d is e ñ a d o p a ra p e rm it ir a lo s d e s a rro lla d o re s q u e
in co rp o re n fu n cio n a lid a d d e s e g u rid a d t a n t o a b a jo co m o a a lt o n ive l d e n t ro d e s u s
a p lica cio n e s Ja va . La p rim e ra ve rs ió n d e la s e g u rid a d Ja va e n e l JDK 1 . 1 co n t ie n e
u n s u b ju e g o d e e s t a s fu n cio n a lid a d e s , in clu ye n d o u n API p a ra firm a s d ig it a le s y
re s u m e n d e m e n s a je s . Ad e m á s e xis t e n in t e rfa ce s a b s t ra ct o s p a ra m a n e jo d e
cla ve s , m a n e jo d e ce rt ifica d o s y co n t ro l d e a cce s o . Es p e cífica m e n t e e l API s o p o rt a
ce rt ifica d o s X. 5 0 9 v3 y o t ro s fo rm a t o s d e ce rt ifica d o s , y u n a rica fu n cio n a lid a d e n
e l á re a d e co n t ro l d e a cce s o , q u e co n t in u a rá e n ve rs io n e s p o s t e rio re s d e l JDK.
e l JDK 1 . 1 t a m b ié n p ro p o rcio n a u n a h e rra m ie n t a q u e p u e d e firm a r a rch ivo s ( JAR) ,
q u e p u e d e n co n t e n e r cla s e s y o t ro s d a t o s ( có m o im á g e n e s o s o n id o s ) . El
a p p le t vie we r p e rm it e d e s ca rg a r a p p le t s e n fich e ro s JAR firm a d o s ( u t iliza n d o la
h e rra m ie n t a ) m e d ia n t e u n a e n t id a d d e co n firm a ció n p a ra e je cu t a rlo s co n lo s
m is m o s d e re ch o s q u e u n a a p lica ció n lo ca l. Es t o e s , d ich o s a p p le t s n o e s t á n s u je t o s
a la s re s t riccio n e s d e s e g u rid a d d e l m o d e lo d e s e g u rid a d o rig in a l d e Ja va . La s
ve rs io n e s p o s t e rio re s d e l JDK p ro rp o cio n a rá n u n a s p o lít ica s d e s e g u rid a d m á s
s o fis t ica d a s , in clu ye n d o m a yo r g ra n u lid a d e n lo s n ive le s d e co n fo rm id a d
p e rm it id o s .

¿Dónde encontrar documentación?

● S e h a cre a d o u n a n u e va le cció n t it u la d a Ja va S e cu rit y 1 . 1 . S i la in fo rm a ció n


q u e n e ce s it a s n o e s t á a h í p u e d e s le e r la d o cu m e n t a ció n e n la s it e d e S u n
S e g u rid a d y Ap p le t s Firm a d o s .

Oz it o
Ampliación del AWT
En e l JDK 1 . 1 , la a rq u it e ct u ra d e l AWT h a s id o a m p lia d a p a ra h a ce r q u e e l
d e s a rro llo d e GUI a g ra n e s ca la s e a m á s fá cil y p a ra a ñ a d ir fu n cio n a lid a d e s b á s ica s
q u e s e h a b ía n p e rd id o e n la ve rs ió n 1 . 0 . 2 . Lo m á s s ig n ifica n t e e s la cre a ció n d e u n
n u e vo m o d e lo d e e ve n t o s y la ca p a cid a d p a ra cre a r co m p o n e n t e s d e p o co p e s o . S e
h a n a ñ a d d id o u n API p a ra im p rim ir, m e jo r d e s p la za m ie n t o d e p a n t a lla , m e n ú s
p o p u p , p o rt a p a p e le s ( co p ia r/ p e g a r) , y cu rs o re s p a ra co m p o n e n t e s . Ta m b ié n s e h a n
a m p lia d o la s ca p a cid a d e s g rá fica s y d e im á g e n , y e l s o p o rt e d e fu e n t e s s e h a
h e ch o m á s fle xib le p a ra a co m o d a rs e a la in t e rn a cio n a liza ció n .

¿Dónde encontrar documentación?

● Ca m b io s e n e l GUI: El AWT cre ce d e s crib e co m o t ra b a ja n la s n u e va s cla s e s


re la cio n a d a s co n e l GUI e n e l JDK 1 . 1 . La le cció n in clu ye in fo rm a ció n
d e t a lla d a d s o b re la u t iliza ció n d e l n u e vo s is t e m a d e e ve n t o s , e s crib ir
co m p o n e t e s d e p e s o lig e ro , y có m o co n ve rt ir p ro g ra m a s q u e u t iliza n e l a WT
1 . 0 a la ve rs ió n 1 . 1 .
● Ha s t a q u e s e co m p le t e la le cció n a n t e rio r, p u e d e s e n co n t ra r la s
e s p cifica cio n e s d e d is e ñ o d e l AWT e n la s it e d e S u n Am p lia ció n d e l AWT.

Oz it o
JavaBeans(tm)
Ja va Be a n s d e fin e e l m o d e lo d e co m p o n e n t e s o ft wa re re u t iliza b le d e Ja va .
Es t o s APIs p e rm it e n a t e rce ra s p a rt e s cre a r y la n za r co m p o n e n t e s Ja va
re u t iliza b le s ( Be a n s ) , co m o p ro ce s a d o re s d e t e xt o , h o ja s d e cá lcu lo , o
p u e n t e s g rá fico s , q u e ju n t o s , p u e d e n s e r co n ve rt id o s e n a p lica cio n e s p o r
lo s n o p ro g ra m a d o re s .

¿Dónde encontrar documentación?

● En la le cció n d e e s t e t u t o ria l t it u la d a Ja va Be a n s , q u e in clu ye va rio s


e je m p lo s .
● Ta m b ié n p u e d e s le e r la s Es p e cifica cio n e s d e lo s Ja va Be a n s ( t m ) .

Oz it o
El formato de Ficheros JAR
JAR ( Ja va ARch ive ) e s u n fo rm a t o d e fich e ro in d e p e n d ie n t e d e la p la t a fo rm a q u e t e
p e rm it e a lm a ce n a r u n a p p le t Ja va y s u s co m p o n e n t e s re q u e rid o s ( fich e ro s . c la s s ,
im á g e n e s y s o n id o s ) e n u n s ó lo fich e ro JAR. Ut iliza n d o e l n u e vo a t rib u t o ARCHI VE
d e la e t iq u e t a < APPLET> , e s t e fich e ro p u e d e s e r d e s a rg a d o p o r e l n a ve g a d o r co n
u n s o la t ra n s a ció n HTTP, a u m e n t a n d o g ra t a m e n t e la ve lo cid a d d e d e s ca rg a .
Ad e m á s , JAR s o p o rt a co m p re s ió n , lo q u e re d u ce e l t a m a ñ o d e l fich e ro , y o p t im iza
m á s a ú n e l t ie m p o d e d e s ca rg a .
Fin a lm e n t e , e l a u t o r d e l a p p le t p u e d e firm a d ig it a lm e n t e e n t ra d a s e n e l fich e ro JAR
p a ra a u t e n t ifica r s u o rig e n . Pu e d e s le e r m á s s o b re e s t o e n la le cció n d e s e g u rid a d .

¿Dónde encontrar más documentación?

Act u a lm e n t e , la ca n t id a d d e d o cu m e n t a ció n d is p o n ib le d e n t ro d e l t u t o ria l s o b re lo s


fich e ro s JAR e s t á d e a lg ú n m o d o lim it a d a . S in e m b a rg o , e s s u ficie n t e p a ra
e m p e za r.
● Ca m b io s e n e l JDK 1 . 1 : Arch ivo s JAR y lo s Ap p le t s t e e n s e ñ a co m o u t iliza r lo s
fich e ro s JAR e n t u s a p p le t s y e xp lica lo s b e n e ficio s d e h a ce rlo .
● La le cció n s o b re lo s b e a n s co n t ie n e a lg u n a s p á g in a s s o b re Em p a q u e t a r Be a n s
p a ra s u d is t rib u ció n .
● Lo s fich e ro s JAR s e u t iliza n e n u n g ra n n ú m e ro d e e je m p lo s d e a p p le t s e n e l
t u t o ria l, in clu ye n d o e l e je m p lo Aro u n d t h e Wo rld e n Es crib ir p ro g ra m a s
g lo b a le s , y e n la In t ro d u cció n a l n u e vo m o d e lo d e e ve n t o s d e l AWT.
● Y p a ra a yu d a rt e a e m p e za r, a q u í t ie n e s u n a b re ve in t ro d u cció n a a lg u n o s d e
lo s co n ce p t o s b á s ico s p a ra u t iliza r fich e ro s JAR.
Pu e d e s cre a r y m a n ip u la r fich e ro s JAR co n e l p ro g ra m a d e u t ilid a d ja r. Lo s
a rg u m e n t o s d e la lín e a d e co m a n d o s p a ra e s t e p ro g ra m a s o n s im ila re s a lo s
d e l p ro g ra m a t a r d e l UNIX. La s co s a s m á s co m u n e s q u e p u e d e s h a ce r co n u n
fich e ro JAR s o n : cre a r u n fich e ro JAR, lis t a r e l co n t e n id o d e u n fich e ro JAR,
e xt ra e r e l co n t e n id o d e u n fich e ro JAR, y u t iliza r u n fich e ro JAR e n e l a t rib u t o
ARCHI VE d e la e t iq u e t a < APPLET> . Bre ve m e n t e , a q u í t ie n e s có m o h a ce r
ca d a u n a d e e s a s co s a s ( u t iliza n d o S o la ris o Win d o ws ) :
Pa ra cre a r u n fich e ro JAR: ja r cvf No m b re d e Fich e ro JAR Lis t a d e Fich e ro s

Pa ra lis t a r e l co n t e n id o d e u n
ja r t vf No m b re d e Fich e ro JAR
fich e ro JAR:
Pa ra e xt ra e r e l co n t e n id o
ja r xvf No m b re d e Fich e ro JAR
co m p le t o d e u n fich e ro JAR:
<applet code=AppletClassName.class
Pa ra e s p e cifica r la u t iliza n ció n d e
archive="JarFileName.jar"
u n fich e ro JAR co n u n a p p le t :
width=width height=height>
</applet>

Ad e m á s , d e la d o cu m e n t a ció n a n t e rio rm e n t e m e n cio n a d a p u e d e s e n co n t ra r, la


Gu ia y Ma n ifie s t o d e la s Es p e cifica cio n e s d e l Fo rm a t o JAR e n la p á g in a JAR - Ja va
Arch ive d e la s it e d e S u n .

Oz it o
Ampliaciones del Trabajo en Red
El JDK 1 . 1 h a ce m u ch a s a m p lia cio n e s e n e l p a q u e t e ja v a . n e t .

¿Dónde encontrar documentación?

● Es t a s a m p lia cio n e s s e s u m a riza n e n la p á g in a No t a s s o b re la 1 . 1 q u e s e h a


a ñ a d id o a la le cció n "S e g u rid a d y Co n e ct ivid a d e Clie n t e ". Ad e m á s s e h a n
a u m e n t a d o lo s e je m p lo s q u e u t iliza n la s a m p lia cio n e s d e la ve rs ió n 1 . 1 p a ra
q u e p u e d a s ve r lo s ca m b io s q u e p o d ría n a fe ct a r a t u s p ro g ra m a s .
● La p á g in a Am p lia cio n e s d e l Tra b a jo e n Re d e n e l s it e d e S u n , p ro p o rcio n a
a lg ú n m a t e ria l d e s crip t ivo s o b re lo s ca m b io s e n ja v a . n e t .

Oz it o
Ampliaciones de la I/O
El p a q u e t e I/ O h a s id o a m p lia d o co n s t e a m s d e ca rá ct e r, q u e s o n co m o lo s s t re a m
d e b yt e e xce p t o q u e co n t ie n e n ca ra ct e re s Un ico d e d e 1 6 - b it e n ve z d e b yt e s d e
o ch o b it s .

¿Dónde encontrar documentación?

● Es t o s n u e vo s s t re a m s e s t á n d o cu m e n t a d o s e n la s p á g in a s No t a s s o b re la
ve rs ió n 1 . 1 .
● Am p lia cio n e s d e la I/ O t ie n e m á s d o cu m e n t a ció n s o b re e s t o s ca m b io s e n e l
s it e d e S u n .

Oz it o
El paquete Math
S e h a a ñ a d id o u n n u e vo p a q u e t e a l JDK 1 . 1 , e l p a q u e t e ja v a . m a t h . Es t e p a q u e t e
co n t ie n e d o s n u e va s cla s e s : Big I n t e g e r y Big D e c im a l.
Lo s n ú m e ro s Big I n t e g e r s o n e n t e ro s d e p re cis ió n a rb it ra ria in m u t a b le , lo q u e
p ro p o cio n a a n a lo g ía co n t o d o s lo s o p e ra d o re s d e e n t e ro s p rim it ivo s d e Ja va , y
t o d o s lo m é t o d o s e s t á t ico s re le va n t e s d e la s cla s e s d e ja v a . la n g . Ma t h .
Ad icio n a lm e n t e , lo s n ú m e ro s Big I n t e g e r p ro p o rcio n a n o p e ra cio n e s p a ra a rt im é t ica
m o d u la r, cá lcu lo GCD, t e s t e o p rim a ro , p rim e ra g e n e ra ció n , m a n ip u la ció n d e b it s ,
e t c.
Lo s n ú m e ro s Big D e c im a l s o n n ú m e ro s d e cim a le s in m u t a b le s d e p re cis icó n
a rb it ra ria , d is e ñ a d o s p a ra e l cá lcu lo m o n e t a rio . Es t o s n ú m e ro s p ro p o rcio n a n
o p e ra cio n e s p a ra a rit m é t ica b á s ica , m a n ip u la ció n d e e s ca la s , co m p a ra ció n y
co n ve rs ió n d e fo rm a t o s .

¿Dónde encontrar documentación?

● Act u a lm e n t e la ú n ica d o cu m e n t a ció n d is p o n ib le s o b re e s t á s cla s e s s e


e n cu e n t a e n la d o cu m e n t a ció n s o b re e l API e n e l s it e d e S UN:
ja va . m a t h . Big In t e g e r, y ja va . m a t h . Big De cim a l

Oz it o
Invocación Remota de Métodos (RMI)
La In vo ca ció n Re m o t a d e Mé t o d o s ( RMI) p e rm it e a lo s p ro g ra m a d o s cre a r
a p lica cio n e s d is t rib u id a s Ja va - a - Ja va , e n la q u e lo s m é t o d o s d e o b je t o s Ja va
re m o t o s p u e d e n s e r in vo ca d o s d e s d e o t ra s m á q u in a s virt u a le s Ja va , p o s ib le m e n t e
e n d ife re n t e s s e rvid o re s .
Un p ro g ra m a Ja va p u e d e h a ce r u n a lla m a d a a u n o b je t o re m o t o u n a ve z q u e h a
o b t e n id o u n a re fe re n cia h a cia e s e o b je t o , o b ie n b u s ca n d o e l o b je t o e n u n s e rvid o r
d e n o m b re s p ro p o rcio n a d o p o r e l RMI o re cib ie n d o la re fe re n cia co m o u n
a rg u m e n t o o u n va lo r d e re t o rn o . Un clie n t e p u e d e lla m a r a u n o b je t o re m o t o e n e l
s e rvid o r, y e s t e s e rvid o r p u e d e a s u ve z s e r u n clie n t e d e o t ro s o b je t o s re m o t o s .
RMI u t iliza S e ria liza ció n d e Ob je t o s p a ra o rd e n a r y d e s o rd e n a r p a rá m e t ro s y n o
t ru n ca lo s t ip o s , s o p o rt a n d o ve rd a d e ro p o lim o rfis m o o ria n t a d o a o b je t o s .

¿Dónde encontrar documentación?

● Pu e d e s e n co n t ra r e l t u t o ria l s o b re e l RMI y la s e s p e cifica cio n e s e n e l s it e s e


S u n Do cu m e n t a ció n RMI.

Oz it o
Serialización de Objetos
La S e ria liza ció n d e Ob je t o s e xt ie n d e e l co ra zó n d e la s cla s e s d e I/ O d e Ja va co n
s o p o rt e p a ra Ob je t o s . La s e ria liza ció n s o p o rt a la co d ifica ció n d e o b je t o s y lo s
o b je t o s a lca n za b le s d e s d e d e n t ro d e u n s t re a m d e b yt e s y la re co n s t ru cció n
co m p le m e n t a ria d e l o b je t o d e s d e e l s t re a m . La s e ria liza ció n e s u t iliza d a p a ra
p e rs is t e n cia d e p e s o lig e ro y p a ra co m u n ica ció n m e d ia n t e s o cke t s o RMI. La
co d ifica ció n d e o b je t o s p o r d e fe ct o p ro t e g e la t ra n s m is ió n d e d a t o s , y s o p o rt a la
e vo lu ció n d e la s cla s e s . Un a cla s e p o d ría im p le m e n t a r s u p ro p ia co d ifica ció n
e xt e rn a y s e r co m p le t a m e n t e re s p o n s a b le d e l fo rm a t o e xt e rn o .

¿Dónde encontrar documentación?

● La s e s p e cifica cio n e s s o b re s e ria liza ció n d e o b je t o s p u e d e n e n co n t ra rs e e n


S e ria liza ció n d e Ob je t o s .
● Ad e m á s p u e d e s ve r la d o cu m e n t a ció n s o b re e l API d e ja va . io .

Oz it o
Reflexión
Pe rm it e a l có d ig o Ja va d e s cu b rir in fo rm a ció n s o b re ca m p o s , m é t o d o s y
co n s t ru ct o re s d e la s cla s e s ca rg a d a s , y u t iliza r ca m p o s re fle ja d o s , m é t o d o s y
co n s t ru ct o re s p a ra o p e ra r co n s u s p a rt e s s u b ra ya d a s d e lo s o b je t o s , d e n t ro d e la s
re s t riccio n e s d e s e g u rid a d . El API a co m o d a la s a p lica cio n e s q u e n e ce s it a n a cce s o a
lo s m ie m b ro s p ú b lico s o a l o b je t o fu e n t e ( b a s á n d o s e e n s u cla s e s ru n t im e ) o a lo s
m ie m b ro s d e cla ra d o s p o r u n cla s e d a d a .

¿Dónde encontrar documentación?

● La e xp e cifica ció n s o b re la Re fle xió n d e l Co ra zó n d e Ja va s e p u e d e e n co n t ra r


e n e l s it e d e l JDK Re fle ct io n Do cu m e n t a t io n .

Oz it o
Conectividad con Bases de Datos en Java
Co n e ct ivid a d co n Ba s e s d e Da t o s e n Ja va e s u n in t e rfa ce d e a cce s o a b a s e d e d a t o s
S QL e s t á n d a rd . p ro p o rcio n a n d o u n a cce s o u n ifo rm e a u n a m p lio ra n g o d e b a s e s d e
d a t o s re la cio n a le s . Ta m b ié n p ro p o rcio n a u n a b a s e co m ú n a la s h e rra m ie n t a s d e
a lt o n ive l y lo s in t e rfa ce s q u e s e p u e d e n co n s t ru ir. Es t o vie n e co m o u n "Pu e n t e
OBDC" ( e xce p t o e n Ma c 6 8 K) . El p u e n t e e s u n a lib re ría q u e im p le m e n t a e l JDBC e n
t é rm in o s d e l API e s t á n d a rd d e l OBDC d e "C".

¿Dónde encontrar documentación?

● Pu e d e s e n co n t ra r e l t u t o ria l s o b re JDBC e n e l s it e d e S u n JDBC


Do cu m e n t a t io n .

Oz it o
Clases Internas
La s ve rs io n e s p ré via s d e l le n g u a je Ja va re q u e ría n q u e t o d a s la s cla s e s fu e ra n
d e cla ra d a s m ie m b ro s d e u n p a q u e t e ( lla m a d a s cla s e s d e m á xim o n ive l) . La ve rs ió n
d e l JDK 1 . 1 e lim in a e s t a re s t ricció n y p e rm it e d e cla ra r cla s e s e n cu a lq u ie r á m b it o
( lla m a d a s cla s e s In t e rn a s ) .

¿Dónde encontrar documentación?

● Pu e d e s ve r la p á g in a No t a s s o b re e l JDK 1 . 1 .
● Pu e d e s ve r la s Es p e cifica cio n e s d e la s cla s e s in t e rn a s d e Ja va .

Oz it o
Interface Nativo de Java
Lo s m é t o d o s n a t ivo s , s o n m e t o d o s u t iliza d o s p o r Ja va p e ro e s crit o s e n u n le n g u a je
d ife re n t e , h a n e s t a d o e n e l JDK d e s d e e l p rin cip io . Y co m o s e p ro m e t ió , e l in t e rfa ce
d e lo s m é t o d o s n a t ivo s d e l 1 . 0 . 2 h a s id o re e s crit o co m p le t a m e n t e . Es t e in t e rfa ce
s e lla m a a h o ra In t e rfa ce d e Ja v a Na t iv o o JNI p a ra a co rt a r.

¿Dónde encontrar documentación?

● Lo s n u e vo s m é t o d o s n a t ivo s e n e l JDK 1 . 1 e s t á n d o cu m e n t a d o s e n la le cció n


In t e g ra r có d ig o n a t ivo y p ro g ra m a s Ja va
● O s i lo p re fie re s , p u e d e s le e r e n la s it e d e S u n la s Es p e cifica cio n e s d e lo s
Mé t o d o s Na t ivo s e n Ja va .

Oz it o
Aumento del Rendimiento en el JDK 1.1
LA s ig u ie n t e lis t a d e s crib e lo s a u m e n t o s d e re n d im ie n t o re a lizo s e n la ve rs ió n 1 . 1
d e l JDK:
● Bu c le d e I n t e rp re t e e n c ó d ig o e n s a m b la d o r e n W in 3 2 y S o la ris / S P ARC
Ya q u e a lg u n a s p o rcio n e s d e la Má q u in a Virt u a l Ja va s e h a n re e s crit o e n
le n g u a je e n s a m b la d o r, la m á q u in a re s u lt a n t e a h o ra s e e je cu t a h a s t a 5 ve ce s
m á s rá p id o e n cie rt a s o p e ra cio n e s .
● S o p o rt e d e P ila n o - c o n t ín u a p a ra Ma c
Au m e n t a r la u t iliza ció n d e la m e m o ria e n Ma cin t o s h p e rm it e q u e Ja va s e
e je cu t e d e fo rm a m á s co rre ct a co n o t ra s a p lica cio n e s .
● Ac e le ra c ió n d e lo s Mo n it o re s
Lo s m é t o d o s s in cro n iza d o s p e rm it e n o p e ra cio n e s p a ra e je cu t a rs e m á s rá p id a
y e ficie n t e m e n t e .
● Re c o le c c ió n d e b a s u ra d e Cla s e s
Es t a a m p lia ció n d e s ca rt a a u t o m á t ica m e n t e la s cla s e s n o u t iliza d a s . Al
a u m e n t a r la u t iliza ció n d e m e m o ria d e la m á q u in a virt u a l p e rm it e a Ja va
o p e ra r m á s e ficie n t e m e n t e y co n m e n o s m e m o ria .
● La s c la s e s p a re s d e l AW T re - e s c rit a s p a ra W in 3 2
Pa ra a lca n za r u n a lt o re n d im ie n t o , la s cla s e s p e a re s d e l AWT h a s id o
co m p le t a m e n t e re - e s crit a p a ra a u m e n t a r s u ve lo cid a d e n Win 3 2 .
● JAR ( Arc h iv o s Ja v a ) e m p a q u e t a d o d e re c u rs o s p a ra u n a s ó la
t ra n s a c ió n HTTP
JAR e s u n n u e vo fo rm a t o d e fich e ro s in d e p e n d ie n t e d e la p la t a fo rm a
p ro p o rcio n a o d p o r JDK 1 . 1 q u e p e rm it e e m p a q u e t a r va rio s fich e ro s e n u n o
s ó lo . Lo s a p p le t s Ja va y s u s co m p o n e n t e s - co m o fich e ro . cla s s , im á g e n e s o
s o n o d is o - - p u e d e n s e r e m p a q u e t a d o s e n u n fich e ro JAR co m p rim id o y
d e s a ca rg a d o p o r e l n a ve g a d o r co n u n a s ó lo t ra n s a ció n HTTP p a ra re d u cir e l
t ie m p o d e d e s ca rg a . Ad e m á s , lo s a u t o re s d e lo s a p p le t s p u e d e n firm a r
d ig it á lm e n t e e n t ra d a s in d ivid u a le s e n e l fich e ro JAR p a ra a u t e n t ifica r s u
o rig e n .

¿Dónde encontrar documentación?

● Pa ra la s m e d id a s d e re n d im ie n t o d e l JDK p u e d e s ve r Pe rfo rm a n ce
Me a s u re m e n t s e n e l s it e d e Ja va S o ft .

Oz it o
Miscelánea
Lo s s ig u ie n t e s ca m b io s t a m b ié n s e h a n re a liza d o e n la ve rs ió n 1 . 1 d e l JDk p e ro n o
p u e d e n s e r ca t e rg o riza d o s co n n in g ú n o t ro .
● La s c la s e s By t e , S h o rt y Vo id
Lo s Byt e s y lo s S h o rt s s e h a n a co m o d a d o co m o n ú m e ro re co rt a d o r m e d ia n t e
la a d ició n d e la s cla s e s Byt e y S h o rt . La cla s e a b s t ra ct a Nu m b e r o b t ie n e d o s
n u e vo s m é t o d o s co n cre t o s : b yt e Va lu e y s h o rt Va lu e ; la s im p le m e n t a cio n e s p o r
d e fe ct o d e e s t o s u t iliza n e l m é t o d o in t Va lu e . Ta m b ié n in clu ye u n a cla s e s Vo id
q u e e s u n a cla s e n o e je m p la riza b le .
● La e t iq u e t a @d e p re c a t e d
Ut iliza d a e n d o cu m e n t a ció n p a ra m a rca r la s cla s e s n o a m b íg u a s , lo s m é t o d o s
y ca m p o s q u e h a n s id o s u p e ra d o s p o r lo n u e vo s APIs . El co m p ila d o r la n za rá
u n a vis o cu a n d o p ro ce s e có d ig o fu e n t e q u e u t ilice la ca ra ct e rís t ica
d e s p re cia d a .
● Ac c e s o a fic h e ro s d e re c u rs o s
Es t e API p ro p o rcio n a u n m e ca n is m o p a ra lo ca liza r fich e ro s d e re cu rs o s e n u n a
fo rm a in d e p e n d ie n t e d e la lo ca liza ció n d e lo s re cu rs o s . Po r e je m p lo , e s t e
m e ca n is m o p u e d e lo ca liza r u n fich e ro d e re cu rs o s t a n t o s i e n u n a p p le t ca rg a r
d e s d e la re d u t iliza n d o m ú lt ip le s co n xio n e s HTTP, u n a p p le t ca rg a d o u t iliza n d o
fich e ro JAR, o u n a lib re ría in s t a la d a e n e l CLAS S PATH.
● Ad ic io n e s a la e t iq u e t a AP P LET ( HTML)
Am p lia cio n e s d e la e t iq u e t a < APPLET> u t iliza d a e n HTML.

¿Dónde encontrar documentación?

● La ú n ica in fo rm a ció n d is p o n o b le a ct u a lm e n t e p a ra la s cla s e s By t e , S h o rt , y


Vo id e s t á e n la d o cu m e n t a ció n g e n e ra d a p o r Ja va Do c.
● En la p á g in a Th e @d e p re ca t e d Ta g d e S u n p u e d e s e n co n t ra r in fo rm a ció n
s o b re lo s vie jo s APIs .
● Acce s s in g Re s o u rce s De s crib e có m o p u e d e s lo ca liza r re cu rs o s d e u n a fo rm a
in d e p e n d ie n t e d e la p o s ició n .
● APPLET Ta g Do cu m e n t a t o d o lo s co m p o n e n t e s d e la e t iq u e t a < AP P LET>
in clu ye n d o lo s n u e vo s d e l JDK 1 . 1 .

Oz it o
Cómo afecta el JDK 1.1 a las lecciones existentes
Es t a p á g in a s u m a riza có m o a fe ct a n lo s ca m b io s d e l JDK 1 . 1 a la s le ccio n e s d e e s t e
t u t o ria l.

Escribir applets

El API b á s ico d e Ap p le t n o h a ca m b ia d o , e xce p t o p o r la a d ició n d e u n a t rib u t o a la


e t iq u e t a < APPLET> . El n u e vo p a rá m e t ro ARCHIVE, t e p e rm it e e xp e cifica r e l fich e ro o
fich e ro s JAR q u e co n t ie n e n la s cla s e s y lo s fich e ro s d e d a t o s .
Co m o lo s a p p le t s p u e d e n u t iliza r la s m a yo ría d e la s cla s e s d e l JDK, la m o yo ría d e
lo s ca m b io s d e s crit o s e n la s o t ra s le ccio n e s , t a m b ié n s e a p lica n a lo s a p p le t s .

Crear un Interface de usuario

El AWT h a ca m b ia d o s ig n ifica t iva m e n t e , p e ro m a n t ie n e s u co m p a t ib ilid a d . Pu e d e s


ve r Ca m b io s d e l GUI: e l AWT Cre ce p a ra d a r u n vis t a zo a la d o cu m e n t a ció n
d e t a lla d a e l n e vo API.

Trabajo en Red

El JDK 1 . 1 h a re a liza d o va ria s a m p lia cio n e s e n e l p a q u e t e d e re d , m á s


n o t a b le m e n t e h a e xt e n d id o lo s s o cke t s y la s o p cio n e s d e l e s t ilo BS D.

Oz it o
Cambios del GUI: el AWT crece
De s p u é s d e lib e ra r la ve rs ió n 1 . 0 d e la p la t a fo rm a Ja va , Ja va S o ft e m p e zó a
t ra b a ja r e n fo rm a s p a ra p e rm it ir a lo s p ro g ra m a d o re s cre a r m e jo re s in t e rfa ce s
g rá fico s d e u s u a rio ( GUIs ) e n e l m e n o r t ie m p o .
En e l JDK 1 . 1 , la a rq u it e ct u ra d e l AWT s e h a a m p lia d o p a ra h a ce r e l d e s a rro llo d e
GUI a g ra n e s ca la m á s fá cil y p a ra a ñ a d ir fu n cio n a lid a d e s b á s ica s q u e s e h a b ía n
p e rd id o . La m á s s ig n ifica n t e d e la s a m p lia cio n e s e s u n n u e vo m o d e lo d e e ve n t o s y
la ca p a cid a d p a ra cre a r co m p o n e n t e s d e p e s o lig e ro .
Ju s t o d e s p u é s d e fin a liza r la 1 . 1 , Ja va S o ft a n u n ció la Ja v a Fo u n d a t io n Cla s s e s
( JFC) . El JFC in clu ye e l AWT d e l 1 . 1 m á s fu n cio n a lid a d e s a d icio n a le s , co m o u n a
in fra e s t ru ct u ra p a ra cre a r co m p o n e n t e s d e p e s o lig e ro , u n ju e g o d e e s t o s
co m p o n e n t e s lis t o s p a ra u t iliza r, y u n a ca p a cid a d d e d ib u jo co m p le t a m e n t e
ca ra ct e riza d a . Pa ra o b t e n e r re a lim e n t a ció n y p ro b a r e s t a s fu n cio n a lid a d e s
a d icio n a le s d e JFC, Ja va S o ft p ro p o rcio n a a cce s o a la s p rim e ra ve rs io n e s d e lo s
p ro ye ct o s Ja v a 2 D ( d ib u jo ) y S w in g ( co m p o n e n t e s d e p e s o lig e ro ) .

Cambios en el GUI 1.1 y posteriores

Es t a s e cció n d is cu t e e l JFC - - lo s ca m b io s d e l AWT 1 . 1 , e l p ro ye ct o S win g


y u n p o co s o b re Ja va 2 D.

El nuevo modelo de eventos del AWT

Es t a s e cció n d e s crib e e l m o d e lo d e l e ve n t o s d e l a WT 1 . 1 , o fre cie n d o t e


ca n t id a d d e e je m p lo s a s e g u ir.

Utilizar la versión de "Swing" del JFC

La ve rs ió n d e S win g e s u n a p rim e ra ve rs ió n d e u n a p a rt e d e l JFC. Es t a


s e cció n d e cu e n t a co m o d e s ca rg a r la ve rs ió n d e S win g , y co n s t ru ir
a p lica cio n e s q u e u t ilice n co m p o n e n t e s d e p e s o lig e ro ya cre a d o s .

Ecribir componentes de peso ligero

Es t a s e cció n n o e s t á e s crit a t o d a vá . Pu e d e s ve r la p á g in a d e e je m p lo s e n
e l s it e d e Ja va S o ft Lig h t we ig h t Co m p o n e n t s p a ra ve r d o cu m e n t a ció n y
e je m p lo s . Cu a n d o la ve rs ió n d e S win g s e in co rp o re a l JDK, e s crib ir
co m p o n e n t e s d e p e s o lig e ro - - y co m p o n e n t e s d e u s u a rio e n g e n e ra l - -
s e rá m á s s e n cillo .

Cómo convertir programar al API del AWT 1.1

Pa ra e s t a ifo rm a ció n , d e b e s ir a la s it e d e Ja va S o ft Có m o co n ve rt ir
p ro g ra m a s a l API d e l a WT 1 . 1 , q u e e s u n a p a rt e d e la d o cu m e n t a ció n d e l
p a q u e t e 1 . 1 . Es t o s co n t e n id o s s e a ñ a d irá n p ro n t o a e s t e t u t o ria l.

S o b re lo s e je m p lo s : Mu ch o s d e lo s e je m p lo s d e e s t a s e cció n u t iliza n
co m p o n e n t e s d e p e s o p e s a d o . S in e m b a rg o , t e re co m e n d a m o s q u e
u t ilice s co m p o n e n t e s lig e ro s s ie m p re q u e s e a p o s ib le !

Oz it o
El nuevo modelo de eventos del AWT
As í co m o e l JDK, e l AWT t ie n e u n n u e vo m o d e lo d e e ve n t o s . El vie jo m o d e lo
b a s a d o e n co n t e n id o t o d a vía fu n cio n a , p e ro s i u s o e s t á d e s a co n s e ja d o p o rq u e e l
n u e vo m o d e lo e s m u ch o m á s fle xib le , p o d e ro s o y e ficie n t e . El n u e vo m o d e lo e s t á
b a s a d o e n e l m o d e lo d e e ve n t o s d e lo s Ja va Be a n s , co m o u n p a s o h a cia a d e la n t e
s o p o rt a n d o co m p o n e n t e s AWT co m o Be a n s .

Introducción al nuevo modelo de eventos del AWT

Es t a s e cció n e xp lica e l n u e vo m o d e lo d e ve n t o y co n t ie n e a lg u n o s
a p p le t s ilu s t ra t ivo s .

Utilizar adaptadores y clases internas para manejar eventos del AWT.

Pa ra re d u cir e l có d ig o in n e ce s a rio , p u e d e s u t iliza r a d a p t a d o re s y cla s e s


in t e rn a s . Es t a s e cció n m u e s t ra có m o y cu á n d o h a ce r e s t o

Manejar eventos estándard del AWT

Es t a s e cció n lis t a t o d o s lo s e ve n t o s q u e p u e d e n g e n e ra r lo s co m p o n e n t e s
d e l AWT. Y d a rá e je m p lo s d e s u m a n e jo .

Generar eventos AWT

Tu s o b je t o s p u e d e n g e n e ra r t a n t o e ve n t o s e s t á n d a rd co m o clie n t e s d e
AWT. Es t e s e cció n t e lo co n t a rá . Po r a h o ra p u e d e s ve r e s t a s p á g in a s e n
la s it e d e Ja va S o ft Lig h t we ig h t Co m p o n e n t s p a ra e je m p lo s d e la
g e n e ra ció n d e ve n t o s . O JDK 1 . 1 Eve n t Exa m p le s p a ra ve r u n e je m p lo d e
la fo rm a d e re d e s p a ch a r u n e ve n t o AWT.

Suamrio del modelo de eventos del AWT

Es t e s e cció n lo p o n d rá t o d o ju n t o , s u m a riza n d o lo q u e h a s a p re n d id o y
p ro p o rcio n a n d o a lg u n o s d e t a lle s a d icio n a le s .

Oz it o
Introducción al nuevo modelo de ventos del AWT
En e l n u e vo m o d e lo d e e ve n t o s , lo s e ve n t o s s o n g e n e ra d o s p o r fu e n t e s d e ve n t o s . Un o
o m á s o y e n t e s p u e d e n re g is t ra rs e p a ra s e r n o t ifica d o s s o b re lo s e ve n t o s d e u n t ip o
p a rt icu la r s o b re u n a fu e n t e p a rt icu la r. Alg u n a s ve ce s e s t e m o d e lo e s lla m a d o
d e le g a ció n , ya q u e p e rm it e a l p ro g ra m a d o r d e le g a r la a u t o rid a d d e l m a n e jo d e l e ve n t o
a cu a lq u ie r o b je t o q u e im p le m e n t e e l in t e rfa ce d e o ye n t e a p ro p ia d o . El n u e vo m o d e lo
d e e ve n t o s d e l AWT d e p e rm it e t a n t o m a n e ja r co m o g e n e ra r e ve n t o s AWT.
Lo s m a n e ja d o re s d e e ve n t o s p u e d e n s e r e je m p la re s d e cu a lq u ie r cla s e . S ie m p re q u e
u n a cla s e im p le m e n t e e l in t e rfa ce d e o ye n t e d e e ve n t o s , s u s e je m p la re s p u e d e n
m a n e ja r e ve n t o s . En t o d o p ro g ra m a q u e t e n g a u n m a n e ja d o r d e e ve n t o s , ve ra s t re s
t ro zo s d e có d ig o :
1 . En la s e n t e n co a c la s s d e l m a n e ja d o r d e e ve n t o s , El có d ig o q u e d e cla ra q u e la
cla s e im p le m e n t a u n in t e ra ce o ye n t e ( o e xt ie n d e u n a cla s e q u e im p le m e n t a e l
in t e rfa ce o ye n t e ) . Po r e je m p lo :

public class MiClase implements ActionListener {


2 . El có d ig o q u e re g is t ra u n e je m p la r d e la cla s e m a n e ja d o ra d e e ve n t o s co m o u n
o ye n t e p a ra u n o o m á s co m p o n e n t e s . Po r e je m p lo :

someComponent.addActionListener(instancedeMiClase);
3 . La im p le m e n t a ció n d e m é t o d o s e n e l in t e rfa ce o ye n t e . Po r e je m p lo :

public void actionPerformed(ActionEvent e) {


...//código que reacciona a la acción...
}

Un ejemplo sencillo

Aq u í t ie n e s u n a p p le t d e l 1 . 1 q u e ilu s t ra e l m a n e jo d e e ve n t o s . Co n t ie n e u n s ó lo b o t ó n
q u e h a ce u n Be e p cu a n d o lo p u ls a s .
Pu e d e s e n co n t ra r e l p ro g ra m a co m p le t o e n Be e p e r. ja v a . Aq u í s ó lo e l có d ig o q u e
im p le m e n t a e l m a n e jo d e e ve n t o s p a ra e l b o t ó n :

public class Beeper ... implements ActionListener {


...
//Donde ocurre la inicialización:
button.addActionListener(this);
...
public void actionPerformed(ActionEvent e) {
...//Hace un sonido Beep...
}
}
¿ No e s s e n cillo ? La cla s e Be e p e r im p le m e n t a e l in t e rfa ce Ac t io n Lis t e n e r, q u e co n t ie n e
u n m é t o d o : a c t io n P e rfo rm e d .
Có m o Be e p e r im p le m e n t a Ac t io n Lis t e n e r, u n o b je t o Be e p e r p u e d e re g is t ra rs e co m o
o ye n t e d e lo s e ve n t o s d e a cció n q u e g e n e re n lo s b o t o n e s . Un a ve z q u e Be e p e r h a s id o
re g is t ra d o u t iliza n d o e l m é t o d o a d d Ac t io n Lis t e n e r d e l b u t t o n , e l m é t o d o
a c t io n P e rfo rm e d d e l Be e p e r e s lla m a d o ca d a ve z q u e s e p u ls a e l b o t ó n .

Un ejemplo más complejo

El m o d e lo d e e ve n t o s d e l 1 . 1 q u e h a s p o d id o ve r e n s u fo rm a m á s s e n cilla e n e l
e je m p lo a n t e rio r, e s b a s t a n t e p o d e ro s o y fle xib le . Cu a lq u ie r n ú m e ro d e o b je t o s o ye n t e s
p u e d e e s cu ch a r t o d a s la s cla s e s d e e ve n t o s d e s d e cu a lq u ie r n ú m e ro d e o b je t o s fu e n t e s .
Po r e je m p lo , u n p ro g ra m a p o d ría cre a r u n o ye n t e p a ra ca d a fu e n t e d e e ve n t o . O u n
p ro g ra m a p o d ría t e n e r u n s ó lo o ye n t e p a ra t o d o s lo s e ve n t o s d e t o d a s la s fu e n t e s .
In clu s o u n p ro g ra m a p u e d e t e n e r m á s d e u n o ye n t e p a ra u n a s o la cla s e d e e ve n t o
d e s d e u n s ó lo o b je t o fu e n t e .
El s ig u ie n t e a p p le t o fre ce u n e je m p lo d e u t iliza ció n d e m ú lt ip le s o ye n t e s p o r o b je t o . El
a p p le t co n t ie n e d o s fu n t e s d e e ve n t o s ( e je m p la re s d e Bu t t o n y d o s o ye n t e s d e
e ve n t o s . Un o d e lo s o ye n t e s ( u n e je m p la r d e la cla s e lla m a d a Mu lt iLis t in e r e s cu ch a
lo s e ve n t o s d e lo s d o s b o t o n e s . Cu a n d o re cib e u n e ve n t o , a ñ a d e e l "co m a n d o d e
a cció n " d e l e ve n t o ( e l t e xt o d e la e t iq u e t a d e l b o t ó n ) e n la p a rt e s u p e rio r d e l á re a d e
t e xt o . El s e g u n d o o ye n t e ( u n e je m p la r d e la cla s e lla m a d a Ea v e s d ro p p e r) e s cu ch a s lo s
e ve n t o s d e u n o s ó lo d e lo s b o t o n e s . Cu a n d o re cib e u n e ve n t o , a ñ a d e e l co m a n d o d e
a cció n e n la p a rt e in fe rio r d e l á re a d e t e xt o .
Pu e d e s e n co n t ra r e l p ro g ra m a co m p le t o e n Mu lt iLis t e n e r. ja va . Aq u í s ó lo t ie n e s e l có d ig o
q u e im p le m e n t a e l m a n e jo d e e ve n t o s p a ra e l b o t ó n :

public class MultiListener ... implements ActionListener {


...
//donde ocurra la inicialización:
button1.addActionListener(this);
button2.addActionListener(this);

button2.addActionListener(new Eavesdropper(bottomTextArea));
}

public void actionPerformed(ActionEvent e) {


topTextArea.append(e.getActionCommand() + "\n");
}
}

class Eavesdropper implements ActionListener {


...
public void actionPerformed(ActionEvent e) {
myTextArea.append(e.getActionCommand() + "\n");
}
}
En e l có d ig o a n t e rio r, t a n t o Mu lt iLis t e n e r co m o Ea v e s d ro p p e r im m p le m e n t a n e l
in t e rfa ce Ac t io n Lis t e n e r y s e re g is t ra n co m o o ye n t e s d e a cció n u t iliza n d o e l m é t o d o
a d d Ac t io n Lis t e n e r d e la cla s e Bu t t o n . La im p le m e n t a ció n d e l m é t o d o
a c t io n P e rfo rm e d e n a m b a s cla s e s e s s im ila r: s ó lo a ñ a d e n e l co m a n d o d e a cció n a l
á re a d e t e xt o .

Un ejemplo de manejo de eventos de otro tipo

Ha s t a a h o ra , la ú n ica cla s e d e e ve n t o s q u e h a s vis t a h a n s id o lo s e ve n t o s a ct io n .


Ech e m o s u n vis t a zo a u n p ro g ra m a q u e m a n e ja o t ra cla s e d e e ve n t o s : e ve n t o s d e l
ra t ó n .
El s ig u ie n t e a p p le t m u e s t ra u n re ct á n g u lo e le va d o y u n á re a d e t e xt o . Cu a n d o o cu rre
u n e ve n t o d e lra t ó n - - u n click, p u ls a ció n , lib e ra ció n , e n t ra r o s a lid - - d e n t ro d e l á re a d e l
re ct á n g u lo ( Bla n k Are a Mo u s e De m o ) , e l á re a d e t e xt o m u e s t ra la ca d e n a q u e d e s crib e
e l e ve n t o .
Pu e d e s e n co n t ra r e l p ro g ra m a co m p le t o e n Mo u s e De m o . ja va . Aq u í s ó lo e s t á e l có d ig o q u e
im p le m e n t a e l m a n e jo d e e ve n t o s :

public class MouseDemo ... implements MouseListener {


...
//Donde ocurra la inicialización:
//Registra lo eventos del ratón en blankArea y applet (panel).
blankArea.addMouseListener(this);
addMouseListener(this);
}

public void mousePressed(MouseEvent e) {


saySomething("Mouse button press", e);
}

public void mouseReleased(MouseEvent e) {


saySomething("Mouse button release", e);
}

public void mouseEntered(MouseEvent e) {


saySomething("Cursor enter", e);
}

public void mouseExited(MouseEvent e) {


saySomething("Cursor exit", e);
}

public void mouseClicked(MouseEvent e) {


saySomething("Mouse button click", e);
}

void saySomething(String eventDescription, MouseEvent e) {


textArea.append(eventDescription + " detected on "
+ e.getComponent().getClass().getName()
+ ".\n");
textArea.setCaretPosition(maxInt); //hack to scroll to bottom
}
}
Po d rá s ve r e l có d ig o e xp lica d o e n Im p le m e n t a r u n o ye n t e d e l Ra t ó n .

Oz it o
Utilizar adaptadores y clases internas para manejar
eventos del AWT
Es t a s e cció n t e cu e n t a có m o u t iliza r lo s a d a p t a d o re s y la s cla s e s in t e rn a s ( in n e r) p a ra
re d u cir e l a t e s t a m ie n t o d e t u có d ig o . S i n o t e im p o rt a e s t o , p u e d e s s a lt a r lib re m e n t e a
la s ig u ie n t e s e cció n .
La m a yo ría d e lo s in t e rfa ce s o ye n t e s d e l AWT, a l co n t ra rio q u e Ac t io n Lis t e n e r,
co n t ie n e n m á s d e u n m é t o d o . Po r e je m p lo , e l in t e rfa ce Mo u s e Lis t e n e r co n t ie n e cin co
m é t o d o s : m o u s e P re s s e d , m o u s e Re le a s e d , m o u s e En t e re d , m o u s e Ex it e d , y
m o u s e Clic k e d . In clu s o s i s ó lo t e im p o rt a n lo s clicks d e l ra t ó n , s i t u cla s e im p le m e n t a
d ire ct a m e n t e Mo u s e Lis t e n e r, d e b e s im p le m e n t a r e s t o s cin co m é t o t o s . Lo s m é t o d o s
q u e n o t e in t e re s e n p u e d e n t e n e r cu e rp o s va cío s . Aq u í t ie n e s u n e je m p lo :

//Un ejemplo de atestamiento pero con código válido.


MyClass implements MouseListener {
...
someObject.addMouseListener(this);
...
/* Definición de método vacío. */
public void mousePressed(MouseEvent e) {
}

/* Definición de método vacío. */


public void mouseReleased(MouseEvent e) {
}

/* Definición de método vacío. */


public void mouseEntered(MouseEvent e) {
}

/* Definición de método vacío. */


public void mouseExited(MouseEvent e) {
}

public void mouseClicked(MouseEvent e) {


...//La implementación del manejador del eventos va aquí...
}
}
De s a fo rt u n a d a m e n t e , e l re s u lt a d o d e la co le cció n d e cu e rp o s d e m é t o d o s va cío s p u e d e
h a ce r e l có d ig o d ifícil d e le e r y d e m a n t e n e r. Pa ra a yu d a rt e a e vit a r e l a t e s t a m ie n t o d e
t u có d ig o co n cu e rp o s d e m é t o d o s va cío s , e l AWT p ro p o rcio n a u n a cla s e a d a p t a d o ra
p a ra ca d a in t e rfa ce o ye n t e co n m á s d e u n m é t o d o . ( Ma n e ja r e ve n t o s e s t á n d a rd d e l
AWT lis t a t o d o s lo s o ye n t e s y s u s a d a p t a d o re s . ) Po r e je m p lo , la cla s e Mo u s e Ad a p t e r
im p le m e n t a e l in t e rfa ce Mo u s e Lis t e n e r. Un a cla s e a d a p t a d o r im p le m e n t a ve rs io n e s
va cía s p a ra t o d o s s u s m é t o d o s d e l in t e rfa ce .
Pa ra u t iliza r u n a d a p t a d o r, cre a u n a s u b cla s e d e é l, e n lu g a r d e im p le m e n t a r
d ire ct a m e n t e u n in t e rfa ce o ye n t e . Po r e je m p lo , e xt e n d ie n d o Mo u s e Ad a p t e r, t u cla s e
p u e d e h e re d a r d e fin icio n e s va cía s p a ra lo s cin co m é t o d o s co n t e n id o s p o r
Mo u s e Lis t e n e r.

/*
* Un ejemplo de extensión de una clase adaptador en vez de
* implementar directamente un interface oyente.
*/
MyClass extends MouseAdapter {
...
someObject.addMouseListener(this);
...
public void mouseClicked(MouseEvent e) {
...//La implementación del manejador de eventos va aquí...
}
}
¿ Qu é p a s a s i n o q u ie re s q u e t u cla s e m a n e ja d o ra d e e ve n t o s d e s cie n d a d e u n a cla s e
a d a p t a d o r? Po r e je m p lo , s u p ó n q u e h a s e s crit o u n a p p le t , y q u ie re s q u e t u s u b cla s e d e
Ap p le t co n t e n g a a lg o d e có d ig o p a ra m e n a ja r e ve n t o s d e l ra t ó n . Co m o e l le n g u a je
Ja va n o p e rm it e la h e re n cia m ú lt ip le , t u cla s e n o p u e d e d e s ce n d e r d e Ap p le t y
Mo u s e Ad a p t e r a la ve z. La s o lu ció n e s d e fin e r u n a cla s e in n e r - - u n a cla s e d e n t ro d e
t u s u b cla s e d e Ap p le t - - q u e e xt ie n d a la cla s e Mo u s e Ad a p t e r,

//Un ejemplo de implementación de las clases internas.


MyClass extends Applet {
...
someObject.addMouseListener(new MyAdapter());
...
class MyAdapter extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
...//La implementación del manejador de eventos va aquí...
}
}
}
La s cla s e s in t e rn a s fu n cio n a n b ié n in clu s o s i t u m a n e ja d o r d e e ve n t o s n e ce s it a a cce d e r
a va ria b le s p riva d a s d e la cla s e s u p e rio r. S ie m p re q u e n o d e cla re s u n a cla s e in t e rn a
co m o s t a t ic , é s t a p u e d e re fe rirs e a e je m p la re s d e va ria b le s y m é t o d o s co m o s i s u
có d ig o e s t u vie ra e n la cla s e s u p e rio r.
A lo la rg o d e e s t a le cció n ve rá s e l u s o d e la s cla s e s in t e rn a s . Pa ra m á s in fo rm a ció n
s o b re la s cla s e s in n e r p u e d e s ve r la Es p e cifica ció n d e la s Cla s e s In n e r e n la s it e d e
Ja va S o ft .

Oz it o
Manejo de Eventos Estándard del AWT
Es t a s e cció n t e cu e n t a có m o e s crib ir u n o ye n t e p a ra ca d a cla s e d e e ve n t o q u e
d e fin e e l AWT 1 . 1 . Prim e ro t e o fre ce u n a in t ro d u cció n a lo s o ye n t e s d e l AWT.
De s p u é s ca d a t ip o d e o ye n t e e s e xp lica d o e n s u p ro p ia s u b - s e cció n .
En la t a b la q u e s ig u e , ca d a fila d e s crib e u n g ru p o p a rt icu la r d e e ve n t o s q u e
co rre s p o n d e a u n in t e rfa ce o ye n t e . La p rim e ra co lu m n a d a e l n o m b re d e l in t e rfa ce
o ye n t e , co n u n e n la ce a la p á g in a d e l t u t o ria l q u e lo d e s crib e . La s e g u n d a co lu m n a
n o m b ra la cla s e a d a p t a d o r co rre s p o n d ie n t e , s i la h a y. ( Pa ra u n a e xp lica ció n s o b re
la u t iliza ció n d e lo s a d a p t a d o re s , p u e d e s ve r la p á g in a a n t e rio r. ) La t e rce ra
co lu m n a lis t a lo s m é t o d o s q u e co n t ie n e e l in t e rfa ce o ye n t e .
Pa ra s a b e r q u é co m p o n e n t e s d e l AWT 1 . 1 g e n e ra n q u é t ip o s d e e ve n t o s p u e d e s
ve r, Eve n t o s Ge n e ra d o s p o r lo s co m p o n e n t e s d e l AWT.
Interface Oyeente Clases Adaptador Métodos
ActionListener ninguna a ct io n Pe rfo rm e d ( Act io n Eve n t )
AdjustmentListener ninguna a d ju s t m e n t Va lu e Ch a n g e d ( Ad ju s t m e n t Eve n t )
co m p o n e n t Hid d e n ( Co m p o n e n t Eve n t )
ComponentListener ComponentAdapter co m p o n e n t Mo ve d ( Co m p o n e n t Eve n t )
co m p o n e n t Re s ize d ( Co m p o n e n t Eve n t )
co m p o n e n t S h o wn ( Co m p o n e n t Eve n t )
ContainerListener co m p o n e n t Ad d e d ( Co n t a in e rEve n t )
ContainerAdapter
co m p o n e n t Re m o ve d ( Co n t a in e rEve n t )
FocusListener fo cu s Ga in e d ( Fo cu s Eve n t )
FocusAdapter
fo cu s Lo s t ( Fo cu s Eve n t )
ItemListener ninguna it e m S t a t e Ch a n g e d ( It e m Eve n t )
ke yPre s s e d ( Ke yEve n t )
KeyListener KeyAdapter ke yRe le a s e d ( Ke yEve n t )
ke yTyp e d ( Ke yEve n t )
m o u s e Clicke d ( Mo u s e Eve n t )
m o u s e En t e re d ( Mo u s e Eve n t )
MouseListener MouseAdapter m o u s e Exit e d ( Mo u s e Eve n t )
m o u s e Pre s s e d ( Mo u s e Eve n t )
m o u s e Re le a s e d ( Mo u s e Eve n t )
MouseMotionListener MouseMotionAdapter m o u s e Dra g g e d ( Mo u s e Eve n t )
m o u s e Mo ve d ( Mo u s e Eve n t )
TextListener ninguna t e xt Va lu e Ch a n g e d ( Te xt Eve n t )
win d o wAct iva t e d ( Win d o wEve n t )
win d o wClo s e d ( Win d o wEve n t )
win d o wClo s in g ( Win d o wEve n t )
WindowListener WindowAdapter win d o wDe a ct iva t e d ( Win d o wEve n t )
win d o wDe ico n ifie d ( Win d o wEve n t )
win d o wIco n ifie d ( Win d o wEve n t )
win d o wOp e n e d ( Win d o wEve n t )

Lo s e ve n t o s AWT d e s crit o s e n la t a b la a n t e rio r s e p u e d e n d ivid ir e n d o s g ru p o s :


e ve n t o s d e b a jo n iv e l y e ve n t o s s e m á n t ic o s . Lo s e ve n t o s d e b a jo n ive l
re p re s e n t a n la s o cu rre n cia s d e l s is t e m a d e ve n t a n a s o e n t ra d a s a b a jo n ive l,
Cla ra m e n t e , lo s e ve n t o s d e l ra t ó n y d e l t e cla d o - - a m b o s s o n re s u lt a d o d e u n a
e n t ra d a d ire ct a d e l u s u a rio - - s o n e ve n t o s d e b a jo n ive l.
Lo s e ve n t o s d e co m p o n e n t e s , co n t e n e d o re s , fo co y ve n t a n a s , t a m b ié n s o n e ve n t o s
d e b a jo n ive l. Lo s e ve n t o s d e co m p o n e n t e t e p e rm it e n s e g u ir lo s ca m b io s d e
p o s ició n , t a m a ñ o y vis ib ilid a d d e u n co m p o n e n t e . Lo s e ve n t o s d e co n t e n e d o r t e
p e rm it e n co n o ce r s i s e h a a ñ a d id o o e lim in a d o cu a lq u ie r co m p o n e n t e a u n
co n t e n e d o r p a rt icu la r. Lo s e ve n t o s d e fo co , t e d ice n cu a n d o u n co m p o n e n t e
o b t ie n e o p ie rd e e l fo c o d e l t e c la d o - - la h a b ilid a d d e re cib ir ca ra ct e re s t e cle a d o s
e n e l t e cla d o . Lo s e ve n t o s d e ve n t a n a t e m a n t ie n e n in fo rm a d o s o b re e l e s t a d o d e
cu a lq u ie r cla s e d e W in d o w , co m o u n D ia lo g o u n Fra m e .
Lo s e ve n t o s d e l ra t ó n s e d ivid e n e n d o s g ru p o s - - e ve n t o s d e m o vim ie n t o d e l ra t ó n
y e l re s t o - - p o r lo q u e u n o b je t o p u e d e o ir lo s e ve n t o s d e l ra t ó n p a ra la s
p u ls a cio n e s s in t e n e r q u e s o b re ca rg a r e l s is t e m a g e n e ra n d o y e n via n d o e ve n t o s d e
m o vim ie n t o d e l ra t ó n , lo q u e t ie n d e a o cu rrir fre cu e n t e m e n t e .
Lo s e ve n t o s s e m á n t ico s in clu ye n lo s e ve n t o s d e a cció n , a ju s t e , ít e m , y t e xt o . Es t o s
e ve n t o s s o n e l re s u lt a d o d e u n a in t e ra cció n d e l u s u a rio co n u n co m p o n e n t e
e s p e cífico . Po r e je m p lo , u n b o t ó n g e n e ra u n e ve n t o a cció n cu a n d o e l u s u a rio lo
p u ls a , y u n a lis t a g e n e ra u n e ve n t o a cció n cu a n d o e l u s u a rio h a ce d o b le click s o b re
u n ít e m . Lo s e ve n t o s d e a ju s t e o cu rre n cu a n d o u n u s u a rio ca m b ia d e l va lo r d e u n a
b a rra d e d e s p la za m ie n t o d e cu a lq u ie r fo rm a . Cu a n d o u n u s u a rio s e le ccio n a u n ít e m
d e u n g ru p o d e e le m e n t o s ( co m o u n a lis t a ) s e g e n e ra u n e ve n t o d e ít e m . Lo s
e ve n t o s d e t e xt o o cu rre n s ie m p re q u e s e ca m b ia e l t e xt o d e n t ro d e u n á re a o
ca m p o d e t e xt o .
La s s ig u ie n t e s p á g in a s e xp lica n co n m á s d e t a lle s ca d a t ip o d e e ve n t o .

Oz it o
Eventos Generados por los Componentes AWT
Es t a t a b la lis t a la s cla s e s d e e ve n t o s q u e p u e d e g e n e ra r ca d a co m p o n e n t e d e l AWT 1 . 1 .
Pa ra ve r u n a t a b la q u e lis t a lo s o ye n t e s y lo s t ip o s d e a d a p t a d o re s ju n t o co n lo s m é t o d o s
q u e co n t ie n e n , p u e d e s ve r Ma n e ja r Eve n t o s Es t á n d a rd d e l AWT.
Tipos de Eventos que puede Generar
Componente AWT m ouse
a ct io n a d ju s t m e n t co m p o n e n t co n t a in e r fo cu s it e m ke y m o u s e t e xt win d o w
m o t io n
Bu t t o n X X X X X X
Ca n v a s X X X X X
Ch e c k b o x X X X X X X
Ch e c k b o x Me n u I t e m
N o t a : No e s u n a * X
s u b cla s e d e
Co m p o n e n t !
Ch o ic e X X X X X X
Co m p o n e n t X X X X X
Co n t a in e r X X X X X X
D ia lo g X X X X X X X
Fra m e X X X X X X X
La b e l X X X X X
Lis t X X X X X X X
Me n u I t e m
N o t a : No e s u n a X
s u b cla s e d e
Co m p o n e n t !
Pa ne l X X X X X X
S c ro llb a r X X X X X X
S c ro llP a n e X X X X X X
Te x t Are a X X X X X X
Te x t Co m p o n e n t X X X X X X
Te x t Fie ld X X X X X X X
W in d o w X X X X X X X
* Ch e c k b o x Me n u I t e m h e re d a a d d Ac t io n Lis t e n e r d e Me n u I t e m , p e ro n o g e n e ra e ve n t o s
a ct io n .

Oz it o
Escribir un Oyente de "Action"
Lo s o ye n t e s d e "Act io n " p ro b a b le m e n t e s o n lo s m á s s e n cillo s - - y m á s co m u n e s - -
m a n e ja d o re s d e e ve n t o s p a ra im p le m e n t a r. S e im p le m e n t a n p a ra re s p o n d e r a u n a
in d ica ció n d e l u s u a rio d e q u e u n a a cció n d e p e n d ie n t e d e la im p le m e n t a ció n d e b e ría
o cu rrir. Po r e je m p lo , cu a n d o u n u s u a rio p u ls a u n b o t ó n , h a ce d o b le click s o b re u n
ít e m d e u n a lis t a , e lig e u n ít e m d e u n m e n ú , o p u ls a re t u rn e n u n ca m p o d e t e xt o ,
o cu rre u n e ve n t o a ct io n . El re s u lt a d o e s q u e s e e n via u n m e n s a je
a c t io n P e rfo rm e d a t o d o s lo s o ye n t e s q u e e s t á n re g is t ra d o s e n u n co m p o n e n t e
re le va n t e

Métodos del Evento Action

El in t e rfa ce Ac t io n Lis t e n e r co n t ie n e u n s ó lo m é t o d o y n o t ie n e cla s e


a d a p t a d o r co rre s p o n d ie n t e . Aq u í t ie n e s e l ú n ico m é t o d o d e
Ac t io n Lis t e n e r:
vo id a ct io n Pe rfo rm e d ( Act io n Eve n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l u s a rio in fo rm e a l
co m p o n e n t e s q u e d e b e ría o cu rrir u n a a cció n .

Ejemplos de manejo del evento Action

Aq u í t ie n e s e l có d ig o d e m a n e jo d e l e ve n t o Act io n p a ra u n a p p le t
lla m a d o Be e p e r. ja v a :

public class Beeper ... implements ActionListener {


...
//Donde ocurra la inicialización:
button.addActionListener(this);
...
public void actionPerformed(ActionEvent e) {
...//Make a beep sound...
}
}
Pu e d e s e n co n t ra r e je m p lo s d e o ye n t e s d e Act io n e n la s s iu g ie n t e s
s e ccio n e s :
Un e je m p lo s e n cillo
Co n t ie n e y e xp lica e l a p p le t cu yo có d ig o h a s vis t o a rrib a .
Un e je m p lo m á s co m p le jo
Co n t ie n e y e xp lica u n a p p le t q u e t ie n e d o s fu e n t e s d e Act io n y d o s
o ye n t e s d e Act io n , co n u n o ye n t e q u e e s cu ch a la s d o s fu e n t e s y e l
o t ro s ó lo e s cu ch a u n o d e e llo s .
La clase ActionEvent

El m é t o d o a c t io n P e rfo rm e d t ie n e u n s ó lo p a rá m e t ro , u n o b je t o
Ac t io n Ev e n t . La cla s e Ac t io n Ev e n t d e fin e d o s m é t o d o s ú t ile s :
g e t Ac t io n Co m m a n d
De vu e lve la ca d e n a a s o cia d a co n e s t a a cció n . Ge n e ra lm e n t e , é s t a
e s la e t iq u e t a d e l co m p o n e n t e - - o d e l ít e m s e le ccio n a d o d e n t ro d e l
co m p o n e n t e - - q u e g e n e ra la a cció n .
g e t Mo d ifie rs
De vu e lve u n e n t e ro q u e re p re s e n t a la s t e cla s m o d ifica d o re s q u e e l
u s u a rio e s t a b a p u ls a n d o cu a n d o o cu rrió e l e ve n t o Act io n . S e
p u e d e n u t iliza r la s co n s t a n t e s Ac t io n Ev e n t . S HI FT_ MAS K,
Ac t io n Ev e n t . CTRL_ MAS K, Ac t io n Ev e n t . META_ MAS K, y
Ac t io n Ev e n t . ALT_ MAS K p a ra d e t e rm in a r q u é t e cla s e s t a b a n
p u ls a d a s . Po r e je m p lo , s i e l u s u a rio s e le ccio n ó co n S h ift u n ít e m d e
m e n ú , la s ig u ie n t e e xp re s ió n s e rá d is t in t a d e ce ro :

actionEvent.getModifiers() & ActionEvent.SHIFT_MASK

Ta m b ié n e s ú t il e l m é t o d o g e t S o u rc e , q u e d e vu e lve e l o b je t o ( u n
co m p o n e n t e o m e n ú ) q u e g e n e ró e l e ve n t o Act io n . El m é t o d o g e t S o u rc e
e s t á d e fin id o e n u n a d e la s s u p e rcla s e s d e Ac t io n Ev e n t , Ev e n t Ob je c t .

Oz it o
Escribir un Oyente de Adjustment
Lo s e ve n t o s Ad ju s t m e n t n o t ifica n lo s ca m b io s e n lo s va lo re s d e lo s co m p o n e n t e s
q u e im p le m e n t a n e l in t e rfa ce Ad ju s t a b le Lo s o b je t o s Ad ju s t a b le t ie n e n u n va lo r
e n t e ro y g e n e ra n e ve n t o s Ad ju s t m e n t cu a n d o e l va lo r ca m b ia .
Ad e m á s d e la cla s e S c ro llb a r, q u e im p le m e n t a d ire ct a m e n t e Ad ju s t a b le , la s
cla s e s d e b a rra s d e d e s p la za m ie n t o ve rt ica l y h o rizo n t a l S c ro llP a n e im p le m e n t a n
Ad ju s t a b le . S i q u ie re s ca za r lo s e ve n t o s Ad ju s t m e n t d e n t ro d e u n p a n e l
d e s p la za b le , p u e d e s o b t e n e r e l o b je t o Ad ju s t a b le n e ce s a rio u t iliza n d o lo s m é t o d o s
g e t VAd ju s t a b le y g e t HAd ju s t a b le .
Exis t e n cin co t ip o s d e e ve n t o s Ad ju s t m e n t :
t ra c k
El u s u a rio a ju s t a e xp lícit a m e n t e e l va lo r d e l co m p o n e n t e . Pa ra u n a b a rra d e
d e s p la za m ie n t o , e s t o p o d ría s e r e l re s u lt a d o d e u n a rra s t re d e l cu rs o r d e la
b a rra d e d e s p la za m ie n t o .
u n it in c re m e n t
u n it d e c re m e n t
El u s u a rio in d ica q u e d e s e a u n a ju s t e lig e ro d e l va lo r d e l co m p o n e n t e . Pa ra
u n a b a rra d e d e s p la za m ie n t o , e s t o p o d ría s e r e l re s u lt a d o d e u n a p u ls a ció n
d e l u s u a rio s o b re u n a d e la s fle ch a s la t e ra le s .
b lo c k in c re m e n t
b lo c k d e c re m e n t
El u s u a rio in d ica q u e d e s e a a ju s t a r e l va lo r d e l co m p o n e n t e e n u n a ca n t id a d
s u p e rio r. Pa ra u n a b a rra d e d e s p la za m ie n t o , e s t o p o d ría s e r e l re s u lt a d o d e
u n a p u ls a ció n d e l u s u a rio s o b re e l cu e rp o d e la b a rra d e d e s p la za m ie n t o ,
e n t re la s fle ch a s y e l cu rs o r.

Métodos del Evento Adjustment

El in t e rfa ce Ad ju s t m e n t Lis t e n e r t ie n e s ó lo u n m é t o d o , p o r lo t a n t o n o
t ie n e cla s e a d a p t a d o r co rre s p o n d ie n t e . Aq u í t ie n e s e l m é t o d o :
vo id a d ju s t m e n t Va lu e Ch a n g e d ( Ad ju s t m e n t Eve n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e ca m b ie e l va lo r d e l
co m p o n e n t e e s cu ch a d o .

Ejemplos de manejo de eventos Adjustment

[ No d is p o n ib le ] .

La clase AdjustmentEvent

Ca d a m é t o d o t ie n e u n s ó lo p a rá m e t ro : u n o b je t o Ad ju s t m e n t Ev e n t . La
cla s e Ad ju s t m e n t Ev e n t d e fin e lo s s ig u ie n t e s m é t o d o s :
Ad ju s t a b le g e t Ad ju s t a b le ( )
De vu e lve e l co m p o n e n t e q u e g e n e ró e l e ve n t o .
in t g e t Ad ju s t m e n t Ty p e ( )
De vu e lve e l t ip o d e a ju s t e q u e h a o cu rrid o . El va lo r d e vu e lt o e s u n a
d e la s s ig u ie n t e s co n s t a n t e s d e fin id a s e n la cla s e
Ad ju s t m e n t Ev e n t : UN I T_ I N CREMEN T, UN I T_ D ECREMEN T,
BLOCK_ I N CREMEN T, BLOCK_ D ECREMEN T, TRACK.
in t g e t Va lu e ( )
De vu e lve e l va lo r d e l co m p o n e n t e ju s t o d e s p u é s d e q u e h a ya
o cu rrid o e l a ju s t e .

Oz it o
Escribir un Oyente de Component
Un o o m á s e ve n t o s d e Co m p o n e n t s o n g e n e ra d o s p o r u n o b je t o Co m p o n e n t ju s t o
d e s p u e s d e q u e e l co m p o n e n t e s e h a ya o cu lt a d o , s e h a ya m o vid o , h e ch o vis ib le o
re d im e n s io n a d o . Un e je m p lo d e u n o ye n t e d e Co m p o n e n t p o d ría s e r u n a h e rra m ie n t a
d e co n s t ru cció n d e GUI q u e m o s t ra ra in fo rm a ció n s o b re e l t a m a ñ o d e l co m p o n e n t e
s e le ccio n a d o , y q u e n e ce s it e co n o ce r cu a n d o ca m b ia e l t a m a ñ o d e l co m p o n e n t e .
Ne ce s it a ría s u t iliza r e ve n t o s d e co m p o n e n t e p a ra m a n e ja r la d is p o s ició n y m a n e jo
b á s ico .
Lo s e ve n t o s d e co m p o n e n t e o cu lt o y co m p o n e n t e vis ib le o cu rre n s ó lo co m o
re s u lt a d o s d e lla m a d a s a l m é t o d o s e t Vis ib le d e Co m p o n e n t ( o s u s e q u iva le n t e s
s h o w y h id e ) . Po r e je m p lo , u n a ve n t a n a p o d ría s e r m in ia t u riza d a e n u n ico co
( ico n ifica d a ) s in q u e s e h a ya g e n e ra d o u n e ve n t o d e co m p o n e n t e o cu lt o .

Métodos de Evento de Component

El in t e rfa ce Co m p o n e n t Lis t e n e r y s u cla s e a d a p t a d o r co rre s p o n d ie n t e ,


Co m p o n e n t Ad a p t e r, co n t ie n e n cu a t ro m é t o d o s :
v o id c o m p o n e n t Hid d e n ( Co m p o n e n t Ev e n t )
Lla m a d o p o r e l AWT d e s p u é s d e q u e e l co m p o n e t e e s t e o cu lt o co m o
re s u lt a d o d e u n a lla m a d a a l m é t o d o s e t Vis ib le .
v o id c o m p o n e n t Mo v e d ( Co m p o n e n t Ev e n t )
Lla m a d o p o r e l AWT d e s p u é s d e q u e e l co m p o n e n t e s e h a ya m o vid o ,
re la t ivo a s u co n t e n e d o r. Po r e je m p lo , s i u n a ve n t a n a s e m u e ve , e s t a
ve n t a n a g e n e ra u n e ve n t o d e co m p o n e n t e m o vid o , p a ro e l
co m p o n e n t e q u e la co n t ie n e n o .
v o id c o m p o n e n t Re s iz e d ( Co m p o n e n t Ev e n t )
Lla m a d o p o r e l AWT d e s p u é s d e q u e l co m p o n e n t e h a ya ca m b ia d o s u
ta m a ño.
v o id c o m p o n e n t S h o w n ( Co m p o n e n t Ev e n t )
Lla m a d o p o r e l AWT d e s p u é s d e q u e e l co m p o n e n t e s e vu e lva vis ib le
co m o re s u lt a d o d e u n a lla m a d a a l m é t o d o s e t Vis ib le .

Ejemplos de manejo de eventos de Component

El s ig u ie n t e a p p le t d e m u e s t ra lo s e ve n t o s d e co m p o n e n t e . El a p p le t t ra e
u n a ve n t a n a ( Fra m e ) q u e co n t ie n e u n a e t iq u e t a y u n ch e ckb o x. El
ch e ckb o x co n t ro la s i la e t iq u e t a e s vis ib le o n o . S ie m p re q u e e l a p p le t
a rra n ca ( co m o cu a n d o vis it a s o re vis it a s la p á g in a q u e co n t ie n e e l a p p le t ) ,
la ve n t a n a s e h a ce vis ib le . S ie m p re q u e e l a p p le t s e p a ra ( cu a n d o d e ja s la
p á g in a q u e co n t ie n e a l a p p le t ) , e s t a ve n t a n a s e o cu lt a . Un á re a d e t e xt o
m u e s t ra u n m e n s a je ca d a ve z q u e la ve n t a n a , la e t iq u e t a o e l ch e ckb o x
g e n e ra n u n e ve n t o d e co m p o n e n t e .
Inte nta e s to :
1 . Pu ls a s o b re e l ch e ckb o x p a ra o cu lt a r la e t iq u e t a .
La e t iq u e t a g e n e ra u n e ve n t o d e co m p o n e n t e o cu lt o .
2 . Pu ls a d e n u e vo s o b re e l ch e ckb o x p a ra m o s t ra r la e t iq u e t a .
La e t iq u e t a g e n e ra u n e ve n t o d e co m p o n e n t e vis ib le .
3 . Ico n ifica y d e s - ico n ifica la ve n t a n a lla m a d a "S o m e Fra m e ".
No s e o b t ie n e n in g ú n e ve n t o d e co m p o n n t e o cu lt o o vis ib le .
4 . Ca m b ia e l t a m a ñ o d e la ve n t a n a "S o m e Fra m e ".
Ve rá s e l e ve n t o d e co m p o n e n t e re d im e n s io n a d o ( y
p o s ib le m e n t e e l d e co m p o n e n t e m o vid o ) p a ra lo s t re s
co m p o n e n t e s - - e t iq u e t a , ch e ckb o x y ve n t a n a . S i e l
m a n e ja d o r d e d is t rib u ció n d e la ve n t a n a n o h a ce ca d a
co m p o n e n t e t a n a n ch o co m o s e a p o s ib le , la e t iq u e t a y e l
ch e ckb o x n o s e h a b rá n re d im e n s io n a d o .

Pu e d e s e n co n t ra r e l có d ig o d e l a p p le t e n Co m p o n e n t De m o . ja va . Aq u í t ie n e s
e l có d ig o d e m a n e jo d e e ve n t o s Co m p o n e n t d e l a p p le t :

public class ComponentDemo ... implements ComponentListener {


...
//Donde ocurra la inicialización:
someFrame = new SomeFrame(this);
...

public void componentHidden(ComponentEvent e) {


displayMessage("componentHidden event from "
+ e.getComponent().getClass().getName());
}

public void componentMoved(ComponentEvent e) {


displayMessage("componentMoved event from "
+ e.getComponent().getClass().getName());
}

public void componentResized(ComponentEvent e) {


displayMessage("componentResized event from "
+ e.getComponent().getClass().getName());
}

public void componentShown(ComponentEvent e) {


displayMessage("componentShown event from "
+ e.getComponent().getClass().getName());
}
}
class SomeFrame extends Frame ... {
...
SomeFrame(ComponentListener listener) {
...
label.addComponentListener(listener);
checkbox.addComponentListener(listener);
this.addComponentListener(listener);
...
}
...
}

La clase ComponentEvent

Ca d a m é t o d o d e e ve n t o d e Co m p o n e n t t ie n e u n s ó lo p a rá m e t ro , u n o b je t o
Co m p o n e n t Ev e n t . La cla s e Co m p o n e n t Ev e n t d e fin e u n m é t o d o ú t il,
g e t Co m p o n e n t , q u e d e vu e lve e l Co m p o n e n t e q u e g e n e ró e l e ve n t o .

Oz it o
Escribir un Oyente de Container
Lo s e ve n t o s d e Co n t a in e r s o n g e n ra d o s p o r u n Co n t a in e r ju s t o d e s p u é s d e q u e s e a
a ñ a d id o o e lim in a d o a lg ú n co m p o n e n t e . Es t o s e ve n t o s s ó n s ó lo p a ra n o t ifica ció n - - n o
s e n e ce s it a q u e e s t é p re s e n t e n in g ú n o ye n t e d e Co n t a in e r p a ra q u e lo s co m p o n e t e s
s e a n a ñ a d id o s o e lim in a d o s s a t is fa ct o ria m e n t e .

Métodos de Eventos de Container

El in t e rfa ce Co n t a in e rLis t e n e r y s u co rre s p o n d ie n t e cla s e a d a p t a d o r,


Co n t a in e rAd a p t e r, co n t ie n e n d o s m é t o d o s :
v o id c o m p o n e n t Ad d e d ( Co n t a in e rEv e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e s e h a ya a ñ a d id o u n
co m p o n e n t e a l co n t e n e d o r.
v o id c o m p o n e n t Re m o v e d ( Co n t a in e rEv e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u e s d e q u e s e h a ya e lim in a d o u n
co m p o n e n t e d e l co n t e n e d o r.

Ejemplos de Manejo de Eventos de Container

El s ig u ie n t e a p p le t d e m u e s t ra lo s e ve n t o s d e co n t a in e r. Pu ls a n d o s o b re lo s
b o t o n e s d e "Ad d a b u t t o n " o "Re m o ve a b u t t o n ", p u e d e s a ñ a d ir o e lim in a r
co m p o n e n t e s e n e l p a n e l q u e h a y d e b a jo d e l a p p le t . Ca d a ve z q u e u n
co m p o n e n t e e s a ñ a d id o o e lim in a d o , e l p a n e l d is p a ra u n e ve n t o d e co t a in e r,
y s e le n o t ifica a l p a n e l o ye n t e . El o ye n t e m u s t ra u n m e n s a je d e s crip t ivo e n
e l á re a d e t e xt o q u e h a y e n cim a d e l a p p le t .
Inte na e s to :
1 . Pu ls a e l b o t ó n lla m a d o "Ad d a b u t t o n ".
Ve rá s q u e a p a re ce u n b o t ó n e n la p a rt e in fe rio r d e l a p p le t . El
co n t e n e d o r o ye n t e ( e n e s t e e je m p lo , u n e je m p la r d e
Co n t a in e rD e m o ) re a cio n a a l e ve n t o d e a ñ a d ir u n
co m p o n e n t e m o s t ra n d o e l m e n s a je "Bu t t o n # 1 wa s a d d e d t o
ja va . a wt . Pa n e l" e n la p a rt e s u p e rio r d e l a p p le t .
2 . Pu ls a e l b o t ó n lla m a d o "Re m o ve a b u t t o n ".
Es t o e lim in a e l ú lt im o b o t ó n a ñ a d id o a l p a n e l, h a cie n d o q u e
e l o ye n t e re cib a u n e ve n t o d e co m p o n e n t e e lim in a d o .

Pu e d e s e n co n t a r e l có d ig o d e e s t e a p p le t e n Co n t a in e rDe m o . ja va . Aq u í
t ie n e s e l có d ig o d e m a n e jo d e e ve n t o s d e l a p p le t :

public class ContainerDemo ... implements ContainerListener ... {


...//Donde ocurra la inicialización:
buttonPanel = new Panel();
buttonPanel.addContainerListener(this);
...
public void componentAdded(ContainerEvent e) {
displayMessage(" added to ", e);
}

public void componentRemoved(ContainerEvent e) {


displayMessage(" removed from ", e);
}

void displayMessage(String action, ContainerEvent e) {


display.append(((Button)e.getChild()).getLabel()
+ " was"
+ action
+ e.getContainer().getClass().getName()
+ "\n");
}
...
}

La clase ContainerEvent

Ca d a m é t o d o d e e ve n t o d e co n t e n e d o r t ie n e u n s ó lo p a rá m e t ro : u n o b je t o
Co n t a in e rEv e n t La cla s e Co n t a in e rEv e n t d e fin e d o s m é t o d o s ú t ile s :
Co m p o n e n t g e t Ch ild ( )
De vu e lve e l co m p o n e n t e cu ya a d ició n o e lim in a ció n d is p a ro e l e ve n t o .
Co n t a in e r g e t Co n t a in e r( )
De vu e lve e l co n t e n e d o r q u e d is p a ró e l e ve n t o .

Oz it o
Escribir un Oyente de Foco
Lo s e ve n t o s d e Fo co s e g e n e ra n ca d a ve z q u e u n co m p o n e n t e o b t ie n e o p ie rd e e l
fo co d e l t e cla d o - - la h a b ilid a d d e re cib ir e ve n t o s d e l t e cla d o . De s d e e l p u n t o d e
vis t a d e l u s u a rio , e l co m p o n e n t e co n e l fo co d e l t e cla d o n o rm a lm e n t e e s m á s
p ro m in e n t e - - co n u n b o rd e d is t in t o d e l u s u a l, p o r e je m p lo - - y la ve n t a n a d e l
co m p o n e n t e t a m b ié n e s m á s p ro m in e n t e q u e o t ra s ve n t a n a s d e la p a n t a lla . Es t e
p e rm it e a l u s u a rio s a b e r a q u e co m p o n e n t e irá t o d o lo q u e t e cle e . Ca s i la m a yo ría
d e lo s co m p o n e n t e s d e l s is t e m a d e ve n t a n a s p u e d e n t e n e r e l fo co d e l t e cla d o .
La fo rm a e xa ct a e n la q u e lo s co m p o n e n t e s o b t ie n e n e l fo co d e p e n d e d e l s is t e m a
d e ve n t a n a s . No rm a lm e n t e , e l u s u a rio s e le ccio n a e l fo co p u ls a n d o s o b re u n a
ve n t a n a o co m p o n e n t e , p u ls a n t o TAB e n t re co m p o n e n t e s , o m e d ia n t e cu a lq u ie r
o t ra in t e ra cció n co n u n co m p o n e n t e . S e p u e d e p e d ir q u e u n co m p o n e n t e t e n g a e l
fo co lla m a n d o a l m é t o d o re q u e s t Fo c u s d e Co m p o n e n t

Método de Eventos de Foco

El in t e rfa ce Fo c u s Lis t e n e r y s u co rre s p o n d ie n t e cla s e a d a p t a d o r,


Fo c u s Ad a p t e r, co n t ie n e n d o s m é t o d o s :
v o id fo c u s Ga in e d ( Fo c u s Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l co m p o n e n t e o b t e n g a
e l fo co .
v o id fo c u s Lo s t ( Fo c u s Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l co m p o n e n t e p ie rd a e l
fo co .

Ejemplos de Manejo de eventos de Foco

El s ig u ie n t e a p p le t d e m u e s t ra lo s e ve n t o s d e fo co . Pu ls a n d o s o b re e l
b o t ó n q u e h a y e n la p a rt e s u p e rio r d e l a p p le t , p o d rá s t ra e r u n a ve n t a n a
q u e co n t ie n e u n a g ra n va rie d a d d e co m p o n e n t e s . Un o ye n t e d e Fo co
e s cu ch a lo s e ve n t o s d e fo co d e ca d a co m p o n e n t e d e la ve n t a n a ,
in clu ye n d o la p ro p ia ve n t a n a ( q u e e s u n e je m p la r d e u n a s u b cla s e d e
Fra m e lla m a d a Fo c u s W in d o w ) .
Inte nta e s to :
1 . Tra e la ve n t a n a lla m a d a Fo cu s De m o Win d o w p u ls a n d o
s o b re e l b o t ó n d e la p a rt e s u p e rio r d e l a p p le t .
2 . S i e s n e ce s a rio , p u ls a s o b re la ve n t a n a p a ra q u e s u s
co n t e n id o s p u e d a n o b t e n e r e l fo co .
Ve rá s u n m e n s a je d e "Fo cu s g a in e d " e n e l á re a d e l
a p p le t . La fo rm a d e o b t e n e r e l fo co e s d e p e n d ie n t e d e l
s is t e m a . Pu e d e s d e t e ct a r cu a n d o la ve n t a n a o b t ie n e o
p ie rd e e l fo co im p le m e n t a d o u n o ye n t e d e ve n t a n a y
e s cu ch a r lo s e ve n t o s d e a ct iva ció n o d e s a ct iva ció n d e
ve n t a n a .
3 . Pu ls a e l b o t ó n q u e h a y a la d e re ch a d e la ve n t a n a Fo cu s
De m o Win d o w, y lu e g o p u ls a s o b re a lg ú n o t ro
co m p o n e n t e , co m o e l ca m p o d e t e xt o .
Ob s e rva q u e cu a n d o e l fo co ca m b ia d e u n co m p o n e n t e a
o t ro , e l p rim e r co m p o n e n t e g e n e ra u n e ve n t o d e fo co
p e rd id o a n t e s d e q u e e l s e g u n d o co m p o n e n t e g e n e re u n
e ve n t o d e fo co o b t e n id o .
4 . In t e n t a ca m b ia r e l fo co p u ls a n d o Ta b o S h ift - Ta b .
La m a yo ría d e lo s s is t e m a s p e rm it e n u t iliza r la t e cla Ta b
p a ra circu la r a t ra vé s d e lo s co m p o n e n t e s q u e p u e d e n
o b t e n e r e l fo co .
5 . Min ia t u riza la ve n t a n a Fo cu s De m o Win d o w.
De b e ría s ve r u n m e n s a je "Fo cu s lo s t " d e l co m p o n e n t e
q u e t u vo e l fo co p o r ú lt im a ve z.

Pu e d e s e n co n t ra r e l có d ig o co m p le t o d e l a p p le t e n Fo cu s De m o . ja va . Aq u í
t ie n e s e l có d ig o d e m a n e jo d e e ve n t o s d e l a p p le t :

public class FocusDemo ... implements FocusListener ... {


...//Donde ocurra la inicialziación
window = new FocusWindow(this);
...
public void focusGained(FocusEvent e) {
displayMessage("Focus gained", e);
}

public void focusLost(FocusEvent e) {


displayMessage("Focus lost", e);
}

void displayMessage(String prefix, FocusEvent e) {


display.append(prefix
+ ": "
+ e.getSource() //XXX
+ "\n");
}
...
}

class FocusWindow extends Frame {


...
public FocusWindow(FocusListener listener) {
super("Focus Demo Window");
this.addFocusListener(listener);
...
Label label = new Label("A Label");
label.addFocusListener(listener);
...
Choice choice = new Choice();
...
choice.addFocusListener(listener);
...
Button button = new Button("A Button");
button.addFocusListener(listener);
...
List list = new List();
...
list.addFocusListener(listener);
}
}

La clase FocusEvent

Ca d a m é t o d o d e e ve n t o d e fo co t ie n e u n s ó lo p a rá m e t ro : u n o b je t o
Fo c u s Ev e n t . La cla s e Fo c u s Ev e n t d e fin e u n m é t o d o , is Te m p o ra ry ,
q u e d e vu e lve t ru e s i u n e ve n t o d e p é rd id a d e fo co e s t e m p o ra l. Es u n
co n o cim ie n t o e s p e cia l cu a n d o d e s e a s in d ica r q u e u n co m p o n e n t e
p a rt icu la r o b t e n g a e l fo co s i la ve n t a n a vu e lve a o b t e n e r e l fo co .
El m e n s a je m á s co m ú n q u e e n via rá s a u n o b je t o Fo c u s Ev e n t e s
g e t Co m p o n e n t ( d e fin id o e n Co m p o n e n t Ev e n t ) , q u e d e vu e lve e l
co m p o n e n t e q u e a ca b a d e o b t e n e r o p e rd e r e l fo co , d is p a ra n d o e l
e ve n t o .

Oz it o
Escribir un Oyente de Item
Lo s e ve n t o s d e Ít e m s o n g e n e ra d o s p o r co m p o n e n t e s q u e im p le m e n t a n e l in t e rfa ce
I t e m S e le c t a b le . Es t o s s o n co m p o n e n t e s q u e m a n t e n ie n e n e l e s t a d o - -
g e n e ra lm e n t e e l e s t a d o o n / o ff p a ra u n o o m á s ít e m s . Lo s co m p o n e n t e s d e l AWT
1 . 1 q u e g e n e ra n e ve n t o s d e ít e m s o n ch e ckb o xe s , ch e ckb o x m e n u it e m s , ch o ice s ,
y lis t s .

Métodos de Evento de Item

El in t e rfa ce I t e m Lis t e n e r t ie n e s ó lo u n m é t o d o , y p o r lo t a n t o n o t ie n e
la co rre s p o n d ie n t e cla s e a d a p t a d o r. Aq u í t ie n e s e l m é t o d o :
v o id it e m S t a t e Ch a n g e d ( I t e m Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e u n ca m b io d e e s t a d o e n e l
co m p o n e n t e e s cu ch a d o .

La clase ItemEvent

Ca d a e ve n t o d e ít e m t ie n e u n s ó lo p a rá m e t ro : u n o b je t o I t e m Ev e n t . La
cla s e I t e m Ev e n t d e fin e lo s s ig u ie n t e s m é t o d o s :
Ob je c t g e t I t e m ( )
De vu e lve e l o b je t o d e l co m p o n e n t e e s p e cífico co n e l ít e m cu yo
e s t a d o h a ca m b ia d o . No rm a lm e n t e e s t a e s u n a ca d e n a q u e co n t ie n e
e l t e xt o d e l ít e m s e le ccio n a d o . Ot ra s p o s ib ilid a d e s p o d ría s e r u n
o b je t o im a g e o u n o b je t o s in re p re s e n t a ció n vis u a l.
I t e m S e le c t a b le g e t I t e m S e le c t a b le ( )
De vu e lve e l co m p o n e n t e q u e g e n e ró e l e ve n t o d e ít e m .
in t g e t S t a t e Ch a n g e ( )
De vu e lve e l n u e vo e s t a d o d e l ít e m . La cla s e I t e m Ev e n t d e fin e d o s
e s t a d o s : S ELECTED y D ES ELECTED .

Oz it o
Escribir un Oyente de Teclas
Lo s e ve n t o s d e Te cla t e d ice n cu a n d o e l u s u a rio h a p u ls a d o e l t e cla d o .
Es p e cífica m e n t e , lo s e ve n t o s d e t e cla s o n g e n e ra d o s p o r lo s co m p o n e n t e s q u e t ie n e n
e l fo co d e l t e cla d o cu a n d o e l u s u a rio p u ls a o lib e ra u n a t e cla . ( Pa ra m á s in fo rm a ció n
s o b re e l fo co , p u e d e s ve r la p á g in a : Es crib ir u n o ye n t e d e Fo co . )
S e p u e d e n n o t ifica r d o s t ip o s b á s ico s d e e ve n t o s : e l t e cle o d e u n cá ra ct e r Un ico d e , y la
p u ls a ció n o lib e ra ció n d e u n a t e cla d e l t e cla d o . El p rim e r t ip o d e e ve n t o e s lla m a d o u n
e ve n t o d e t e c la t e c le a d a . El s e g u n d o t ip o s o n lo s e ve n t o s t e c la p u ls a d a y t e c la
lib e ra d a .
En g e n e ra l, d e b e ría s in t e n t a r u t iliza r lo s e ve n t o s d e t e cla t e cle a d a , a m e n o s q u e
n e ce s it e s co n o ce r cu a n d o e l u s u a rio p u ls a u n a t e cla q u e n o co rre s p o n d e co n lo s
ca ra ct e re s . Po r e je m p lo , s i q u ie re s s a b e r cu a n d o e l u s u a rio t e cle a a lg ú n ca rá ct e r
Un ico d e - - in clu s o a q u e llo s q u e s o n e l re s u lt a d o d e la p u ls a ció n d e va ria s t e cla s p o r
p a rt e d e l u s u a rio - - d e b e s e s cu ch a r p o r lo s e ve n t o s d e t e cla t e cle a d a . De o t ra fo rm a , s i
q u ie re s s a b e r cu a n d o e l u s u a rio p u ls a e l ca rá ct e r F1 , n e ce s it a rá s e s cu ch a r lo s e ve n t o s
d e t e cla p u ls a d a / lib e ra d a .
S i n e ce s it a s d e t e ct a r lo s e ve n t o s d e t e cla d is p a ra d o s p o r u n co m p o n e n t e d e clie n t e ,
a s e g u rá t e d e q u e e l co m p o n e n t e p id e e l fo co d e l t e cla d o . De o t ra fo rm a , n u n ca
o b t e n d rá e l fo co y n u ca d is p a ra rá e ve n t o s d e t e cla s .

Métodos de eventos de Tecla

El in t e rfa ce Ke y Lis t e n e r y s u co rre s p o n d ie n t e cla s e a d a p t a d o r,


Ke y Ad a p t e r, co n t ie n e n t re s m é t o d o s :
v o id k e y Ty p e d ( Ke y Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l u s u a rio t e cle e u n ca rá ct e r
Un ico d e d e n t ro d e l co m p o n e n t e e s cu ch a d o .
v o id k e y P re s s e d ( Ke y Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l u s u a rio p u ls e u n a t e cla d e l
t e cla d o .
v o id k e y Re le a s e d ( Ke y Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l u s u a rio lib e ro u n a t e cla d e l
t e cla d o .

Ejemplos de Manejo de Eventos de Tecla

El s ig u ie n t e a p p le t d e m u e s t ra lo s e ve n t o s d e t e cla . Co n s is t e e n u n ca m p o d e
t e xt o d o n d e p u e d e s t e cle a r, s e g u id o p o r u n á re a d e t e xt o q u e m u e s t ra u n
m e n s a je ca d a ve z q u e e l ca m p o d e t e xt o d is p a ra u n e ve n t o d e t e cla . Un
b o t ó n e n la p a rt e in fe rio r d e l a p p le t t e p e rm it e lim p ia r e l ca m p o y e l á re a d e
t e xt o .
Inte nta e s to :
1 . Pu ls a e l ca m p o d e t e xt o d e l a p p le t p a ra o b t e n e r e l fo co d e l
t e cla d o .
2 . Pu ls a y lib e ra la t e cla A e n e l t e cla d o .
El ca m p o d e t e xt o d is p a ra t re s e ve n t o s : u n e ve n t o d e t e cla
p u ls a d a , u n e ve n t o d e t e cla t e cle a d a y u n e ve n t o d e t e cla
lib e ra d a . Ob s e rva q u e e l e ve n t o d e t e cla t e cle a d a n o t ie n e
in fo rm a ció n s o b re e l có d ig o d e t e cla , t a m p o co t ie n e
in fo rm a ció n s o b re lo s m o d ifica d o re s . S i s ó lo t e im p o rt a n lo s
ca rá ct e re s q u e e l u s u a rio h a p u ls a d o , d e b e ría s m a n e ja r lo s
e ve n t o s d e t e cla t e cle a d a . S i t e im p o rt a n la s t e cla s q u e h a
p u ls a d o / lib e ra d o e l u s u a rio d e b e ría s m a n e ja r lo s e ve n t o s d e
t e cla p u ls a d a / lib e ra d a .
3 . Pu ls a e l b o t ó n Cle a r.
Po ría s q u e re r h a ce r e s t o d e s p u é s d e ca d a u n o d e lo s
s ig u ie n t e s p a s o s
4 . Pu ls a y lib e ra la t e cla S h ift .
El ca m p o d e t e xt o d is p a ra d o s e ve n t o s : u n o d e t e cla p u ls a d a
y o t ro d e t e cla lib e ra d a . El ca m p o d e t e xt o n o g e n e ra u n
e ve n t o d e t e cla t e cle a d a p o rq u e S h ift , p o s s í m is m a , n o
co rre s p o n d e a n in g ú n ca ra ct e r.
5 . Pu ls a u n a A m a yú s cu la p u ls a n d o la s t e cla s S h ift y A.
Ve rá s lo s s ig u ie n t e s e ve n t o s , a u n q u e q u iza s n o e n e s t e
o rd e n : t e cla p u ls a d a ( S h ift ) , t e cla p u ls a d a ( A) , t e cla t e cle a d a
( 'A') , t e cla lib e ra d a ( A) y t e cla lib e ra d a ( S h ift ) .
6 . Te cle a u n a A m a yú s cu la s p u ls a n d o y lib e ra n d o la t e cla Ca p s
Lo ck, y p u ls a n d o la t e cla A.
De b e ría s ve r lo s s ig u ie n t e s e ve n t o s : t e cla p u ls a d a ( Ca p s
Lo ck) , t e cla p u ls a d a ( A) , t e cla t e cle a d a ( 'A') , t e cla lib e ra d a
( A) . Ob s e rva q u e la t e cla Ca p s Lo ck n o g e n e ra u n e ve n t o d e
t e cla lib e ra d a h a s t a q u e la p u ls e s y la s u e lt e s o t ra ve z. Es t o
e s ig u a l p a ra o t ra s t e cla s d e e s t a d o co m o S cro ll Lo ck o Nu m
Lo ck.
7 . Pu ls a y m a n t e n la t e cla A.
¿ S e re p it e a u t o m á t ica m e n t e ? S i e s a s í, ve rá s lo s m is m o s
e ve n t o s q u e s i p u ls a ra s y lib e ra ra s la t e cla A re p e t id a m e n t e .

Pu e d e s e n co n t a r e l có d ig o co m p le t o d e l Ap p le t e n Ke yDe m o . ja va . Aq u í
t ie n e s e l có d ig o d e m a n e jo d e e ve n t o s d e l a p p le t :

public class KeyDemo ... implements KeyListener ... {


...//Donde ocurra la inicialización:
typingArea = new TextField(20);
typingArea.addKeyListener(this);
...
/** Maneja el evento de tecla tecleada del campo de texto. */
public void keyTyped(KeyEvent e) {
displayInfo(e, "KEY TYPED: ");
}

/** Maneja el evento de tecla pulsada del campo de texto. */


public void keyPressed(KeyEvent e) {
displayInfo(e, "KEY PRESSED: ");
}

/** Maneja el evento de tecla liberada del campo de texto. */


public void keyReleased(KeyEvent e) {
displayInfo(e, "KEY RELEASED: ");
}
...
protected void displayInfo(KeyEvent e, String s){
...
char c = e.getKeyChar();
int keyCode = e.getKeyCode();
int modifiers = e.getModifiers();
...
tmpString = KeyEvent.getKeyModifiersText(modifiers);

...//mustra información sobre el evento...


}
}

La clase KeyEvent

Ca d a m é t o d o d e e ve n t o d e t e cla t ie n e u n s ó lo p a rá m e t ro : u n
o b je t o Ke y Ev e n t . La cla s e Ke y Ev e n t d e fin e lo s s ig u ie n t e s m é t o d o s :
in t g e t Ke y Ch a r( )
v o id s e t Ke y Ch a r( c h a r)
Ob t ie n e o s e le ccio n a e l c a rá c t e r d e t e c la a s o cia d o co n e l e ve n t o d e
t e cla t e cle a d a . El ca rá ct e r e s u n ca rá ct e r Un ico d e .
in t g e t Ke y Co d e ( )
v o id s e t Ke y Co d e ( in t )
Ob t ie n e o s e le ccio n a e l c ó d id o d e t e c la a s o cia d o co n e s t e e ve n t o . El
có d ig o d e t e cla id e n t ifica u n a t e cla p a rt icu la r d e l t e cla d o q u e e l u s u a rio
h a p u ls a d o o lib e ra d o . La cla s e Ke y Ev e n t d e fin e m u ch a s co n s t a n t e s
p a ra có d ig o s d e t e cla . Po r e je m p lo , VK_ A e s p e cifica la t e cla e t iq u e t a d a
A, y VK_ ES CAP E e s p e cifica la t e cla ES CAPE.
v o id s e t Mo d ifie rs ( in t )
S e le ccio n a e l e s t a d o d e la s t e cla s m o d ifica d o ra s p a ra e s t e e ve n t o .
Ta m b ié n p u e d e s ve r lo s m é t o d o s g e t Mo d ifie rs d e in p u t Ev e n t .
Ot ro s m é t o d o s p o t e n cia lm e n t e ú t ile s d e Ke y Ev e n t in clu ye n m é t o d o s q u e
g e n e ra n d e s crip cio n e s d e t e xt o lo ca liza b le s d e có d ig o s d e t e cla s y t e cla s
m o d ifica d o ra s .
La cla s e Ke y Ev e n t d e s cie n d e d e I n p u t Ev e n t , q u e a s u ve z d e s cie n d e d e
Co m p o n e n t Ev e n t . Co m p o n e n t Ev e n t p ro p o rcio n a e l m é t o d o
g e t Co m p o n e n t . I n p u t Ev e n t p ro p o rcio n a lo s s ig u ie n t e s m é t o d o s :
in t g e t W h e n ( )
De vu e lve e l m o m e n t o e n e l q u e o cu rrió e s t e e s t e e ve n t o . Cu a n t o m á s
a lt o s e a e l t ie m p o , m á s re cie n t e m e n t e h a o cu rrid o e l e ve n t o .
b o o le a n is Alt D o w n ( )
b o o le a n is Co n t ro lD o w n ( )
b o o le a n is Me t a D o w n ( )
b o o le a n is S h ift D o w n ( )
Es t o s m é t o d o s o fre ce n e l e s t a d o d e la s t e cla s m o d ifica d o ra s cu a n d o e l
e ve n t o fu e g e n e ra d o .
in t g e t Mo d ifie rs ( )
De vu e lve u n a b a n d e ra q u e in d ica e l e s t a d o d e t o d a s la s b a n d e ra s
cu a n d o e l e ve n t o fu e g e n e ra d o .

Oz it o
Escribir un Oyente de Ratón
Lo s e ve n t o s d e Ra t ó n t e d ice n cu a n d o e l u s u a rio u t iliza e l ra t ó n ( u o t ro d is p o s it ivo
d e e n t ra d a s im ila r) p a ra in t e ra ct u a r co n u n co m p o n e n t e . Lo s e ve n t o s d e ra t ó n
o cu rre n cu a n d o e l cu rs o r e n t ra o s a le d e l á re a d e p a n t a lla d e u n co m p o n e n t e o
cu a n d o e l u s u a rio p re s io n a o lib e ra u n b o t ó n d e l ra t ó n . Co m o s e g u ir la p is t a d e lo s
m o vim ie n t o s d e l cu rs o r e n vu e lve u n s o b re ca rg a d e l s is t e m a m á s s ig n ifica n t e q u e lo s
e ve n t o s d e l ra t ó n , lo s e ve n t o s d e m o vim ie n t o s e h a n s e p a ra d o e n o t ro t ip o d e
o ye n t e . ( Pu e d e s ve r Es crib ir u n Oye n t e d e Mo vim ie n t o s d e l Ra t ó n ) .

Métodos de Eventos del Ratón

El in t e rfa ce Mo u s e Lis t e n e r y s u co rre s p o n d ie n t e cla s e a d a p t a d o r,


Mo u s e Ad a p t e r, co n t ie n e n t re s m é t o d o s :
v o id m o u s e Clic k e d ( Mo u s e Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u e s d e q u e e l u s u a rio p u ls e s o b re e l
co m p o n e n t e e s cu ch a d o .
v o id m o u s e En t e re d ( Mo u s e Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l cu rs o r e n t re e n lo s
lím it e s d e l co m p o n e n t e e s cu ch a d o , s i n o e s t á p u ls a d o e l b o t ó n d e l
ra t ó n .
v o id m o u s e Ex it e d ( Mo u s e Ev e n t )
LLa m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l cu rs o r a b a n d o n e lo s
lím it e s d e l co m p o n e n t e e s cu ch a d o , s i n o e s t á p u ls a d o e l b o t ó n d e l
ra t ó n .
v o id m o u s e P re s s e d ( Mo u s e Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l u s u a rio p u ls e u n b o t ó n
d e l ra t ó n m ie n t ra s e l cu rs o r e s t á s o b re e l co m p o n e n t e e s cu ch a d o .
v o id m o u s e Re le a s e d ( Mo u s e Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e e l u s u a rio lib e re u n b o t ó n
d e l ra t ó n . El e ve n t o d e lib e ra ció n d e ra t ó n e s d is p a ra d o p o r e l m is m o
co m p o n e n t e q u e a ca b a d e g e n e ra r e l e ve n t o d e ra t ó n p u ls a d o , n o
im p o rt a d o n d e e s t é e l cu rs o r cu a n d o o cu rra la lib e ra ció n d e l b o t ó n .

Ejemplos de Manejo de Eventos de Ratón

El s ig u ie n t e a p p le t d e m u e s t ra lo s e ve n t o s d e l ra t ó n . En la p a rt e s u p e rio r
d e l a p p le t h a y u n á re a va cía ( im p le m e n t a d a p o r u n a cla s e lla m a d a
Bla n k Are a ) . Un o ye n t e d e ra t ó n e s cu ch a lo s e ve n t o s t a n t o d e l
Bla n k Are a co m o d e s u p ro p io co n t e n d o r, q u e e s u n e je m p la r d e
Mo u s e D e m o . Ca d a ve z q u e o cu rre u n e ve n t o d e ra t ó n , s e m u e s t ra u n
m e n s a je d e s crip t ivo d e b a jo d e l á re a va cía . Mo vie n d o e l cu s o r s o b re e l
á re a va cía y p u ls a n d o lo s b o t o n e s d e l ra t ó n p o d rá s ve r lo s e ve n t o s
g e n e ra d o s p o r e l ra t ó n .
Inte nta e s to :
1 . Mu e ve e l cu s o r d e n t ro d e l re ct á n g u lo q u e h a y e n la p a rt e
s u p e rio r d e l a p p le t .
Ve rá s u n o o m á s e ve n t o s d e "m o u s e e n t e r" [ q u e d e b e ría n
s e r m o s t ra d o r co m o "Cu s t o r e n t e r"] .
2 . Pu ls a y m a n t e n e l b o t ó n d e l ra t ó n .
Ve rá s u n e ve n t o d e "m o u s e p re s s ". Po d ría s ve r a lg u n o s
e ve n t o s e xt ra s co m o "m o u s e e xit " o "m o u s e e n t e r".
3 . Lib e ra e l b o t ó n d e l ra t ó n .
Ve rá s u n e ve n t o d e "m o u s e re le a s e ". S i n o h a s m o vid o e l
ra t ó n s e g u irá u n e ve n t o d e "m o u s e click".
4 . Pu ls a y m a n t e n e l b o t ó n d e l ra t ó n y lu e g o a rra s t ra e l ra t ó n
h a s t a e l e xt e rio r d e l á re a d e l a p p le t . Lib e ra e l b o t ó n d e l
ra t ó n .
Ve rá s u n e ve n t o d e "m o u s e p re s s ", s e g u id o p o r u n e ve n t o
d e "m o u s e e xit " y s e g u id o p o r u n e ve n t o d e "m o u s e
re le a s e ". N o h a s s id o n o t ifica d o s o b re e l m o vim ie n t o d e l
cu rs o r. Pa ra o b t e n e r lo s m o vim ie n t o s d e l ra t ó n , n e ce s it a s
im p le m e n t a r u n Oye n t e d e m o vim ie n t o d e ra t ó n .

Aq u í p o d rá s e n co n t ra r e l có d ig o co m p le t o d e l a p p le t Mo u s e De m o . ja va . Y
a q u í t ie n e s e l có d ig o d e m a n e jo d e e ve n t o s d e l a p p le t :

public class MouseDemo ... implements MouseListener {


...//Donde ocurra la inicialización:
//Registrado para los eventos del ratón en el blankArea
//y en el applet (panel).
blankArea.addMouseListener(this);
addMouseListener(this);
...

public void mousePressed(MouseEvent e) {


saySomething("Mouse button press", e);
}

public void mouseReleased(MouseEvent e) {


saySomething("Mouse button release", e);
}

public void mouseEntered(MouseEvent e) {


saySomething("Cursor enter", e);
}
public void mouseExited(MouseEvent e) {
saySomething("Cursor exit", e);
}

public void mouseClicked(MouseEvent e) {


saySomething("Mouse button click", e);
}

void saySomething(String eventDescription, MouseEvent e) {


textArea.append(eventDescription + " detected on "
+ e.getComponent().getClass().getName()
+ ".\n");
textArea.setCaretPosition(maxInt); //scroll to bottom
}
}

La clase MouseEvent

Ca d a m é t o d o d e e ve n t o d e ra t ó n t ie n e u n s ó lo p a rá m e t ro : u n o b je t o
Mo u s e Ev e n t La cla s e Mo u s e Ev e n t d e fin e lo s s ig u ie n t e s m é t o d o s :
in t g e t Clic k Co u n t ( )
De vu e lve e l n ú m e ro d e rá p id o s , clicks co n s e cu t ivo s q u e h a re a liza d o
e l u s u a rio ( in clu id o e s t e e ve n t o ) .
in t g e t X( )
in t g e t Y( )
P o in t g e t P o in t ( )
De vu e lve la p o s ició n ( x, y) d e l cu rs o r cu a n d o o cu rrió e l e ve n t o ,
re la t ivo a l co m p o n e n t e s o b re e l q u e o cu rrió e l e ve n t o .
b o o le a n is P o p u p Trig g e r( )
De vu e lve t ru e s i e l e ve n t o d e b e ría ca u s a r q u e a p a re cie ra u n m e n ú
p o p u p . Co m o lo s d is p a ro s d e p o p u p s o n d e p e n d ie n t e s d e la
p la t a fo rm a , s i t u p ro g ra m a u t iliza m e n ú s p o p u p , d e b e ría s lla m a r a
is P o p u p Trig g e r p a ra lo s e ve n t o s d e "m o u s e d o wn " y "m o u s e u p ".
La cla s e Mo u s e Ev e n t d e s cie n d e d e I n p u t Ev e n t , q u e d e s cie n d e d e
Co m p o n e n t Ev e n t . Co m p o n e n t Ev e n t p ro p o rcio n a e l m é t o d o
g e t Co m p o n e n t . I n p u t Ev e n t p ro p o rcio n a lo s s ig u ie n t e s m é t o d o s :
in t g e t W h e n ( )
De vu e lve e l m o m e n t o e n e l q u e o cu rrió e l e ve n t o . Un m a yo r n ú m e ro
a q u í in d ica q u e e l e ve n t o h a o cu rrid o m á s re cie n t e m e n t e .
b o o le a n is Alt D o w n ( )
b o o le a n is Co n t ro lD o w n ( )
b o o le a n is Me t a D o w n ( )
b o o le a n is S h ift D o w n ( )
Es t o s m é t o d o s t e o fre ce n e l e s t a d o d e la s t e cla s m o d ifica d o ra s
cu a n d o e l e ve n t o fu e g e n e ra d o .
in t g e t Mo d ifie rs ( )
De vu e lve u n a b a n d e ra in d ica n d o e l e s t a d o d e t o d a s la s t e cla s
m o d ifica d o ra s cu a n d o e l e ve n t o fu e g e n e ra d o .

Oz it o
Escribir un Oyente de Movimiento del Ratón
Lo s e ve n t o s d e m o vim ie n t o d e l ra t ó n t e d ice n cu a n d o e l u s u a rio u t iliza u n ra t ó n ( o
u n d is p o s it ivo d e e n t ra d a s im ila r) p a ra m o ve r e l cu rs o r p o r la p a n t a lla . Pa ra m á s
in fo rm a ció n s o b re o t ro t ip o s d e e ve n t o s d e l ra t ó n , co m o lo s clicks , p u e d e s ve r la
p á g in a , Es crib ir u n Oye n t e d e l Ra t ó n .

Métodos de Eventos de Movimiento del Ratón

El in t e rfa ce Mo u s e Mo t io n Lis t e n e r y s u co rre s p o n d ie n t e cla s e


a d a p t a d o r, Mo u s e Mo t io n Ad a p t e r co n t ie n e n d o s m é t o d o s :
v o id m o u s e D ra g g e d ( Mo u s e Ev e n t )
Lla m a d o p o r e l AWT e n re s p u e s t a a u n m o vim ie n t o d e l ra t ó n p o r
p a rt e d e l u s u a rio m ie n t ra s e s t á p u ls a d o u n b o t ó n . Es t e e ve n t o e s
d is p a ra d o p o r e l co m p o n e n t e q u e d is p a ró e l e ve n t o d e ra t ó n
p u ls a d o p re ce d e n t e .
v o id m o u s e Mo v e d ( Mo u s e Ev e n t )
Lla m a d o p o r e l AWT e n re s p u e s t a a u n m o vim ie n t o d e l ra t ó n p o r
p a rt e d e l u s u a rio s in q u e e s t é p u ls a d o e l b o t ó n . Es t e e ve n t o e s
d is p a ra d o p o r e l co m p o n e n t e s o b re e l q u e s e e n cu e n t ra e l cu rs o r.

La clase MouseEvent

Ca d a m é t o d o d e e ve n t o d e m o vim ie n t o d e ra t ó n t ie n e u n s ó lo p a rá m e t ro
- - y n o s e lla m a Mo u s e Mo t io n Ev e n t !. En s u lu g a r s e u t iliza n o b je t o s
Mo u s e Ev e n t . Pu e d e s ve r Es crib ir u n Oye n t e d e Ra t ó n p a ra m á s
in fo rm a ció n s o b re la cla s e Mo u s e Ev e n t .

Oz it o
Escribir un Oyente de Texto
Lo s e ve n t o s d e t e xt o s o n g e n e ra d o s d e s p u é s d e q u e e l t e xt o d e u n co m p o n e n t e d e t e xt o
h a ya ca m b ia d o d e a lg ú n m o d o . Lo s co m p o n e n t e s d e l AWT 1 . 1 q u e p u e d e n g e n e ra r
e ve n t o s d e t e xt o s o n lo s ca m p o s y la s á re a s d e t e xt o . Pa ra o b t e n e r u n n o t ifica ció n
a n t e rio r a lo s ca m b io s d e t e xt o - - p o r e je m p lo , p a ra in t e rce p t a r ca ra ct e re s in co rre ct o s - -
d e b e ría s e s crib ir u n o ye n t e d e t e cla s .

Métodos de eventos de Texto

El in t e rfa ce Te x t Lis t e n e r t ie n e s ó lo u n m é t o d o , p o r lo t a n t o n o t ie n e la
co rre s p o n d ie n t e cla s e a d a p t a d o r. Aq u í t ie n e s e l m é t o d o :
v o id t e x t Va lu e Ch a n g e d ( Te x t Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e h a ya ca m b ia d o e l t e xt o d e l
co m p o n e n t e e s cu ch a d o .

ejemplos de Manejo de Eventos de Texto

El s ig u ie n t e a p p le t d e m u e s t ra lo s e ve n t o s d e t e xt o . Co n t ie n e d o s co m p o n e t e s d e
t e xt o e d it a b le - - u n ca m p o d e t e xt o y u n á re a d e t e xt o . Pu ls a r Re t u rn e n e l
ca m p o d e t e xt o h a ce q u e e l co n t e n id o d e é s t e s e a a ñ a d id o a l á re a d e t e xt o .
Ca d a co m p o n e n t e d e t e xt o e d it a b le p o s e e u n o ye n t e d e t e xt o . Es t o s d o s
o ye n t e s , q u e s o n d o s e je m p la re s d e u n a m is m a cla s e , a ñ a d e n u n m e n s a je a u n
á re a d e t e xt o n o e d it a b le q u e e s t á a la d e re ch a d e l a p p le t . Un b o t ó n s it u a d o e n
la p a rt e in fe rio r d e re ch a d e l a p p le t t e p e rm it e lim p ia r e l á re a d e m e n s a je s .
Inte nta e s to :
1 . Pu ls a s o b re e l ca m p o d e t e xt o s it u a d o e n la p a rt e s u p e rio r
izq u ie rd a d e l a p p le t , lu e g o p u ls a e l ca rá ct e r A e n e l t e cla d o .
Ocu rre u n e ve n t o d e t e xt o , y ve rá s u n m e n s a je e n e l á re a
s it u a d a a la d e re ch a d e l a p p le t .
2 . Te cle a a lg u n o s ca ra ct e re s m á s .
Ocu rre u n e ve n t o d e t e xt o ca d a ve z q u e t e cle a s u n ca rá ct e r.
3 . Pu ls a Re t u rn .
El ca m p o d e t e xt o n o g e n e ra u n e ve n t o d e t e xt o . En s u lu g a r
g e n e ra u n e ve n t o "a ct io n ", y e l m a n e ja d o r d e e s t e e ve n t o co p ia
e l t e xt o co n t e n id o e n e l ca m p o d e t e xt o d e n t ro d e l á re a d e t e xt o .
El á re a d e t e xt o re a ccio n a g e n e ra n d o u n s ó lo e ve n t o d e t e xt o ,
s in im p o rt a r e l n ú m e ro d e ca ra ct e re s co p ia d o .
4 . Pu ls a s o b re e l á re a d e t e xt o - - e l á re a g ra n d e s it u a d o e n la p a rt e
in fe rio r izq u ie rd a d e l a p p le t - - y lu e g o p u ls a u n ca ra ct e r e n e l
t e cla d o .
El á re a d e t e xt o d is p a ra u n e ve n t o d e t e xt o .

Aq u í p o d rá s e n co n t ra r e l có d ig o co m p le t o d e l a p p le t Te xt De m o . ja va . S u ce d e
q u e e s t e a p p le t im p le m e n t a s u m a n e jo d e e ve n t o s d e t e xt o d e n t ro d e u n a cla s e
in t e rn a lla m a d a My Te x t Lis t e n e r. El a p p le t cre a y re g is t ra d o s e je m p la re s d e
My Te x t Lis t e n e r, u n o p a ra ca d a co m p o n e n t e d e t e xt o e d it a b le . El co n s t ru ct o r
d e My Te x t Lis t e n e r t o m a u n a ca d e n a q u e d e s crib e la fu e n t e d e l e ve n t o .
Cu a n d o u n e je m p la r d e My Te x t Lis t e n e r d e t e ct a u n e ve n t o d e t e xt o , ( e s t o e s ,
s e lla m a a l m é t o d o t e x t Va lu e Ch a n g e d d e My Te x t Lis t e n e r) , e l e je m p la r
a ñ a d e u n m e n s a je a l á re a s it u a d a a la d e re ch a d e l a p p le t . Aq u í t ie n e s e l có d ig o
d e m a n e jo d e e ve n t o s d e l a p p le t :

public class TextDemo ... {


TextField textField;
TextArea textArea;
TextArea displayArea;
...
//Donde ocurra la inicialización:
textField = new TextField(20);
...
textField.addTextListener(new MyTextListener("Text Field"));

textArea = new TextArea(5, 20);


textArea.addTextListener(new MyTextListener("Text Area"));
...
}

class MyTextListener implements TextListener {


String preface;

public MyTextListener(String source) {


preface = source
+ " text value changed.\n"
+ " First 10 characters: \"";
}

public void textValueChanged(TextEvent e) {


TextComponent tc = (TextComponent)e.getSource();
String s = tc.getText();
...//truncate s to 10 characters...

displayArea.append(preface + s + "\"\n");
...
}
}
...
}

La clase TextEvent

Ca d a m é t o d o d e e ve n t o d e t e xt o t ie n e u n s ó lo p a rá m e t ro : u n o b je t o
Te x t Ev e n t . La cla s e Te x t Ev e n t n o d e fin e m é t o d o s ú t ile s . Ut iliza n d o e l m é t o d o
g e t S o u rc e q u e h e re d a d e Ev e n t Ob je c t , p u e d e s o b t e n e r e l co m p o n e n t e q u e
g e n e ró e l e ve n t o y lu e g o e n via rle u n m e n s a je .
Oz it o
Escribir un Oyente de Ventana
Lo s e ve n t o s d e ve n t a n a s o n g e n e ra d o s p o r u n a Ve n t a n a ju s t o d e s p u é s d e q u e la
ve n t a n a s e a a b ie rt a , ce rra d a , ico n ifica d a , d e s ico n ifica d a , a ct iva d a o d e s a ct iva d a .
Ab rir u n a ve n t a n a s ig n ifica h a ce rla vis ib le e n la p a n t a lla ; ce rra rla s ig n ifica e lim in a r
la ve n t a n a d e la p a n t a lla . Ico n ifica rla s ig n ifica s u s t it u ir la ve n t a n a p o r u n p e q u e ñ o
ico n o e n e l e s crit o rio , d e s ico n ifica rla s ig n ifica lo s co n t ra rio . Un a ve n t a n a e s
a ct iv a d a s i u n o d e s u s co m p o n e n t e s o b t ie n e e l fo co d e l t e cla d o ; la d e s a ct iva ció n
o cu rre cu a n d o la ve n t a n a o u n o d e s u s co m p o n e n t e p ie rd a n e l fo co d e l t e cla d o .
Pro b a b le m e n t e e l u s o m á s co m ú n d e lo s o ye n t e s d e ve n t a n a e s p a ra ce rra r
ve n t a n a s . S i u n p ro g ra m a n o m a n e ja lo s e ve n t o s d e ce rra r ve n t a n a , n o s u ce d e rá
n a d a cu a n d o e l u s u a rio in t e n t e ce rra rla . Un a a p lica ció n q u e co n s is t e e n u n a s ó la
ve n t a n a p o d ría re a ccio n a r a lo s e ve n t o s d e ce rra r ve n t a n a s a lie n d o d e la
a p lica ció n . Un a p p le t u o t ro p ro g ra m a e n e l q u e e xis t a n m á s d e u n a ve n t a n a
n o rm a lm e n t e lla m a a l m é t o d o d is p o s e p a ra ce rra r la ve n t a n a .
Ot ro u s o co m ú n d e lo s o ye n t e s d e ve n t a n a s e s p a ra r lo s t h re a d s y lib e ra r lo s
re cu rs o s cu a n d o u n a ve n t a n a e s in co n ifica d a , y p a ra a rra n ca r d e n u e vo cu a n d o la
ve n t a n a s e a g ra n d a d e n u e vo . De e s t a fo rm a , p o d rá s e vit a r la u t iliza ció n
in n e ce s a ria d e l p ro ce s a d o r u o t ro s re cu rs o s . Po r e je m p lo , u n p ro g ra m a q u e re a liza
co n t ín u a s a n im a cio n e s , n o e s ú t il cu a n d o la ve n t a n a n o e s vis ib le , p o r e s o d e b e ría
lib e ra r lo s re cu rs o s d e l s is t e m a cu a n d o e s t á in co n ifica d a . Es p e cífica m e n t e , d e b e ría
p a ra r e l t h re a d d e a n im a ció n y lib e ra r cu a lq u ie r g ra n b u ffe r cu a n d o la ve n t a n a e s
ico n ifica d a , y a rra n ca r e l t h re a d d e n u e vo y re cre a r lo s b u ffe re s cu a n d o la ve n t a n a
s e d e s ico n ifica d a .

Métodos de Eventos de Ventana

El in t e rfa ce W in d o w Lis t e n e r y s u co rre s p o n d ie n t e cla s e a d a p t a d o r,


W in d o w Ad a p t e r, co n t ie n e n s ie t e m é t o d o s :
v o id w in d o w Op e n e d ( W in d o w Ev e n t )
Lla m a d o p o r e l AWT ju s t o d e s p u é s d e q u e la ve n t a n a e s cu ch a d a
h a ya s id o a b ie rt a p o r p rim e ra ve z [ o m o s t ra d a d e s p u é s d e h a b e r
s id o ce rra d a ] .
v o id w in d o w Clo s in g ( W in d o w Ev e n t )
Lla m a d o p o r e l AWT e n re s p u s t a a u n a p e t ició n d e l u s u a rio d e q u e
la ve n t a n a e s cu ch a d a s e a ce rra d a . Pa ra ce rra r re a lm e n t e la
ve n t a n a , e l o ye n t e d e b e lla m a a l m é t o d o d is p o s e d e la ve n t a n a .
v o id w in d o w Clo s e d ( W in d o w Ev e n t )
Lla m a d a p o r e l AWT ju s t o d e s p u é s d e q u e la ve n t a n a e s cu ch a d a
h a ya s id o ce rra d a .
v o id w in d o w I c o n ifie d ( W in d o w Ev e n t )
v o id w in d o w D e ic o n ifie d ( W in d o w Ev e n t )
Lla m a d o s ju s t o d e s p u é s d e q u e la ve n t a n a e s cu ch a d a h a ya s id o
ico n ifica d a o d e s ico n ifica d a , re s p e ct iva m e n t e .
v o id w in d o w Ac t iv a t e d ( W in d o w Ev e n t )
v o id w in d o w D e a c t iv a t e d ( W in d o w Ev e n t )
Lla m a d a p o r e l AWT ju s t o d e s p u é s d e q u e la ve n t a n a e s cu ch a d a s e a
a ct iva d a o d e s a ct iva d a , re s p e ct iva m e n t e .

La clase WindowEvent

Ca d a m é t o d o d e e ve n t o d e ve n t a n a t ie n e u n s ó lo p a rá m e t ro : u n o b je t o
W in d o w Ev e n t . La cla s e W in d o w Ev e n t d e fin e u n m é t o d o ú t il,
g e t W in d o w , q u e d e vu e lve la v e n t a n a q u e g e n e ró e l e ve n t o .

Oz it o
Utilizar la versión "Swing" del JFC
El p ro ye ct o S win g - - q u e e s t á d e s a rro lla n d o a lg o d e l API d e JFC ( Ja va Fu n d a t io n
Cla s s e s ) - - h a d e s a rro lla d o m u ch o s co m p o n e n t e s lis t o s p a ra u t iliza r y o t ra s cla s e s
co n ve n ie n t e s . Es t a s e cció n t e cu e n t a có m o u t iliza r lo s co m p o n e n t e s S win g . Pro n t o
p o d rá s ve r co m o cre a r lo s t u yo s p ro p io s .
Es t e e s u n Tra b a jo e n Pro g re s o !
La s p á g in a s d e e s t a s e cció n s e a ct u a liza n co n s t a n t e m e n t e . Da t e u n a
vu e lt a d e ve z e n cu a n d o p o r a q u í o p o r la Ho m e p a g e d e l JFC p a ra
o b t e n e r la ú lt im a in fo rm a ció n s o b re e l p ro ye ct o S win g . Es t a s e cció n s e
a ct u a lizó p o r ú lt im a ve z e n 8 d e Ag o s t o d e 1 9 9 7 .

Introducción a los Componentes de Swing

Es t a s e cció n t e m u e s t ra t o d o s lo s co m p o n e n t e s d e S win g y lu e g o e n la za
co n la d ire cció n d o d e p o rd rá s a p re n d e r a u t iliza r lo s co m p o n e n t e s .

Empezar con Swing

Pa ra e s crib ir p ro g ra m a s q u e u t ilice n co m p o n e n t e s S win g , p rim e ro d e b e s


d e s ca rg a r la ú lt im a ve rs ió n d e S win g . Pa ra a s e g u ra rt e d e q u e h a s b a ja d o
la ve rs ió n co rre ct a y q u e t u e n t o rn o e s t á co n fig u ra d o co rre ct a m e t e ,
p u e d e s e je cu t a r la d e m o S win g S e t . La p ru e b a fin a l e s co m p ila r y
e je cu t a r p ro g ra m a s S win g .

Utilizar los Componentes Swing

Lo s co m p o n e n t e s d e S win g co n fo rm a n la a rq u it e ct u ra d e S win g , lo q u e
s ig n ifica q u e s o n d e p e s o lig e ro , t ie n e co n ca ra ct e r co n e ct a b le , d e
a cu e rd o a lo s re q u e rim ie n t o s d e lo s Ja va Be a n s , e t c.
Es t a s e cció n p rim e ro o fre ce u n a in t ro d u cció n a l có d ig o q u e p o d ría s
u t iliza r cu a n d o u t ilice s co m p o n e n t e s S win g . Lu e g o ca d a co m p o n e n t e
t ie n e u n a s u b s e cció n q u e e xp lica t o d o s o b re la u t iliza ció n d e l
co m p o n e n t e .

Escribir Componentes de Peso Ligero utilizando la versión de Swing

Es t a s e cció n t e co n t a rá co m o e s crib ir d o s cla s e s d e co m p o n e n t e s d e p e s o


lig e ro :
● Co m p o n e n t e s s e n cillo s , u t iliza n d o s u b cla s e s d e co m p o n e n t e s S win g .
( As í e s fá cil!)
● Co m p o n e n t e s q u e s e a p ro ve ch a n d e la a rq u it e ct u ra d e S win g .
Oz it o
Introducción a los Componentes de Swing
Es t a p á g in a m u e s t ra lo s co m p o n e n t e s S win g , co n e n la ce s a la s p á g in a s d o n d e ca d a
co m p o n e n t e s e d e s crib e e n m á s d e t a lle . Pa ra t e n e r u n a lo s co m p o n e n t e s lis t o s p a ra
u t iliza r q u e s e h a n a ñ a d id o a S win g , p u e d e s co m p a ra r e s t a s e cció n co n la s p a g in a s
d e Co m p o n e n t e s d e l AWT.
Label Bordered pane Progress bar Tool tip

Button Radio buttons Checkboxes Tool bar

Slider Combo box Menu Tree

Scroll bar List box Tabbed pane

Table
Oz it o
Empezar con Swing
Pa ra e m p e za r a u t iliza r e l e n t o rn o d e p ro g ra m a ció n d e S win g , d e b e s s e g u ir e s t o s
pa sos:
● De s ca rg a r la ú lt im a ve rs ió n d e l JDK, s i n o lo h a s h e ch o t o d a vía .

● De s ca rg a r la ú lt im a ve rs ió n d e S win g , s i n o lo h a s h e ch o t o d a vía .
● Eje cu t a r la a p lica ció n Ru n S win g .
● Co m p ila r y e je cu t a r u n a a p lica ció n S win g .
In clu s o p u e d e s e je cu t a r a p p le t S win g , s i e s t a s d is p u e s t o a s e g u ir u n p a r d e a t a jo s .

Descargar la última versión del JDK

La ve rs ió n d e S win g re q u ie re la co rre cció n d e a lg u n o s e rro re s q u e


a p a re cie ro n e l e n JDK 1 . 1 . 2 . De b e ría s d e s ca rg a r la ú lt im a ve rs ió n d e l
JDK.

Descargar la última versión de Swing

Pu e d e s De s ca rg a r la ve rs ió n d e S win g d e s d e la "Ja va De ve lo p e rs
Co n n e ct io n ". Ne ce s it a rá s re g is t ra rt e , s i a ú n n o lo h a s h e ch o .

Ejecutar una aplicación Swing

An t e s d e e s crib ir t u s p ro p io s p ro g ra m a s S win g , d e b e rá s a s e g u ra rt e d e
q u e p u e d e s e je cu t a r u n a ya e xis t e n t e . Po d ría s q u e re r e m p e za r
e je cu t a n d o e l e je m p lo S win g S e t , q u e t e p re s e n t a t o d o s lo s co m p o n e n t e s
d e S win g . El fich e ro READ ME. t x t s it u a d o e n e l d ire ct o rio s u p e rio r d e la
ve rs ió n d e S win g t e e xp lica co m o e je cu t a r la d e m o S e in g S e t .
Aq u í t ie n e s u n a e xp lica ció n g e n e ra l d e co m o e je cu t a r a p lica cio n e s S win g :
1 . To m a n o t a d e d o n d e t ie n e s in s t a la d o la co p ia d e la ve rs ió n d e
S win g . Ne ce s it a rá s e s t o p a ra p o d e r e n co n t ra r la s cla s e s d e S win g .
Po d ría s q u e re r s e le ccio n a r la va ria b le d e e n t o rn o S WINGHOME co n
e l d ire ct o rio s u p e rio r d e la ve rs ió n d e S win g .
El fich e ro q u e co n t ie n e la s cla s e s S win g e s t á e n e l d ire ct o rio d e
n ive l m á s a lt o e n u n fich e ro lla m a d o s w in g . ja r. Lo s d is t in t o s
fich e ro s Ro s a s e s t á n a rch iva d o s e n e l m is m o d ire ct o rio , e n u n
fich e ro lla m a d o ro s e . ja r.

N o t a : Te n cu id a d o d e n o e lim in a r e s t o s fich e ro s . La
ve rs ió n d e S win g d e p e n d e d e e s t o s fich e ro s .

2 . To m a n o t a d e d o n d e t ie n e s in s t a la d a la co p ia d e la ve rs ió n d e l JDK
1 . 1 . N ( d o n d e N > = 2 ) . Ne ce s it a rá s e s t o p a ra p o d e r e n co n t ra r la s
ve rs io n a s a p ro p ia d a s d e la s cla s e s d e l JDK y e l in t é rp re t e . Po d ría s
q u e re r s e le ccio n a r la va ria b le d e e n t o rn o JDKHOME co n e l d ire ct o rio
s u p e rio r d e la ve rs ió n d e l JDK 1 . 1 . N.
La s cla s e s d e l JDK e s t á n e n e l d ire ct o rio lib d e la ve rs ió n d e l JDK,
e n u n fich e ro lla m a d o c la s s e s . z ip . ¡No d e s co m p rim a s e s t e fich e ro !
El in t é rp rt e Ja va e s t á e n e l d ire ct o rio b in d e la ve rs ió n d e l JDK.
3 . Eje cu t a r la a p lica ció n , e s p e cifica n d o u n cla s s p a t h q u e in clu ya e l
fich e ro s w in g . ja r, e l fich e ro c la s s e s . z ip d e l JDK, y e l d ire ct o rio
q u e co n t ie n e la s cla s e s d e l p ro g ra m a . As e g ú ra t e d e q u e la s cla s e s y
e l in t é rp re t e d e l JDK q u e e s t á s u t iliz a n d o s o n d e la m is m a v e rs ió n
d e l JDK 1 . 1 . N. !

Compilar y ejecutar una aplicación Swing

1 . Elig e u n d ire ct o rio d e t ra b a jo .


2 . Gra b a e l fich e ro fu e n t e Ja va e n t u d ire ct o rio d e t ra b a jo . Aq u í t ie n e s
u n o q u e p u e d e s u t iliza r: Bu t t o n D e m o . ja v a .
3 . De s d e t u d ire ct o rio d e t ra b a jo , lla m a a l co m p ila d o r Ja va ,
e s p e cifica n d o e l cla s s p a t h co m o s e d e s crib ió e n e l p a s o 3 d e la
s e cció n a n t e rio r.
4 . De s d e t u d ire ct o rio d e t ra b a jo , lla m a a l in t é rp re t e Ja va , co m o s e
d e s crib ió e n e l p a s o 3 d e la s e cció n a n t e rio r.
S i h a s s e g u id o t o d o e s t o , e s t á s lis t o p a ra e m p e za r a e s crib ir t u s p ro p io s
p ro g ra m a s s win g ! Pu e d e s a p re n d e r co s a s s o b re S win g a t ra vé s d e la s
p á g in a s d e e s t e t u t o ria l o a t ra vé s d e la d o cu m e n t a ció n d e la ve rs ió n d e
s win g . Pa ra le e r la d o cu m e n t a ció n d e S win g , u t iliza u n n a ve g a d o r p a ra
ve r e l fich e ro d o c / in d e x . h t m l ( q u e e s t á e n e l d ire ct o rio s u p e rio r d e a l
ve rs ió n d e S win g ) .

Oz it o
Ejecutar un Applet Swing
De b id o a la s re s t riccio n e s d e s e g u rid a d , a ct u a lm e n t e n o p u e d e s d is t rib u ir cla s e s
S win g e n u n Ap p le t . S in e m b a rg o , s i la s cla s e s d e S win g e s t á n e n t u p a t h , a lg u n a s
ve ce s p o d rá s e je cu t a r a p p le t s b a s a d o s e n s win g e n n a ve g a d o re s 1 . 1 q u e e s t é n
e s crit o s e n Ja va . Lo s a p p le t s t ie n d e n a ca s ca r d e s p u é s d e u n ra t o . Ob ivia m e n t e s e
e s t á p la n e a n d o co rre g ir e s t o .
¿ Pu e d e s ve r t re s b o t o n e s d e b a jo d e e s t e p á rra fo ? . S i e s a s í, e s t á s e je cu t a d o co n
é xit o u n a p p le t b a s a d o e n S win g !
El re s t o d e e s t á p á g in a o fre ce in s t ru cio n e s p a s o a p a s o p a ra e je cu t a r a p p le t s
b a s a d o s e n S win g y e xp lica la s lim it a cio n e s d e e s t o s a p p le t s .

Paso a paso: Ejecutar un applet basado en Swing.

1 . En cu e n t ra u n n a ve g a d o r 1 . 1 q u e e s t é e s crit o e n Ja va . As e g u ra t e d e
q u e t ie n e s la ú lt im a ve rs ió n , ya q u e la s ve rs io n e s p o s t e rio re s
t ie n d e n a co rre g ir e rro re s q u e h a ce n q u e S win g t ra b a je m e jo r. Lo s
n a ve g a d o re s Ja va 1 . 1 s o n Ho t Ja va y e l ( a p p le t v ie w e r) , q u e s e
d is t rib u ye e n e l JDK,
2 . As e g u ra t e q u e la s cla s e s S win g e s t á n e l p a t h d e cla s e s d e t u
n a ve g a d o r.
3 . Arra n ca t u n a ve g a d o r Ja va y a p u n t a a u n a p á g in a co m o é s t a q u e
co n t e n g a u n a p p le t b a s a d o e n S win g .

Limitaciones de los Applets basados en Swing

Lo s a p p le t s d e S win g g e n e ra n e xce p cio n e s d e s e g u rid a d . Mie n t ra s e l


a p p le t t ra b a je co rre ct a m e n t e , p u e d e s ig n o ra r e s t a s e xce p cio n e s .
Qu izá s n o p o d rá s u t iliza r im á g e n e s e n lo s a p p le t s b a s a d o s e n S win g . Po r
e je m p lo , e l a p p le t d e e s t á p á g in a e s t á b a s a d o e n la a p lica ció n e xp lica d a
e n la p á g in a la c la s e Bu t t o n . Es t a a p lica ció n u t iliza im á g e n e s e n
b o t ó n e s . He m o s t e n id o q u e e lim in a r la s im á g e n e s d e lo s b o t o n e s p a ra
co n s e g u ir q u e e l có d ig o s e e je cu t e e n u n a p p le t .

Oz it o
Utilizar todos los Componentes de Swing
Reglas generales para el uso de componentes Swing

An t e s d e e m p e za r a u t iliza r lo s co m p o n e n t e s S win g , d e b e ría s s a b e r la s


cla s e s q u e p ro p o rcio n a e l JCo m p o n e n t

Como se utiliza ...

El s ig u ie n t e g ru p o d e p á g in a s t e e xp lica co m o u t iliza r lo s co m p o n e n t e s
S win g . Ca d a t ip o d e co m p o n e n t e t ie n e s u p ro p ia p á g in a :
● Có m o u t iliza r Bu t t o n

● Có m o u t iliza r Ch e ckb o x
● Có m o u t iliza r Ca n va s
● Có m o u t iliza r Ch o ice
● Có m o u t iliza r Co lo r Ch o o s e r [ n o t im p le m e n t e d ye t ? ]
● Có m o u t iliza r Co m b o Bo xe
● Có m o u t iliza r File Ch o o s e r [ n o t im p le m e n t e d ye t ? ]
● Có m o u t iliza r Fo n t Ch o o s e r [ n o t im p le m e n t e d ye t ? ]
● Có m o u t iliza r In t e rn a l Fra m e s
● Có m o u t iliza r La b e l
● Có m o u t iliza r La ye re d Pa n e
● Có m o u t iliza r Lis t Bo xe
● Có m o u t iliza r Me n u
● Có m o u t iliza r Pa n e l
● Có m o u t iliza r Po p u p Me n u
● Có m o u t iliza r Pro g re s s Ba r
● Có m o u t iliza r Ra d io Bu t t o n
● Có m o u t iliza r S cro ll Ba r y Pa n e
● Có m o u t iliza r S e p a ra t o r
● Có m o u t iliza r S lid e r
● Có m o u t iliza r Ta b b e d Pa n e
● Có m o u t iliza r Ta b le
● Có m o u t iliza r Te xt
● Có m o u t iliza r Tit le d Pa n e [ s e rá n re n o m b ra d o s co m o Bo rd e re d Pa n e ]
● Có m o u t iliza r To o l Ba r
● Có m o u t iliza r To o l Tip
● Có m o u t iliza r Tre e
● Có m o u t iliza r Vie wp o rt

Oz it o
Reglas Generales para el uso de Componentes
Swing
Es t a s e cció n t ie n e in fo rm a ció n g e n e ra l s o b e lo q u e t ie n e n e n co m ú n lo s
co m p o n e n t e s d e s win g . Exp lica la s ca ra ct e ris t ica s q u e p ro p o rcio n a la cla s e
JCo m p o n e n t a la m a yo ría d e lo s co m p o n e n t e s S win g , in clu ye n d o có d ig o s o b re
có m o u t iliza r e s t á s ca ra ct e rís t ica s . Un d ía , q u izá s p o d rá m o s m o s t ra rt e co m o s e
d ife re n cia e l có d ig o d e p ro g ra m a s S win g d e lo s p ro g ra m a s q u e u t iliza n
co m p o n e n t e s d e p e s o p e s a d o .

Qué proporciona la clase JComponent

La m a yo ría d e lo s co m p o n e n t e s S win g e s t á n im p le m e n t a d o s co m o u n a
s u b cla s e d e la cla s e JCo m p o n e n t , q u e d e s cie n d e d e la cla s e
Co m p o n e n t . De JCo m p o n e n t , lo s co m p o n e n t e s S win g h e re d a n la s
s ig u ie n t e s fu n cio n a lid a d e s :
● To o l t ip s

● a ccio n e s g e n e ra d o s p o r t e cla d o
● S o p o rt e p a ra e s cro la d o
● Pro p ie d a d e s
● Ap lica ció n a m p lia m e n t e co n fig u ra b le
● S o p o rt e p a ra d is t rib u ció n t
To o l t ip s .
Es p e cifica n d o u n a ca d e n a co n e l m é t o d o s e t To o lTip , p u e d e s
p ro p o rcio n a r a yu d a a lo s u s u a rio s d e u n co m p o n e n t e . Cu a n d o e l
cu rs o r s e p a re s o b re e l co m p o n e n t e , la ca d e n a e s p e cifica d a s e
m o s t ra rá e n u n a p e q u e ñ a ve n t a n a q u e a p a re ce ce rca d e l
co m p o n e n t e . Pu e d e s ve r Có m o u t iliza r To o l Tip s p a ra m á s
in fo rm a ció n .
Ac c io n e s g e n e ra d a s p o r t e c la d o .
Ut iliza n d o e l m é t o d o re g is t e rKe y b o a rd Ac t io n , p u e d e s p e rm it ir
q u e e l u s u rio u t ilice e l t e cla d o , e n ve z d e l ra t ó n , p a ra in d ica r q u é
a cció n d e l co m p o n e n t e d e b e ría o cu rrir.

N o t a : Alg u n a s cla s e s p ro p o rcio n a n m é t o d o s co n ve n ie n t e s


p a ra a ccio n e s d e t e cla d o . Po r e je m p lo Ab s t ra c t Bu t t o n
p ro p o rcio n a s e t Ke y Ac c e le ra t o r, p a ra e s p e cifica r lo s
ca ra ct e re s q u e , e n co m b in a ció n co n u n a t e cla
m o d ifica d o ra e s p e cífica d a , h a ce q u e la a cció n d e l b o t ó n
s e a re a liza d a . Pu e d e s ve r Có m o u t iliza r Bu t t o n s p a ra ve r
u n e je m p lo d e u t iliza ció n d e t e cla s a ce le ra d o ra s e n
botone s.

La co m b in a ció n d e ca ra ct e re s y t e cla s m o d ifica d o ra s q u e e l u s u a rio


d e b e p u ls a r p a ra a rra n ca r u n a a cció n e s t á re p re s e n t a d a p o r u n
o b je t o JKe y S t ro k e . El e ve n t o a ct io n re s u lt a n t e e s m a n e ja d o p o r u n
o b je t o JAc t io n . To d a a cció n d e t e cla d o fu n cio n a b a jo u n a d e e s t a s
d o s co n d icio n e s : cu a n d o e l co m p o n e n t e a ct u a l t ie n e e l fo co o
cu a n d o cu a lq u ie r co m p o n e n t e d e s u ve n t a n a t ie n e e l fo co .
S o p o rt e p a ra s c ro llin g .
Co n lo s m é t o d o s c o m p u t e Vis ib le Re c t y g e t Vis ib le Re c t , p u e d e s
d e t e rm in a r q u e p a rt e d e u n co m p o n e n t e p o d ría s e r vis ib le e n la
p a n t a lla . Es t o e s e s p e cia lm e n t e ú t il p a ra a u m e n t a r e l re n d im ie n t o
d e l e s cro la d o . El m é t o d o s c ro llRe c t To Vis ib le e n vía u n m e n s a je a l
p a d re d e l JCo m p o n e n t , p id ie n d o q u e m u e s t re e l á re a e s p e cifica d a .
Co n e l m é t o d o s e t Au t o s c ro lls , p u e d e s e s p e cifica r q u e u n
co m p o n e t e s e e s cro le a u t o m á t ica m e n t e cu a n d o s e a a rra s t ra d o , s i
s u co n t e n e d o r s o p o rt a e s cro la d o ( co m o u n JVie w p o rt ) .
P ro p ie d a d e s .
Co n e l m é t o d o p u t P ro p e rt y , p u e d e s a s o cia r u n a o m á s
p ro p ie d a d e s ( p a re ja s n o m b re / o b je t o ) co n cu a lq u ie r JCo m p o n e n t .
Po r e je m p lo , u n co n t ro la d o r d e d is p o s ició n p o d ría u t iliza r la s
p ro p ie d a d e s p a ra a s o cia r u n o b je t o co n ca d a JCo m p o n e n t q u e
m a n e ja . Pu e d e s o b t e n e r p ro p ie d a d e s u t iliza n d o e l m é t o d o
g e t P ro p e rt y .
Ap lic a c ió n a m p lia m e n t e c o n fig u ra b le .
Ca d a m á q u in a virt u a l Ja va t ie n e u n o b je t o UI Fa c t o ry q u e
d e t e rm in a e l a s p e ct o y co m p o rt a m ie n t o d e lo s co m p o n e n t e s S win g
e n t ie m p o d e e je cu ció n . S u je t o a la s re s t riccio n e s d e s e g u rid a d
p u e d e s e le g ir e l a s p e ct o y co m p o rt a m ie n t o d e t o d o s lo s
co m p o n e n t e s S win g , lla m a n d o a l m é t o d o
UI Ma n a g e r. s e t UI Fa c t o ry . De t rá s d e la e s ce n a , ca d a o b je t o
JCo m p o n e n t t ie n e s u co rre s p o n d ie n t e o b je t o Co m p o n e n t UI
( cre a d o p o r e l UI Fa c t o ry ) q u e re a liza la s a ccio n e s d e d ib u jo ,
m a n e jo d e e ve n t o s , d e t e rm in a ció n d e t a m a ñ o , e t c p a ra ca d a
JCo m p o n e n t .
N o t a : S i q u ie re s ca m b ia r e l a s p e ct o y co m p o rt a m ie n t o d e u n
co m p o n e n t e in d ivid u a l d e S win g , e n ve z d e ca m b ia r t o d o e l
co n ju n t o co m p le t o d e co m p o n e n t e s , d e b e ría s re im p le m e n t a r e l
co m p o n e n t e in d ivid u a l.
S o p o rt e p a ra D is t rib u c ió n .
Co n m é t o d o s co m o s e t P re fe rre d S iz e , s e t Min im u m S iz e ,
s e t Ma x im u m S iz e , s e t Alig n m e n t X, s e t Alig n m e n t Y, y
s e t I n s e t s , p u e d e s e s p e cifica r re s t riccio n e s d e d is t rib u ció n s in t e n e r
q u e e s crib ir t u p ro p io co m p o n e n t e .

Consideraciones para la utilización de componentes de peso ligero

Pa ra e vit a r e l "p a rp a d e o " cu a n d o s e re d ib u ja n co m p o n e n t e s d e p e s o


lig e ro , n e ce s it a rá s p o n e r lo s co m p o n e n t e s d e p e s o lig e ro e n
co n t e n e d o re s co n d o b le b u ffe r. La ve rs ió n d e S win g in clu ye d o s cla s e s
q u e p u e d e s u t iliza r ju n t a s p a ra o b t e n e r e l d o b le b u ffe r: JP a n e l y
JFra m e . La cla s e JP a n e l p ro p o rcio n a co n t e n e d o re s d e d o b le b u ffe r y d e
p e s o lig e ro . La cla s e JFra m e q u e d e s cie n d e d e Fra m e s im p le m e n t e
im p le m e n t a u n a co rre cció n d e d ib u jo p a ra p e rm it ir q u e JP a n e l fu n cio n e .
Pa ra m á s in fo rm a ció n s o b re e l p a rp a d e o p u e d e s ir a Elim in a r e l
Pa rp a d e o .

Oz it o
Cómo utilizar Buttons
Pa ra cre a r u n b o t ó n , p u e d e s e je m p la riza r u a n d e la s m u ch a s s u b lca s e s d e la cla s e
Ab s t ra c t Bu t t o n . Es t a s e cció n e xp lica e l API b a s ico d e b o t o n e s q u e d e fin e
Ab s t ra c t Bu t t o n - - y q u e t ie n e n e n co m ú n t o d o s lo s b o t o n e s S win g . Co m o
JBu t t o n s u b cla s ifica Ab s t ra c t Bu t t o n n o d e fin e u n n u e vo API p ú b lico , e s t a p á g in a
lo u t iliza p a ra m o s t ra r co m o fu n cio n a n lo s b o t o n e s . La s ig u ie n t e t a b la m u e s t ra
t o d a s la s s u b cla s e s d e Ab s t ra c t Bu t t o n d e fin id a s e n S win g , q u e p o d ría s q u e re r
e je m p la riza r:
Clase Sumario Dónde se describe
JBu t t o n Un b o t ó n n o rm a l. Es t a s e cció n .
JCh e c k b o x Un ch e ckb o x t íp ico . Có m o u t iliza r Ch e ckb o xe s
JRa d io Bu t t o n Un o d e lo s g ru p o s d e b o t o n e s d e ra d io . Có m o u t iliza r Ra d io Bu t t o n s
JMe n u I t e m Un ít e m e n u n m e n ú . [ t o d a vía e n n in g ú n s it io ]
JMe n u Un m e n ú . [ t o d a vía e n n in g ú n s it io ]

Aq u í t ie n e s u n g rá fico d e u n a a p lica ció n q u e m u e s t ra t re s b o t o n e s :

Try t h is :
1 . Co m p ila y e je cu t a la a p lica cio n . El fich e ro fie n t e e s Bu t t o n D e m o . ja v a .
Pu e d e s ve r Em p e za r co n S win g s i n e ce s it a s a yu d a
2 . Pu ls a e l b o t ó n d e la izq u ie rd a .
De s a ct iva e l b o t ó n ce n t a rl ( y a s í m is m o , ya q u e n o e s n e ce s a rio ) y a ct iva e l
b o t ó n d e la d e re ch a .
3 . Pu ls a e l b o t ó n d e la d e re ch a .
Act iva e l b o t ó n ce n t ra l y e l d e la izq u ie rd a y s e d e s a ct iva a s í m is m o .

Có m o m u e s t ra e l e je m p lo Bu t t o n D e m o , u n b o t ó n S win g p u e d e m o s t ra r t a n t o t e xt o co m o u n a
im a g e n . En Bu t t o n D e m o , ca d a b o t ó n t ie n e s u t e xt o e n u n lu g a r d ife re n t e , re la t ivo a s u im a g e n .
La le t ra s u b ra ya d a d e l t e xt o d e ca d a b o t ó n m u e s t ra la t e cla a lt e rn a t iva p a ra ca d a b o t ó n .

Ca u n d o u n b o t ó n s e d e s a riva , a u t o m á t ica m e n t e s e g e n e ra u n a a p a rie n cia d e b o t ó n d e s a ct iva d o .


S in e m b a rg o , s e p o d ría p ro p o rcio n a r u n a im a g e n q u e s u s t it u ye ra a la im a g e n n o rm a l. Po r
e je m p lo , p o d ría s p ro p o rcio n a r u n ve rs ió n g ris d e la s im á g e n e s u t iliza d a s e n lo s b o t o e s d e re ch o e
izq u ie rd o .

Có m o s e im p le m e n t a e l m a n e jo d e e ve n t o s d e p e n d e d e l t ip o d e b o t ó n y d e s u u t iliza ció n . To d o s
lo s b o t o n e s S win g , p u e d e n g e n e ra r e ve n t o a ct io n , ch a n g e e ít e m , a s í co m o lo s e ve n t o s u s u a le s
d e b a jo n ive l. El e je m p lo Bu t t o n D e m o im p le m e n t a s ó lo e l o ye n t e d e a ct io n .
Ab a jo e s t á e l có d ig o d e Bu t t o n D e m o . ja v a p a ra cre a r lo s b o t o n e s d e l e je m p lo a n t e rio r y
re a ccio n a a lo s clicks e n lo s b o t o n e s . El có d ig o e n n e g rit a e s e l có d ig o q u e p e rm a n e ce ría s i lo s
b o t o n e s n o t u vie ra n im á g e n e s .

//En el código de inicialización:


ImageIcon leftButtonIcon = new ImageIcon("LEFT.gif");
ImageIcon middleButtonIcon = new ImageIcon("middle.gif");
ImageIcon LEFTButtonIcon = new ImageIcon("left.gif");

b1 = new JButton("Disable middle button", leftButtonIcon);


b1.setVerticalTextPosition(AbstractButton.CENTER);
b1.setHorizontalTextPosition(AbstractButton.LEFT);
b1.setKeyAccelerator('d');
b1.setActionCommand("disable");

b2 = new JButton("Middle button", middleButtonIcon);


b2.setVerticalTextPosition(AbstractButton.BOTTOM);
b2.setHorizontalTextPosition(AbstractButton.CENTER);
b2.setKeyAccelerator('m');

b3 = new JButton("Enable middle button", LEFTButtonIcon);


//Use the default text position of CENTER, LEFT.
b3.setKeyAccelerator('e');
b3.setActionCommand("enable");
b3.setEnabled(false);

//Oyente para actions en los botones 1 y 3.


b1.addActionListener(this);
b3.addActionListener(this);
. . .
}

public void actionPerformed(java.awt.event.ActionEvent e) {


if (e.getActionCommand().equals("disable")) {
b2.setEnabled(false);
b1.setEnabled(false);
b3.setEnabled(true);
} else {
b2.setEnabled(true);
b1.setEnabled(true);
b3.setEnabled(false);
}
}
La t a b la s ig u ie n t e lis t a lo s m é t o d o s u t iliza d o s d e Ab s t ra c t Bu t t o n y lo s co n s t ru ct o re s d e
JBu t t o n . Po d rá s ve r m á s API e n a cció n ju g a n d o co n lo s b o t o n e s d e l e je m p lo S w in g S e t q u e e s
p a rt e d e la ve rs ió n d e S win g . .
El API d e u t iliza ció n d e b o t o n e s s e d ivid e e n t re s ca e g o ría s :
● S e le ccio n a r u Ob t e n e r lo s Co n t e n id o s d e l Bo t ó n

● Aju s t e Fin o d e la Ap a rie n cia d e l Bo t ó n


● Im p le m e n t a r la Fu n cio n a lid a d d e l Bo t ó n

S e le ccio n a r u Ob t e n e r lo s Co n t e n id o s d e u n Bo t ó n
Método o Constructor Propósito Ejemplo
JBu t t o n ( S t rin g , I c o n )
Cre a r u n e je m p la r d e JBu t t o n , la
JBu t t o n ( S t rin g ) Bu t t o n D e m o . ja v a
in icia liza ció n d e b e e s p e cifica r e l t e xt o o
JBu t t o n ( I c o n )
la im a g e n
JBu t t o n ( )
v o id s e t Te x t ( S t rin g ) S e le ccio n a u o b t ie n e e l t e xt o m o s t ra d o
[ t o d a vía n o ]
S t rin g g e t Te x t ( ) por e l botón.
S e le ccio n a u o b t ie n e la im a g e n m o s t ra d a
v o id s e t I c o n ( I c o n )
p o r e l b o t ó n cu a n d o e l b o t ó n n o e s t á [ t o d a vía n o ]
Ico n g e tIco n( )
s e le ccio n a d o o p u s la d o .
S e le ccio n a u o b t ie n e la im a g e n m o s t ra d a
v o id s e t D is a b le d I c o n ( I c o n ) p o r e l b o t ó n cu a n d o e s t á d e s a ct iva d o . S i
[ t o d a vía n o ]
I c o n g e t D is a b le d I c o n ( ) n o e s p e cífica s n in g u n o , s e cre a u n o p o r
d e fe ct o m a n ip ila n d o la im a g e n .
v o id s e t P re s s e d I c o n ( I c o n ) S e le ccio n a u o b t ie n e la im a g e n m o s t ra d a
[ t o d a vía n o ]
Icon g e t P re s s e d I c o n ( ) p o r e l b o t ó n cu a n d o e s p u ls a d o .
v o id s e t S e le c t e d I c o n ( I c o n ) S e le ccio n a u o b t ie n e la im a g e n m o s t ra d a
[ t o d a vía n o ]
Icon g e t S e le c t e d I c o n ( ) p o r e l b o t ó n cu a n d o e s t á s e le ccio n a d o .
S e le ccio n a u o b t ie n e la im a g e n m o s t ra d a [ ca ra ct e rís t ica n o
v o id s e t Ro llo v e rI c o n ( I c o n )
p o r e l b o t ó n cu a n d o e l cu rs o r p a s a s o b re im p le m e n t a d a
I c o n g e t Ro llo v e rI c o n ( )
é l s in q u e e s t é p u ls a d o . t o d a vía ]
Aju s t e Fin o d e la Ap a rie n cia d e l Bo t ó n
Método o Constructor Propósito Ejemplo
S e le ccio n a n u o b t ie n e n d o n d e s e
d e b e n s it u a r lo s co n t e n id o s d e l
v o id s e t Ho riz o n t a lAlig n m e n t ( in t ) b o t ó n . La cla s e Ab s t ra c t Bu t t o n
v o id s e t Ve rt ic a lAlig n m e n t ( in t ) d e fin e t re s p o s ib le s va lo re s p a ra
[ t o d a vía n o ]
in t g e t Ho riz o n t a lAlig n m e n t ( ) a lin e a ció n h o rizo n t a l: LEFT,
in t g e t Ve rt ic a lAlig n m e n t ( ) CEN TER ( p o r d e fe ct o ) , y LEFT. Pa ra
a lin e a ció n ve rt ica l: TOP , CEN TER
( p o r d e fe ct o ) , y BOTTOM.
S e le ccio n a n u o b t ie n e n d o n d e s e
d e b e s it u a r e l t e xt o d e l b o t ó n , e n
v o id re la ció n a la im a g e n d e l b o t ó n . La
s e t Ho riz o n t a lTe x t P o s it io n ( in t ) cla s e Ab s t ra c t Bu t t o n d e fin e t re s
v o id s e t Ve rt ic a lTe x t P o s it io n ( in t ) p o s ib le s va lo re s p a ra a lin e a ció n [ t o d a vía n o ]
in t g e t Ho riz o n t a lTe x t P o s it io n ( ) h o rizo n t a l: LEFT, CEN TER y LEFT
in t g e t Ve rt ic a lTe x t P o s it io n ( ) ( p o r d e fe ct o ) . Pa ra a lin e a ció n
ve rt ica l: TOP , CEN TER ( p o r
d e fe ct o ) , y BOTTOM.
S e le ccio n a u o b t ie n e e l n ú m e ro d e
v o id s e t P a d ( I n s e t s )
p ixe ls e n t re e l b o rd e d e l b o t ó n y s u s [ t o d a vía n o ]
Ins e ts g e tPa d( )
co n t e n id o s .
S e le ccio n a u o b t ie n e s i e l b o t ó n
v o id s e t Fo c u s P a in t e d ( b o o le a n )
d e b e ría p a re ce r d ife re n t e cu a n d o [ t o d a vía n o ]
b o o le a n is Fo c u s P a in t e d ( )
t ie n e e l fo co .
v o id s e t Bo rd e rP a in t e d ( b o o le a n ) S e le ccio n a u o b t ie n e s u e l b o rd e r d e l
[ t o d a vía n o ]
b o o le a n is Bo rd e rP a in t e d ( ) b o t ó n d e b e ría s e r d ib u ja d o .
Im p le m e n t a r la Fu n cio n a lid a d d e l Bo t ó n
Metodos o Constructor Propósito Ejemplo
S e le ccio n a u o b t ie n e s i e l
b o t ó n e s t á s e le ccio n a d o . S o lo
v o id s e t S e le c t e d ( b o o le a n )
t ie n e s e n t id o s i e l b o t ó n t ie n e [ t o d a vía n o ]
b o o le a n is S e le c t e d ( )
u n e s t a d o d e o n / o ff, co m o lo s
ch e ckb o xe s .
Ob t ie n e lo s o b je t o s
s e le ccio n a d o s d e n t ro d e l
b o t ó n . Tie n e s e n t id o s ó lo p a ra
Ob je c t [ ] g e t S e le c t e d Ob je c t s ( ) [ t o d a vía n o ]
lo s b o t o n e s co m o Me n u s q u e
co n t ie n e n m u ch o s ít e m s
s e le ccio n a b le s .
S e le ccio n a u o b t ie n e e l
v o id s e t Ac t io n Co m m a n d ( S t rin g )
n o m b re d e la a cció n re a liza d a [ t o d a vía n o ]
S t rin g g e t Ac t io n Co m m a n d ( v o id )
por e l botón.
S e le ccio n a u o b t ie n e la t e cla
v o id s e t Ke y Ac c e le ra t o r( c h a r) Bu t t o n D e m o . ja v a
a lt e rn a t iva p a ra p u s la r e l
c h a r g e t Ke y Ac c e le ra t o r( )
botón.
v o id
Añ a d e o e lim in a u n o b je t o q u e
a d d Ac t io n Lis t e n e r( Ac t io n Lis t e n e r)
e s cu ch a lo s e ve n t o s a ct ió n [ t o d a vía n o ]
Ac t io n Lis t e n e r
d is p a ra d o s p o r e l b o t ó n .
re m o v e Ac t io n Lis t e n e r( )
v o id
Añ a d e o e lim in a u n o b je t o q u
a d d Ch a n g e Lis t e n e r( Ch a n g e Lis t e n e r)
e s cu ch a lo s e ve n t o s ch a n g e [ t o d a vía n o ]
Ch a n g e Lis t e n e r
d is p a ra d o s p o r e l b o t ó n .
re m o v e Ch a n g e Lis t e n e r( )
Añ a d e o e lim in a u n o b je t o q u e
v o id a d d I t e m Lis t e n e r( I t e m Lis t e n e r)
e s u ch a lo s e ve n t o s ít e m [ t o d a vía n o ]
I t e m Lis t e n e r re m o v e I t e m Lis t e n e r( )
d is p a ra d o s p o r e l b o t ó n .
Pro g ra m a t ica m e n t e re a liza u n
v o id d o Clic k ( ) [ t o d a vía n o ]
"click".

Oz it o
Cómo utilizar Checkboxes
La ve rs ió n S win g s o p o rt a ch e ckb o xe s co n la s cla s e s JCh e c k b o x y Bu t t o n Gro u p . Co m o JCh e c k b o x
d e s ce ice n d e d e Ab s t ra c t Bu t t o n , lo s ch e ckb o xe s d e S win g t ie n e n t o d a s la s ca ra ct e ris t ica s n o rm a le s d e
lo s b o t o n e s , co m o s e e xp lica e n la p á g in a a n t e rio r. Po r e je m p lo , s e p u e d e n e s p e cifica r im á g e n e s p a ra
u t iliza rla s e n lo s ch e ckb o xe s .
Aq u í t ie n e s u n a im a g e n d e u n a a p lica ció n q u e t ie n e d o s ch e ckb o xe s :

Inte nta e s to :
1 . Co m p ila y e je cu t a la a p lica ció n . El fich e ro fu e n t e e s t á e n Ch e c k b o x D e m o . ja v a .
Pu e d e s ve r la p á g in a Em p e za n d o co n S win g s i n e ce s it a s a yu d a .
2 . Pu ls a e l b o t ó n 2 .
El b o t ó n 2 s e s e le ccio n a y e l b o t ó n 1 p e rm a n e ce s e le cio n a d o .
3 . Mira e l m e s a je m o s t ra d o e n la s a lid a e s t á n d a rd .
Es t a a p lica ció n re g is t ra u n o ye n t e p a ra ca d a t ip o d e e ve n t o q u e u n b o t ó n p u e d e e n via r.
Ca d a ve z q u e re cib e u n e ve n t o , la a p lica ció n m u e s t ra u n m e n s a je q u e d e s crib e e l
e ve n t o .
4 . Pu ls a d e n u e vo e l b o t ó n 2 , y m ira lo s m e n s a je s m o s t ra d o s e n la s a lid a e s t á n d a rd .

Un ch e ckb o x g e n e ra u n e ve n t o d e ít e m y u n e ve n t o d e a cció n p o r ca d a p u ls a ció n , . No rm a lm e n t e , lo


ú n ico q u e n e ce s it a u n m a n e ja d o r d e e ve n t o s d e ch e ckb o xe s e s u n o ye n t e d e ít e m . S i t u p re fie re s u t iliza r
e l API a s o cia d o co n lo s e ve n t o s a cció n , p u e d e s u t iliza r u n o ye n t e d e a cció n e n s u lu g a r. No s e n e ce s it a
im p le m e n t a r u n o ye n t e d e ca m b io a m e n o s q u e t u p ro g ra m a n e ce s it e s a b e r e n t o d o m o m e n t o lo s
ca m b io s d e a p a rie n cia d e l b o t ó n .
Ab a jo t ie n e s e l có d io d e Ch e c k b o x D e m o . ja v a q u e cre a lo a ch e ckb o xe s d e l e je m p lo a n t e rio r y
re a ccio n a a lo s cliks .

//en el código de inicialización:


// Crear los botones.
JCheckbox firstButton = new JCheckbox(first);
firstButton.setKeyAccelerator('1');
firstButton.setActionCommand(first);
firstButton.setSelected(true);

JCheckbox secondButton = new JCheckbox(second);


secondButton.setKeyAccelerator('2');
secondButton.setActionCommand(second);

// Registra un oyente para los checkboxes.


CheckboxListener myListener = new CheckboxListener();
firstButton.addActionListener(myListener);
firstButton.addChangeListener(myListener);
firstButton.addItemListener(myListener);
secondButton.addActionListener(myListener);
secondButton.addChangeListener(myListener);
secondButton.addItemListener(myListener);
. . .
class CheckboxListener implements ItemListener, //Sólo es necesario el tipo
ActionListener, //sólo por curiosidad
ChangeListener { //sólo por curiosidad
public void itemStateChanged(ItemEvent e) {
System.out.println("ItemEvent received: "
+ e.getItem()
+ " is now "
+ ((e.getStateChange() == ItemEvent.SELECTED)?
"selected.":"unselected"));
}

public void actionPerformed(ActionEvent e) {


String factoryName = null;

System.out.print("ActionEvent received: ");


if (e.getActionCommand() == first) {
System.out.println(first + " pressed.");
} else {
System.out.println(second + " pressed.");
}
}

public void stateChanged(ChangeEvent e) {


System.out.println("ChangeEvent received from: "
+ e.getSource());
}
}
Pu e d e s ve r la p á g in a Ho w t o Us e Bu t t o n s p a ra m á s in fo rm a ció n s o b re e l API d e Ab s t ra c t Bu t t o n d e l
q u e d e s cie n d e JCh e c k b o x . El ú n ico API d e fin id o p o r JCh e c k b o x q u e t e g u s t a rá u t iliza r s o n lo s
co n s t ru ct o re s . JCh e c k b o x d e fin e s ie t e co n s t ru ct o re s :
● JCh e c k b o x ( S t rin g )

● JCh e c k b o x ( S t rin g , b o o le a n )

● JCh e c k b o x ( I c o n )

● JCh e c k b o x ( I c o n , b o o le a n )

● JCh e c k b o x ( S t rin g , I c o n )

● JCh e c k b o x ( S t rin g , I c o n , b o o le a n )

● JCh e c k b o x ( )

Lo s a rg u m e n t o s s o n co rre ct o s :
S t rin g
Es p e cifica e l t e xt o q u e d e b e ría m o s t ra r e l ch e ckb o x.
Icon
Es p e cifica la im a g e n q u e d e b e ría m o s t ra r e l ch e ckb o x. A m e n o s q u e s e e s p e cifiq u e u n a im a g e n s e
u t iliza n la s im á g e n e s d e fin id a s p o r la m á q u in a virt u a l.
b o o le a n
Es p e cifica s i e l ch e ckb o x e s t á s e le ccio n a d o . Po r d e fe ct o e s fa ls e [ n o s e le ccio n a d o ] .

Oz it o
Cómo utilizar Labels
Co n la cla s e JLa b e l, p u e d e s m o s t ra r u n t e xt o s e le ccio n a b le e im á g e n e s . La s
e t iq u e t a s n o p u e d e n o b t e n e r e l fo co d e l t e cla d o .
Aq u í t ie n e s u n g rá fico d e u n a a p lica ció n q u e m u e s t ra t re s e t iq u e t a s . La ve n t a n a
e s t á d ivid id a e n t re s co lu m n a s d e la m is m a a lt u ra ; la e t iq u e t a d e ca d a co lu m n a e s
t a n a n ch a co m o s e a p o s ib le .

Inte nta e s to :
1 . Co m p ila y e je cu t a la a p lica ció n . El fich e ro fu e n t e e s t á e n
La b e lD e m o . ja v a .
Pu e d e s ve r la p á g in a Em p e za r co n S win g s i n e ce s it a s a yu d a .
2 . Re d im e n s io n a la ve n t a n a p a ra p o d e r ve r có m o s e a lin e a n la s
e t iq u e t a s .
To d a s la s e t iq u e t a s t ie n e n la a lin e a ció n ve rt ica r p o r d e fe ct o - - e s t á n
e n e l ce n t ro ve rt ica l d e s u e s p a cio . La e t iq u e t a d e l n ive l s u p e rio r
q u e co n t ie n e t a n t o im a g e n co m o t e xt o , e s t á e s p e cifica d a p a ra t e n e r
a lin e a m ie n t o h o rizo n t a l ce n t ra d o . La s e g u n d a e t iq u e t a , q u e s ó lo
co n t ie n e t e xt o , t ie n e a lin e a m ie n t o a la izq u ie rd a q u e e s p o r d e fe ct o
p a ra la s e t iq u e t a s d e s ó lo t e xt o . La t e rce ra e t iq u e t a , q u e s ó lo
co n t ie n e u n a im a g e n , t ie n e a lin e a m ie n t o h o rizo n t a l ce n t ra d o q u e e s
p o r d e fe ct o p a ra la s e t iq u e t a s d e s ó lo im a g e n .

Ab a jo t ie n e s e l có d ig o d e La b e lD e m o . ja v a q u e cre a la s e t iq u e t a s e n e l e je m p lo
a n t e rio r.

ImageIcon icon = new ImageIcon("middle.gif");


. . .
label1 = new JLabel("Image and Text", icon, JLabel.CENTER);
label1.setVerticalTextPosition(JLabel.BOTTOM);
label1.setHorizontalTextPosition(JLabel.CENTER);

label2 = new JLabel("Text-Only Label");


label3 = new JLabel(icon);

//Add labels to the JPanel.


add(label1);
add(label2);
add(label3);
La s s ig u ie n t e s t a b la s lis t a n lo s co n s t ru ct o re s y m é t o d o s d e JLa b e l m á s u t iliza d o s .
Ot ro s m é t o d o s q u e p o d ría s u t iliza r e s t á n d e fin id o s e n la cla s e Co m p o n e n t . En t re
e lla s s e in clu ye n s e t Fo n t y s e t Fo re g ro u n d .
S e le ccio n a r u Ob t e n e r lo s co n t e n id o s d e u n a Et iq u e t a
Método o Constructor Propósito Ejemplo
Cre a u n e je m p la r d e JLa b e l,
in icia lizá n d o lo p a ra q u e t e n g a e l
t e xt o / im a g e n / a lin e a m ie n t o
e s p e cifica d o . El a rg u m e n t o in t
JLa b e l( I c o n ) e s p e cifica e l a lin e a m ie n t o
JLa b e l( I c o n , in t ) h o rizo n t a l d e l co n t e n id o d e la
JLa b e l( S t rin g ) e t iq u e t a d e n t ro d e s u á re a d e La b e lD e m o . ja v a
JLa b e l( S t rin g , I c o n , in t ) d ib u jo . El a lin e a m ie n t o d e b e s e r
JLa b e l( S t rin g , in t ) u n a d e la s s ig u ie n t e s co n s t a n t e s
JLa b e l( ) d e fin id a s e n e l in t e rfa ce
Gra p h ic s Ut ils Co n s t a n t s ( q u e
im p le m e n t a JLa b e l) : LEFT,
CEN TER, o r LEFT.
v o id s e t Te x t ( S t rin g ) S e le ccio n a u o b t ie n e e l t e xt o
[ To d a vía n in g u n o ]
S t rin g g e t Te x t ( ) m o s t ra d o e n la e t iq u e t a .
v o id s e t I c o n ( I c o n ) S e le ccio n a u o b t ie n e la im a g e n
[ To d a vía n in g u n o ]
Ico n g e tIco n( ) m o s t ra d a p o r la e t iq u e t a .
S e le ccio n a u o b t ie n e la le t ra q u e
d e b e ría a p a re ce r co m o a t a jo d e
t e cla d o . Es t o e s ú t il cu a n d o u n a
v o id
e t iq u e t a d e s crib e u n
s e t Re p re s e n t e d Ke y Ac c e le ra t o r( c h a r) [ t o d a vía n in g u n o ]
co m p o n e n t e [ co m o u n ca m p o
c h a r g e t Re p re s e n t e d Ke y Ac c e le ra t o r( )
d e t e xt o ] q u e t ie n e u n a t e cla d e
a t a jo d e t e cla d o p e ro n o p u e d e
m o s t ra rlo .
S e le ccio n a la im a g e n q u e s e
m u e s t ra e n la e t iq u e t a cu a n d o
e s t á d e s a ct iva d a . S i n o s e
v o id s e t D is a b le d I c o n ( I c o n )
e s p e cifica u n a im a g e n , la [ To d a vía n in g u n o ]
I c o n g e t D is a b le d I c o n ( )
m á q u in a virt u a l cre a u n a
m e d ia n t e u n a m a n ip u la ció n d e
la im a g e n p o r d e fe ct o .
Aju s t e Fin o d e la Ap a rie n cia d e u n a Et iq u e t a
Método Propósito Ejemplo
S e le ccio n a u o b t ie n e d ó n d e s e d e b e
s it u a r e l co n t e n id o d e la e t iq u e t a . El
in t e rfa ce Gra p h ic s Ut ils Co n s t a n t s
v o id s e t Ho riz o n t a lAlig n m e n t ( in t ) d e fin e t re s p o s ib le s va lo re s p a ra e l
v o id s e t Ve rt ic a lAlig n m e n t ( in t ) a lin e a m ie n t o h o rizo n t a l: LEFT ( p o r [ To d a vía n in g u n o ]
in t g e t Ho riz o n t a lAlig n m e n t ( ) d e fe ct o p a ra e t iq u e t a s d e s ó lo t e xt o ) ,
in t g e t Ve rt ic a lAlig n m e n t ( ) CEN TER ( Po r d e fe ct o p a ra e t iq u e t a s
d e s ó lo im a g e n ) , o LEFT. Pa ra
a lin e a m ie n t o ve rt ica l: TOP , CEN TER
( p o r d e fe ct o ) , y BOTTOM.
S e le ccio n a u o b t ie n e d ó n d e s e d e b e ría
s it u a r e l t e xt o , e n re la ció n co n la
v o id im a g e n . El in t e rfa ce
s e t Ho riz o n t a lTe x t P o s it io n ( in t ) Gra p h ic s Ut ils Co n s t a n t s d e fin e t re s
v o id s e t Ve rt ic a lTe x t P o s it io n ( in t ) p o s ib le s va lo re s p a ra p o s ició n La b e lD e m o . ja v a
in t g e t Ho riz o n t a lTe x t P o s it io n ( ) h o rizo n t a l: LEFT, CEN TER, y LEFT
in t g e t Ve rt ic a lTe x t P o s it io n ( ) ( p o r d e fe ct o ) . Pa ra p o s ició n ve rt ica l:
TOP , CEN TER ( p o r d e fe ct o ) , y
BOTTOM.
v o id s e t I c o n Te x t Ga p ( in t ) S e le ccio n a e l n ú m e ro d e p ixe ls e n t re e l
[ To d a vía n in g u n o ]
in t g e t I c o n Te x t Ga p ( ) t e xt o y la im a g e n d e la e t iq u e t a .

Oz it o
Cómo utilizar Botones de Radio
Lo s b o t o n e s d e Ra d io s o n g ru p o s d e b o t o n e s e n lo s q u e s ó lo u n o d e e llo s p u e d e s e r s e le ccio n a d o a
la ve z. La ve rs ió n S win g s o p o rt a b o t o n e s d e ra d io co n la s cla s e s JRa d io Bu t t o n y Bu t t o n Gro u p .

Co m o JRa d io Bu t t o n d e s cie n d e d e Ab s t ra c t Bu t t o n , lo s b o t o n e s d e ra d io d e S win g t ie n e n la s


ca ra ct e rís it ca s n o rm a le s d e lo s b o t o n e s , co m o s e e xp lica e n la p á g in a Có m o u t iliza r Bo t o n e s . Po r
e je m p lo , p u e d e s e s p e cifica r e l t e xt o ( s i lo h a y) y la im a g e n e n u n b o t ó n d e ra d io .
Aq u í t ie n e s u n g rá fico d e u n a a p lica ció n q u e t ie n e d o s b o t o n e s d e ra d io :

Inte nta e s to :
1 . Co m p ila y e je cu t a la a p lica ció n . El fich e ro fu e n t e e s t á e n Ra d io Bu t t o n D e m o . ja v a .
Pu e d e s ve r la p á g in a Em p e za r co n S win g s i n e ce s it a s a yu d a .
2 . Pu ls a e l b o t ó n 2 .
El b o t ó n 2 s e s e le ccio n a , lo q u e h a ce q u e e l b o t ó n 1 s e d e s e le ccio n e .
3 . Mira lo s m e n s a je s m o s t ra d o s e n la s a lid a e s t á n d a rd .
Es t a a p lica ció n re g is t ra u n o ye n t e p a ra ca d a t ip o d e e ve n t o q u e p u e d e e n via r u n
b o t ó n - - a ct io n , ch a n g e e ít e m . Ca d a ve z q u e re cib e u n e ve n t o la a p lica ció n
m u e s t ra u n m e n s a je q u e d e s crib e e l e ve n t o .
4 . Pu ls a d e n u e vo e l b o t ó n 1 , y m ira lo s m e n s a je s m o s t ra d o s e n la s a lid a e s t á n d a rd .

No rm a lm e n t e , lo ú n ico q u e n e ce s it a u n m a n e ja d o r d e e ve n t o s d e u n b o t ó n d e ra d io e s u n o ye n t e
d e a ct io n . Pu e d e s u t iliza r u n o ye n t e d e ít e m e n s u lu g a r, s i s ó lo e s t á s m o n it o riza n d o lo s ca m b io s
d e e s t a d o , e n ve z d e la p ro p ia a cció n . No s e n e ce s it a im p le m e n t a r u n o ye n t e d e ca m b io a m e n o s
q u e n e ce s it e s s a b e r e n ca d a m o m e n t o s i la a p a rie n cia d e l b o t ó n h a ca m b ia d o .
Ab a jo t ie n e s e l có d ig o d e Ra d io Bu t t o n D e m o . ja v a q u e cre a lo s b o t o n e s d e ra d io d e l e je m p lo
a n t e rio r y re a ccio n a a lo s clicks .

//En el código de inicialización:


// Crear los botones.
JRadioButton firstButton = new JRadioButton(first);
firstButton.setKeyAccelerator('1');
firstButton.setActionCommand(first);
firstButton.setSelected(true);

JRadioButton secondButton = new JRadioButton(second);


secondButton.setKeyAccelerator('2');
secondButton.setActionCommand(second);

// Agrupa los botones de radio.


ButtonGroup group = new ButtonGroup();
group.add(firstButton);
group.add(secondButton);

// Registra un oyente para los botones de radio.


RadioListener myListener = new RadioListener();
firstButton.addActionListener(myListener);
firstButton.addChangeListener(myListener);
firstButton.addItemListener(myListener);
secondButton.addActionListener(myListener);
secondButton.addChangeListener(myListener);
secondButton.addItemListener(myListener);
. . .
class RadioListener implements ActionListener, ChangeListener, ItemListener {
public void actionPerformed(ActionEvent e) {
String factoryName = null;

System.out.print("ActionEvent received: ");


if (e.getActionCommand() == first) {
System.out.println(first + " pressed.");
} else {
System.out.println(second + " pressed.");
}
}

public void itemStateChanged(ItemEvent e) {


System.out.println("ItemEvent received: "
+ e.getItem()
+ " is now "
+ ((e.getStateChange() == ItemEvent.SELECTED)?
"selected.":"unselected"));
}

public void stateChanged(ChangeEvent e) {


System.out.println("ChangeEvent received from: "
+ e.getSource());
}
}
Pu e d e s ve r la p á g in a Có m o u t iliza r Bo t o n e s p a ra m á s in fo rm a ció n s o b re e l API d e
Ab s t ra c t Bu t t o n d e l q u e d e s cie n d e JRa d io Bu t t o n . JRa d io Bu t t o n d e fin e s ie t e co n s t ru ct o re s :
● JRa d io Bu t t o n ( S t rin g )

● JRa d io Bu t t o n ( S t rin g , b o o le a n )

● JRa d io Bu t t o n ( I c o n )

● JRa d io Bu t t o n ( I c o n , b o o le a n )

● JRa d io Bu t t o n ( S t rin g , I c o n )

● JRa d io Bu t t o n ( S t rin g , I c o n , b o o le a n )

● JRa d io Bu t t o n ( )

Lo s a rg u m e n t o s s o n :
S t rin g
Es p e cifica e l t e xt o q u e d e b e ría m o s t ra r e l b o t ó n d e ra d io .
Icon
Es p e cifica la im a g e n q u e d e b e ría m o s t ra r e l b o t ó n d e ra d io . A m e n o s q u e s e e s p e cifiq u e u n a
im a g e n , la m á q u in a virt u a l u t iliza rá la s im á g e n e s p re d e fin id a s .
b o o le a n
Es p e cifica s i e l b o t ó n d e ra d io e s t á s e le ccio n a d o . Po r d e fe ct o e s fa ls e ( n o s e le ccio n a d o ) .
Pa ra ca d a g ru p o d e b o t o n e s d e ra d io , n e ce s it a s cre a r u n e je m p la r d e Bu t t o n Gro u p y a ñ a d irle
ca d a u n o d e lo s b o t o n e s d e ra d io . El Bu t t o n Gro u p a s e g u ra q u e s ó lo u n o d e lo s b o t o n e s d e g ru p o
e s t é s e le ccio n a d o . Aq u í t ie n e s lo s m é t o d o s y co n s t ru ct o re s d e Bu t t o n Gro u p :
Bu t t o n Gro u p ( )
Cre a u n e je m p la r d e Bu t t o n Gro u p .
a d d ( Ab s t ra c t Bu t t o n )
Añ a d e a l g ru p o e l b o t ó n e s p e cifica d o .
re m o v e ( Ab s t ra c t Bu t t o n )
Elim in a e l b o t ó n e s p e cifica d o d e l g ru p o .

Oz it o
Cómo utilizar Pestañas
Co n la cla s e JTa b b e d P a n e , p u e d e s t e n e r va rio s co m p o n e n t e s [ n o rm a lm e n t e
o b je t o s JP a n e l) co m p a rt ie n d o e l m is m o e s p a cio . El u s u a rio p u e d e e le g ir e l
co m p o n e n t e q u e q u ie re ve r s e le ccio n a n d o la p e s t a ñ a co rre s p o n d ie n t e a l
co m p o n e n t e d e s e a d o . S i q u ie re s u n a fu n cio n a lid a d s im ila r s in e l in t e rfa ce d e
p e s t a ñ a s , p o d ría s u t iliza r e l co n t ro la d o r d e d is p o s ició n Ca rd La y o u t e n ve z d e
JTa b b e d P a n e .
Pa ra cre a r u n a p e s t a ñ a , s ó lo d e b e s e je m p la riza r JTa b b e d P a n e , cre a r lo s
co m p o n e n t e s q u e d e s e a s m o s t ra r, y lu e g o a ñ a d ir lo s co m p o n e t e s a la s p e s t a ñ a s .
Aq u í t ie n e s u n a im a g e n d e u n a a p lica ció n q u e u t iliza cu a t ro p e s t a ñ a s :

Inte nta e s to :
1 . Co m p ila y e je cu t a la a p lica ció n . El fich e ro fu e n t e e s t á e n
Ta b b e d P a n e D e m o . ja v a .
Pu e d e s ve r la p á g in a Em p e za r co n S win g s i n e ce s it a s a yu d a .
2 . Po n e l cu rs o r s o b re u n a p e s t a ñ a .
De p u é s d e u n m o m e n t o , ve rá s e l a vis o a s o cia d o co n la e t iq u e t a .
Co m o e s co n ve n ie n t e , p u e d e s e s p e cifica r u n t e xt o d e a vis o cu a n d o
a ñ a d a s u n co m p o n e n t e a u n a p e s t a ñ a .
3 . S e le ccio n a u n a p e s t a ñ a .
La p e s t a ñ a m u e s t ra e l co m p o n e n t e co rre s p o n d ie n t e .

Un a p e s t a ñ a p u e d e m o s t ra r t a n t o t e xt o co m o im á g e n e s .
Ab a jo t ie n e s e l có d ig o d e Ta b b e d P a n e D e m o . ja v a q u e cre a la s p e s t a ñ a s d e l
e je m p lo a n t e rio r. Ob s e rva q u e n o e s n e ce s a rio e l có d ig o d e m a n e jo d e e ve n t o s . El
o b je t o JTa b b e d P a n e s e o cu p a d e la s e n t ra d a s d e l u s u a rio p o r t í.

JTabbedPane tabbedPane = new JTabbedPane();

Component panel1 = makeTextPanel("Blah");


tabbedPane.addTab("One", null, panel1, "Does nothing");
tabbedPane.setSelectedIndex(0);
Component panel2 = makeTextPanel("Blah blah");
tabbedPane.addTab("Two", null, panel2, "Does nothing");

Component panel3 = makeTextPanel("Blah blah blah");


tabbedPane.addTab("Three", null, panel3, "Does nothing");

Component panel4 = makeTextPanel("Blah blah blah blah");


tabbedPane.addTab("Four", null, panel4, "Does nothing");
. . .
add(tabbedPane);

Oz it o
Cómo utilizar Tablas
Co n la cla s e JTa b le , p u e d e s m o s t ra r t a b la s d e d a t o s . JTa b le n o co n t ie n e d a t o s , e s s ó lo u n a vis t a
d e t u s d a t o s . Es t a fo rm a d e ca ch é h a ce q u e JTa b le fu n cio n e b ie n , in clu s o cu a n d o lo s d a t o s vie n e n
d e u n a e n o rm e b a s e d e d a t o s . JTa b le t ie n e d e m a s ia d a s ca ra ct e rís t ica s p a ra p o d e r s e r d e s crit a s
co m p le t a m e n t e e n e s t e t u t o ria l, p o r e s o s ó lo n o s re fe rire m o s a la s ca ra ct e rís it ca s m á s u t iliza d a s
p o r la m a yo ría d e lo s p ro g ra m a d o re s .
Pa ra u t iliza r JTa b le , d e b e rá s e s crib ir u n m o d e lo d e d a t o s - - u n o b je t o q u e s u m in is t re d a t o s a la
t a b la . Pu e d e s h a ce r e s t o cre a n d o u n a s u b cla s e d e JTa b le D a t a Mo d e lAd a p t e r. Un m o d e lo d e d a t o s
co n t ie n e m é t o d o s p a ra o b t e n e r y s e le ccio n a r va lo re s d e d a t o s , o b t e n e r e l n ú m e ro d e fila s
( re g is t ro s ) d e d a t o s , y p a ra a ñ a d ir o e lim in a r o ye n t e s d e e ve n t o s . [ Lo s o ye n t e s d e Ta b la s o n
o b je t o s co m o JTa b le q u e s o n n o t ifica d o s ca d a ve r q u e e l m o d e lo d e d a t o s ca m b ia . ]
Cu a n d o in icia lice s u n a JTa b le , d e b e rá s p ro p o rcio n a r u n o b je t o JTa b le Co lu m n p a ra ca d a co lu m n a .
Ca d a o b je t o JTa b le Co lu m n id e n t ifica u n a co lu m n a d e d a t o s y e s p e cífica co m o d e b e ría n s e r
m o s t ra d o s .
Aq u í t ie n e s u n a im a g e n d e u n a a p lica ció n q u e m u e s t ra u n a t a b la e n u n p a n e l d e s p la za b le :

Inte nta e s to :
1 . co m p ila y e je cu t a la a p lica ció n . El fich e ro fu e n t e e s t á e n S im p le Ta b le D e m o . ja v a .
Pu e d e s ve r la p á g in a Em p e za r co n S win g s i n e ce s it a s a yu d a .
2 . Pu ls a s o b re u n a ce ld a .
La fila e n t e ra e s s e le ccio n a d a . Es t o e s in t e n cio n a d o p a ra re co rd a rt e q u e JTa b le
im p le m e n t a u n a b a s e d e d a t o s n o u n a h o ja d e cá lcu lo .
3 . Po s icio n a e l cu rs o r s o b re la ca b e ce ra "Firs t Na m e ". Ah o ra p u ls a e l b o t ó n d e l ra t ó n y
a rra s t ra la ca b e ce ra a la d e re ch a .
Co m o p u e d e s ve r, lo s u s u a rio s p u e d e n re o rd e n a r la s co lu m n a s d e la t a b la . Es t e
p o s icio n a m ie n t o fle xib le e s p o rq u e la s co lu m n a s e s t á n e s p e cifica d a s co m o o b je t o s
e n ve z d e ín d ice s [ co m o s e u t iliza p a ra la s fila s ] .
4 . Po s icio n a e l cu rs o r a l b o rd e d e re ch o d e la ca b e ce ra . Ah o ra p u ls a e l b o t ó n d e l ra t ó n y
a rra s t ra lo a la d e re ch a o la izq u ie rd a .
La co lu m n a ca m b ia d e t a m a ñ o .
5 . Re d im e n s io n a la ve n t a n a q u e co n t ie n e la t a b la p a ra q u e s e a m a yo r q u e e l co n t e n id o
co m p le t o d e la t a b la .
La s ce ld a s d e la t a b la p e rm a n e ce n co n e l m is m o t a m a ñ o , y p e rm a n e ce n e n la
e s q u in a s u p e rio r izq u ie rd a d e l á re a d e p a n t a lla .

Ab a jo t ie n e s e l có d ig o d e S im p le Ta b le D e m o . ja v a q u e im p le m e n t a la t a b la d e l e je m p lo a n t e rio r.

//En el código de inicialización de una subclase de JPanel:


MyDataModel myDataModel = new MyDataModel();
JTable table = new JTable(myDataModel);
for (int columnIndex = 0;
columnIndex < myDataModel.numColumns;
columnIndex++) {
JTableColumn newColumn = new JTableColumn(
myDataModel.getColumnName(columnIndex));
table.addColumn(newColumn);
newColumn.sizeWidthToFit();
}

//Crea el panel desplazable y le añade la tabla.


JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table);

//hace que la cabecera de la tabla no se desplace.


JViewport columnHeading = new JViewport();
columnHeading.setView(table.getTableHeader());
columnHeading.setLayout(new BoxLayout(columnHeading, //HACK
BoxLayout.X_AXIS));
scrollPane.setColumnHeading(columnHeading);
. . .
class MyDataModel extends JTableDataModelAdapter {

//Datos inútiles.
final Object[][] data = {
{"First Name", "Mary", "Alison", "Kathy", "Mark", "Angela"},
{"Last Name", "Campione", "Huml", "Walrath", "Andrews", "Lih"},
{"Sport", "Snowboarding", "Rowing", "Chasing toddlers", "Speed reading",
"Teaching high school"},
{"Est. Years Experience", "5", "3", "2", "20", "4"},
};

public int numColumns = data.length;


protected int numRows = data[0].length - 1;

public int getRowCount() {


return numRows;
}

public Object getValueAt(Object columnIdentifier, int rowIndex) {


for (int columnIndex = 0; columnIndex < numColumns; columnIndex++) {
if (data[columnIndex][0].equals(columnIdentifier)) {
return data[columnIndex][rowIndex+1];
}
}
return "NO DATA";
}

public void setValueAt(Object aValue,


Object columnIdentifier,
int rowIndex) {
}

/** This method isn't in TableDataModel. */


public String getColumnName(int columnIndex) {
return (String)data[columnIndex][0];
}
}

Oz it o
Cómo utilizar Tool Tips
Cre a r u n To o l Tip [ e t iq u e t a d e a yu d a ] p a ra cu a lq u ie r JCo m p o n e n t e s s e n cillo , S ó lo d e b e s
u t iliza r e l m é t o d o s e t To o lTip Te x t p a ra a ct iva r e l To o l Tip d e l co m p o n e n t e . Po r e je m p lo ,
p a ra a ñ a d ir [ e t iq u e t a s d e a yu d a ] a lo s t re s b o t o n e s d e l p ro g ra m a Bu t t o n D e m o
( e xp lica d o e n la p á g in a Có m o Ut iliza r Bu t t o n s ) , s ó lo t ie n e s q u e a ñ a d ir t re s lín e a s d e
có d ig o :

b1.setToolTipText("Click this button to disable the middle button.");


b2.setToolTipText("This middle button does nothing when you click it.");
b3.setToolTipText("Click this button to enable the middle button.");
Cu a n d o e l u s u a rio d e l p ro g ra m a p a re e l cu rs o r s o b re u n o d e lo s b o t o n e s d e l p ro g ra m a la
[ e t iq u e t a d e a yu d a ] s e m o s t ra rá . Po r e je m p lo :

[ Po r fa vo r im á g in a t e u n cu rs o r s o b re e l b o t ó n izq u ie rd o . Gra cia s . ]


Pa ra m á s in fo rm a ció n s o b re To o l Tip s p u e d e s le e r la d o cu m e n t a ció n d e la s cla s e s
JTo o lTip y JCo m p o n e n t e n la s it e d e S u n .

Oz it o
Cómo Utilizar Trees
Co n la cla s e JTre e , p u e d e s m o s t ra r d a t o s e n fo rm a d e á rb o l. JTre e re a lm e n t e n o co n t ie n e t u s
d a t o s , s im p le m e n t e e s u n a vis t a d e e llo s . Aq u í t ie n e s u n a im a g e n d e u n a á rb o l:

Co m o m u e s t ra la im a g e n a n t e rio r, JTre e m u e s t ra s u s d a t o s ve rt ica lm e n t e . Ca d a fila co n t ie n e


e xa ct a m e n t e u n ít e m d e d a t o s [ lla m a d o n o d o ) . Ca d a á rb o l t ie n e u n n o d o ra iz [ lla m a d o Ro o t e n la
fig u ra a n t e rio r] d e l q u e d e s cie n d e n t o d o s lo s n o d o s . Lo s n o d o s q u e n o p u e d e n t e n e r h ijs o s e
lla m a n n o d o s h o ja . En la fig u ra a n t e rio r s e m a rca n lo s n o d o s h o ja co n u n círcu lo .
Lo s n o d o s q u e n o s o n h o ja s p u e d e n t e n e r cu a lq u ie r n ú m e ro d e h ijo s , o in clu s o n in g u n o . En la
im a g e n s u p e rio r lo s e s t o s n o d o s e s t á n re p re s e n t a d o s p o r u n a ca rp e t a . No rm a lm e n t e e l u s u a rio
p o d rá e xp a n d ir y co n t ra e r lo s n o d o s q u e n o n h o ja s - - h a cie n d o q u e s u s h ijo s s e a n vis ib le s o
in vis ib le s . Po r d e fe ct o e s t o s n o d o s a rra n ca s co n t ra id o s .
Cu a n d o in icia liza s u n Tre e , cre a s u n e je m p la r d e Tre e N o d e p a ra ca d a u n o d e lo s n o d o s .
In clu ye n d o e l ra íz. Pa ra h a ce r u n n o d o h o ja , lla m a a s u m é t o d o s e t Allo w s Ch ild re n ( fa ls e ) .
Cu a n d o lo s d a t o s ca m b ia n - - p o r e je m p lo , s e a ñ a d e n n o d o s - - p u e d e s p e rm it ir q u e
JTre e [ Mo d e l? ] s e p a n q u e h a y n u e vo s d a t o s in co ca n d o u n o d e lo s m é t o d o s d e
Tre e Mo d e lLis t e n e r. En t o n ce s JTre e m u e s t ra lo s n u e vo s d a t o s .

Aq u í t ie n e s u n g rá fico d e u n a a p lica ció n q u e m u e s t ra e l t re e e n u n S cro ll Pa n e :

Inte nta e s to :
1 . Co m p ila y e je cu t a la a p lica ció n . El fich e ro fu e n t e e s t á e n Tre e D e m o . ja v a .
Pu e d e s ve r la p á g in a Ge t t in g S t a rt e d wit h S win g s i n e ce s it a s a yu d a .
2 . Exp a n d e u n n o d o .
S i e s t á s u t iliza n d o u n a Má q u in a virt u a l b á s ica , p u e d e s h a ce r e s t o p u ls a d o e l s ig n o
+ q u e h a y a la izq u ie rd a d e l ít e m .
3 . S e le ccio n a u n n o d o .
S i e s t á s u t iliza n d o u n a Má q u in a virt u a l b á s ica , p u e d e s h a ce r e s t o p u ls a d o e l t e xt o
d e l n o d o o e l ico n o q u e h a y a la izq u ie rd a .
a b a jo t ie n e s e l có d ig o d e Tre e D e m o . ja v a q u e im p le m e n t a e l á rb o l d e l e je m p lo a n t e rio r.

//en el código de inicialización de JPanel:


//Crea los nodos.
TreeNode top = new TreeNode("The Java Series");
TreeNode category;
TreeNode book;

category = new TreeNode("Books for Java Programmers");


top.add(category);

//Tutorial
book = new TreeNode("The Java Tutorial: Object-Oriented Programming for the
Internet");
book.add(new TreeNode("Mary Campione"));
book.add(new TreeNode("Kathy Walrath"));
category.add(book);

...//hacer lo mismo para cad libro...

category = new TreeNode("Books for Java Implementers");


top.add(category);

//VM
book = new TreeNode("The Java Virtual Machine Specification");
book.add(new TreeNode("Tim Lindholm"));
book.add(new TreeNode("Frank Yellin"));
category.add(book);

//Liberar todos los nodos sin hijos.


makeLeaves(top);

JTree tree = new JTree(top);


. . .
//Este método se añadirá al API de TreeNode API en una futura versión.
protected void makeLeaves(TreeNode top) {
Enumeration childEnum = top.preorderEnumeration();
TreeNode descendant;

while(childEnum.hasMoreElements()) {
descendant = (TreeNode)childEnum.nextElement();
if(descendant.getChildCount() == 0)
descendant.setAllowsChildren(false);
}
}

Oz it o

También podría gustarte