Java en 21 Dias

Descripción completa

Views 270 Downloads 3 File size 26MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Laura Lemay

Rogers Cadenhead

Aprendiendo

TRADUCCIÓN: Antonio Enrique González Velázquez Traductor Profesional

José Antonio Solbes Shang Traductor Profesional

REVISIÓN TÉCNICA: Ariel Ortiz Ramírez

Profesor en Ciencias Computacionales

Tecnológico de Monterrey, Campus Estado de México PRENT1CE

HALL

MÉXICO - NUEVA YORK • BOGOTÁ • LONDRES • MADRID MUNICH • NUEVA DELH1 • PARÍS • RÍO DE JANEIRO • SIDNEY SINGAPUR • TOKIO • TORONTO • ZUR1CH

Aprendiendo Jüvj I en 21

i vi

DIa 3

65

Les ABCs de Java instrucciones y expresiones

...66

Variables y tipos de datos ...

...67

Creación de variables Nomenclatura de variables

67 69

Tipos de variable

70

Asignación de valores a las variables

72

72

Comentarios

76

Literales de c;ulcna Expresiones y operadores

.;

Más sobre asignación Incremento y decrcmento

Comparaciones

Operadores lógicos Precedencia de operadores Aritmética ele cadenas Resumen Preguntas y respuestas

Lecciones de objetos Creación de objetos nuevos

Uso de new

Qué hace ncw

Observación acerca de la administración de memoria Acc;so y establecimiento de variables de clase y de instancia Cómo obtener valore.-.

Modificación de valores \arhbles de clase

Llanadas a métodos I. ;>s métodos dt clase

Relé encías a objetos

Con ersión por east y conversión normal de objetos y tipos primitivos Conversión por casi de objetos

Conversión de tipos primitivos a objetos y viceversa Comparación de valores de objetos \ de clases Comparación de objetos

Determinación de la clase de un ob¡< *>

Día I

75

Literales de caracteres

1

, 7

Los inicios de la programación en Java

74

Lúcrales boolcanas

L onversiüii por cast de tipos primitivos

Semana 1

7.1

Literales numéricas

DIa 4

Introducción

73

!.heniles

Aritmética

Resumen de contenido Introducción a Java

9

i

2

Un vistazo a la programación orientada a objetos

33

3

Los ABCs de Java

65

4

Lecciones de objetos

89

5

Listas, lógica y ciclos

111

135

77

6

Creación de clases

77

7

Uso de métodos para realizar tareas

■153

79

80 «2

X3 S4

Semana 2 Temas avanzados de Java Día 8 9

So

87

Cómo poner programas interactivos en Web

171 173

Cómo mejorar la apariencia de sus programas con

gráficos, fuentes y color

231

Adición de imágenes, animación y sonido

23!

11

Construcción de inierfaces de usuario sencillas para applets

267

12

Organización de los componentes en una ¡nterfaz de usuario

291

90

13

Respuesta a la entrada del usuario en un applet

317

92

14

Desarrollo de interfaces de usuario avanzadas con el AWT

351

N8

89 yo

93 93 93

10

Semana 3 Afine sus conocimientos de Java

Funciones de las clases: paquetes, inierfaces y otras características

38!

95

16

Circunstancias excepcionales: manejo de errores y la seguridad

413

96

17

Manejo de datos a través de los flujos de Java

437

18

Comunicación a través de Internet

461

100

19

JavaBeans y otras características avanzadas

485

102

20

Diseño de una interfaz de usuario con Swing

509

Manejo de eventos de usuario con Swing

531

44

os '}')

103 104

105 105

107

Día 15

379

-21

Contenido

Examen de clases y métodos con reflexión

Resumen •. Preguntas y respuestas

553 Apéndices

Apéndice A

555

Resumen del lenguaje Java

B

Recursos de Java en Internet

C

Configuración del JDK

D

Uso de un editor de texto con el JDK

DIa5

565

'

^

( jq 111

Ustas, lógica y ciclos

Arreglos • Declaración de variables de arreglo

573

índice



* -■.•

583

Creación de arreglos de objetos

589

Acceso a los elementos del arreglo

.....—.•

,



;

^ " ^ ]4

;

Modificación de los elementos de un arreglo

^ ^

Arreglos multidimensionales

^^

Instrucciones de bloque

^

Condicionales if



pj

El operador condicional

^

Condicionales switch

^

Ciclos f or

]28

Ciclos while y do

••*

Ciclos while

Ciclos do-.while

12g 120

:

(jj

Interrupción de los ciclos

,32

Ciclos etiquetados

^4

Resumen Preguntas y respuestas

134 135

DIa 6

Creación de clases

Definición de clases

]36

Creación de variables de clase y de instancia

^

Definición de variables de instancia

^

Constantes

jjg

Variables de clase

^

Creación de métodos

^

Definición de métodos

)4¡

La palabra clave this

]4,

Paso de argumentos a métodos

)4

primera herramienta que soporta una nueva versión de Java.

J Si „ „„ pt0Enil,,al|«, O*.

El JDK es un coniunto de utilerías basadas en texto para programas de linca de comandos, que no utilizan una interfaz gráfica de usuario. Los programadores ejecutan cada una de las utilerías del JDK al escribir comandos en un indicador, como lo siguiente: java

semana di i libro.

GetFunky

Este comando le indica al programa java (el intérprete de código de bytes) que ejecute un

archivo de código de byles llamado GetFunky. ciass. (Como podrá ver más tarde hoy, lodos los programas de Java compilados tienen la extensión de archivo .class.)

program

y son aún más

L «,„,„ stracion de ,a rápidan':me.

iles de coneg

s podr.n e.ra.,

Los usuarios de Windows 95 deben usar el comando MS-DOS (Inicio I Programas I MSDOS) de la barra de tareas, para abrir una ventana donde se puedan escribir los comandos.

Esto representa un gran abismo en la mayoría de las herramientas de programación, las cuales utilizan ¡merfaces gráficas de usuario, depuradores, editores de programación y otras muchas linduras. La gente que se siente cómoda con los sistemas operativos como MS-DOS y DOS se sentirá en casa con el JDK.

puede ; accr.

m

%rx

V 23

Introducción a Java Día 1

La página actual, que lista todas las versiones del JDK para distintas plataformas, tiene la dirección siguiente:

.

http://java.sun.com:80/egi-bin/java-ports.cgi JDK 1.2.

Asegúrese de haber recibido completo el archivo luego de haberlo descargado. Las instruc ciones de instalación de Sun en Web listan el tamaño de la versión vigente del JDK para la

Instalación del JDK

Uversión 1.2 de. JDK (Kit de Desarrollo de Java) está disponible actualmente para las s-

Pura verificar el tamaño en Windows 95 o Windows NT, vaya al directorio que contiene el

guientes plataformas:

archivo de instalación del JDK y haga clic en el archivo con el botón derecho del rutón. Surge

. Windows 95

un menú contextual, y puede seleccionar el comando Propenies (Propiedades) para ver el

. Windows 98

tamaño del archivo en byics, junto con otra información pertinente.

. Windows NT

instalación en Windows 95 y Windows NT

. SohrisSPARC

Antes de instalar el JDK en su sistema, asegúrese que no haya otras herramientas de desarro

• Sol iris x86

Descargu : e, JDK para estas plataformas de, sitio Web de Sun, en ,a «guíeme dneccón: http://

plataforma que uslcd usa.

ava.sun.com

U seccic n Produc» & APls del s.tio Web, ofrece hipexvincu.es a versiones d.suiuas de, v otros p educios de Sun.

llo de Java instaladas. Tener más de una herramienta de programación Java en su sistema provocará problemas de configuración cuando trate de usar el JDK.

Para instalar el JDK en Windows 95 o Windows NT, haga doble clic en el archivo de insta lación o use el comando Starl I Run (Inicio I Ejecutar) de la barra de tareas de Windows para encontrar y ejecutar el archivo.

Después de ver un cuadro de diálogo que le pregunta si desea instalar el JDK 1.2, se desplie ga el Asistente de configuración del JDK (figura 1.4). Use esla ventana para configurar el

vigente :s la siguiente página Web:

JDK instalado en su sistema.

huP:/^.iavasOn.con,/Products/JDK/i.2/xndex.html

Figura 1.4

/:/ Asísteme de confi guración del JDK.

Trecawión

i ^=i inx i 2 Periódicamente, Sun publica repara-

Elija la versión más actual del JDK y2^°°^^ núr fionGS de T3li3S QUG SQlcQoIi

iii

u

„„ r,13ndo a

^

119 ptcéters. Usted oeucria

¡«"eme del'JDK 1 '.2 disponible para su plataforma. Si us; otra plataforma, como la Apple

con J .va 2 visitando el sitio oficial Java de Sun en: http

/yjava.sun.com

ti

Macintosh, puede verificar si tiene un JDK compatible La conriguración predeterminada de este asistente debería ser satisfactoria para la mayoría de los usuarios. El JDK está instalado en un nuevo directorio con un nombre basado en la ver

sión que usted obtuvo (como \ jdk1.2), a menos que utilice el botón Browse (Examinar) para seleccionar un directorio diferente en su sistema.

Introducción a Java

Día 1

Si descargó el archivo de instalación, asegúrese que puede accesar el archivo correctamente

Tip

: usted pudiera tener con el JDK

mediante el comando chmod a+x con el nombre de archivo.

que esté

Por ejemplo, los usuarios de SPARC usarían el comando siguiente:

xTdk'i'l qu¡"püe"de ser el valor predeterminado.

% chmod a+x

jdk12-solaris2-sparc.bin

Para instalar el JDK después de hacer el cambio con chmod, use una ventana de sesión del intérprete de comandos para escribir el comando . / seguido del nombre de archivo del

El asistente instalará tres componentes del JDK:

paquete. El siguiente es un ejemplo:



%

- ■»

./jdk12

-solaris2-sparc.bin

Prueba de la instalación

En un mundo ideal, el JDK debería funcionar correctamente después de la instalación. Además, el queso debería estar libre de grasas, los presidentes deberían ser ejemplares y Jimmy John.-on debería ser todavía el entrenado/ en jefe de los vaqueros de Dallas.



.

i.) necesita ->U1B de espacio libre en disco duro.

acepta .a .lalación prede.ermma a. us , c ,a Si omitir todo todo cxccp.o cxccp.o lo los arch.vos de prog,ama e Al omitir

meter el JDK en un disco duro con poco espaco libre.

^^

^.^



Los problemas más comunes cuando se aprende Java provienen de errores al configurar el JDK.

Los usuarios de Windows pueden verificar su instalación del JDK al usar el comando de MS-

DOS en la mayoría de los sistemas. Esto hace aparecer una ventana en la cual usted puede escribir comandos en MS-DOS, el sistema operativo que precedió a Windows 3.1.

Al indicador de MS-DOS también se le conoce como indicador de comandos debido a que lo

espacio en disco duro y ..«, so noces,,;.,, pan, el ........ ...I

precaución

archivo Z1P, no debe descomprimirlo. El JDK puede leer

puede usar para escribir comandos que ejecuta el sistema operativo.

en su

MS-DOS puede ser ¡ntimldatorio para quienes están acostumbrados al estilo gráfico de apuntar y seleccionar de Windows 95. Por lo tanto, no puede usar

Tip

el JDK sin aprender antes un poco de MS-DOS. Este libro ofrece algunos tips para facilitarle todo el aprendizaje de MS-DOS humanamente posible.

formato de archivo en este directono.

Escriba lo siguiente en un indicador de comandos para verificar que su sistema pueda encon trar la versión correcta del JDK en él:

.. sismas SPARC que ejecuten Solaris 2.4 o supenor . Sisicmas xKft que ejecuten S«l:.ris 2.5 o s,.pcr,«»r [¿I archivero i

java

-versión

Si está usando el JDK 1.2, en respuesta uslcd debería ver el siguiente mensaje: java versión

subdirectorio llamado )

previamente un s

existentes en su sistema.

"1.2"

""""mero de versión mostrado es específico, así que si ha descargado una versión subse

cuente a la reparación de una falla de programación del JDK, con un número como 1.2.1, debería ser reportado por el comando j ava ■ versión. Si ve el número equivocado de

251

27

Introducción a Java

Día 1 126

h



El JDK no incluye un editor de lexto, pero la mayoría de herramientas de Java vienen con su

su sistema no puede encon-

file

rsión o un mensaje de error 'Bad co-and or 1< ^

^

propio editor para crear archivos de código fuente.

Com|;,

.

Si utiliza Windows 95 o Windows NT, un editor de texto como el Bloc de notas podría

añadirle una extensión .txt de más al nombre de archivo de cualquiera de los archivos fuente de Juvii que usted guarde (lo cuul provoca que un nomine como GetFunky. juva Iciniiiie cu

GetFunky. java. txt). El compilador de Java manejará únicamente archivos fuente con la extensión de archivo . j ava. Para evitar este problema, ponga entre comillas el nombre de archivo cuando guarde el archivo fuente. La figura 1.5 muestra esta técnica para guardar cl archivo fuente Craps. java desde cl Bloc de notas de Windows.

pLcg

celebridad' por un

miembro del publico,

cu.u Figura 1.5

~3

Cuuixtudo de un archivo fuente.

Nota

a, comunicador de telev.sion Dar, Rather

de Nueva York. Durante años nad,e en^^ grupo R.E.M. inmortalizó la frase en una can :.o ^

a

L arrestado, luego de haber.c deparado a un ce:^ en 1994, y le dijo a un psiquiatra que las cadenas de atraparlo.

Una mejor solución es usar el Explorador de Windows para asociar perma

Tip

nentemente los archivos de Java con el editor de texto que va a usar. Esto le permitirá abrir un archivo fuente para su edición al hacer doble clic en el archivo en una carpeta de Windows. Para aprender a hacerlo, vea el apéndice D, "Uso de un editor de texto con el JDK".

Escriba el programa

^

la se nana 2, -

,,es;, rollo de «pplc.s. »o .n.c.Hc

a-ea aplicaciones senc.las de

S : "SÍ^

Crnación del archivo fuente

O, «o con la mayor, de los "^¿ ce, an como archivos de texto pr, .cesador de palabras que P

eo ,oce como texto ASC. o texto

)o ^ ^

^^

;ip,.cml:, micnlriis K)

clcmc||Lil

^

Si su editor pide un nombre de archivo antes di empezar a escribir cualquier cosa, use

,„

HelloDan.java.

, df S/'Cómo poner programas ¡mcnuo, e, AWT,

es de usuano

Listado 1.1. El código fuente de la aplicación 1:

2:

is fuenie de Java s lauier editor de icxio o

le creariu:* >-»"' «.u»imu1*-

Ejecute el editor de su elección y escriba el programa Java que se

muestra en el listado 1.1. Tenga cuidado que todos los paréntesis, llaves y comillas en el lista do estén correctamente escritos, y use exactamente las mayúsculas y minúsculas requeridas.

,

,s usuarios de Windows 95 pueden escribir progra- .

,

":

5:

HelloDan

{

publie static void main (String[] arguments)

3:-

.

- ,exio sin formato, un formato al que también se fc ¡ HvWrite, así como Microsoft Word.s, tiene el

class

HeiloDan.

System.out.println("Whafs the frequeney,

}

}

'

{

Kenneth?");

.

Introducción a Java

cd es abreviatura de "cambiar directorio", los términos carpeta y directorio son sinónimos.

5Ss

Si está en la carpeta correcta, puede compilar HelloDan. java escribiendo lo siguiente en el indicador de línea de comandos:

en el sL Web de la versión en inglés del libro, en la di

Entrada

javac HelloDan.java

http://www.prefect.com/java21

Al terminar de escribir el programa, guarde e, archivo en alguna pane en su disco Curo con e. nombre HelloDan. java.

Nota

Si usa el comando dir para listar todos los archivos en un directorio en

MS-DOS, usted podría notar que un archivo tiene dos nombres de archivo, el que usted le dio, como HelloDan . j ava, y una versión abreviada, como

Si es un usuario del JDK de Windows 9S c,ue P

HELLOD-1 .JAV. La forma abreviada es una muestra de cómo maneja MS-DOS

=S££S=S

los nombres de archivo con más de ocho caracteres y extensiones de tres caracteres. Al usar las utilerías del JDK en el indicador de linea de comandos, use siempre el nombre de archivo que le dio al archivo, no la abreviatura.

La figura 1.6 muestra ios comandos de MS-DOS que se usaron para cambiarse a la carpeta \J21work, listar los archivos de las carpetas y compilar HelloDan. java.

Figura 1.6

jMSDUSPimw

Compilación de pro

gramas Java en una

ventana de MS-DOS.

ión y ejecución del programa en Windows

•tici-osoft (FO Windows 91 (C)Copyright Microsoft ;: \VINDO'«'E>cd

Corp

19S1-3996.

\J21uork

::\J21«.rk>dir Voluiac

ir,

Volui.ie

StL'ial

di i ve

Oiroctory of

C

has

Nutnbér.

nc

]s

label DS4T.-2F2F

C:\021ucirl:

bo:6n o un comando de menú comextual.

01-24-96

IELLC'D-1 JAV

picdan ser ejecutados por la máquina virtual de Java.

'

1

file(s)

2

dic(s)

14

';■

2:39s

.

C;l-24-'5a

2:33a

..

01-24-5J

2:2ía Heliot-ih

14 3

byt.es

42 , í96,704

bytes

fr-i-e

::\J21uork>javac HelloDan

'1

qic contenga HelloDan. java.

.

S ..ardó e. arcn.vo dentro de una carpc.a recen creada J2iworK fuera de. d.rectono ra,, de, s siema, el comando debería ser el siguiente: ci

\J2iwork

--•

^--'-:-



..

-

-

,

...

.

,

El compilador del JDK no despliega ningún mensaje si el programa se compila con éxito. Si el programa se compiló sin ningún error, se creará un archivo HelloDan. class en el mismo

Introducción a Java

Día 1

130

directorio que contiene Hellodan. java. Este archivo .class es el código de bytes de Java que puede ser ejecutado por la' máquina virtual. Si obtiene algún error, regrese.al arch.vo fuente original y asegúrese de haberlo escrito correctamente, como aparece ene da frutos o no i

]„,«, Mímale como objetos ""

objet. s crtmlos a pan» »> la P1™"

Un ejemplo de diseño de clases

racurísiicas siguientes de un botón:

■ El texto que identifica el propósi.o del bolón El tamaño del bolón

. Aspectos de su apariencia, como el >ener o no «na sombra en ,-D La .lase Co^andButton también podría definir cómo se compona un botón: .

s¡ necesita un clic sencillo o doble para ser usado

. Si se debieran ignorar por completo los clics del «non

Nota

Una de las clases estándar'de Java. java.awt.Button, agrupa toda la fun cionalidad de este ejemplo hipotético CommanóButton y más. Ya tendrá oportunidad de trabajar con él en el dia 11. "Construya interfaces de usuario sencillas para applets".

hacer cuando se ha hecho un clic con exi.o

Al escribir un programa Java, usted diseña y construye un conjunio de clases. Cuando su pro grama se eslá ejecutando, los objetos se crean desde estas clases y se usan conforme se van

necesitando. Su tarea como programador de Java es crear el conjunio adecuado de clases para

y ,„ c.niivman.ic.10 «Hsümos. h^ulos en lo que

llevar a cabo lo que su programa requiere.

371

Un vistazo a la programación orientada a objetos

Día 2

Por fortuna no tiene que empezar de cero. Cada versión de. .enguaje Java incluye un grupo

Íc2Tq« imp.emen.an la mayoría de la funcionalidad básica que neces.tara. A estas agrupaciones se les denomina bibliotecas.' Una biblioteca de clases es un grupo de clases diseñadas pan, su use, con .«rus Término Nuevo

programas. La biblioteca estándar de clases de Java contiene docenas de ellas.

Cuando usted habla de usar el lenguaje Java, realmente se refiere al uso de la biblioteca de clases de Java y algunas palabras Cave y operadores que son reconocaos por un compilador

berwock (enojado o calmado), estado de salud (vivo o muerto), o tendencias políticas (socialista, independiente, o mamá futbolista).

En una clase los atributos están definidos por variables. Usted puede considerarlos análogos para las variables globales para cada objeto de esa clase. Cada objelo puede tener valores distintos para sus variables y a éstas se les denomina variables de instancia.

Una variable de instancia es un elemento de información que define un atribu

Término Nuevo

Java.

to de.un objeto en particular. La clase del objeto define qué tipo de atributo es,

La biblioteca estándar de Java maneja numerosas tareas co.no funciones míticas, .«anejo dt textos gráficos, somdo, interacción del usuario y conectividad de redes. En muchos casos.

y cada instancia almacena su propio valor para ese atribulo. A las variables de instancia

consistiría en crear una Case sencilla que se use para crear objetos a pan,r de ,as clases «tan-

Cada atributo de clase tiene una variable correspondiente sencilla; al cambiar el valor de la

as

Cecas de clases de Java serán suficientes para sus necesidades. En tal caso su tarea

dar de Java y manejar su interacción.

m; s Java complicados, deberá crear todo un conjun.o de Cases con interacciones

Para

e.las. Éstas se podrían usar para'conformar su prop.a bih.io.ee:, de Cases, para

usarse posteri >rmente en oíros programas.

La «utilizad >n es uno de los beneficios de mayor importancia en la programación orientada a objetos.

Fn -enera! c ada clase que usted escriba en Java está compuesta de dos componentes: a.nbu;Zmpo. «en, En es.a sección aprenderá cómo se aplica cada componente a una Cas,

eoricn >hl da Jabberwock. Para finalizar esta sección, cread una dase Java que ,mplc-

Z:L r. presentación de un J abberwock, (un monstruo parecido a un dragón, tomado dC poema Jabh wacky de Lewis Carroll).

Atribuios ios de una clase de objetos

u o, son las cosas individuales que idiidl que diferencian diferencian una un clase de objetos de otros y de.er-

^:t^arienca, estado y otras cualidades de esa Case. Piense cómo se podna crear ,a Los

también se les denomina variables de objeto.

variable puede cambiar ese atributo en un objeto. En el programa que creará hoy un poco más adelante, la instrucción siguiente se emplea para indicar que un objeto Jabberwock ■representado por j ya no está hambriento: ].hungry

= false;

Las variables de instancia pueden lomar un valor cuando se crea un objeto y permanece constante a través de la vida del objeto, o bien pueden tomar valores diferentes mientras el objeto se usa en un programa en ejecución.

Atributo; y comportamiento -

Los atributos de una clase de objetos también pueden incluir información acerca del estado

de un objeto. Por ejemplo, usted podría tener las características de la disposición de un jab

clase icóri :a Mamada Jabberwock. Sus atributos podrían inclu.r lo s.gu.ente:

. Col »r naranja, ocre terracota, amarillo li«ón, maiz tostado . Se>o masculino,

femenino, qué-le-importa

. Ap -'lito satisfecho,

hambriento

Para describir toda una clase de objelos se usa otro tipo de atribulo en vez de objetos especí ficos desde la clase. A estas se les denomina variables de clase.

Término Nuevo

Una variable de clase es un clcmcnlo de información que define un atribulo de loda una clase. La variable aplica para la clase por sí misma y para todas sus

instancias, de modo que sólo se almacena un valor, no impona cuántos objetos de clase

hayan sido creados. Para un buen ejemplo de una variable de clase, suponga una variable que registre la canti dad exacta de los objetos Jabberwock que viven en una comunidad. Si se creara una va

riable de instancia para el conteo en la clase Jabberwock, cada uno de los objetos podría tener un conteo distinto, lo cual no sería preciso. Habría que utilizar una variable de Case para que sólo se almacenara un valor, y que cada objeto Jabberwock pudiera lener acceso a esa variable.

Comportamiento de una clase de objetos El comportamiento es la manera en que una Case de objelos puede hacer cualquier cosa

para sí o para otros objetos. El comportamiento de una clase determina qué objelos de esa

Case hacen cambiar sus atributos, y tambicn qué hacen cuando otros objetos les piden hacer algo. El comportamiento de un objeto Jabberwock podría incluir lo siguiente:

391

Un vistazo a la programación orientada a objetos

Din 2

41 I

i

Creación de una clase .

Se enoja

.

Se calma

Ahora que ya conoce la terminología básica de la programación orientada a objetos, las cosas i

. Se come a un campesino .

Se salta la cena



Se recupera

podrían ser más claras con un ejemplo más concreto. Creará un ejemplo de trabajo de la clase Jabberwock, para que pueda ver cómo se definen variables de instancia y métodos en una

clase. Asimismo, podrá crear un applet Java que cree un objeto nuevo mediante la clase

Jabberwock, modificará sus variables de instancia y tomará acción a partir de sus valores.

EI comportamiento para una Case de objetos se implementa a través de métodos. os „*«** son grupos de instrucciones asociadas en una cía. de ob^sque

La sintaxis real del ejemplo no se detalla aquí. Úsela como una introducción

Nata

a la programación orientada a objetos, más que como una lección de la sin

taxis de programación Java, en la cual tendrá oportunidad de profundizar el día 3: "Los ABCs de java."

9

Abra el editor de lexto que suele usar para crear programas Java, de modo que empiece a crear un archivo fuente de Java. En vez de introducir un programa completo, escribirá algunas

. Para informar un cambio a otro objeto

. Pan, indicar al otro objeto que cambie algo acerca de sí mismo .

para pedir a otro objeto que haga algo

instrucciones mientras aprende a usarlo. Tiene una oportunidad de revisar doblemente su ira-, bajo al final, para asegurarse que esté correcto.

o m

El lugar para empezar es una definición básica de clase. Escriba lo siguióme:. class

Jabberwock

{

} por pillaba:

Usted ha creado una clase. Por el momento no es gran cosa, pero las dos líneas son un ejem

•■¡Uno, dos! ¡Uno, dos! Marchando marcialmeme va,

plo de una clase Java en su expresión más simple.

¡antojo de chocolate había, en la espada vorpal!

Para o,ue Jabberwock sea más sofisticada, hay que crear tres variables de instancia para esta

Ya la d ¡capitó y con su cabeza en lo alto,

clase. Justo debajo de la línea class Jabberwock {, inserte las tres líneas siguientes:

saltand 3 con alegría, de vuelta a casa va".

String

color;

String sex;

o

m Q m

boolean hungry;

Estas líneas crean tres variables de instancia. Dos de ellas, color y sex, pueden contener

con,o pl«». para lo ,«

objetos String. Una cadena de texto es un término general que significa un grupo de caracteres, pero en Java un objeto String se crea mediante una de las clases estándar en

la biblioteca de clases de Java. La clase String se usa para guardado de texto y muchas funciones de manejo de texto.

*

El tercer objeto, hungry, es una variable boolean que sólo puede guardar uno de dos valo

res: true (cieno) o f alse (falso). Este objeto se usa para registrar si el jabberwock está hambriento (true) o satisfecho (f alse).

m

Un vistazo a la programación orientada a objetos.

s:

void feedJabberwock()

6:

if

7:

{

(hungry == true)

{

8:

Systera.out.printlnCYum

9:

hungry =

}

18:

a peasant!");

else System.out.println("No,

11:

--

false;

thanks

--

already ate.");,

12:

13:

//y aún hay más

14:

nétodos. Hay

15:}

La sangría y las lineas en blanco que se usan para dar el espaciado en el

Tip

y oirá para revisar sus atributos).

archivo fuente no afectan al compilador Java. Como los comentarios, se

incluyen para beneficio de los programadores, para que la lógica del progra

P;ll, empezar, agregue las siguientes líneas debajo de las tres variab.es de instan,, en su

ma sea más sencilla de seguir. La sangría y el espaciado usados aquí, con las líneas en blanco entre métodos y variables sangradas y los métodos, se usan

definición de clase:

en todo el libro. La biblioteca de clases de Java usa una sangría similar.

void feedJabberwock(

if

Puede elegir el estilo de sangría que prefiera.

hungry = false;

} ''sJste-.out.printlnCHo, thanks -- already ate.»); }

//

y

aún

Antes de que compile esta ciase, necesita agregar un método más. El método

showAttributes() despliega los valores actuales de las variables de instancia en una instan cia de su clase Jabberwock.

hay mas

En el programa, borre la línea de comentario / /y aún hay más y reemplácela con lo si guiente: void

Tif

showAttributes()

{

System.out.println("This is a " + sex + " if

(hungry ==

" + color +

"

jabberwock.");

true)

System.out.println("The

jabberwock is hungry.");

else

System.out.println("The

jf (hungry

==

true .Si . true lo*

J

:■ --:::

hanibricn,o, se despliega un me,,**

jabberwock is full.");

El método showAttributes() despliega dos líneas en pantalla: el sexo y color del objeto Jabberwock y si está hambriento o no. A través de su editor de texto, guarde en disco el

archivo fuente asegurándose que se llame Jabberwock. j ava, para que el nombre de archivo corresponda al nombre de clase.

En este momento, usted tiene una clase Jabberwock con variables de instancia y métodos de instancia que se pueden usar para desplegar y modificar estas variables. 1:

class Jabberwock {

2:

String color;

3:

String

4:

boolean

sex;

hungry;

Use uno de los procedimientos siguientes para compilar el programa, dependiendo del sis tema que esté usando.

43 I

Un vistazo a la programación orientada a objetos

451

Día 2 |"44 Hay dos maneras de usar la clase Jabberwock:

• Cree un applet o aplicación por separado que use esta clase.

• Agregue un método main () a la clase Jabberwock para que pueda ser ejecutada direc

indicador de ■MI

javac Jabberwock.java

tamente.

; ,

Para esle ejercicio se hará lo último. Cargue Jabberwock. java a su edilor de texto e inserte una línea en blanco directamente debajo de la última línea del programa. (Línea 21 del listado 2.2.)

iavac Jabberwock.java

En esta línea, inserte lo siguiente:

public static void main (String arguments[]) {

tiene errores de escritura.

Jabberwock j j.color =

fifi. USTADO 2.2. EL TEXTO taUAlOZ.MKWO^^

j.sex = j.hungry

= new Jabberwock();

"orange";

"male"; -

true;

1: class Jabberwock {

System.out.println("Calling showAttributes

2:

String color;

j.showAttributes();

3:

String

System.out.println("

sex;

boolean

4:

5:

j.feedJabberwock();

System.out.println("

8:

j.showAttributes();

hungry = false;

9:

System.out.println(" "); System.out.println("Feeding the jabberwock

thanks - already ate.");

10:

");

System.out.println("Calling showAttributes ...");

i1 (s;s?e:.::t:;

7:

-");

System.out.printlnCFeed'ing the jabberwock ...");

hungry;

void ieedJabberwock()

6:

...");

...");

j.feedJabberwock();

11:

12: 13: 14:

a

15:

«

+

sex

color

cación. Resguarde y compile el archivo.

jabberwock."); iabberwock i.

16: 17:

1Se

18: 19:

Systen,

.out.printlnrThe jabberwock i. full.');

28:

21:

Con el método mainn.out.println("Feeding the jabberwock . j

-•

Con el listado 2.3 como guía, lo que sigue toma lugar en el método main ().

"orange";

Svstem.out.printlnf'

thanks

.

),

feedJabberwock();

• Línea 23, Jabberwock j = new Jabberwock();— Crea un nuevo objeto de la clase ..

Jabberwock y almacena una referencia a él en una variable llamada j. Como lo

aprendió, usted de hecho no opera directamente en las clases en sus programas Java.

K;::::":;Sun!"c;iü;í;showAttributes.

En vez de ello, crea objetos de aquellas clases y llama a métodos para esos objetos para

j.showAttributes();

operar en ellos.

Svstem.out,println("

)>

lystel.out.printlnC'Feeding tbe jabberwock . j.feedJabberwock();

38: 39:

La apHcacón Jabberwock se puede ejecutar con uno de los siguien.es procedimientos espec, fieos de plataforma:

• Líneas 24-26 — Las variables de instancia color, sex y hungry son asignadas para el objeto Jabberwock creado en la línea dos. El color es orange, el sexo es male y la variable hungry toma el valor booleano true. Esto indica que el objeto Jabberwock está hambriento.

• Línea 27 — En esta línea y otras más que siguen, se usa una instrucción System.out.printlnO para desplegar información a la pantalla. Se despliega todo lo que haya entre paréntesis.

'■'• Línea 28 — Se llama al método showAttributes, definido en el objeto Jabberwock. Windows

través del intérprete, como sigue: java Jabberwock

Esto hace que el objeto Jabberwock indique los valores de sus variables de instancia: color, sex y hungry.

Un vistazo a la programación orientada a objetos

Una clase puede tener únicamente una superclase, pero cada clase tiene una cantidad ilimita da de subclases. Las subclases reciben por herencia todos los atributos y comportamiento de sus superclases..;

cambia el el va valor cambia

de la

t)

ciación del objeto Jabberwock showAttrlhl,tosO ,«r.. despicar los v:, , fllcll -,, _ Se Un.ua ,«.cv,,...cn.c «1 .uíLkW, showA ^.^ ^ ^^

nUevameme en un intento de al-

.-.;••

En términos prácticos, esto significa que si la superclase tiene comportamiento y atributos que la clase que usted esté creando necesita, no tendrá que «definirlos o copiar el código para

tener el mismo comportamiento y atributos. Su clase recibe automáticamente todo esto de su

superclase, la cual a su vez las obtiene de su superclase y así sucesivamente por toda la jerar quía de clases. La clase que usted esté creando se convierte en una combinación de todas las características de las clases superiores en la jerarquía, así como de las propias.

La situación es comparable a la manera en que se heredan todo tipo de aspectos de los padres, como la altura, el color del cabello, el amor por la música africana, o la resistencia a pregun

tar cómo llegar a alguna parte. Se heredan algunas de estas cosas de los padres, quienes lo heredaron de los suyos, y así hacia atrás hasta llegar al Jardín del Edén, el Big Bang, o (.inserte aquí su propia creencia cosmológica).

En la figura 2.2 se muestra la estructura de una jerarquía de clases. Figura 2.2

Organización de las clases

Una jerarquía de

Clase A

clases.

• La clase A es la superclase de B • La clase B es la subclase de A • La clase B es la sjperclase de C, D y E

• Las clases C, D y E son subclases de B

Clase B \

bien las necesitan.

Herencia

ia en la programación orientada a

—-

Clase D

En la pane superior de la jerarquía de clases de Java está laclase Object (todas las clases heredan de esta superclase única). Object es la clase más general de la jerarquía y define el comportamiento y atributos heredados por todas las clases de la biblioteca de clases de Java. Conforme desciende la jerarquía, las clases se construyen para un propósito especifico. Una

diferencian de la clase existente.

estricta, las que uno mismo

Con la herencia, todas las clases

rreó v aquellas que provienen d
78);-

Java tiene varias operaciones para hucer comparaciones entre las variables, variables y li terales, u ülros tipos de información en un programa.

Esta expresión combina dos expresiones de comparación: age < 21 y girlf riendAge > 78.

Si ambas expresiones son verdaderas, el valor true está asignado a la variable unusual. En

Estos operadores se usan en expresiones que devuelven valores booleanos true o f alse.

cualquier otra circunstancia, el valor f alse se asigna a unusual.

dependiendo de ;i la comparación que se hace es verdadera o falsa. La tabla 3.5 muestra a los

La diferencia entre & y && radica en cuánlo Irabajo realiza Jasa en la expresión combinada. Si

operadores de ce mparación.

se usa &, las expresiones en cada lado de & son evaluadas indistintamente. Si se usa && y el

lado izquierdo de && es f alse, la expresión en el lado derecho de la && nunca se evalúa. Tabla 3.5. Operadofes de comparación. Operador

Significado

Ejemplo

Igual

x

==

3

No igual

x

1=

3

Menor que

x




3

Menor que o igual a

X

=

Otro ejemplo inspirado en Harold óí Maude:

boolean unusual = (grimThoughts > 10) ¡¡ (girlfriendAge > 78);

3

El ejemplo siguiente muestra un operador de comparación en uso: boolean

Para las combinaciones OR se usan los operadores ¡ o ¡ ¡ Estas expresiones combinadas devuelven un valor true si cualquiera de las expresiones booleanas son verdaderas.

hip;.

Esta expresión combina dos expresiones de comparación: grimThoughts > 10 y girlf riendAge > 78. Si cualquiera de estas expresiones son ciertas, el valor true se asigna

a la variable unusual. Únicamente si ambas de estas expresiones son f alse el valor false se asignará a unusual.

Observe el uso de ¡ ¡ en vez de ¡. Por este uso, si grimThoughts > 10 es true, se asigna el La combinación XOR tiene un operador lógico, \ Esto provoca un resultado true sólo si las

hip

dos expresiones booleanas que combina tienen valores opuestos. Si ambas son true o ambas

age

< 25;

La expresión ; ye


cualquier pane de una operación de concatenación es una String o una hteral String. todos

Significado Suma Resta

los elementos de I i operación serán tratados como si fueran cadenas:



Multiplicación

System.out.prirtln(4 + • score and " + 7 ♦ ■ years ago.");

i

División

Módulo

Esto produce el te: to de salida 4 score and 7 years ago., como si las literales enteras 4

Menor que

y 7 lucran cadena:.

Hay también un o ,erador cono ♦=■ para añadir algo al final de la caoena. Por ejemplo, la

>

Mayor que

. t cambia el valor de nyName (que podría ser algo parecido a Ef rgm Zimbalist)alaíudirJr. al final (Efrem Zimbalist Jr.).

li

i & i

!Í:Í

OR lógico NOT lógico ANO

OR

flíl

Semana 1

Tabla 3.7. continuación

XOR

Asignación Incremento Decrcmento

Suma y asignación Hi-süi y asignación

Multiplicación y asignación

Día

División y asignación Módulo y asignación

4

Lecciones de objetos Hace dos días, la programación orientada a objetos se comparaba con la cerveza, ya

que ésta tiene un sabor que se aprecia con el tiempo que podría provocar desorien

ejemplo * .to

cí,o ,.,

tación, causar náuseas y una visión alterada del mundo.

El día de hoy ofrece un repuesto. Usted se pone al corrienie con esle tipo de progra mación al tiempo que trabaja con objetos en Java.

La mayoría de lo que se hace en este lenguaje está hecho con objetos. Usted crea objetos, los modifica, los mueve de un lado a otro, cambia sus variables, llama a sus métodos, y los combina con otros objetos. Usted desarrolla clases, crea objetos

En realidad, así. s difícil de leer.

R u dM»i. -* b. sada en C++, J

lal- i,mo de las n, ñecas rusas u. d

po enea de progn ^^

^^

-^

^

compor.

fuera de estas clases, y las usa con otras clases y objetos.

En este día trabajará extensamente con objetos y abarcará los temas siguientes:

crad()res conos SOI, uno de los

• Creación de objetos (también llamados insiancius).

Srt en «n pm^nw no « un n^suo. por lo s,

^.K-do evitarlo

e)

• Revisión de la ejecución y modificación de variables de clase y de instancia

¡1M- u>

en esos objetos.

c. si. ptop.a

• Llamadas a los métodos de un objeto. ;

• Conversión de objetos y otros tipos de datos de una clase a otra.

Lecciones de objetos

Creación de objetos nuevos

";

con el número o tipo equivocado de argumentos (o si no le proporciona argumentos y se necesita alguno), obtiene un mensaje de error cuando trata de compilar su programa Java.

Cando escribe un programa de Java, usted define un conjunto de clases. Como aprenda c,v el día 2 las clases son plantillas para objetos; para la mayor pane usted solo usa la clase p crear instancias y así trabajar con el.as. En esta sección, por unto, aprenderá a crear un objuo

para generar los números aleatorios en un programa. Estos objetos son llamados generadores

nuevo de cualquier clase dada.

de números aleatorios, y su rango es de un valor decimal de 0.0 a 1.0. Los números aleato

,. Recuerda las cadenas de ayer? Aprendió que mediante una literal de cadena (una serie de caracteres entre comillas dobles) crea una nueva instancia de la clase String con el valo.

'

91

He aquí un ejemplo de la creación de diversos tipos de objetos usando diferentes cantidades y tipos de argumentos: La clase Random, parte del paquete java.útil, crea objetos que se usan

rios son útiles en juegos y otros programas en los cuales sé necesita un elemento de impre- dictibilidad.

.


- ' ^ d A es.e s.e método cspcc.al ;lasc dada. espec.al f ^ , os matmcu,*s son métodos especa.es para ^imu.u ^^ ^

,a cia

-w^— Ce clases. Los constructores m.c,, .7^

^

„..,,„ ,.„.. ,, obic

-U.u.erouoob.co que e, objeto necesitóle

,ener un numero

Enire las mül«pl« definición» de mülp Enin

C c«n,e de argumentos. C Cuan 0 uPo difc«n,e

specificar argumentos dife, u

^

.Jes en la lisia de argnmenK s, y se "a--a Us múltiples definiciones de constructor o U q

^^

^

^

cs(os

,

Cómo obtener valores nombre de variable de clase o de instancia tiene dos partes: el objeto a la izquierda del punió y la variable a la derecha.

Término Nuevo

La notación de punió es una forma de referirse a las variables de instancia y métodos de un objeto mediante un operador de pumo (.)

Por ejemplo, si tiene un objeto asignado a la variable myCustomer^y dicho objeio tiene una variable llamada orderTotal, usted se refiere al valor de la variable con algo como esto:

„».

b ^ Ran(jom(, cn e eJem ^.^ de ,a declaracion

myCustomer.orderTotal;

Esta forma de accesar variables es una expresión (esto es, devuelve un valor), y ambos lados del punto lambién son expresiones. Esto significa que usted puede anidar el acceso a varia

bles de instancia. Si la variable de instancia orderTotal cauikne por sí misma un objeto y a clase.

m

Para obtener el valor de una variable de instancia, usied usa la notación de pumo. Con ella, un

m

Lecciones de objetos

D(a4

ese objeto tiene su propia variable de instancia llamada layaway, usted podría referirse a ella

951

Cuando usted ejecute esta aplicación, la salida deberá ser la siguiente: Starting location:

de esta forma:

'

t



.

X equals 4 '

myCustomeí.orderTotal.layaway;

Y equals

Las expresiones de punto se evalúan de izquierda a derecha, así que inicie con lá variable

13

Moving to

orderTotal de myCustomer, la cual apunta a otro objeto con la variable layaway. Terminará con el valor de la variable layaway. J

(7,

6)

,

Ending location: X equals 7

Y equals 6

Modificación de valores

Asignar un valor a esa variable es igualmente sencillo; sólo hay que agregar un operador de asignación a la derecha de la expresión: myCustomer.crderTotal.layaway = true;

.

mo las líneas 17 y 18 despliegan nuevamente los valores ile x y y para mosir.iicóiiio han

El listado 4 2 «s un ejemplo de un programa que prueba y modifica las variables de instancia en el objeto P. int. listo es pan. del paquee java.awt y ,c renca- « ..n pumo Ac «««le y.

2:

3: 4: 5: 6: 7:

8: 9:

10: 11 : 12: 13: 14:

15: 16: 17: 18:

import

cambiado.

Variables de clase Las variables de clase, como ya Jo aprendió, son variables que están definidas y almacenadas en la clase por sí mismas. Sus valores aplican a la clase y a todas sus instancias.

Lista >o 4.2. El texto completo de setpoints. java. 1:

(línea 6). Las líneas 9 y 10 despliegan estos valores individuales mediante la notación de punto. Las líneas 13 y 14 cambian los valores de x a 7 y de y a 6, respectivamente. Por últi

Este ejemplo asigna el valor de la variable layaway a true.

nadas con los 'alores x y

En este ejemplo, primero crea una instancia de Point donde x es igual a 4 y y es igual a 13

Con las variables de instancia, cada nueva instancia de la clase obtiene una nueva copia de las variables de instancia que define la clase. Entonces cada instancia cambia los valores de estas instancias sin afectar a las demás. Con las variables de clase sólo hay una copia de esa varia

java.awt.Point;

ble. Al modificar el valor de esa variable lo modifica para todas las instancias de esa clase.

class fetPoints {

publie static void main(String arguments[]) { Po.nt location = new Point(4, 13);

Svite» out.println("Starting location: •); S>sten,.out.println("X equals " ♦ location.x); S;steQ.out.println("Y equals " + location.y);

Usted define las variables de clase al incluir la palabra clave static antes de la variable misma. Por ejemplo, tome la siguiente definición parcial de clase: class FamilyMember { static String súmame = String ñame;

"Igwebuike";

int age;

S.stem.out.println("\nMoving to (7, 6)"); 1 ication.x =

Cada instancia de la clase FamilyMember tiene sus propios valores para ñame y age, pero la

7;

1 ication.y = 6;

variable de clase súmame sólo tiene un valor para lodos los miembros de la familia:

S/steo.out.println("\nEnding location:-);

"Igwebuike". Cambie el valor de súmame y todas las instancias de FamilyMember serán

íystem.out.printlnCX-equals

afectadas.

"

+ location.x;

«ytte-.out.printmCY equals " + location.y);

19: 20:

Llamar static a estas variables es referirse a uno de los significados para la palabra estático: fijo en un lugar. Si una clase tiene una variable static, cada objeto de esa clase tiene el mismo valor para dicha variable.

¿i

Lecciones de objetos

Día 4

97 1

96 System.out es una variable de clase que contiene una instancia de la clase PrintStream.

Este objeto PrintStream representa la salida estándar del sistema, la cual j>uele ser la pan talla, mas puede ser redirigida hacia un monitor o a un archivo en disco. Los objetos

PrintStream tienen un método println () que envía una cadena al flujo de salida.

de salida despliegan el mismo valor:

El listado 4.3 muestra un ejemplo de llamar algunos métodos definidos en la clase String. Las cadenas incluyen métodos para pruebas y modificación de cadenas, parecido a lo que esperaría en una biblioteca de cadenas en otros lenguajes.

Listado 4.3. El texto completo de checkstring.java. 1:

class

CheckString

{

2: 3:

publie

static

String

A:

void main(String

str

=

"In

my

next

arguments[J)

life,

I

{

will believe

in

reincarnation";

Llamadas a métodos

5:

System. out. println ("Trie

6:

System.out.println("Length +

7:

Llamar a un método en un objeto es igu

a está a la izquierda del punto, y

+

9:

+

12:

System.out.println("The

index

+

+

15:

método no tenga argumentos:

str); "

position 7:

of

to 31:

the character x:

"substring

index of the beginning of

\"will\":

"

+

+

"

" the

str.indexOf("will"));

System.out.println("The string in upper case:

16: 17:

"

str.indexOf('x'));

Systeui. out. println ("The

14:

■R.,,Ea „,„„ ,«

+

substring frora 24 31));

13:

"

string:

character at

str.substring(24,

11:

is: this

str.charAt(7));

Systen.out.println("The

10:

of

str.lengthO);

System. out. println ("Trie

8:

string

*

str.tol)pperCase());

18:

19:

Cuando usted ejecuta el programa, se despliega lo siguiente en el dispositivo de salida están

definido en myCistomer:

elAllOrdersO .talkToManager() ;

dar de su sistema

Trie string is:

In my next life,

Length of this

string:

The

character

The

substring from 24

The index

at

I will believe in reincarnation

48

position

to

7:

31:

of the character x:

e

believe 8

The index of the beginning of the substring "will": 19 The string in upper case: IN MY NEXT LIFE, I WILL BELIEVE IN

objeto myCustcner:

REINCARNATION

:

e se está rjoculando Java.

cll que

-"-•■--"-—

En la línea 4 usted crea una nueva instancia de String al utilizar una literal de cadena. (Este modo es más sencillo que usar new e introducir los caracteres en forma individual.) El residuo del programa, simplemente, llama a métodos de cadena diferentes para hacer operaciones diferentes en esa cadena:

m m *

Lecciones de objetos

Día 4

,98

La notación de punto se usa para llamar a un método de clase. Como con las variables de clase, usted puede usar una instancia de la clase, o la clase en sí misma, a la izquierda del punto. Sin embargo, por las mismas razones mencionadas en las variables de clase, mediante el nombre de la clase hace que su código sea más sencillo de leer. Las dos ultimas líneas en

. La línea 5 imprime el valor de la cadena que usted creó en la línea 4 ■ In my next life

I will believe in reincarnatóon".

. La linca 7 llama al método length() sobre el nuevo objeto String. La cadena tiene 48 caracteres.

este ejemplo producen el mismo resultado: la cadena 5:

.. La linca 9 llama al método charAt (), el cual devuelve el carácter en la posición dada

String s,

de la cadena. Observe que las posiciones de la cadena empiezan en la posición 0 i.n

S2

Término Nuevo

raría un String.

Una referencia es un tipo de apuntador que se usa para indicar el valor de i objeto.

En realidad no está usando objetos cuando asigna un objeto a una variable o pasa un objeto a un método como un argumento. Tampoco está usando copias de los objetos. En vez de ello,

. La línea 15 muestra un uso distinto del método indexOf (), el cual toma un argumento de cadena y devuelve el índice del principio de esa cadena.

está usando referencias a dichos objetos.

. La línea 17 usa el método toUpperCase para devolver una copia de la cadena sólo en

Para ilustrar mejor la diferencia, el listado 4.4 muestra cómo funcionan las referencias.

mayúscul is.

Listado 4.4. El texto computo de refebencestest. java.

Los métodos de clase 1:

^;

2: 3:

podrían no opc, „ doctamente en una instancia de esa clase, pem pertenece^kcP

mente a ella P< r ejemplo, la clase String contiene un método de dase llamado valueOf e puede ton, r uno o muchos tipos distintos de argumentos (enteros, boolcanos «ros

4:



os, etcétera). E «once, el método valueOf,) devuelve una instancia nueva de St 9 co .emendo e, val., de cadena de, argumento. Este método no opera d,— - -tan

■™

definitiva, una .peración del estilo String, y ..ene sentido definirlo en la clase Strxng.

Los métodos d: clase pueden ser útiles para colocar juntos métodos en un solo '^

Case,. Por eje nplo. la Case Math. defmida en el paquete i •«. lang, contiene un con unto

en'nde de ope aciones matemáticas como métodos de Case; no hay -n«»«»^

Math pero at, , puede usar sus métodos con argumentos numéricos o booleanos. Po ejemplo.

,é,odode :,LM.th.«x,, toma dos argumentos y devuelve e. más grande de: os s.

Usicd no nec sita crear una nueva instancia de Math; ésta puede ser llamada en .ualqu.er lugar que se icccsiic. como en el siguiente ejemplo:

S.VBluopf(5);

Puesto que usted trabaja con objetos, algo importante para entenderlo es el uso de referencias.

. ,,, .i,,-:, .."» H;inu, almé.odo indexOf (). que devuelve I» P--, do la primer., instan cia del carácter dado (aquí, • x ■). Las literales de carácter están rodeadas por com.ll, scncllas; si en la línea 13 la x estuviera entre las comillas dobles, la lucra, se cons,üc-

cía ex.stente de Strin., pero a. obtener una cadena de otro objeto o upo «^ '°

-

Referencias a objetos

subeadena de esa posición y hasta el final de la cadena.

a sus instancias Los métodos de clase suelen ser usados para métodos de

"

s2 = String.valueOf(5);

. I a linca 11 Mama al método substring(), el cual toma dos en.eros indicando un rango y devuelve una subeadena con los pumos de inicio y de finalización. Tamb.cn puede ser llamado el método substringl )con sólo un argumento, el cual dcvuclv. I.,

Los métodos de Case, como las variab.es de Case, aplican a la Case como

s2;

s = "ítem"; "

ve/ do 1, por Iü que el carúcier en la posición 7 es e.

#

99 i

5:

import java.awt.Polnt; class ReferencesTest {

publie static void main (String arguments[]) { Point pti,

pt2;

6:

pt1

= new Point(1O0,

7:

Pt2

=

10e);

pt1;

8: 9:

10: 11: 12: 13:

pti.x

=

200;

pti.y = 200;

System .out.println( "Pointi:

"

System .out.printlnf "Point2:

+ pt1 .x +

",

"

"

+ pt1

+

-,

"

+ Pt2

pt2 .x

+

•y); ■ y);

14:

A continuación se muestra la salida del programa: Pointi:

200,

200

Point2:

200,

200

int maximu .Price = Math.max(firstPrice, secondPrice) ;

! I

Á>

I

Lecciones de objetos

Cuando envíe argumentos pura métodos o use variables en expresiones, debe usar variables de

U Siguien,e .orna lugar en I. primera pane de este programa: . 1 inca 5

Se crean dos variables Point.

. Línea 6

Se asigna un nuevo objeto Point a pt1.

. Linca 7

El valor de pt1 se asigna a pt2.

101

los tipos apropiados. Si un método requiere un int, el compilador Java responde con un error si intenta enviar al método un valor f loat. Del mismo modo, si asigna una variable con el valor de otra, éstas deben ser del mismo tipo.

■ Hay un área donde el compilador de Java es decididamente diferente: las

Nota

cadenas. El manejo de cadenas en los métodos printlnf), instrucciones de asignación y argumentos de métodos se simplifican con el uso del operador de concatenación (+). Si cualquier variable en un grupo de expresiones de concatenación es una cadena. Java trata toda la forma como un String.

arama nada las cambie «plídamenie.

Esto hace posible lo siguiente: ( c iicaí

pt2

float gpa = 2.25F;

System.out.println("Honest,

"

+

(gpa+1.5));

usted lo necesita. Podría ser la clase incorrecta, o el tipo de datos incorrectos, como un float pti,

Referan ¡as ti objetos.

my GPA is a

Algunas veces tendrá un valor en su programa de Java que no es del tipo correcto para lo que

usar cualquier v¡

Figura 4.1

dad,

pt2-

cuando usted necesita un int.

Objeto Point x:200

Utilice la conversión por cast para convertir un valor de un (ipo a otro.

y: 200

Término Nuevo

Conversión por cast es el proceso de producir un valor nuevo con un tipo dil'erente al de su fuente. El significado es semejante a la actuación, donde el per

sonaje de un programa de televisión puede ser representado por olro actor, si el primero

renuncia por un problema de sueldo o es arrestado públicamente por obscenidad. Al hacer la conversión usted no cambia el valor de una variable. En ve/ de ello crea una oti

nueva variable del tipo deseado.

Aunque el concepto de conversión por cast es razonablemente sencillo, el uso se complica por

el hecho de que Java tiene tanto tipos primitivos (como int, float y boolean), como tipos de objetos (String, Point, ZipFile, y similares). En esta sección se expondrán ires for mas de conversión.

• Conversiones por cast entre tipos primitivos, tales como int a float o float a

Ñola

double.

• Conversiones por Cast desde una instancia de una clase a una instancia de otra clase.

Conversión por cast y conversión normal i de objetos y tipos

ñMM^

i y no a f2tó.tvC;! c^era que Us «-osa, sean de unat::: forma precisa

Algo que

nianej

• Conversión normal de tipos primitivos a objetos, para extraer posteriormente valores primitivos de esos objetos.

Al hablar de conversiones por cast, podría ser más sencillo pensar en términos de fuentes y dcsiinos. La fuente es la variable a ser representada en otro tipo. El deslino es el resultado.

#

103 I

Lecciones de objetos

conversión por cast de tipos primitivos

tipo, primitivos .e permite cambiar c. valor de un tipo a otro ,,po eces ocurre con tipos numéricos, y hay un ,¡po primmvo que

£S^Í i—«1 conversé por cast. Los va.ores booleanos deben ser true o Taíse y no se pueden usar en una operación de conversa por cas..

Conversión por cast de objetos

„•

■■

Las instancias de clases también pueden ser convertidas por cast a instancias de otra clase, con una restricción: las clases fuente y destino deben estar asociadas por herencia. Una clase debe ser una subclase de la otra.

Así como se puede convertir un valor primitivo a un tipo más largo, algunos objetos podrían no necesitar ser convertidos por cast en forma explícita. Sobre iodo, como todas las subclases; contienen la misma información que sus superclases, usted puede usar una instancia de una

nT Deb,do a que byte contiene valores de -128 a 127 y un int conuene

mirones, ha^espacio más que suficiente para conven, de byte a in,

i illliiiil un double. piicJe causar alguna pérdida de precismn.

Por ejemplo, piense en un método que toma dos argumentos: uno del tipo Object y otro del tipo Window. Usted puede pasar una instancia de cualquier clase al argumento Object, debido a que todas las clases de Java son subclases de Obj ect. Para el argumento Window, usted puede pasarle sus subclases como Dialog,

FileDialog y Frame.

Esto es cierto en cualquier parte en un programa, no sólo dentro de llamadas a méiodos. Si usted tenía una Variable definida como clase Window, podría asignar objetos de esa clase o cualquiera de sus subclases, a esa variable sin conversión por cast explícita.

También es cieno en forma inversa y usted puede usar una superclase cuando se espera una sub clase. Sin embargo hay una desventaja: puesto que las subclases contienen mas comportamiento

que sus superclases, se da una pérdida de precisión. Esos objetos de superclase podrían no tener

todo el comportamiento requerido para actuar en vez de un objeto de subclase. Por ejemplo, si tiene una operación que llama a métodos en objcios de la clase Integer, mediante un objeto de

la clase Number no incluiría muchos métodos definidos en Integer. Los errores ocurren si traía

adoptado por Java como parte de su soporte de caracteres.

de llamar a métodos que el objeto destino no tiene.

Para usar objetos de superclase donde se esperan objetos de subclase, debe usar explícita cisión. La epresentación explícita toma la forma s.gu.ente (nomared iripo)valué

mente una conversión por cast. No perderá información alguna en la conversión por cast, pero conseguirá todos los métodos y variables que define la subclase. Para convertir por cast

un objeto a otra clase, utilice la misma operación que empleó para los tipos base: (nombredelaclase)object

En este caso, nombredelaclase es el nombre de la clase destino y object es una referencia al objeto fuente. Observe que la conversión por casting crea una referencia al-objeto anterior del tipo nombredelaclase; el objeto anterior aún existe como antes lo hacía. siguiente expresión: (int)(x

/

y);

El siguiente ejemplo convierte por casting una instancia de la clase VicePresident a una

instancia de la clase Employee; VicePresident es una subclase de Enployee con más información para definir que VicePresident tiene privilegios de toilet ejecutiva: Employee emp = new Employee();

VicePresident veep = new VicePresident(); diferentí.

,

subclase dondequiera que se espere una superclase.

emp = veep; // no se necesita conversión por cast hacia arriba veep = (VicePresident)emp; // requiere conversión por cast explícita

Lecciones de objetos

1051

Día 4 104 String pennsylvania = "65000"; int penn. = Integer.parselnt(pennsylvania);

9

La documentación de la API de Java incluye detalles en estas clases. Puede encontrar estas páginas HTML en la sección Documentaüon del sitio Web de Sun Microsystcms: http://java.sun.com

screen2D:

Nota

Hay tipos especiales de clases para boolean, Byte, Character, Double, Float, Integer, Long, Short y Void.

Comparación de valores de objetos y de clases Además de la conversión por cast, hay operaciones que puede desempeñar en objetos: •

Comparar objetos

• Identificar la clase de cualquier objeto dado

• Probar un objeto para verificar si es o no una instancia de una clase dada eorrcspondcn a cada upo

^ Observe que ,os non.

Como una alternativa, e, paquete primitivos: c chlos primiti

r F1°3L F1 ,?

tienen nomnrcs Lon /v ,os tiposs primevos prim

Se clases t,enen una te» T^^'^daL y' sus voznes de Case. v un prominascula. Java .rata en forma «1,^ - |o ^a no se contra e.tos,,-,

P ^ ^^ sc ^a ,, ol,,,

,

^^ ^ ^ ^

Comparación de objetos Ayer aprendió acerca de operadores para comparar valores: igual, distinto, menor que.

etcétera. La mayoría de los operadores funcionan únicamente en tipos primitivos, no en obje tos. Si intenta usar otros valores como openmdos, el compilador de Java produce errores.

La excepción a esta regla son los operadores de igualdad: == (igual), y 1= (distinto). Cuando se usan con objetos, estos operadores no hacen lo que usted de primera impresión podría esperar. En vez de determinar si un objeto tiene el mismo valor que el oiro, determina si los objetos son el mismo objeto.

Para poder comparar las instancias de una clase y tener resultados relevantes, debe ¡mplementar métodos especiales en su clase y llamar a esos métodos.

mteger dataCount = new inte9er

Una v« creado as. un obJCto, ¡o p^c ^

e^p.0. * ***« obtener un

Un buen ejemplo de esto es la clase String. lis posible tener dos objetos diferentes que con

tengan los mismos valores. Sin embargo, aun cuando hubiera utilizado el operador == para

compararlos, estos objetos deberían ser considerados diferentes. Pese a que sus contenidos

int

newcount

-

., „ ,r,lluccil-,n común Mue

nt.w usted necesita en p V

• ■

Sxring

,0 pucdc pu rcsuUacjo ,0 obtener , rcsuUacjo

corresponden, no son el mismo objeto.

Para poder ver si los dos objetos String tienen valores que corresponden, se utiliza un méto do de la clase llamado equalsf). El método verifica cada carácter en la cadena y devuelve true si ambos tienen los mismos valores. El listado 4.5 ilustra esto:

#

Lecciones de objetos

ÜSfrADO 4.5. EL manCO WLETO DE EOUAISTEST. JAVA

eU"u¡u"mSe1«.id ^(String .rg.f]) I

1:

2:

String str1, str2; ... str1 = "Free the bound periodicais. ,

3: 4:

6:

* «M11;

ten out.println("String1:

7:

Systen,.out.println("String2:

8:

"

+

(stri == str2));

System.out.println("Same object.

9: 16: 12:

13: 14:

System.out.println(-String1:

■ +

Svstetn.out.println("String2:

■ *

System.out.printlnC'Sarae object.

15:

Systei».out.println(-Sa.e valué?

16:

¿Quiere encontrar la clase de un objeto? He aquí cómo hacerlo para un objeto asignado a la String ñame = obj.getClass().getName();

str2

==

I

.equals(str2));

¿Para qué se hace esto? El método getClass() está definido en la clase Object, y por lanío disponible para todos los objetos. El resultado de ese método es un objeto Class (donde Class es por sí misma una clase), el cual tiene un método llamado getName (). getName ()

17: 18:

Determinación de la clase de un objeto variable obj.

str2 = new String(stM);

11:

¿Por qué no puede usar sólo otra literal cuando cambia str2, en vez deusar new? En Java las literales de cadena están optimizadas. Si crea una cadena mediante una literal y luego utiliza otra literal con los mismos caracteres. Java sabe lo suficiente para devolverle el primer objeto String. Ambas cadenas son los mismos objetos. Tiene que salirse de su camino para crear dos objetos separados.

str2 = stri;

5:

#

Nota

devuelve una cadena representando cl nombre de la clase.

}

Otra prueba que podría ser útil es cl operador instanceof. Éste tiene dos opeiandos: un objeto a la izquierda y un nombre de clase a la derecha. La expresión devuelve true o false

La salida de! programa es como skue:

si el objeto es una ¡nsiancia de la clase nombrada o cualquiera de las subclases de la clase:

Sfingí: Free the bc_nd periodicals. St-xng2: Free the bc.nd periodica.s.

"swordfish" instanceof String // true 10); pt instanceof String // false Point pt = new Point(iB,

Sane object? true

Sfingi: Free the bc^nd penodicals.

St-ing2: Free the bc.nd penodicsis.

También se puede usar este operador instanceof para interfaces; si un objeto es una instan

Síw object? false Se me

cia de una clase que implemento una inierfaz, cl operador instanceof con ese nombre de inierfaz a la derecha devuelve true.

valué? true

!.! linca 9 .sí lo prueba.

Examen de clases y métodos con reflexión K.,n «strina .vn el mismo valor M^' str1 > ;IS1S?I1;I Str2 ^ ^^ str2_

I-;,, U sog' mía pane crea un nuevo obje o String .

a ese nue «, objeto String. Ahora usted ,,cnc dos *>^« l «

pe. con .-. mismo va!o, Efectu. la ^^^

;,, usar el „,,,,,.

'cl .^ objclD en memo-

Jür « (I nca .5) devuelve .. «P*J^ ^ ;"X ^ devuclvc la respuestt esperada

Una de las mejoras hechas al lenguaje Java después de Java 1.0.2 fue la introducción de la reflexión, a la cual también se le denomina ¡niivspección. Bajo cualquier nombre, la reflexión

habilita a una clase de Java, como la de un programa que usted escriba, para aprender detalles sobre cualquier otra clase.

ha). Prol arlos con el método epuals() en la nnej iu

A través de la reflexión, un programa Java puede cargar una clase tic la cual no sabe nada, y

ítrue; i iiien los mismos valore»!.

encontrar las variables de la clase, métodos y constructores, y trabajar con ellos.

107 1

1091

Lecciones de objetos Día 4

Mediante la reflexión, la aplicación SeeMethods puede conocer cada método de la clase

Randora y todos los métodos heredados de las superclases Randora. Cada línea del listado muestra la información acerca de un método: •

Si es public

• Qué tipo primitivo o de clase devuelve el método

V import java.lang.reflect.*;



2: iaport java.útil.Random;

• El nombré del método

3:

r^Ucvoid ..inCtrin.!] argu.ents)

4:


teven contiene un método utilitario llamado evenCheck,,. el cual -.cl.ca .... valor para ver si es par. S. lo es, despliega Steven! en panialla.

ESCWBA 1: 2: 3:

Listado 5.2. El texto computo de evensteven.java.

void evenCheck(int val)

if (val "s 2 == 6) System.out.printlnf"Steven!");

7:

9: 10:

11: 12: 13: 14:

15:

is

+ val +"•");

6:

■8:

{

System.out.printlnCValue

5:

}

pubLic static void main (String arguments[]) { EvenSteven e = new EvenSteven(); e.evenCheck(1); e.evéncheck(2); e.evenCheck(54);

El corazón de la clase EvenSteven es el método evenCheck () (líneas 3-8), donde se verifienn los valores y se imprime un mensaje «propínelo. A diferencia de los ...¿iodo, que usicil ha defin.do en los ejemplos anteriores, observe que la definición incluye un argumento sencillo

entero (vea la línea 3). El método evenCheck () inicia en cuanto imprime el valor que le fue

pasado. Entonces se prueba ese argumento, mediante una condicional if, para ver si se trata

de un número par.

La prueba del módulo del día 3, "Los ABCs de Java" devuelve el residuo de la división de sus

operandos. Si el residuo de un número dividido entre 2 es O, es un número par.

Si el número es par, se despliega Steven! (Mañana aprenderá más sobre la definición de

métodos con argumentos.)

En esta aplicación el método main() crea una nueva instancia de EvenSteven y la prueba llamando repetidamente al método evenCheck () con valores diferentes. En la salida, única

mente los valores que son pares obtienen un mensaje Steven!

class EvenSteven {

4:

77.

Valué is 1346. Steven!

else System.out.println("It wanoers off.");

jabberwock está contento. Si lo está, .a condición (hungry) se usa para v r s, J ™ también está hambriento, asumiendo que un jabberwock hambnen.o es algo que h.,> que ev ,ar incluso s, es un jabberwock contento. La condicional if (hungry) es o.n. ™»íra d
*>* Observe que s, usa una instrucción vacía en su ciclo for, tendría que inicializar o incrementar a sin n.nguna expresión o instrucción y esa parte del ciclo f or será ignorada

mer vanable de celo o índices de ciclo por usted mismo en otras panes del programa.

instrucción;

inicio del ciclo f or tiene tres partes:

Usted también puede tener una;instrucción vacía como el cuerpo de su ciclo

(ndice de,

f or si todo lo

encuc7 qU7a el-aCer CSt numero h Priprimo mayor lí Ca ^a CSe CÍC'°-(Llama P°r ejemP)0' el S¡8uienle encuentra primer 4,e00. a un método llamadoc

El inicio

notPnme (), el cual teóricamente tiene forma de averiguarlo.) for (i = 4001; notPrime(i); i += 2) J

Un error común en los ciclos for es colocar accidentalmente un punto y coma al final de la

leales al ciclo.

dclü. Li! prueba debe ser una

linea que incluye la instrucción for; for

(i = 0;

i < 10;

x = x * i; //

i++).

¡Esta línea no es parte del ciclo!

En este ejemplo, el primer punto y coma finaliza el ciclo sin ejecutar x = x • i como parte

del ciclo. La línea x = x • i se ejecutará sólo una vez, debido a que está por completo

luera del celo for. Tenga cuidado de no cometer este error en sus programas de javu.

;

Para terminar con los ciclos for, reescriba ese ejemplo con los nombres de la sección de arreglos. El ejemplo original es largo y repetitivo y únicamente funciona con arréelos de Iongitud de cuatro elementos. Esta versión, mostrada en el listado 5.4, es más corta y flexible

(pero devuelve la misma salida).

Escriba 1:

Listado 5.4. El texto completo de namesloop . java.

class NaoesLoop {

2:

sn firstNanés = { "Dennis", "Grace", -Bjarne", "James" };

3:

j,

4:

5:

: índice se compara con saluta •

■ion. Cuando el índice es .gual o

6: 7: 8:

9:

String[] lastNames = new StringrfirstNames.length]; void printNames()

{

for (int i = e; i < firstNames.length; i++)

^

SyStem.out.println(firstNa.i.es[i] + ■ • + lastNames [i]);

10:

11: 12: 13: 14: 15: 16:

publie static'v'oid main (String argumentsr]) { NanesLoop a = new NamesLoop();

a.printNames();

System.out.printlnC

");

a.lastNames[6] = "Ritchie"; a.lastNames[1] = "Hopper";

Listas, lógica y ciclos

se Z I™ én de d£ contiene únicamente una instrucción: clón de bloo bloque, 7, ésto no se requ.eren ya^que""" el ciclo

Listado 5.4. continuación a.lastNames[2] = "Stroustrup"; ».lastNames[3] = "Gosling";

17:

18:

19:

das'si má• ÍIh"

CUand° US3X l3S "aVeS "° "" n¡ngÚn pr0blema- éstas l

dds m más tarde agrega otra instrucción dentro del ciclo.

a.printNames();

20:

á

21:

m nto es , eT í 77 t ""'"

Dennis nuil Grace nuil Bjarne nuil James nuil Dennis Gracs

Bjarne

q

mentos es 1, el ciclo finalizará inmediatamente

La salida del programa es:

cada en ese punto.

' Listado 5.5. El texto completo de copvARRAm«LE. JAVA. 1:

2: 3:

Ritchie

4:

Hopper

Stroustrup

james Gosling

5:

6:

publie static void main (String argun,entS[]) / intf] arrayl = { 7, 4, 8, 1, 4, 1, 4 }; Tl,oat[] array2 = new float[array1 .length] ;

Systero.out.print("arrayi: [ "); for (int i = 0; i < arrayl.length; i++) { Systero.out.print(array1[i] + " ");

7: 8:

9: 10:

System.out.println("J");

11: 12:

System.out.print("array2: [ ")•

13:

int count =0;

14:

array2[count] = (float) arraylfcount);

16:

System.out.print(array2|count++] + " •);

17: 18:

System.out.println(" J");

19: 20:

'

while ( count < arrayl.length &t arrayl[count] != 1) {

15:

Ciclos while y do

class CopyArrayWhile {

}

La salida del programa es:

Salida

arrayl: array2:

[7481414] [ 7.0 4.0 8.0 J

He aquí lo que sucede en el método main (): while

(i
- * "Oy vio comoün método podía hacer e, lrab.jo de otro: y un método buildRect () llamó a otro método buíldRect ().

constructor definido en la clase actual: this(arg1,

Escriba

arg2, arg3);

1:

2: 3: 4:

Listado 7.4. El te: lnt x2-iBt

10:

class MyCircle {

this.x2 = x2; this.y2 = y2;

13: 14:

xPoint;

= yi;

15:

this.y = yPoint; this.radius = radiusLengtn;

16:

1 point

17:

}

18:

l,.yCircle(int xPoint, int yPoint) { tnis(xPoint, yPoint,

y1 = topLeft.y;

19:

1);

x2 = bottomRight.x;

20:

21:,, 22:

■■■>■

23:

MyRect2(Point topL.ft, int w, int h)

24:

x1 = topLeft.x;

25:

y1 = topLeft.y;

26:

X2 =

27:

28: '■!.. •}■'■■

Sobrecama de métodos constructores

29:,

3e:

31:

.,'

32:

diferentes tipos de entrada. * hoy temprano harían

35:' 36:

'

(xi

+ w);

y2 = (VI + h); ■'■ .Mi. i .-

.

.

: .

void printRect() {,

^

33: 34:

y2 = bottomRight.y;

System.out.printCMyRect:

erecL. del app.et, v VSPACE comro.a el espacio vertical sobre y bajo el applet. Por ejemplo,

aquí está ese fragmento muestra de HTML con espacio vertical de 50 y espac.o hor.zontal de 10:

Requires

Java

1 a fi.u.r.. 8.4 muestra cómo se desplegaría este applet. el cual despliega una cama sonriente

en un fondo blanco, con otros elementos de una pagina Web. El fondo de la pag.na es una

rejilla, y cada rejilla tiene un tamaño de !0xl0 pixeles. Usted puede usar la rej.lla para med.r la cantidad de espacio entre el applet y el texto en la página.

CODE y CODEBASE Los atributos CODE y CODEBASE a diferencia de otras partes de la etiqueta , se usan

nara indicar dot.de se pueden encontrar el archivo de la clase principal del applet y otros

archivos los cuales serán utilizados por un navegador con capacidades Java cuando trate de ejecutar un applet después de obtenerlo de un servidor Web.

j!

;



i

La etiqueta

Cómo poner programas interactivos en Web

Día 8

188

i°' archivo de texl° ° cualc!uier T ""^ demr° "" "^ MR" Lüi ■■üianic el lonnaio Zip ÜC o empacados sin compresión

Cn!ar CS0S ílTchtw™< «' J^K incluye una hc,T,,n,cnu, describen posteriormente.

jar cf Aníñate, iar -.class vgi

listado 8.2

1:

2:

:mLE>The PaHndrone Page

3: 4:

5:

:;>!¡Tf.vorit. ,eat-related palindro.e 1.:

6:

que el nombre nomb«dJ del

'

que

""''

vo del archivero seguirá como uno de los argumentos siguiemes. i

También puede añadir i--h:- i- .

ieme.

-r

— rwi.s ^puo/lcos a un archivero Java con un comando como el sigu-

jar cf Smiley.jar ShowSniley.class ShowSmaley.html spinhead.gif

7:

Tiiiey . jar que contiene tres archivos: ShowSmiley.class,

8: 9: 10:

11:

12:

Archiveros ch.veros JAVA jmvm La manera estándar de colocar un applei de J-

^ es mediame u ^ ^ obücne y ejccuU,

para .ndicar el archivo de ^ ~ ^^ arch¡vos requeridos por e, un navegador con soporte para Java. Cualesquier

aPple. se obtienen desde el servidor Web.

pZ ón ,

i' ^ " " Ca

appiti con etK|iieias como la-, .siguientes:

- archive-smiley.jar- width=45 heiBht=42>

La etiqueta especifica ,,uc „„ :la-,livo JAR |hml;ldo Smiley. j

jar

por el applei. TO navegadores v hi.o-,,.,; .,„ .

H.nIrn . , .

..

.

.."

com¡cnc

| "tminiiLMUs de navegacionque soportan archivos JAK buscará,,

aentro del archivo indimH.-» u ^^

'

t -

o inalado los demás archivos que se necesitan conforme se ejecuta el applet.

Cómo poner programas interactivos en Web

Dia 8

•i Precaución

Aunque un archivero Java puede contener archivos de clase, el atributo

ARCHIVE no elimina la necesidad del atributo CODE. Un navegador requiere

í t:rf'°'lc lm *

conocer el nombre del archivo de la clase principal del applet para cargarlo.

Otros formatos de almacenamiento

An.cs de que los desarrollados de Java introdujeran el formato de archivo JAR. lamo Netscape

Lo Microsoft ofrecieron sus propias so.uciones de almacenamiento. No ofrecen algunas de las ventajas de los archiveros Java, pero tienen el beneficio de trabajar con navegadores con soporte para Java que todavía no soportan las versiones de Java mas alia de 1.0.2.

L-.s versiones actuales de los navegadores Web de Netscape soportan el uso de archiveros Zip

Paso de parámetros a los applets

coi, el atributo ARCHIVE, pero sólo se pueden utilizar para los archivos de clase, no para ,ma-

"!!e ' u otros unos ele archivos que un applc. pudiera necesitar. Con Netscape, usted puede usar el atribulo ARCHIVE para indicar el n.mib.v cid a.duvcro. um.o i-Me.

es d.ferente a minúsculas. En otras Palab^s?s7parámetros no están pasando ade-

Nota

12: 13:

}

Lo primero que necesila para añadir a esta clase es un lugar para que el parániciro palindrome

sea almacenado. Como usted necesilará esle nombre a iravés del applct, agregue una variable de instancia para el nombre exactamente después de la variable para la luentc:

h-i sido especificado en el archivo 1ITM1Observe i|uc si un parámetro que usted espera ^"^ ^ ^c£% prucbc con uri parámetro

if (theFontName == nuil)

String

palindrome;

Para configurar un valor para el nombre, liene que obtener el parámetro. El mejor lugar para

manejar ios parámetros de un applet es denno del método init (). Esle método se del me del mismo modo que paint () (publie, sin argumentos, y un tipo de retorno void). Al probar un. parámetro asegúrese de probarlo para un valor de nuil. Si no se indica un palíndromo, lo pre determinado, en este caso, es desplegar Oennis and Edna sinned, como lo ilustra lo

^

siguiente: publie void init() { palindrome = getParameter("palindrome");

if (palindrome == nuil) palindrome = "Dennis and Edna sinned";

}

StringY = ¿etParameter('size-); if

Una vez agregado este método, todo lo que queda es modificar el método paint (). El méto

(s == nuil)

do original drawString() se parecía a esto: cd

C,«

*

e,

applci

U '"" ",,,.|0 „„„!. .na Eír,.

p,_unar0.,

screen.drawString("Go hang a salami, I'm a lasagna hog.", 5, 58); Para dibujar la nueva cadena que usted almacenó en la variable de instancia palindrome.

todo lo que necesitará es substituir dicha variable por la cadena literal: screen.drawString(palindrome,

,icie cP_.Teiigo un applet que toma parámetros y un archivo HTML que le pasa esos

La página

NewPa Iiíi

drawLine(x1, yi, X2, y2);

las coordenadas x se incrementa a la derecha de 0,0, y las coordenadas y, lo hacen en

sentido inferior. Esto difiere de otros sistemas de dibujo en el cual el origen 0.Ü está en h esquina inferior izquierda y los valores de y se incrementan en semido superior.

Todos los valores de pixeles son enteros (usicd no puede usar números decimales para desple gar algo entre valores enteros).

La figura 9.2 representa el sistema de coordenadas para gráficos de Java con el origen en 0,0. Dos de los puntos de un rectángulo están en 20,20 y 60,60.

Agregue la siguiente instrucción al método paint() del apple, Map. screen.drawLine(185,80,222,80);

Esta instrucción dibuja una línea de 185,80 a 222,80; una Knea que subrava

como se puede ver en ,a figura 9.3, una porción de la ventana del apple,.

c\ texio Florida,

9.3

Figura 9.2

+X

0.0

El sistema de coordenadas para

Axregado de una Unen al apitlel.

?r ?o

gráficos de Java.

Mota 6C 60

Para preven,, las molestias producidas de voltear repetidamente entre este

texto y su edrtor de código fuente de Java, la versión final de Map. Java se

lista completa al final de esta sección. Hasta entonces, usted puede conti

nuar con el texto y escribir todo el código Java una sola vez

Rectángulos +Y

Dibujo y relleno

H-,y disponibles dos clases de métodos de dibujo para muchas de las figuras que usted puede dibujar en un applet: métodos de dibujo, con los que se delinea el obje.o. y métodos de relleno, con los cuales se rellena el objeto con el color actual. En cada tipo de-método tam bién se desplegará el contorno con el color actual.

Nota

También puede dibujar archivos de mapas de bits, como los archivos GIF y JPG, mediante la clase Image. Mañana aprenderá sobre esto.

redoñderd?: ** "^ ieCUta8ul0í: reclán«ul« ml« v con esquinas redondeadas (como en la mayoría de los*teclados de computadora). Usted puede dibujar ambos tipos de rectángulos en una forma delineada o rellena con el color Para dibujar un rectángulo normal, use e. método drawRect (, para los contornos y e, método

fillRect () para las formas rellenas.

Ambos métodos toman cuatro argumentos:

• Las coordenadas x y y de la esquina superior izquierda del rectángulo. • El ancho del rectángulo.

• La altura del rectángulo.

Día 9

grífico, fuentes y co.or

# #

Agregue la siguiente instrucción al applet Map: > screen.drawRect(2,

2,

345,

Esto weoa un contorno cttreciánguló justo dentro de !as orillas exteriores de la ventana de. ^sTcn ve, d, ello se hadado e, método* illRectO «„ ^angu^hdo podna llenar la mayor parte del área del apple. y ocultar el texto subrayado Florida. Les rceñngulos con esquinas redondeadas redondeadas reque requieren los métodos drawRoundRect () y on esquinas 3Sfe tos de lo, rectángulos norm 3fe , que toman los primeros cuatro argumentos normales. con doVnrgU/iicntos añadidos 'il final.

rcdondea^ «» & 10 pixeles de

ancho y 8 de aho El

345);

del aPÍL.; Figura 9.5

:

e" I:l fieura 95- «" acercamiento de una porción

g

Agregado de un

rectángulo redondeado

al applet.

"

Los Pohgonos se pueden dibujar con ,os métodos drawPolygon

lilüÜoí ¿¡limos argumentos definen el ancho y el alto del área en que se redondean las

^ nÍ E re mis grande sea el área, más redondas serán las esquinas. Incluso puede hacer

() y nilPoIygon,,

qS «ciínguto se vea como un círculo o .,„ ovalo, haciendo esu, argumcn.os ,o su,,,cnteniente grandes.

,, f,..un 9 4 muestra vanos ejemplos de rectángulos con qsquinas redondeadas. Un rec.ángu-

"o tS,e n anl de 30 y una altura de ,0 para cada esquina redondeada. Otro nene un ancho

Puede especificar eslas coordenadas de dos

de 20 y una altura de 2()!y luce mucho más como un círculo que como un rectangu.o.

maneras

Figura 9.4 10

dondeadus.

Polygon poly = new Polygon();

J

e!ZE P£° d6Sde ""Poly0on(¿nt/; C°^° de P«"««iattl -diante enteros. Esto requ.ere una llamada al constructor

, e, cual especifica e, aneg.o de pumos x. e. arreglo de pun.I y "c., ,'id- c

El s,guienie ejemplo muestra el uso de este constructor: Agregue la siguiente insirucción a! método paint() del applel Map: screen.drawRoundRect(182,61,43,24,10,8);

int x[]

= {

ia,

20,

30|

48|

50 }.

int y[] = { 15, 25, 35, 45, 55 };'

mt points = x.length;

Polygon poly = neW Polygon(x, y, points);

p'un.os

P

Cómo mejorar la apariencia de sus programas con gráficos, fuentes y color

Día 9 I 206

Figura 9.6 Agregado de un polí gono al applel. ejemplo: ,

65);

cde dibujarlo con los

Cuando tenga ,

métodos

drawPo

objeto Polygon, como se muestra aqu>: .cre.n.dr.*oly0-n(poly>".

^

^

de correspondencia

Óvalos Precaución

Círculos y óvalos se dibujan mediante los métodos drawOvalf) y mi0val(). Estos loman cuatro argumentos: • Las coordenadas x, y del óvalo.

• El ancho y alto del óvalo, que son del mismo tamaño en círculos.

, 253. 261,3«-, 336, 295,253, »

Como un óvalo no tiene esquinas, .al ve/, le desconcierte a qué se refieren las coordenadas x, y. Los óvalos se manejan igual que las esquinas para los rectángulos redondeados. La coorde nada x, y esta en la esquina superior izquierda del área en que está dibujado el óvalo, y estará

a la izquierda y arriba del mismo óvalo real .

Regresemos al applet Map y agregue las instrucciones siguientes: screen.fillOval(235,140,15,15);

screen.fillOval(225,130,i5,i5);

screen.fillOval(245,130,15,15);

Éstos son métodos f ill (rellenar) en vez de métodos draw (trazar), por eso crean tres círcu

los negros conectados entre sí en un punió al ceniro de Florida, como se ve en la ílgura 9.7

#

I

Día 9

208

Cómo

Figura 9.7

Figura 9.8

Agregado de un trío de

círculos el arpie!.

I2Ü2!2l!ifPar¡enc¡ade:

l^gjggffg*^

Medidas de un aito.

270°

Esta

Arcos De todas las operaciones de dibujo, los arcos son los más complejos de construir. Un arco es pane de un óvalo y se implemento en Java como un óvalo dibujado parcialmente. Los arcos se dibujan con los métodos drawArc () y f illArc (), los cuales toman se.s argumemos:

• Las coordenadas x, y del óvalo. • El ancho y alio del óvalo. •

E! ángulo de inicio del arco.

• El número de grados cursados por el arco.

Los primeros cuatro argumentos son los mismos que para un óvalo y funcionan de la misma manera.

Pl ánuiilo de inicio del arco va de 0 u 359 grados en sentido «puesto a las manecillas del reloj.Kr, un óvalo circular, 0 grados equivale a un reloj a las 3 en pumo; 90 grados a las 12 en punto: 180 grados a las 9 en punto y 270 grados a las 6 en punto.

Los grados que cursa un arco van de 0 a 359 grados en sentido contrario a las manecillas del reloj y de 0 a 359 grados en el sentido de las manecillas del reloj. La figura 9.S muestra cómo se calculan los últimos dos argumentos.

-190) .

instrucción dibuja el ve veo

lcs y un alio c]0

Figura 9.9 Un arco.

fuentes y color

Día 9

211

>210

tro areumentos que no cambian

""' " **■*

*

.0 P«ele>,

9:

screen.drawRoundRect(182,61,43,24,10l8); int X[] =,{ 10, 234, 253, 261, 344, 336, 295, 259, 205, 211,

10:

11:

195,

12:

13:

, ,,. „„*

15:

19:

AlV,da .as instrucciones

21:

screen.drawArcfax, ay,

23:

denadas x, y creadas por el ciclo:

12 };

£#&:!■. mmm.

for (int ay = 120; ay < 320 ; ay += 10)

22:

00,0» - **, .«•

t

Los objetos de laclase java.awt .Font se usan junto con el método drawString() para pro ducir fuentes diferentes. Los objetos Font representan el nombre, estilo y tamaño en puntos de una fuente. Otra clase, FontMetrics, proporciona métodos para determinar el tamaño de los caracteres que se van a desplegar con una fuente especificada, la cua! se puede usar para cosas como formateo y centrado de texto.

m

Cree objetos Font

El método copyArea () toma seis argumentos:

. Los coordenadas x, y de la región rectangular a copiar.

Un objeto Font se crea al enviar tres argumentos ¡i su constructor: • El nombre de la fuente.

. F! ancho y alio de esa región.

.. La rancia horizomal y vertical, en pixeles, para reurarse de .a reg.ón antes de desple-



El estilo de la fuenlc.

• El tamaño del punto de la fuente.

jrar una copia de ellu.

La siguiente inacción copia una región de 100x100 Pieles a un área de 50 pixel* a la dcnvha y 25 pixi-les ¡ih.ij.v. .

El nombre de la fuente puede ser un nombre específico de fuente como Arial o Garamond Oíd Style, y se usará si la fuente está en el sistema en que se está ejecutando el programa Java. También hay nombres que pueden ser usados para seleccionar las fuentes integradas de Java: TimesRoman, Helvética, Courier, Dialog y Dialoginpui.

aprenderá hoy a conhg.rar el color de fondo, posterior.ne.nic.

Precaución

Para Java 1.1 y posteriores, los nombres de fuentes TimesRoman, Helvética y Courier deben ser remplazados con serif, sanserif, y monospaced, respectiva mente. Estos nombres genéricos especifican el estilo de la fuente sin nom

que representan las dimensiones del applet.

brar una familia de fuente especifica usada para representarla. Ésta es una mejor opción ya que podrían faltar algunas familias de fuente en todas las implementecíones de Java, por lo que se podría usar la mejor opción para el estilo de fuente seleccionada (como serif).

instrucción siguiente:

screen.clearRect(e; 0, size() .width,

Se pueden seleccionar tres estilos de fuenle mediante las constantes Font.PLAIN, Font. BOLD y Font. ITALIC. Estas constantes son enteros y usted las puede agregar para combinar efectos.

El último argumento del constructor Font() es el tamaño en pumos de la fuente.

La instrucción siguiente crea una fuente Dialog de 24 puntos, que es negrita y con itálicas. Font f = new Font("Dialog",

¡

nombre es parte del esfuerzo de JavaSoft para tener nombres de , consistentes a través de la biblioteca de clases.

Font.BOLD +

Font.ITALIC,

24);

Dibujo de caracteres y cadenas Para configurar la fuente actual, el método setFont () de la clase Graphics se usa con un objeto Font. La instrucción siguiente utiliza un objeto Font llamado f t: screen.setFont(ft);

\1

m

Texto y fuentes

Copiado y limpieza

screen.copyArea(8,0,100,188,50,25);

2131

Üf-Üi-'.'-i'

Cómo mejorar la apariencia de

sus programas con gráficos, fuentes y color

4:

J| Püblic class SoLong extends iava.applet.Applet { »: lual a dicho obje-

dianie setFont ().

PU51^n^old_Paint(G'-aphics screen) {

9:

rics fm =

18:

g,

setFont(f);

11: 12:

,o y dibuja la cadena

13:

14:

-•

16:

}

screen.dra*StrinB(S) ,, y);

}

tanas de distinto tamaño. Figura 9.11

Dos copias del applei

a

viccnlc, como el ancho y al.o de escures

dicha cadena.

.

Dado un carácc, devuelve el ancho de ese c:,,a.c,

charWidth(char)

getHeightl)

,

V ,

import java.awt.Font; imoort java.awt.Graphics;

I i/port ]ava.a«t.FontMetrics;

^"J^^^^r'-v --»■ ■'■-■■

wses Font y FontMetrics. El applci SoLong

215

217

Color

y

y ColorSpace del paquete j ava. awt para que sus aPPlel!| >'

usar las

■--■—coior Para crear un color: s

"mbién puede traducir un color de un sistema de descripción de colores a otio.

En forma predeterminad, Java usa co.ores de acuerdo a un sistema de Opción de -lores

SJndo sícB. En este sistema un color se describe por la cantidad que contiene d. ojo

X -I tde alH tienen la R.G. y B de Red. Orcen y Blue, Cada uno de ,. ^ ponentes pueden ser representados como un entero emre 0 y 55

^

esencia completa de color rojo, verde o azul Blanco es 255. 255. ¿bs. la



. ■

^ .^

;es emeros que represemen ^ ^

numeros de pumo floiame que

Usted puede especificar el valor sRCB del Las .nstrucciones siguienles ,nuestran

sea

) float.

= newColor(0.807FjlF0F).

Color c2 = newcolor(255,204)102).

:

le ós tres U ,ed también puede representar valores sRGB mediante los nume.o, de pa.to

ÍJal que van de 0 a ^ .0. Java puede representar millones de colores entre los dos extremos mediante sRGB.

Un sistema de desenpción de colores se llama un e^uáo de

^^?

de tales espacios. Otro lo es CMYK. un s.stema usado por ,m.sore seaún la cantidad que contienen de cyan, magenta, amarillo > nefcro.

l

e^ -

punto flotante como

'ores se suelen «Z5 ," página Web medi

el día 3, "Los ABCs de Java". Los cocomo si configurar un fondo para

Cases y métodos ./i::;

I

io de color deseado, en cuanto se use el objeto ColorSpace para JJh.t ü pcón de colores. Usted también puede convenir desde cuaUuncr onuc, d.

; ^^

males, por ,ünto. cuando vea una «, ^

con números de punto tate

HTML. Ninguna de las

ar9umentos hexadeci-

"^ '^^ eS eS quo quo esIá esIá tr^

color ol a sKGB. y y

I , representacón ¡mema de colores de Java medíame sRGB es sólo un espacio de co

actuales

;;c se está usando en un programa. Un dispositivo de salida. mon,,o, o ,„„—

' el méiodo setColor() de la clase

tiene su propio espacio Je color.

CU-.VO v.s,ed desnlieoü „ ¡aprime ulso de un co.or designado, el disposi.Ko de salida podrí:,

=SEHSS==

o más colores que se aproximan al color no existente.

U realidad practica de la admin^ion de ^ sRGB no está disponible en todos los dispositivos de s

»>les «mo

s co,o,,s usan las s,guienlCs variable., Color (con valores sRGB ind.cados en(re pa.nteblack

(0,0,0)

'aso de ese color, puede usar las clases ColorSpace y otras clases en el paquete

blue (0,0,255)

java awt. color primado en Java 2.

cyan

En ,a mayoría de los programas, bastará e, uso integrado de sRGB para definir -os .o,o,w

darkGray (64,64,64)

Uso de objetos Color

P,r, conjurar el color del dibujo actual, ya sea con un objeto Color que debe ser creacto pan. fresen.;,- el co.or o que usted deba usar alguno de los colores estándar dispenses ,a clase Color.

(0,255,255)

°ray (128,128,128) green

(0,255,0)

lightGray (192,192,192)

magenta orange

(255,0,255) (255,200,0)

Pink (255,175,175) red

(255,0,0)

wnite (255,255,255) yellow (255,255,0)

Día 9

Lu i,«n«ca» siE-ic,c e--h.cc e, * v¡gfin,c de, .*Jc.o screen a u^s Uc u.» - ,,,s

Cómo mejorar la apariencia de

Eptre Jas características de Java2D se incluyen las siguientes:

'■ • Plantillas de llenado especiales, como degradados y lexlUras

variables de clase estándar. screen.setColor(Color.pink);

Si usted na creado un objeto Color, lo puede estab.ecer de una .añera «ñutan Color brush=newcolor(255,204,102); screen.setColor(brush);

s de estab,ecer e, coior actual, todas ,as operaciones de d,buJ0 ocurrirán en ese co!or.

• Trazos que definen el ancho y estilo de un trazo de dibujo

• Procesos de suavizado para redondear los bordes de los objetos dibujados.

Espacios de coordenadas de usuario y de dispositivo I Término Nuevo

stablecerá el color de fondo de la ventana de, applc Este

El mé,odo setBackground las coordenadas que se usaron para dibujar líneas, textos y otros elementos

;is ;'cerca los

color como el fondo del applet: screen.setColor(getBackgroundO);

Operaciones gráficas avanzadas mediante

Conversión por cast de un objeto Graphics2D

es cb t0r

do paint ()

lk,,s * ;D üo .*. »m«i. ¡"^"«»■«» °;.™;n.n»¿«,-. o.,,;...,».,.«..«.> ha apréndalo hy

do las otras clases y programas que las implementan.

\

dÍbUJ° " ^ SOn

"

» desde un objeto

Pa'a

public void paint(Graphics screen) {

GraRhics2D screen2D = (Graphics2D)screen;

El objeto screen2D en este ejemplo fue producido a través de una conversión por cas,. Es d

objeto screen conven.do desde la clase Graphics a la clase GraPhics2D.

.

Todas las operaciones gráficas de Java2D deben ser llamadas en un objeto Graphics2D. Éste

es parte del paquete java.awt.

Cómo mejorar la apariencia de

Día 9

sus programas con gráficos, fuentes y color

220

■ Addico

Especificación de los

Cíclico

Figura 9.12

Desplazamientos de degradados aa'clicos y

cíclicos. y muchas otras características.

d ■"*■

funciona de la misma mane-

2D

* -

screen2D.setColcr(Color.black)

sea con el mismo p¡¡

Figura 9.13 litis rectángulas con el mismo

GradientPaint.

Patrones de relleno LüS patrón, s de relleno

puede usar m color sol.do. relleno

patrón c: «Ueno « ^ «

Ss22 2

uñar con ,n color só.ido como p.tr6n

- ^ -d,— lo que es un **

feúra ,12 muestra los ejemplos de

ad0 Con JaVa2D «*«*

paint se implementa por cualquier entPaint.TexturePaint, y Color, con setPaintO

,mslnil1or GradlentPaint

GradientPaint(x1Iyi>Colonlx2ly2,color2,;

setPaint()deGraPhics2Dconun

es io mismo que

de

=

"Z^::Tzrel co]or

Si usu* desea usar un desp.azamicn.0 Jc ggradienle

cícl,C0. „„

GradientPaintfx!,yi,colon,X2,y2,colora,true,-

.sacíclicos y cíclicos emre blanco y u«

es insertados. untos en

refieren eren direcumentc a pu . de coordenadas en

a Jlam«Ia a, ,né

o un P- * su P^ —

el objeto

i de d usuano y Heren a, espacio

screen2D.setPamt(pat) ;

Todas las operaciones subsecuentes de dibujo pan, el

relleno hasta que se elija ouo.

' \

usaran e.sie palron de

Cómo mejorar .a aparlendade I 222

Creación de objetos para dibujar

del d.a de hoy, .

BasicS

Td

líneas, rectángulos, elipses, arcos y polígonos

r

uan, an^nu-s:s: ,a,as

daSseguido de las coordenadas x, y de Ja o.ra. Aquí está un , y de un punto '"fina,

os de unlón se apUcan a Unes que

Line2D.Float ln = new Line2D.Float(60F.5F,13F.28F); «gumentos. pues de otra manera e, compilador Java asum.rí. que son entero,

Rectángulos

Los rectángulos se crean mediante las clases Rectan9le2D. Float o fiectan9le2D Double

L^ferenca entre ,OS dos es que uno loma argumentos fioat y eJ olro lc)n):Lgumentas ente es un ejemplo:

RectanSle2D.Float re = new Rectangle2D.Float(10F,13F,40F>20F);

Esto crea un rectángulo en 10.13 que es de 40 pixeles de ancho y 20 de alto. ' Figura 9.15

faliltn de unión Je minto fui"1-

Elipses

E" J;iva2D los °bje.os ovales se llaman elipses, y pueden ser creados con la

Tl pse2D'Float ■Toma cualro ar8umemos: ia coordenada x-ia

U instrucción siguiente crea una elipse en .13,25 con un ancho de 22 pixeles y un alto de Ellipse2D.Float ee = new Ellipse2D.Float(ii3,25,22,40) ■

redonclcadas.

programas con gráficos, fuentes y color

Un objeto GeneralPat, puede ser creado si,, nillj.,m :1I,lmlcnl0, ^ sc ,„_,„ ^ GeneralPath polly = new GeneralPath();

'■

El método moveTof) de

usted qu.s.era quisiera lnic,ar iniciar polly nonI en ?las coordenadas "" ParU £' Pr¡mer pUn'° e" el P°lfeono- Si 5,0 "^ t tendría que usar la instrucción siguiente:

polly.moveTo(5f, 0f);

^rtoE

> se usa ei

nuevo punto. Es

toma dos argumentos: las coordenadas x yy yy de. de. nue nuevo

Las instrucciones siguientes añaden tres líneas al objeto polly: polly.HneTo(205f, 0f);

POlly.lineTc(205f, 90f);

polly.lineTo(5í,

Csira cluia uno do estos eslilos

90f);

y moveTo° St quiere cerrar un polígono, utilice el método closePath( )s in

argumentos como se muestra

polly.closePath();

ado por el

mé odo lmeTo() , ,rque conecta al punto Pe Ce'Ta método original. uraT[! ? uraTrend[l'!" P°'?On0

ad°' "Sled '° ^ede dib^r con,o• cualquier otra ,

uia Mguiendo Mguiendo los los métodos métodos üraw() y fin O I-'I ohi.-K, Mn guia ' V enn 5,0, 5,0, 2050 205,0, 20590 205,90, y y 590 5.90.

" "" lvcli"l»llll> CíW l'lllllos

Dibujo de objetos

ccrr:.r:i como una rebanada de pastel

Todos los objetos dibujados usan los mismos métodos de la clase GrapfUcs2D:

los fiemos y f xll,, para los objetos rellenos. És,oS toman un objeto como argumento

para

obetoSt J ÜawStr-9< )■ ^ U,n,a tres «n-umemos: objeto St rano para d.bujar y sus coordenadas x. y. Como todas las coordenadas"™

U',cn es pane d,l paquete iava.awt.geoa

Java2D, se deben especificar los números de punto flotante en vez de ser enteros

225

Día 9

Un ejemplo de dibujo 2D »' —— • i-I r i nrimcns actividades de hoy usted creó un mapa de Ronda siguiendo los meiodos

? n "c^n disponibles a uuvds de la clase Graphics. lil ,m',x¡,,,o applc, 4uc va , Íelr ls ulversión modificada de ese mapa, el cual utiliza técnicas de dibujo 2D. Pu -sto que todas las clases Java2D son nuevas eon la versión 2 de Java, este applet sólo

^TvÜ con un navegador Web que soporte Java 2. A. momen.o de escnb.r es.a obra ,a herramienta appletviewer incluida con el JDK 1.2 es la única manera de verlo.

F.I listado 9 5 contiene el applet MaP2D. Es un programa más largo que muchos en este libro debido a que 2D requiere muchas instrucciones para completar una operación de d.bujo. Listado 9.5. El texto completo de map2d . java. 1:

2:

3: 4: 5:

6: 7:

8: 9: 10: 11: 12:

13: 14:

15: 16: 17: 18:

19: 20:

21: 22: 23: 24:

25: 26: 27: 28:

29: 30:

31: 32:

33: 34:

:

fl.lineTo(i9iF,neF) fl.lineTo(12OF,56F); fl.lineTo(94F,68F)•'

fl.lineTo(81F,49F); n.lineTo(12F,37F);

fl-closePath();

screen2D.fiii(fl);

// Dibujar óvalos

screen2D.setColor(C

S:-;;i;:?¡;

Float(245)130) 15,15) ;

screen2D.fill(e1).

screen2D.fiii(e2),'

screen2D.fill(e3);

importe java.awt.*; importe java.awt.geom.*;

publie class Map2D extends java.applet.Applet { publie void paint(Graphics screen) { Graphics2D screen2D =

(Graphics2D)screen;

setBackground(Color.blue);

// Dibujar olas screen2D.setColor(Color.white);

BasicStroke pen = new BasicStroke(2F, BasicStroke.CAP.BUTT, BasicStroke.JOIN_R0UND), screen2D.setStroke(pen);

for (int ax = 10; ax < 348; ax += 10)

navegador que soporte esta versión delln

raren, appletviewer lncl "

appletviewer maneja las et.quetas Por lo que no hay motivo para crear

breve que io

^ PUCde SCr VÍ!iIU -nbir es,e libro, ía

5"la C°mpl¡Cada para al8° ^ «««1 sólo podrá

for (int ay = 30; ay < 340 ; ay += 10)
' c'"e M ^cuum lú P"-""»- ■*

Control de la animación mediante subprocesos

mciodo repaintO.

' pro«rama

Ai

W—ar en sus

^ de-una .área

solicitudes a repaint,) se )a, acunas podrían ser llamada

a

repaint O

y

c ' ". ventana es insignificante.

.iempo de proce-

'» «ación de d,buJOs repeis pa', crear

#

Día 10

Dibujo de imágenes

#

en un applet a través del método drawlmage () de la clase Graphics.

^desplegar una imagen a su .amaño real, llame a, mé.odo drawlnage,, con cua.ro argusc localiza el archivo de la clase principal del upplcl.

• El objelo lmage a desplegar • La coordenada x

m

• La coordenada y

"rsumt

#

• La palabra clave this

Para^desp-egar un archivo gráfico almacenado en el objeto img, utilice e, siguieme método 'U, = getImage(getDocumentBase() , "book.gif );

imaaeU,

-

getimage(ge

tDocumentBase(), "i.ages/book.g.r

public void paint(Graphics screen) { screen.drawlmage(img,

10, 10, this);

Las coordenadas x, y que se utilizan con drawlnage (, son similares a las coordenadas x, y para desplegar un rectángulo. El punto representa la esquina superior izquierda de la nnagcn. Usted puede desplegar una imagen a un tamaño diferente mediante seis argumen.os ex.ra: • El objelo lmage a desplegar • La coordenada x • La coordenada y • Ancho • Alto

• La palabra clave this

Medíame alguno de estos métodos, usted hace posible página Web y no se hagan cambios al programa.

Los argumentos ancho y alto describen el ancho y alto, en pixeles. que la miasen debería de

ocupar al desplegarse. Si no son del tamaño real, la imagen será escalada parque quepa en

el ancho y aho modificados. Es.o no ahera la imagen, por lo que us.ed puede usar varias lla madas a drawlmage() para desplegar un objeto im3ge en varios .amaños clileremes. Hay dos métodos de la clase Inrnge que son útiles cuando se despliega una imagen en 01ro

tamaño d.stimo al real. El método OetHeiOht() devuelve la altura de la imagen como un

archivos de clase en el archivo JAR

V..

entero, y el método getWidthf) que devuelve la altura.

é

Día 10

|248

Cómo crear animación mediante imágenes

Crear animación con imágenes es lo mismo que con fuentes, colores y otros objetos amma-

1 U^

'os mismo! métodos y .os mismos procedimientos para dibujo. reP,n,a o y

"" aiTeS'° de obJelos

y usar otro ^

Succión de los poblanas de parpadeo. La única diferencia es que usted uene una p,la de imágenes para hojear entre sí, en vez de un conjunto de dibujos.

L-, mejor fon,,:, de mostrar «rimo animar imágenes es trabajar a través de un ejemplo, lil £S> proyecto es el más grande que usted haya emprendido y está amphamen.e de, Hado. El a^e, Nek° es una buena demostración de la programación de subprocesos en applets, manejo de imágenes y animación.

El ejemplo Neko

1 as imágenes con que usted trabaja en el apple. Neko les parecerán familiares a muchos

usuarios^ sistemas Macntosh, así como a otros usuarios de algunas otras P «^™J;

Neko que proviene de la palabra japonesa que significa gato, es un programa de Mcuosh ,

esÍho or Kenji Gotoh que desarrolla un gato pequeño animado. Neko juega con el punten,

siguientes declaran esIOS objetos:

""agen actual- LaS ¡"«nicciones

Image nekoPics[] = new imaQe[9]. , Image currentlmg; y l J"



imágenes tiene nueve posiciones (0 a 8)>

Neko se moverá pre el mismo valor- 50 Las

que

inj

ü VariabIe emcra V lendrf siem"

' '""mecones s.guientes crean es.as variables:

int x.

int y = 50;

del ratón, duerme y se compona en forma parecida al juguete Tamagotch..

""7

Para este ejemplo, creará animación basada en los gráficos originales de Neka éste es.á basa Java se ejecutará desde el lado izquierdo de la ventana del applet, se deiend a a

. mauHan!. se rascará .. oreja, domurf un poco y luego desacera por la Je....,, Paso 1: reí na sus imágenes

Antes de empe» ar a escribir un código Java para construir una animación, usted debena tener

consto .odas I: s imágenes que forman la animación en sí. Para es,:, vers.on de N.ko. M nueve de ellas (íl original tiene 36). como se muestra e« la t.gi.ra 10.4.

Figura 10.4 i'S 0; i--J) \ currentlmg = nekoPics[6];

m m

bostezar

lllilllilcilH, ,K,r ... M»c ukK

253¡

nekoSleep(5); 3:

repaint();

public class Neko extends java.applet.Applet

4:

6: 7:

8: 9: 10: 11: 12:

implements Runnable {

Image

currentlmg;

Thread int

runner;

x;

int y = 58;

go^t! = ( Ti.Kti...

14: 15:

// intercambiar imágenes " (currentlmg == nekoPicsfei)

;

currentlmg = nekoPicsri

pt0r CrrtI

stop.gif", "yawn.gif", -scratch1.gi scratch2.gif.-sleep1.gif", "sleepS

16: 17:

awake.gif"

18: 19:

nekoRUn(x, size(,.width ♦

Iroage nekoPics[] = new Image[9];

13:

20:

pause(580);

for (int i=e; i < nekoPics.leñgth; i) { nekoPics[i] = getlmagefgetCodeBaseW, "images/" + nekoSrc[i]);

21: 22:

nekoscratch(int numTimes) {

°r (int i = numTimes; i I ¡. ±.. currentlmg = nekoPics[4]' repaintf); ' ''

23: 24:

25: 26: 27:

28:

^

Pause(i58);

};

pause(150);

public void start() { if (runner == nuil) { runner = new Thread(this);

currentlmg = nekoPicsfsi-

repaint();

pause(150);

runner.start () ¡

29: 38:

31: 32:

33: 34:

public void stop()

nekosie.p(int numTimes) /

{

f°r (i"t i = numTimes; i > 0; ¿..,

runner = nuil;

currentlmg = nekopicsrei-

repaint();

35: 36: 37: 38: 39: 40:

41: 42: 43: 44:

45: 46: 47:

48: 49: 58:

51:

Pause(258);

public void run() {

currentlmg = nekoPicsm-

^r^oSrdl; pantalla nacia el centro

repaintf);

l ''

pause(258);

nekoRun(8, size().width / 2);

// detenerse y hacer una pausa currentlmg = nekoPics[2);

void pause(int time) {

repaint();

try {

pause(ieee); //

bostezar

currentlmg = nekoPics[3]; repaint();

pause(1808); // rascarse cuatro veces nekoScratch(4);

//

dormir por cinco

"turnos

^

l

Thread.sleep(time);

J caten (InterruptedException e)

public void paint(GraPhics screen) {

Adición de imágenes, animación y sonido

Dia 10 256

L.STADO 10I4^0NTINUAOÓN_ 77 (currentlng != nuil) (cúrre 101:

lT

l

rfrawimaoelcurrentlnig,

screen.drawImage(c

12 t, 1"° SiemPrC £S 'a mej°r SOlUCÍÓ"- S¡ SU aPPli:t sufre de Panadeo, tmte de sobreponer update() y d.bujar pnmero sólo porciones de la pantalla; eso podría resolver su problema. El

x,

y,

doble bufer es menos eficiente que el uso normal de espacio, y también toma más memoria y

this);

e paco, por lo que en algunos casos no podría ser la solución óptima. Sin embargo, para eliminar cas, por completo el parpadeo de la animación, el doble búfer funciona excepcionalmeme bien.

riel JDK I 2, los mensajes de precau-

' «1™ Un,aPKPleI qUC UtÍIÍCe e' d°ble bÚfCr' USled necesila dos c°™- «« ¡™g¿n fuera de pan alia para dibujar en ella y un contexto gráfico para dicha imagen. Juntas simulan el efecto

■ de I..superficie de d.bujo del applet: el contexto gráfico (una instancia de Graphics) para

# m

W-onar los .ne.odos de dibujo, como drawl.age (, «v drawString ( „. y el objeu,

Image para contener los puntos a ser dibujados.

Hay Cua,ro pasos princ¡pales para añadjr e¡ dob¡e b .^ a ^

de pantalla y el contexto gráfico necesitan ser almacenados en variables de instancia para que

r

del applet NeKo tenga un ancho

m

?

usted las pueda pasar al método paint (). Declare las siguientes variables de instancia en su

definición de clase:

Image offscreenlmage;

resultado.

Graphics offsereen;

Segundo, durante la inicialización del applet, usted creará un objeto Image y otro Graphics y los as.gnará a estas variables. (Usted tiene que esperar hasta la iniciación para saber

Figura 10.5 £/ ap¡>lei

que tan grandes serán.) El mé,odo createlmage(, le d:. una instancia de I.age, eon la que

puede entonces enviar el método getGraphics () para obtener un nuevo contexto Grapracs

para esa imagen:

&

offscreenlmage = createlmage(si2e().width size().height);

offsereen = offscreenlmage.getGraphicsf);

Ahora, siempre que tenga que dibujar la pantalla (regularmente con el método paint ()). en vez de d.bujar los gráficos de paint, hay que dibujar los gráficos fuera de pantalla. Por ejem

Doble búfer

**

plo, para dibujar una imagen llamada bug en la posición 10,10, use esta línea: offscreen.drawlmagefbug, ib, ib, this);

Al final de su método paint, después que se ha terminado todo el dibujado de la imagen

Ul CP!U1Ia"a'agrC£Ue 'a 'ínCa ÍÍ

UÜ^ ui área no visible an

irea ..era !e pantalla es .o ,ue se Han.

m c, lklWc

Por supuesto, las más de las veces deberá sobreponer el método update() para que no se

public void update(Graphics g) { paint(g);

del nuiviniíc uo.

la P:'M"

screen.drawlmagefoffscreenlmage, 0, 0, this); , «a «uperncie üc

limpie la pantalla entre cuadros:

lili

l

■Día 10

259 i

Ahora revise estos cuatro pasos:

,

AgrcgUe vanables de instancia para

dirrme"'

contener la imagen y el contexto gráfico para e.

Agg

búfer"fuera de pantalla.

,

contexto gráfico cuando se iniciahee su applet. g

en y Cree una imagen y un un c

3. Rea.ice todo el dibujo de su applet en el búfer fuera de pantal.a, no en e, área de d.bujo

4. Í'ZÜL su metodo p.int< >. dibuje c, búfer fue» do panta,,:, para .a pa,«a..a rea.. Una nota acerca del borrado de objetos de Graphics

manejar espacia de búfer fuera de pantalla.

Es.e método se llama sin argumentos, como se muestra en este

•«*■ offscreenlmg;

Graphics offsereen;

::;;rr

WWic «otó paint(Grapl.ics scre.n, , // dibujar fondo

offsereen.setColor(Color.black) •

publie void destroyO {

offsereen.filiHectfO, 0, ,m¡ \'m). offsereen. setColor(Color.*vhite) •

El applet Checkers

offsereen.setColor(Color.red)-

offscreen.dxsposeO ;

! SCeenfÍUReCt(100 0 1"« '

// dibujar ficha

offsereen.fillOval(xPos, 5, 90

g0)■

SCreen-drawIma9e(offscreenlms'0 ¿;

(0,0). Debido a que

del applet.

tinuamente en el método run().

Pantana, ,,ena ^

^finalizar, se elimina ei 0,et0 of f screen publie void destroy() {

offsereen.dispose();

tnis).

csún

T

«»«*»«*■«

Día 10

Adición de imágenes, animación y sonido

E, ,istado 10.5 muestra el c6digo fuen.e completo para e. aPP.et ChecKers.

47: 48:

I

t

49:

java.awi.

,

pubUc cu.. Oneces extends ^va.applet.Applet i^ple.ents Runnable (

2: 3:

Thread

A:

5:r 6: 7:

8:

runner;

51:

Graphics

m

offscreen.fili0val(p

53:

54:

this);

55:

public void destroy() {

57:

offscreen.dispose(i;

58: 59:

offscreen;

// dibujar ficha

offscreen.setColor(Color.red)•

56:

int xPos = 5; int xMove =4; Image offscreenlmg;

m

?r?rTfiUfiect(1B0¿

50: 52:

iraport

1:

m

offscreen.fiiiRect(0)0,ie0)1e0) offscreen.setColorfColor.white

}

9:

10: 11:

^:eS;i;reateImage(

12:

offscreen

=

;th,

siZe(>

offscreenlmg.ge

13:

Figura 10.6

14:

15: 16: 17: 18:

public void start() { if (runner == nuil) { runner = new Thread(this);

El applei Checkera.

runner.start();

19: 20: 21: 22:

23:

public void stopO { runner = nuil;

24:

25:

26:

Sr«;Vhi.íírí.d - Thread.currentThre.dO;

27:

28:

Recuperación y uso de sonidos

while (runner == thisThread) {

29:

xPos

30:

+=

xMove;

if ((xPos > 105) ! (xpos < 5>>

31:

xMove *= -1;

32:

repaint();

33:

try

34:

{

Thread.sleep(100);

} caten (InterruptedException e) { }

35:

36:

}

37: 38:

39: 40:

public void updatefGraphics screen) { paint(screen);

41:

42:

}

43:

public void paint(Graphics screen) {

44: 45: ,

46:

//

dibujar fondo

offscreen.setüolor(Color.black);

s IaSas ^ ^s.'eo pueden i de

Día 10

Si ios métodos

pXay (,con un argumento

„,.„,.„..,. ,,„ espacio de audio alma, un objeto URL, carga y rep.oducc ,-,

debe venficar esta condición antes de usa usar

objeto Audiociip.

un

««ciado, durante su

cambia a o^r

do. Si un usuano de mismo lugar que el applct: play(getCodeBase(),

"zap.au');

Escriba us;«lo

o, un programa d.beri «r ¡

U 1¡-Üicnu I¡trucci6n carga un archivo de sonido dentro de, on.eto dxp: Audi0Clipclip.QetAudi0Clip(QetC0deB.8.(). "audi i/marimba.wav ));

AudioClip bgSound; AudioClip beep; Thread runner;

publie void start() { if (runner == nuil) { runner = new Thread(this); runner.start();

AudioCli . clip -

; 1

new

AUdioClipCaudio/»ari«ba.waV);

publie void stop() { if (runner != nuil) { if (bgSound 1= nuil) bgSound.stopO; runner

=

nuil;

}

publie void init()

{

f s^proceso del apple. que es.á comen-

Adición de imágenes, animación y sonido

Día 10 I 264

Una técnica de animación que usted ahora puede usar es el doble tófer, el cual virtualmcme elimina el parpadeo en su animación, a riesgo de perder eficiencia en la animación y veloci

Listado

dad. Mediante imágenes y contextos de gráficos, usted puede crear un búfer fuera de pantalla

27:

cuyo resultado se despliega en la pantalla en el último momento posible.

28:

29:

30:

31: 32: 33: 34:

35:

Usted aprendió a usar sonidos, que se pueden incluir en sus applels en cualquier momento que lo necesite, en momentos específicos, o como son.dos de fondo que se puedan repetir al

public void run() { if (bgSound 1= nuil)

ejecutarse el applet. También aprendió a localizar, cargar y reproducir sonidos a través de los

métodos play () y getAudioClip ().

¡hile (runner == thisThread) { trv { Thread.sleepíSaee);

36: 37:

> catch (interruptedException e) { }

38:

if (beep != n"11)

39: 40:

41:

Preguntas y respuestas P En el programa Neko, usted pone el proceso de car-a de la ¡maKen denlro del

beep. playO!

método ¿nit(). Me parece que podría tomarle ¡i Java mucho tiempo cargar todas

}

esas imágenes, y puesto que init() no es subproceso principal del applel, ahí

liabra una diferencia de pausas, ¿l'or qué no en ese caso poner la «.rjii'i de imá-

42: 43:

,

44:

Kones al principio del método run()?

10);

R Cosas extrañas suceden detrás de la escena. l£l método getlinageO realmente no

45

carga la imagen; de hecho, devuelve un objeto Image casi instantáneamente, por lo

46 47

cree una p>ina Web con una ventana de applel

que no toma mucho tiempo de procesamiento durante la inicialización. Los dalos de la 'majen que apunta a getlmagef) no están realmente cargados hasta que se necesita

la imagen. De esta manera, Java no tiene que conservar imágenes enormes en memoria si el programa sólo va a usar una sola pieza pequeña. En todo caso, le basiará to*et. una referencia de esos dalos y recuperarlos posteriormente cuando se necesiten." '*-' P Compilé y ejecuté el applet Neko. Algo muy raro está pasando; la animación inicia en la mitad y pierde cuadros. Es como si sólo se hubieran cargado algunas imá

genes al ejecutarse el applet.

CSIC ,né,odo no * hace n.ngun -» ,lienlc. ,o cua, daña por -Hado a

«» "

J

bgsound y DeeP. Esto sera

^ ^ ^ ^ „ ¡as ,íneas 32 y

R Eso es lo que precisamente sucede. Como en realidad la carga de imágenes no sucede

inmediatamente, su applet sólo podría estar animando pantallas en blanco mientras las imá

genes todavía se eslán cargando. Dependiendo de cuánio tarde en cargar esas imágenes, podría parecer que su applel inicia en la miíad. pierde cuadros o no funciona del lodo.

Hay tres soluciones posibles a este problema. La primera es tener el ciclo de animación (esto es, empezar nuevamente desde el inicio cuando se detiene). Posihlemente, las imágenes se cargarán y la animación funcionará correctamente. La segunda solución, y !il! létorademcu*ios.comostartO,stop0.paintO.

Hov usted aprendió acerca de una plétora de ^

^.^^

m,;ir y usar sllbp,o-

r.p.int(,. runo y upd.t.(). y de piedle d

en el lisudo I0.3 despliega un. .magen de M.llaol F Hn» e, p en e ,lll1CT,l«, el último de los Wl Wli.es US

" I»"'»»'l'^ '"ttu

Figura 10.3 f/

Fillmore.

^ ^^ UmJos ^

^

import java.awt.Graphics;

1:

2: 3: 4:

5: 6: 7:

8:

import

java.awt.lmage;

public class Filiar, extends java.applet.Applet { Image whig;

public void init() { P Whig = getin.age(getCodeBase()I »images/fillmoreopg );

9:

}

11:

public void paint(Graphics screenj {

12: 13: 14:

15: 16: 17:

18: 19: 20:

21: 22:

La línea 5 del applet asocia la variable *hig con la clase I.age. No ,iene que usar la ins.ruc-

con new para crear un objeto aquí, ya que recibe un ohje.o Image desde el método

10:

23

rara un ejemplo ilc

""" * SUS P'°PÍ°S archivos

y width para hacer espac¡°

int int iWidth iHeight = = *hi9"9etWÍdthl!,Íhis)whig.getHe^ght(this), int xPos = 10;

Icreen.drawlmagetwhig, xPos, 16,

getlmagef) en las líneas 8-9.

nan susTl'^4 "^ 96tWÍdth( J y 9etHei9ht' >• ded puede

un conten contenedor !la de Wrio aa un

del contenedor con el componente como su único argumento

t' se podría usar ia instmcción s¡

41

■a

ai

•II ■"8 3

O u

Q

O

Je o

• sZ

'■r.

o

"3

N

c

2¿

«J

ir 5 o r:

c

^z

u o cu

o

S-

P

0

O

£5o §

S

i;

-



5 —

5

c '2

ui n

o





3

u

■-

'i 111 a -g s S C o •" ^ g -2. a r

=

3

J, O

i-s S" §• «

ra

u

rj

u

"l

12

o 1

o

u



aj

3

5J

r*



-

"o. a. al lil 3

ÜJ

-

n



,N .■^

O

flj "S CJS -a "o

3

C

o. o.

^

10

o

'-I "

XI

■s If I

8 -F §

I

«

■o

■a

S

í" o c C 2 c

O

2

..

¡

1

2

o

i"

8 « § ü

•a

o

3 ,2

! 5 í; ? s :e «

C

-rl

•rt

"O

O

>

O

V L.

^ I-I 3

O

V



II

T3

o

c

0» J_2JL

H"e Perneen a un valor ser se.ecconado a,

1: import jsva.awt.*; 2:

aza

T

3: 4:

5: 6: 7:

8:

9:

d

IÍSIM d«P'-bles. La cl.se

^ b- * despla.n.ento puede

c void init() {

im.addItem("Hamlef); m.addItem("Claudius

);

,m.addItem("Gertrude"

S

,m.addItem("Polonius");

10:

,m.addItem("Horatio-);

11:

,m.addItem("Laertes");

12

im.addItem("Ophelia");

13

«™P™»** «¡™» funcionalidad de barras de,

ídd(hm);

K*Jo común las harn.s de despla.a.nic,,,,, w m,m «pccinculo los vata«, mínunos y

máximos que se pueden establecer mediante el componente.

Para crear una barra de desplazamiento, utilice los constructores siguien.es: • ScroUbarf) crea una barra de desplazamiento vertical con sus valores máximo v mínimo iniciales igual a 0.

• Scrollbardflty crea una barra de desplazamiento con valores máximo y mínimo de 0 y la orientación indicada. Se utilizaron !as variables' de clase para establecer la onentac.ón con el argumento único del método: Scrollbar.HORIZONTAL o Scrollbar.VERTICAL.

Al v'.

t

Construcción de interfaces de usuario sencillas Figura 11.12

constructor con cinco argumentos enteros: Scrollbar, int.

Tibien Puede usar -

^ ^ eslc m,lodo Can en orden «,«.:

El appleiSlider.

|

Lienzos " USan Planamente como un espacio en una interfaz . E1 v:1lor mínimo de la barra de despícenlo.

f2:

de diseño.

" " ""

ventana

1: import java.awt.';

'

i

'n°VCr in"">iÍM°»™H «• «...«, si se «vün.-csion:, h,

Listado n.n. El texto completo de crosshair. 1: import java.awt.*:

2:

3: public cía., Crosshair extends java.applet.Applet {

6: 7:

8: 9:

10:

4-

public void init() { add(bar);

MyCanvas can = new MyCanvas();

7:

public void init() {

8:

11:

GridLayout gl = new GridLayout(1,1)•

5:

setLayout(gl);

9:

setLayout(gl);

add(can);

11: 12: 13: 14:

15: 16: 17: 18:

19:

barras de dcsplazam.enlo:

.F=lmé,odofl.tV.lu.(, devuelve e. va.or

ac.ua. . U baua d,

. E, método setvalue(inr) asignad vaior actual.

desplaZamien,o

,

20: 21: 22:

23: 24:

class MyCanvas extends java.awt.Canvas { public void paint(Graphics g) { i-nt x = size().width / 2; int y = sizeO.height / 2; g.setColor(Color.black); g.drawLine(x-10,y,x-2,y);

g.drawLine(x+10,y,x+2,y); g.drawLine(x,y-10,x,y-2); g.drawLine(x,y+i0jX!y+2);

para app,ets

i

width=10C>

™^ de 5 pixeles y uun pixeles y

espacio

Organización de los componentes 296

Listado

en una interfaz de usuario

12.2. continuación

los La figura 12 2 muestra este applet en una página con

la siguiente etiqueta :

«ppl.t cod.-Bunch.cl«." height=i68 width=i60>

component)

ws^CEE

Figura 12.2 Nuc\ e bolones ornan i-

-.ados e un diseño de

¡uüdríeiilii de .5 x J.

dia¡ma .

que U!ltd ,, h. vim

u.ú

_

tj^M

addC'North", quitButton); i

r.o.in n ■> es aue. se han expandido para

El listado 12.3 contiene e, app.e, que se u.Hizó para producir Ja fígma Escriba 1:

2:

import java.awt.*-

3:

la ventana del applet.

4:

El administrador BorderLayout

5:

crd.PL.yout. dividen un con«ncdor

^

6:

Button east = new Button( "East")■

8:

Button west * new Button("West" ■' Button center = new Button("Centén");

9:

trari con o se organizan estas secciones.

10:

11:

Figura 12.3

'¿-.i'i.SÍ-'Xiü:^''-*!'-'/''[:■ -„';':':

Oiíiane:

setLayout(cc)

Borden ayout bo = new BorderLayout(); .setLayout(bo);

add í Strinn

^u dor o componente que es el mitv'' ™ntain&r)- bl ^undo argumento especilícy el c-omone-

"" """'"^ '°d0S '°S «""P—es * deben aga-

# interte Ce «sunrio 13:

runner = new Thread(this)•

14;

runner.start();

15i 16:

17:

naipe el nombre de "Options Card":

18:

°puons

publie void stop() {

19:

runner

20:

21: 22:

addCOptions Card", options);

publie void init() {

23:

p

24:

25:

gM u.. naipe. III mé.odo show() toma dos urgumenUis:

26: 27:

i

28:

31: 32:

■■"

¡-auei[

Divorce.")-

setLayout(card);

30:

El nombre que le ha dado al naipe.

j

lab[5] = new Label(»Burma Shavé.»,-

29: .

= nuil;

''

for (int i = 0; i < 6. i++)

}

.'

add 5)

40:

41:

„„,„-,„ «

publie void run() {

{

Thread.sleep(5000);

44:

} catch (InterruptedException e) {

45: 46: 47:

}

Para p^ucir Ja saIida que s 1:

2:

. 3: 4:

5:

6: 7: 8: 9:

10: 12:

i iport

java.awt.*;

p.blic class BurmaShave extends java.applet.Applet implements Runnable {

CardLayout card = new CardLayout(); Label[] lab = new Label[6); int

current = 0;

Thread

runner;

publie void start() { if (runner == nuil) {

Algunas observaciones acerca del applet:

• Une, 7 -Se crea el arrezo lab para que contenga las seis etique.as

• L,nea 8 -Se eSIableCe )a vanare cu.rent. Así se registra el naipe actual a desplegar.

Din 12

ios»

L dd »«c,o *

"ne"

,.c Se coto..« I» » p« d .PPle, « '

Password'í

•V ■•.-."■• ■

.'.■ •■■■••

'.^'':'.•■ ';'-'■ ' "■ -'M': v J

—;——

OK

Paso tres: determine las proporciones

puede auregar el botón al pane).

spacio que ,„ cuad o I e o L C"qllClilS.(nOmhrc >' ~-a) par:, que ocupen

-nos espacio que

ecen mediante las res^i^"^^ '"" ^ ^ * "" ^-«

estab,ecen mediante las

^

ambos pesos (por ahora) son 106:

•>■■ #

^

buildConstraints(constraints,

;:=::;;:

contraseña está en I,I (segunda columna, segundo renglón): buildConstraintslconstraints, 1, 1, 1, 1

r

ce.da. Los valores de we m* weQ*" 1 "^ ' "'^ ^ SÍd0 cslab'«^ P"r o,i

sumar 100.

9

J W619hty ^ lodos su^ componemes, entonces, deberán

Día 12

308

Ahora que los tonda, de todas las «« ■■ •

porciones, se suman todos los valores en una dirección para que cada valor individual esté en proporción al total. Para que este proceso sea más sencillo

los argumentos Weignty. A ¿ tiene^™'" "eÍ9ht* - "•. usted se puede IllüVcr

-ed dibujo, parece que el bo,onlnee

de entender, considere a los pesos como porcentajes y asegúrese que sumen

reS'° (4° (4° P°

100 para que todo salga correctamente.

¿Qué celdas tienen valores y cuáles tienen 0? Las celdas que ocupan varios renglones u

HC aqUÍ ias cinc° ««nadas finales a buiidConstr ■

columnas deberían ser siempre 0 en la dirección en que se extienden. Así, todo es simple

buno-constraintsíconstraints . "°nitr'int8" Con *» pesos en su lugar.

mente cuestión de elegir la celda que tendrá un valor, y entonces las otras celdas en ese renglón o columna deberán ser 8.

Mire las cinco-llamadas a buildConstraints() hechas en el paso anterior:

J""Constraints(const.-aints 1'

buildConstraintsiconstraints, 0,, 0, 1, 1, 10»,

La figura

buildConstraintsico,

>™): //nombre

buildCon;traints(constraints, i, 8, 8 1., 1 1, 1 100, 100 1»).! 1»)! //«*« nombre buildConstraintsfconstraints, 0,

1, 1, 1,

100- H»l¡

//contrasena

buildConstraxntslconstraints, 1, 1, 1, 1, 100, 100)1 /'texto contrasena buildConstraints(constraints, 0, 2, 2, 1, 100, 100); //botón 0K

Usted ten, Irá que cambiar los dos últimos argumentos en cada llamada a buildConstraints. Empiece «on la dirección x (las proporciones de las columnas), que es el penúltimo argumen

"J' ^«e "bre «■ cuadrícula

cada uno). Como conToS va,o ^ C™ * ** ""*** de '«,

un nuevo administrador de

2T ;?e e ipadyentre en loscomponentes diseñüs de cuad*uia bois^ * "•'■-" p-™ determ nar ,a cantead de espacio en un panel.deLos márgenes, sin emba,

pane, '^"P3ra

a^

45: 46:

S^;

£Z Jo

38: 4B:

-

Márgenes

Edd(tfname);

37:

39:

>

! cuai se apreaa com más fa

// campo de texto de nombre

30:

33:

applcl p;l,, la

metian^^^ «** un mención, V^TS ipadx e ipady. T Estas controlan elUad"CUla rellena * (el b°1Sa' espacioÜ°Sadicional -,|red«lorde

24:

27:

1^

Relleno de celdas

22:

26:

;

de m°para'"T" ^ y^el inferior, ^ ¡nf°rmació" agriary der££cho. márgenesL;,a unfigura diseño de cuadrTí adneula: 10 e, superior y 30 para elP™ izquierdo 12.11 muestra el resultado.

T3

U

vs

=

'-

c

¿¡ o C

S -).=

¡2

vi

ir

»-

=

=

c



¿■í

^

tj

>u

^J

ü

3

-



c

u

-3

§

-^

x:

S| «e

w

"=

5 -S ■? •? =

i 5 t- 1 =

o

a | •§ 5 -2 5 "a ■,-: S — S 3

C "3

r **

C

8.

a

5

.a

s

s

-1

.

e O

O

int

x,

y)

ejemplo: Spots

variiihles"scparadas para hacer mas fácil su manejo.

Aauf .enemos un método sencillo que muestra la informad*, acerca de la ocurrencia de un

■>

evento ratón abajo:

poblie boolean mouseDown(Event evt. int x, int_y) { Sy

return

Figura 13.1

true;

su app.et, este mensaje aparece en el disposuivo de saHda es.ándar

f (tpplet Spots

Si incluve es.c mé.odo en su

cada ve/. t|i«e un usuario hace clic dentro del applei.

Nota

Fl ..«, de Svstem out.printlnO en un applet provoca un comportamiento

rente enaTbientes'distintos. El aPP.etv.e*er despliega la linea en

Lma ventana en la que se emitió el comando apolew.ewe, N«cape

r

import java.awt.Event,'

Ser ¡mponada _ lüdo app)e[

os.lcvulvcrán un \alor true.

La clase Spots tiene cuatro vari

.ibu/ar, yín s, applci. lisie inóunU» se parece al mouseDownl

, eoor.e-

numero del pumo actual.

Dio 13

La clase Event no incluye la cláusula implements Runnable en su defini ción. Como podrá ver más adelante conforme vaya construyendo este

Nota

applet, tampoco tiene un método run(). ¿Por qué no? Porque en realidad

no hace nada por sí mismo; simplemente espera la entrada y entonces hace su trabajo. Si no está haciendo algo en forma constante, el applet no necesi ta subprocesos.

A continuación, agregue el método init (), el cual hace una sola cosa: establecer el color de

os puntos viejos además de] ^ pu-uos vlejos se borrarán

i * actu forma, cada vez que dibuje un pumo

Ahora, .sigamos con el método paint()

PubHc void paint(Graphics o, /

fondo a blanco: publie void init()

{

setBackground(Color.white);

#

0

}

Aquí usted establece el color de fondo en init (), en vez de en paint (), como lo había

)os

hecho en ejemplos pasados, porque necesita establecer el color de fondo sólo una vez. Puesto que cada.vez que se añade un nuevo punto hay que llamar a paint (), establecer el fondo en el método paint () lo retrasaría innecesariamente. Ponerlo en init () es una idea mucho mejor.

La acción principal de este applet se da con el método mouseDownO, así que agregúelo ahora:

publie biolean mouseDown(Event evt, int x, int y) { if

( ¡urrspots < MAXSPOTS)

{

jddspot(x.y); -eturn

}

elsf

s"dol3' nos—" Escriba import java.awt.Graphics-

true;

*»Port java.a^t.Color

{

System.out.println("Too many spots.");

«port java.awt.Event;



return false;

0

Cuando c :urre un clic del ratón, el método mouseDown() verifica si hay menos de 10 puntos.

Si es así, lama al método addspot() (que pronto escribirá) y devuelve un valor true (el evento raiín abajo fue interceptado y manejado). En caso contrario, sólo imprime un mensaje de error y devuelve un valor false. ¿Qué hace addspot()? Agrega las coordenadas del

#

punto en bs arreglos de almacenaje, incrementa la variable currspots y llama a repaint():

void adespot(int x,

int y)

xspets[currspots]

=

x;

yspitslcurrspots]

=

y;

cun spots++;

rep; int();

{

addspot(x,y);

return true; else {

••

»
ouseDown(Event evt, int x, int y) { :*itch (evt.clickCount) { case 1: // clic sencillo case 2: // doble clic case 3: // triple clic

p, nio importan* que debe tener presente cuando busque clics dobles y triples, es que

1 DcwnO es llamado una vez por cada Ce de. botón. Considere e, ejemplo .guíeme

■**»

Día 13

327 i

public boolean mouseDrag(Event evt, int x, int y) {

import java.awt.Graphics;

¿mport java.awt.Color-

import java.awt.Event'

import java.awt.Point;

Los eventos ratón entra y ratón sale

i

luientes ros muestran las firmas para nouseEnter,) y

PUbí anchor;

,,

ter"in«i6n

currentpoint;

currline . ,; }

public void init() {

^

setBackground(Color.White);

public bcolean ,rouseEnter(Event evt, int x, int y) { II...

public

bcolean m

ouseExxt(Event evt, int x, int y) {

-■

2 , ^ " "" SOl° '° """ ^";";lrP°lnM a* clase Point °bJC'a" Pí'r:1

representa una coordenada *

esos puntos, usted debe

Un ejemplo: dibujo de líneas

^i: ;;: oava-awt-point)

,os puntos in¡c¡alcs de 1;ls líneas

' El arreg.0 ends man.iene ,os punIOS finaies de ,ns mlsmas ]fneas

funcionan ¡cnio.

Figura 13.2

*>

Dibujo de líneas.

mantiene e> punto actua, dc tenninacion de h ^ qug se ^ ^

1grmVf«.Mi,.AJKmtlSS3 i

de líneas (para

m""ener

en el arreglo).

m?

de 1* «'"« -rá la si siguien.e

#

m

son

para

insumen iniciales y un método init() senc.llo:

public boolean mou

if (currline < maxlines

para

^ í

evt

anchor = new Point(x,y);

int»



*

Día 13

I 328

Respuesta a /a entran* ^ i

_[f_entrada_del usuario en un applet

return true;

elSeSystem.out.println("Too many lines.1

f

V

Dibujar el apple, significa d¡bu.

return false;

y ends. así con.o la linca ;lL,J CI1 ,,„

( '""* VM*« «""«nada, en los arreglos starts

#

™ -"■ He *,„, cl 111Í|O(|O.painto^T^ " "nim-c'lún *> 'a "'"- en proceso, d¡bl¡¡cljl

t

currentpoint respectivamente,. P ra Zl^'T '""""* ^"^ ^ «' ""^ >'

}

Mientras se arrastra el ratón para dibujar una línea, el applet anima esa línea. Al arrastrar

el ratón en el dibujo, las nuevas líneas se mueven con él desde el punto de anclaje hasta el puntero del ratón. Cada vez que movemos el ratón, el evento mouseDragl) connene el Junto actual, así que use este método para rastrear ese punto (y pan» volver a d.bujar cada

PUt1// H°hid paint«5raPhics g, {

'TiVV1

movimiento, haciendo que la línea se "anime"). Tenga en cuenta que si excede el numero máximo de líneas, ya no podrú hacer este trabajo. Aquí presentamos el método mouseDrag() para lodos esos trabajos:

// dibuja la línea actual 9-setColor(Color.blue)lf (c^rentpoint != nuil) fl-arawunefanchor.x. anchor y x, currentpoint .

publie boolean mouseDrag(Event evt, int x, int y) { if

(currline < MAXLINES) { currentpoint = new Point(x,y); repaint(); return

l lneS-

true;

}

m

else return false;

}

La .mea nueva no se agregará a los arreglos de las líneas viejas, has.a que se suelte el botón del ratón \quí se muestra mouseUp (), con el cual se asegura que no haya exccd.do el max.-

p

(y «-Mecer e, valor a nuil, en e, ^

mo de líneas, antes de llamar al método addline(), descrito a cont.nuac.on:

publie b-'Olean mouseUp(Event evt, int x, int y) {

J

"^•■sMa. Oso es 1()d,,; „,„ só,o 6« line

una aplicación básica de dibujo en s ñ

if (iurrline < MAXLINES) { addl.ne(x,y); retuí n

}

else

Escriba

true;

return false;

1:

}

2:

En el meto lo addline() se actualizan los arreglos de los puntos de inicio y f.nal, y se dibuja de nuevo e applet para que tome en cuenta a la línea nueva: void add.ine(int x,int y) star- s[currline]

ends currline]

= new Point(x.y);

curr. ine++;

curn ntpoint = nuil; anch ir = nuil; repa.nt() ;

{

= anchorr

3: 4:

5: 6: 7:

8: 9:

10:

11:

iava.awt.Color:

«port java.awt.Event-

import java.awt.Point;

^^

■*

Z7 " ' 1S l"'C 7 "^ Al -

la

entoque tic cniíiuM .i i.i vtm.m.i uti ■ .

'-' ll11""11 """""-1-1 , C|.|ril|a t)ci teclado sea recibida p*»i •ipplet lisia instrucción es necesaria paia asLfcui.n H" '

Pübijc-Üooléan handleEvent(Event evt, {

el botón izquierdo. Para probar cada caso, use una instrucción if como ésta: public boolean mouseDown(Event evt, int x, int y) { if

(evt.metaDownO) // maneja un clic derecho el&e if (evt.controlDownO) // maneja un clic central

*

else // maneja un clic normal }

define «odo.un.grUpo de ¿ co^t^^^ * "" f°rtUna' " ^ ^

cuerpo de handleEvent (,..Puesto que est^variab. . , * ""^ C°m''rObar e" el tción switch funciona bastan» w^p»', ' S°" C°nS'an'eS enleras' u"a

Observe que esta asignación desde los botones del ratón a los modificadores del teclado se da en forma automática, no tiene que trabajar mucho para estar seguro de que sus apotos o aph-

cioncs funcionan en sistemas diferentes con d.stintos tipos de ratón. Como los ches ,^u,e,

oo derecho asignan los eventos a .as teclas modificadoras usted puede uuhzar as tecla

nidificado.» reales, en sistemas con ratón de menos botones, para ^-ar exacta e los mismos resultados. Así, por ejemplo en Windows, mantener pres.onada Mu* a Comrol hacer clic con el ratón; o bien en el sistema Macintosh, mantener prestada la ted. Control equivale a h; cer clic en el botón central de un ratón con tres botones; por su parte, s, en una

Mac mantiení presionada la tecla Command (manzanita) y hace clic con el ratón. eS .gual a hacer clic co > el botón derecho en un ratón de dos o tres botones.

Ten-a prese, te, además, que usar ratones con botones diferentes o teclas modificadoras podrú no se, obvio de inmed.ato si su applet o aplicación corren en un s.stema con

botones de le s que está acoslumbrado a usar. En este caso, piense en la convemencia de

reTngir su nterfaz a un solo botón de. ratón, o dar información o ayuda que exphque e, uso de su progra na.

• -"'-case-Eyent.MOUSE DOWN:

Los método: predeterminados que ha aprendido hoy para el manejo de eventos bás.cos en los applets. son llamados por un método genérico manejador de eventos denominado

evt.x + ",- + evt.y); return true; '

case Event.MOUSE UP:

.,;■ ': .

System.out.pFintlnCMouseUp+ evt-x + ">• + evt.y);

return true;

-

^case Event.MOUSE MOVE: - ■■■■

' Systen.out.printlnCMouseMoveevt.x + •,• + evt.y)return true;

case Event.MOUSE_DRAG-

'■ ' ■ ■ ■■

>'■ :■ System.out.printlnCMouseDrao>.:„;,■■-,,.; evt.x + -,- + evt ,. return true; default: . ' ■■■■■■

El manejador de eventos genérico

pntlnCMouse

„,-.

return false;

•■ . . .,:

" .

J Puede probar los siguientes eventos de teclado-

handleEver t (,. Cuando usted usa este método, el AWT trata genér.camente con os e«*o>

que ocurren entre los componentes de la aplicación y los eventos basados en la, entradas de. usuario.

En el méioc o predeterminado handleEvent () se procesan los eventos básicos y se llama a

fes -éuHlo.. que aprendió hoy. Para manejar eventos dis.in.os a .os aqu, menaonados (como ve os par. las barras de desplazamiento u otros elementos de la imerfaz de usuano), cam

biar elcom ««amiento del manejo de un evento predeterminado, o crear y pasar sus prop.os



eventos. nc:cs¡i:i modificar handleEvent () en los programas que usted luiga.

ratón:

(igua, que en e.

Día 13

340

Respuesta a la entrada

. Event .MOUSEJJP se genera al liberar el botón del ratón (igual que en el método mouseUpO).

. Evení.M0USE_M0VE se genera al mover el ralón (igual que en el método mouseMoveO).

* Eventos de acción Son

. Event .MOUSE_DRAG se genera al mover el ratón con el bolón presionado (igual que en el método mouseDragO). „„,

. Event. MOUSE_ENTER se genera cuando el ratón entra al applet (o a un componente de

dc VMc

#

ese applel). También puede utilizar el método mouseEnter().

. Event. MOUSE_EXIT se genera cuando el ratón sale del applel. También puede usar el método mouseExit ().

Observe que s, sobrepone el handleEvent () en su clase, ninguno de los métodos predetermi nólos del manejo de eventos que aprendió hoy será llamado, a menos que los llame explóta mele en c- cuerpo de handleEvent (). De modo que sea muy cuidadoso en caso de que decida sobreponer este evento. La mejor forma de evitar este problema es probar el evento

Sea en que mediante ]. tecIa Tab. ..Qb

Por " ° «»» Pane de un d«p,a»niic

que le interesa y, si ése^nocs el even.o. llame a super. handleEvent () para que la supeclase que define handleEvent () pueda procesar cosas. He aquí un ejemplo: publie boolean handleEvent(Event evt) { if

(evt. id == Event.M0USE_D0WN) // procesa el ratón abajo return

}

{

true;

else

return super.handleEvent(evt);

Manejo de eventos de acción

^n evento de acción es el evento d ■

método especial para manejarlo ex * """^ "^ U"JJZaao *

¿°- el parámetro arg) e, cua, puede ser de

mer tlpo de ciase.

Las técnicas que ha aprendido hasta aquí para el manejo de eventos, se han enfocado en las

¡nlí facciones del usuario (hacer clic con el ratón, oprimir teclas, etcétera,. También hay eventos mr. manejar otros eventos específicos que tienen lugar en componentes como botones, arcas de

¡c'v o v otros elementos de la mterfaz. Por ejemplo, los botones usan eventos de acc.ón que son

dis .'irados al presionarlos. Usted no tiene que preocuparse por el ratón abajo o el ratón arriba, o del -mimar dónde tuvo lugar la interacción del ralón; el componente lo maneja todo.

I

a

IV

i o

c

(0

I

m ^~

o *H 10

0) IA

O

t.

£0

O

-O

3 cr r-H o> III

•9 « ch ?5

O c .

ai

§5 c

3

a.

H

S*í5 •H -a

ü

3

5

= cíí

3

■*c

ü

M ?i

«

m

51 lá

•o '-o

o

o

•§— ■= "i '3 3 2 5

^

o ^

3

c

S

o

¿

#»###+•# #•####••

.5

2

0

"o

c 3 U

>■

> -n ■^

C O

•u

o

c

-7.

Q

5. r3 ü

O O

C w

C

"c

O

+-■

t_

O

-^ 'ro a i)

3 o

■ —

c

>

u

-o

3

O

C

-3

— i: ü 2. o-

ü

3

w ■a

-y.

u

^ 2

§u go

ra

I-

o

=

O.

5 "

£ 8 1 s

^

C



a)

í

-=

H-

vi

5

o

Ji

2

2a-£

^

doble clie en uno de los elementos da como resultado un evento de acc.on.

probar los IDs de eventos LIST_SELECT y LIST_DESELECT.

Eventos de la barra de desplazamiento

S, le -usu, manipular los even.os, us.ed va a adorar las barras de desplaxamiemo. Ha,■ lo o

hay i|iic busca, y los movimientos que los activan.

'os componen,, y d disenfy aS ^

tos que harán .rabajar al app]et.

r p

-jor en es.a distr.bucién y requiere pl

VM b¡en' anles de conectar los e.,n-

rr/an ser más senciiios- ei ^— "" dÍSeñ° *

5

1

t 3) -1 O.

a. ca m > CO

01

c

o ■»-•

OÍ c

o

■H

XJ

-i

c

o

01

3 O >i ra

O

3

_j

U.

r-i

3

01

ce

T3

c o

L~

c

O

3

*

c

-l-í

T3

^-

jO ii

/-i

c

t_

3

+^

c o

3 O 3

c

o OÍi

O) l_

13

CO

c

u

co •o

ra

■o n

* **

01 3

r-t

m

;_

c

+•* +-*

c o

o

c

ii

c

$

CO

C

a> 3

o

3

ca

3

II

01

o

c +-


c

o

■3

*^

ti

+-•

Resumen 1:

import

2: 3: 4:

java.awt.

* «ador de Java. La habi,.

public class SetBack extends java.applet.Applet { ButtonredButton.blueButton.greenButton.wniteButton.blackButton;

5: 6: 7: 8:

public void init() { setBackground(Color.white);

reuTcB

! in

9:

add(redButton);

12:

blueButton = new Button("Blue );

13:

add(blueButton);

14:

greenButton = new Button("Green );

15:

add(greenButton);

16:

whiteButton = new Button("White );

17:

add(whiteButton);

18:

blackButton = new Button("Black );

19:

add(blackButton);

20:

21:

public boolean action(Event evt

Object arg) {

if (evt.target instanceof Button) {

24:

changeColor((Button)evt.target);

25:

return

26:

true;

} else return false;

27:

30:

31:

^

void changeColor(Button b) { d,. if íh — redButton) setBackground(Color.reci),

32:

33: 34:

35: 36 37

-í.i if (b -= blueButton) SetBackground(Colc»r.blue); ,

íí

b - areenButton) setBackground(Color.green);

fu: if !b == 5¡«2ütt.n) setBackground(COlor.white); else

setBackground(Color.black);

repaint();

38 39

Pruebe el applet con el siguiente HTML: en con una, podrían serlamail0 muy graildes Ei

Aerando J^^S^^Z

administrador de diseño y de ,o, mir 1"

los agrega a la vemana , cS£

mira contener esos bmoñes

C h venlana' dd SÍ8UÍenle crea

p

a al '-«ño mó, pcqueño posible que per-

FlowLayout fio = new FlowLayoutí)•

Button ok = new BuTton("OK")• Button cancel . new Buttonfe ¿onuent al appleu

tarna.0, botones de

win.pack();

i lenido de esa a dicacion.

P:ir;, ca.ar „„ „ arco, utilice alguno de los constructores siguienu-s:

;

. new Frs ,., String) crea un marco Wsico con un mulo. a que I- s marcos heredan de Wxndow

A\VT. Los mar. os son contenedores, al igual que

P

lcs, de modo que usted puede

a de nuevo puede utilizar hide();

win.showf);

. newFra,e() crea un marco básico sin título.

da c,e Compone -t. los >narcos se «^^^

win.add(ok);

win.add(cancel);

s de.

medio de un aviso en la venena mi mili mismo navegado, (Ree e e ! cTaí Z7 ^

ios

tanas normales del sistema ) EH P' VCmanaS ^ue se ven co'"° «stema.) El av.so es para prevenirle de algún programador n^lin.enciona-

Día 14 con

e(

3551 20:

21: 22:

23:

else

24:

botones: uno para mostrarla ventana y el otro P^™*

} else

29:

is „ window. Nos

return false;

30: 31:

y"

return true;

28:

^ J^ ^ Jc

O

window.híde();

26: 27:

una ventana. Tanto el app.et como la «e-— £

add(close);

window = new BaseFraneiCA Pop UpWindoW);

window.resiie(150,i58);

15:

16: 17: 18:

19:

Í

String label = (String)arg;

""'

/

Día 14

J^rrollode ¡nterfaces de

"suarioavanzadas con el AWT

Objetos de diálogo

-culado a. marco

OlalogiFrnme, String

ho 1

el cual puede ser moda, ('trUÉ) (truej o'o^alse" o no (false).^ * llÍíÍI"1J" ÍllvWhk' "* "» If"""

modo más convencional.

i venlana de) i

clase en ese constructor.

Cuadros de diálogo Figura 14.2 ción cspccíJica. etcétera.

El cuadro Enier Texi.

cierren.)

título ü botones de cierre.

E

de csi-ir en posibilidad de hacer cualquier 01ra eos, c.i lI s ci.l y ^ aicna son cuadros de diálogos modales comunes.

ar el archivo específico de-la plataforma.

cionar

■ i »•

Día 14

1358

359 i s:

TextDialog di;

6:

En el método del constructor BaseFrame2 puede crear el cuadro de diálogo (una instancia de la nueva clase TextDialog que creará en un momento más), asignarlo a la vanable de ¡nsemcia di y rcdimcnsionarlo; el nuevo rcdimcnsionamicnio se muestra en las dos lincas

9:

10:

siguientes del código. Aún no querrá mostrarlo porque sólo debe aparecer cuando haga che

12:

di = new TextDialog(this, "Enter Text", truej;

13: 14:

dl.resize(i5Q,i58);

15:

Cree ahora el botón Set Text, el cual tendrá un funcionamiento semejante al de los otros botones, y lo agregará al BorderLayout en la posición "South" (que lo coloca directamente debajo de la etiqueta).

21:

Insets insets() {

22:

Después .le haber agregado el TextDialog y un bouSn Scc Tcxi ¡i la clase BaseFrame2. nece sitará agregar el siguiente método manejador de eventos: publie boolean action(Event evt, Object arg) { (evt.target instanceof Button)

{

dl.show(); }

17:

16: 19:

b);

return

16:

20:

Button b = new Button("Set Text");

if

(BaseFra.,e2)p,renf

11:

en el bolón Set Text.

add("South",

BaaeFra«e2 theFrame;

i 7: '8:

true;

else

return false;

}

23: 24:

25: 26: 27:

(label == hide();

28: 29:

"0K")

30: 31:

return true;

32:

} else

33:

Al hacer clic en cualquier botón del marco, este método despliega el objeto di del

34:

TextDialog. En este ejemplo, hay un solo botón: Set Text.

35:

return false; }

Éste es el f.nul del compórtamelo que debe agregar a la ventana de aparición súbiia para crear

un diálogo Sólo se necesitan dos cambios en el PopUpWindowDislog. Primero, se debe cambiar el nombre de la clase de PopUpWindow a PopUpWindowDialog. Luego se debe hacer referencia a la clase BaseFrame2 en vez de a la BaseFramel, tal como se Musirá en la mstruccon siguiente:

#

Hay algunos puntos que debe

ias o.as dos vemanas en este Í7L O diálogo funciona como su propio

«°

*

window = new BaseFrame2( "A Pop Up WindoW);

El rcsio del nuevo comportamiento va en la clase TextDialog, cuyo código se muestra en el listado 14.3.

*

Listado 14.3. Texto computo de textdialog .java. 1:

iraport

java.awt.*;

2:

3: class TextDialog extends Dialog { 4:

TextField

tf;

ame2. Ob

cons^

-perdase, que es exactamen.e i

"nea 8 es la llamada para qUe el con

y ia línea 10 estableced v'albie *

definida en Ja clase BaseFrame2

?me- *más ™*™««

lba" al co—'°r de la * 8 y 10 dci iisIado '4.3. La

^ COneCte «> -^ con el marco, esPecífica d« '« clase Frame

Día 14

361

I--I rosto tlcl c«..sl.m-l,.r del TextDinloü simplemente cslal.kvc U. «, value2, valúes);

Recuerde que los métodos pueden tener ¿I mismo nombre, pero eferentes firmas y definiciones. Debido a que este uadate () tiene un solo argumento

de tipo Colorcontrols. no interfiere con la otra versión de update(). Por ¡o común, todos los métodos llamados update () deberían significar ¡o m.smo.

haría pruebas para as de da,o, aunque este

Ése no es el caso y esto es sólo un ejemplo.

El método update () tiene la responsabilidad de actualizar todos los paneles de! app!ei..Ba.ra saber qué panel actualizar, necesita saber cuál es el que cambió. Es,o lo puede avenguar

Ahora; convierta los valores RGB

probando si el argumento que recibió del panel es el mismo de los subpaneles que guardo en las variables de instancia RGBcontrols y HSBcontrols: void update(Colorcontrols controlPanel)

if (controlPanel « RGBcontrols) { II..

}

else

{

{

*

// RGB ha cambiado, actualizar HSB

// HSB ha cambiado, actualizar RGB

■•■

Esta prueba es el corazón del método update(). Empiece con el primer «so, se ha camb.ado un número en los campos de texto RGB. Ahora, basándose en esos nuevos valores de RGB tiene que -enerar un nuevo objeto Color y actualizar los valores en el panel HSB. I a...

rt

r

..horrar* alan de" escritura de códigos, puede crear algunas variables lócale, para contener

-»- -

,|,u»os valores básicos. En particular, los valores de los campas de texto son cadenas cuyos v Les puede obtener utilizando el método getText () definido en los objetos TextField

del objeto Colorcontrols. Como la mayor parte del tiempo habrá de considerar esos valores ceno enteros en este método, puede obtener los valores de estas cadenas, convenirlos a enteros y fardarlos en las variables locales (valuel, value2, value3). He aquí el código que se i-.icar.j;irá de este trabajo (se ve más complicado de lo que es): int valuel = lnte0er.parseInt(controlPanel.tfieldi.getText());

ní lililí = lnteger.parseInt(controlPanel.tfield2.getText>•

Desarrollo de ir.terfaces de usuario avanzadas con el AWT 31:

32:

Listado 14.4. continuación

}.■'■

33: 35:

return true;

el¿e return false; }

.

Después de compilar ambos archivos de clase, podrá cargar el upplc ipplei ColorTest en

41:

na, con el siguiente HTML:

42: 43:

una pági-

= 100>

44:

45:

swatch.setBackground(c);

46:

swatch.repaint();

47:

Resumen

48 49:

1:

TlíT

import java.awt.*;

2: 3: 4:

5: 6:

class ColorControls extends Panel { ColorTest applet;

„,,,.,.

TextField tfieldi, tfield2, tfield3, ColorControls(ColorTest

7:

parent

String 11, String 12, String 13) {

8:

9:

y(ll«¡ridL.yoot(1,,

10: 11 :

Afielen = new TextField(-B")¡

12:

14:

,dd(new Label(H, Label.RIGHT));

15:

add(tfieldi);

16:

OTrn-m ■

add(new Label(12, Label.RIGHT)),

17:

add(tfield2);

18:

•add(new Label(13,

19:

Label.

21 :

public Insets getlnsets() {

return new Insets(10, 10, 8, 8),

24:

25:

26:

}

27

public bool.an actiOn(Event .vt

30

m.entos para construir los componentes, desplegarlos y manejar los eventos. Dejando

id Eran cantidad de similitudes enrre ln, i«^ „„..-.-:.

23:

29

R Dentro del AWT, tanto los app.ets como las aplicaciones siguen los mismos procedí-

lolo nTr hí Cmre 'OS aPP'CtS y l3S aPlicacio«". ^1 99 99 por por ciento ciento de de que ha aprend.do sobre los apple.s se puede utilizar con bs aplicaciones. De hecho,

22:

28

no hay n.nguna d.ferencia entre un apple. y una aplicación. ¿ Cómo es eso'

ligeramente de lado las restricciones de seguridad, la única diferencia está en que las apl.cac.ones* iniciad desde nain,> y se despliegan en sus propias ventanas, y los applets se .maal.zan y arrancan desde init () y start (,, respectivamente. Debido a '

add(tfield3);

20:

Preguntas y respuestas

P En su comentario sobre las aplicaciones independientes, tengo la impresión de que

tfield2 = new T.xtField ■ ; tfield3 = new TextField( 8 ),

13:

De cualquier manera se merece este reconocimiento: ¡Felicidades por su buen trabajo! .



Obj.cit ,rB) {

if (evt.target instanceof TextField) { applet.update(this);

. nr.

.

,

deb.de a que los applets ignoran el método rcain (), si es que éste existe en una clase, no hay razón por la que no pueda crear un programa sencillo que se ejccu.e ieualmeme

como un applet y como una aplicación.

~

Wí m 'Si

w m

i

378

Día 14

P He creado una aplicación independiente, pero cuando hago clic en la casilla de

cierre, no sucede nada. ¿Qué debo hacer para cerrar la aplicación? K < 'npliiK- el i-viMiln 1-iTi-nr Vfliliiim cmi WINUOW_CLÜÜU en el nn«li-ln ik- cvi-iilos .le J¡iv:i

1.0.2. Como respuesta a ese evento, llame a hide(), si abrirá la ventana más tarde, o

Semana 3

llame a destroy() para deshacerse de ella para siempre. Si el evento cerrar ventana da como resultado la salida de todo el programa, llame también a System.exit().

Afine sus

conocimientos de Java 15 Funciones de las clases: paquetes

■nterfaces y otras carácter!™ 16 Circunstancias excepcionalesmanejo de errores y seguridad

17 18 Comunicación a través de Internet

19 20 Diseño de una interfaz de usuario con Swing

21 con Manejo de eventos de usuario Swing

características

lí utihzan palabras Cave modificadoras de. lenguaje de Java.

cambiar sufsignificado.

E> .encava tiene una amplia variedad de modificadores, incluyendo:

. Modificadores para controlar el acceso a Cases, métodos o variab.es: pubUc.

Acceso predeterminado

protected,y prívate.

. El modificador static, para crear métodos y variables de clase.

. E1 modificador fin* p» fináis .as imp.ementaciones de Cases, me.odos y «n-b.es. boolean digThatCra2yBeat() { >

return true'

se muestra en los siguientes ejemplos:

publie class MyApplet extends java.applet.Applet < prívate boolean kiUJabberwock;

static final double weeks = 9.5;

protected static final int MEANINGOFLIFE = 42;

publie static void main(String argumentsl)) { .••}

Si es, ufando más de un mod.ficador en una *^J ^J%££ los modificadores.

para usarlos.

Control de acceso a métodos y variables

é

\

ue no pertenecen a ningún otro paquete

Día 15

i 384

características

Acceso privado

P,r, ocultar totalmente un método o yariablc.y evitar que sea usado por otras clases, u.uVc e. mod.ncador prívate. El único lugar en que se podrán ver estos métodos o vanables, se.a dentro de su propia clase.

Por ejemplo una variable de instancia privada puede ser utilizada por los métodos de

u , pufclase, pero no por los objetos de cualquier otra clase. Asimismo,.« meto os pnvao oLen ser .amados por otros métodos de su misma dase, pero no por lo. de otras. Esta

Astricción también afecta a la herencia: ninguna variable o método pnvado son heredados por

T

-chos ,ugare p:!Z

Ts" 7 ^ *" *" "^ »

^

clase tendrá libertad para cambiar las

Las variables privadas son extremadamente útiles en dos circunstancias: . Cuando las otras clases no tienen razón para utilizar esa variable.

. cando ,,ra clase pudiera causar estragos cambiando la variable en fon*. inaprop,:ul.

Acceso público

;

clase Color; Esta variable se

^^r°rlic-ün

cione, La variable TOUCHDOW»!tú ^ "¿'v ""m sucestvameme. Estas variables nec«i11 s ' T clases en instrucciones «a.es conTo " ' if (position < 0) {

IZZL «mbién cambiaría de manera importante. Para protegerse de est puede declarar la variable winHatio como una variable prívate.

escenano.

"° COmroIa el a0tíeso' CU3Í^"

de Una clase >" )Iam^ * sus métodos en la

forma que lo desee.

que blaCk no tendrá J^

Tas subclases.

es fiante eI modincador

de clasc black de la

l) °' '" !mOli''aS pudieran

System.out.println("Touchdowni")-

SCOre = Score + Football.TOUCHDOWN;

La clase siguiente utiliza un control de acceso privado: class Writer { prívate boolean writersBlock = true; prívate String mbod; prívate int ir.come = 8;

siguiente:

" ~r"~~—"es escmas. con una instrucción como la

lie static void main(String[] arguments) {

prívate void getldea(lnspiration in) { //

: ;r**

■•■

}

wanuscript createManuscript>*

ser

Lo, p,,ntle, „„, úúla

y

amp|¡aI

Üos comunes a todas las Cases. E. comportamiento y los a.nbutos caerán hacia algún punto en la parte baja de la jerarquía.

comportamiento común y los atributos compartidos por las subclases.

Estas cta.es se Laman Cases abstractas, y se crean utilizando el mod.ficador a.stract. Este es un ejemplo:

^

P°'' CS° nunca lcndrf ^"e crear

"■=

2

D

E a.

3

1

1/1

U

a _

-O

i °

J-s o -.2

■f a

i

¿ S

ü

w

o-

o

o>

fo' flj

3 g.

OJ

3

E

SM-i

5

3 S ü

^S

u



Cu

£ CJ

u

■0

í)

—Z

5 'B .2



396

Día 15

_£i±2™>nes de las cl^es:

^!ii^^

Las instrucciones import en su definición de clase van en la parte superior del archivo, antes de cualquier definición de clase (pero después de la definición del paquete, tal como verá en la próxima sección).

De modo que, ¿se deberá tomar su tiempo para importar las clases en forma individual, o

simplemente las Importa como un grupo? La respuesta depende de qué tan específico quiera ser. Importar un grupo de clases no va a retrasar su programa ni va a hacerlo más largo; sólo se cargarán las clases que utilice en su código conforme las vaya necesitando. Pero importar un paquete dificulta a los lectores de su código averiguar de dónde provienen sus clases. Usar comandos import individuales o importar paquetes, es más una cuestión de su propio estilo de codificación.

Nota

Si sus antecedentes de programación son de C o C++, al llegar a Java espe raría que la instrucción import funcione ¿orne íinclude. que ds por resulta do un programa muy largo al incluir código fuente de otro archivo. Este no

es el caso; import sólo indica dónde se puede encontrar una clase. No incre menta el tamaño de la clase.

Conflictos de nombres Por ¡o regular, después de importar una ciase o paquete de clases, usted se puede referir ;i un;i clase simplemente por su nombre, sin el identificador del paquete. En un solo eso tendría la necesidad de ser más explícito: cuando tiene varias clases con el mismo nombre, pero de diferentes paquetes.

Me aquí un ejemplo. Digamos que usted importa las clases de dos paquetes de distintos programadores (Jonalhan y Bourne): import

jonathanclasses.*;

import

bourneclasses.*;

Dentro del paquete de Jonathan hay una clase llamada Def enestrate. Lamentablemente, dentro del paquete de Bourne también encontrará una clase llamada Def enestrate, que tiene un significado e implementación totalmente distintos. Usted se preguntará qué versión de Def enes •

trate se utilizaría si usted se refiriera a la clase Def enestrate en su propio programa, de la siguiente manera:

Defenestrate outWindow = new Defenestrate("Phil");

La respuesta es, ninguna de las dos; el compilador de Java se quejará de un conflicto de nom

bres y rehusará compilar su programa. En este caso, y a pesar de que usted haya importado ambas clases, todavía tiene que referirse a la clase Defenestrate apropiada con el nombre completo del paquete, tal como sigue:

acerca de cussMTHydónde

Día 15

Funciones de las clases: características

quiera alargar el nombre con algo que describa las clases del paquete, como com. prefect. canasta, o alguno de los códigos de dos letras que ■dent.fican a un pa.s.

| ., idea es estar sc»uro de la exclusividad del nombre para el paquelc. Aunque los paquetes rl-dcn ocultar nombres de clase conflictivos. la protección «ermina ahí. Usicd no puede cs.ar seguro de que Su paquete no causará conflictos con el paquete de alguien más. s. ambos un,,6ro

liz.au el-mismo mimbre.

Por convención, los nombres de los paque.es tienden a comenzar con una letra minúscula, para

dis.in-uirlos d¿ los nombres de clase. Así, por ejemplo, en el nombre completo de la clase inteerada String. i ava. lang. String. es más fácil, a simple vista, separar el nombre del paque

Para permitir que una clase se-i ví

te del nombre de la clase, lisia convención ayuda a reducir los amílicos con los nombres.

*■ -*■ — - ,:;

Creación de la estructura de una carpeta El paso dos en la creación de paquetes es crear una estructura de carpeta en el disco duro

que corresponda al nombre del paquete. Si su paquete liene un solo nombre (mypackafle). debe crear una carpe.a para ese nombre. Si el nombre del paquete consta de vanas panes, debe crear

carpetas dentro de las carpetas. Por ejemplo, para el nombre de paquete co*. pref ect. canasta, necesita crear una carpeta con, una carpeta pref ect dentro de com, y otra carpeta canasta

dentro de pref ect. Entonces, sus archivos de clases y de código fuente podran ,r en el d.recto-

Cómo agregar una clase al paquete El último paso para colocar su clase dentro de los paquetes, es agregar una instrucción al archivo de la clase por encima de cualquier instrucción import que se haya m.I.zado. La

solo sirvan a su impieme

"^ ^efecto de los cambios maj

instrucción package se usa junto con el nombre del paquete, como aparece a commuac.on: package com.prefect.canasta;

así y soJo pueden ser uliIJ2j¿l

paque(e.

rio pref ect.

« Parama par que

nsiderar .odL

•r que ciases desea decl

El listado 15.2 nos muestra dos Ca^

Fl cenando sencillo package, si lo hay, debe ser la primera línea del código en su .chivo fuente, despt.es de cualquier comentario o líneas en blanco y antes de cualquier comando import.

Después de iniciar el uso de los paquetes, deberá asegurarse de que todas las clases pertenecen a algún paquete para reducir la posibilidad de confusión sobre a donde pertenecen sus clases.

Control de acceso a los paquetes y las clases

Us.ecl ha aprendido acerca de los modificadores para el conirol de íutcso :. los mendos y vrlables También puede controlar el acceso a las clases, como ya habrá notado cuando u..lizó el modificador publie en algunas declaraciones de clase en proyectos amenores.

En oso de no especificar un modificador, las clases tienen un control de acceso predetermi

nadlo cual significa que la Case está disponible para las demás Cases en el m.smo paque,.

Escriba collections;

3: publie el.,, LinkedList {

*;

9=

prívate Node

//

...

root;

"———_^~

'

399 i

Dte 15

401, # Listado 15.2. continuación 10:

11 ■:, 12:

class

13: 14:

15: 16: 17:

"18:

Node {

prívate

//no público

Object

prívate Node

next;

Node(Object o, contents next

contents.;.

Node

=

o;

.=

n;

n)

{

19: 20:

21:

Nota

En cada archivo, usted puede incluir todas las definiciones de clase que

desee pero sólo una podrá ser declarada como poblic. y ese nombre de archivo deberá tener el mismp de una clase pública. Cuando Java compile

el archivo, creará archivos separados . class para cada def¡n.e.on de clase

r¿rr—- - -

immmm

dentro del archivo.

La clase pública LinkedList proporciona un grupo de métodos públicos muy ui.lcs (eo.no

add ()) a cualquier otra clase que quisiera utilizarlos. Esas otras clases no ncce^an saber

sobe cualquier clase de apoyo que necesite LinkedList para hacer su trabajo. Nod.. que « una de esas clases de apoyo, está decían* sin un modificador publie >' no .pateen, como pane de la imerfaz pública del paquete collections.

El hecho de que Node no sea pública, no significa que LinkedList no tenga accedo a ella

mucho

* comp,ic,d»s coo ,a „„ " «.» ,»« un, & las » i

s que

— JO. v. ..¿^[ioiK'.s Cuido |,,

lon > '■■■ -■■inbi'ii'icdMi. Y •'•i mu,:¡p¡e en l'avor (|c

después de ser importada a alguna otra clase. Cuando piense en proiccc.ones. nc p.ensc en

dls totalmente ocultas sino, más bien, en V, verificación de los permisos de -a clase de aminada para usar otras clases, variables y métodos. Cuando usted importa y^.un e Lr t. también cargará la clase Node er, el sistema, pero solo las ¡ns.anc.as de LxnkedL^t tendrán permiso para usarla.

La creación de un buen paquete consiste en definir un grupo pequeño y limpio de clases y mé,odos públicos para que los usen otras clases, e implementos me .ante■ ^er -nndad de clases ocultas de apoyo. Más adelante aprenderá otro uso para las clase> ocultas.

Interfaces

Las in.eríaces. al igual que las clases y métodos abstractos, proporcionan plani.llas de con.non no que se espera sean imp.emen.adas por las otras Cases. Sin embargo, las ,nu.-

*ces peonan mucha más funcionalidad a Java y al diseño de clase, y objetos qu, u, clases y métodos abstractos simples.



Día 15,

Veamos un ejemplo sencillo, Ja creación , buena implementación de Ja clase Fruit v

Interfaces y clases Lis chscs e mterfaces, a pesar de sus definiciones diferentes, tienen mucho en común. Las

V

~ "' °"Ue' iuponS.a flue ya tiene una

espera que haga Fruit. Usted quiere aue ..n,"* '" Fruitlik*. que representa lo que se sea un objeto esférico que se pueda lanzar « """""'y" una fruta- P«o también quiere que (por ahora, no se preocupe por las defín.v' Ü "*' ' CS '3 f°rma de MPresar '°do eso

m rÍe" como ,as Cases, están declaradas en los archivos fuente, una interlaz por archwoA.

!üa Z as clases, también se compilan en archivos . class usando el confiador de jaxa. í en muchos casos, donde quiera que pueda utilizar una clase (con» un tipo de datos para una

ellas).

variable, como resultado de una conversión, etc.). también puede ,,.¡l¡«.r una ,n.c.1¡i7..

«* P°r

interface

Donde quiera que este libro tenga un nombre de clase en cualquiera de sus ejemplos o

void void

^om t o . lo puede substituir un nombre de interfa, Con frecuencia, los programadores de f la len ••Case" cuando en realidad quieren decir "clase o imerfaz". La. ^^^ mentan y amplían el poder de'las clases, y las dos se pueden «raiar cas, ,gua . Una de I. s pocas diferencias entre ellas es que no se puede crear una instanca de .mertaz: ne* solo

*fi»«'one. de esa, interfaces, hoy aprenderá más sobre

Fruitlike {

decayf); squish();

class Fruit impleroents Fruitlike i Prívate Color myColor{

puede crear una instancia de una clase.

prívate int daysTilifiot;

Implementación y uso de las interfaces

Hay dos cosas que puede hacer con las interfaces: usarlas en sus propias clases y dehmr sus

interface

propias interfaces. Por ahora, comience con la primera. prp

void void

Pan, usar una imerfaz. debe añadir la palabra Cave i.ple.ents como parte de su I se. Esto ,o hizo el día 10, "Ad.ción de imágenes, animación y son.do cuando aprend.o acerca de los subprocesos e incluyó h, inierfaz «unnable en su Jel.n.con del .W)ei.

Spherelike {

toss(); rotate();

public class Neko extends java.applet.Applet implements Runnable {

En este ejemplo, Java.applat .Applet es la superc.ase, pero la imerfaz Runnable amplía c. comportamiento que está implementado.

-

Como las interfaces no aponan nada más que definiciones de mé.odos ^™ que implemento esos mé.odos en sus propias Cases, ut.l«ando las m.smas fi mas

class sphere implements Spherelike prívate float radius; llke

dos que hay en la in.erfaz. Observe que una vez incluida una m.erfaz t.cne que - u

abracas: las subclases de estas últimas pueden elegir qué mét ner e ignorar los otros.)

Uni ve, que su Case implementa una Ínterin las subclases de su clase heredar,, losnuevos \"

(y pueden sobreponerlos o sobrecárganos) como s. su superclase los hub.era do Si su clase hereda de una superc.ase que implementa una interfaz determmada

no Le que agregar !a pa.abra Cave i.ple.ents en su propia def.mcon de Cas.

// extiende Object

class Orange extends Sphere implercents Fruitlike /

}

- -os usuarios de Oranoe nunca necean{saber del cambi0¡

Implementación de múltiples interfaces clases, y su ciase lmp,enremarf e,

componamiemo conibi-

Día 15

nado de todas .as interfaces incluidas.' Para incluir interfaces múltiples en una Case, sólo separe los nombres con comas:

Dublic class NeVo extends java.applet.Applet

P

impleüents Runnable, Eatable, Sortable, Observable { / /

• • •

Observe que al implemen.ar múltiples ¡nierfaces. pueden surgir complicaciones. .Qué sucede

^"interfaces diferentes definen e. mismo método? Hay tres formas de resolver este problema:

. Si lo. métodos en cada una de las interfaces tienen firmas idénticas, imponente un mé-odo en su clase y esa definición satisface a ambas interfaces.

. Si los nw.odos tienen listas diferentes de parámetros, es un casosimplc de soluta del método; inclemente ambas firmas de método, y cada defin.con saus.ace a su respectiva definición de interfaz.

'

. Si los métodos tienen las mismas listas de parámetros, pero difieren en e, upo devueho.

usted no puede crear un mé.odo que satisfaga a ambos («cuaje. *f*™V£*

y(): /; des^P0Sición ..qul8h0. „ y aplastado de la fruta aFruitlike.tossn • //

.sph.r.iik..to,.(;; „ anOrange.ciecay() •

.anOrange.squisno';

// i

nara"l™ pueden hacer todo eso

'anOrange.toss();

anOrange.rotate(};

método s acciona por las listas de parámetros, no por el upo devuelto). En «te en», ratar de compilar una clase que implcmente ambas mterfaces produce un erro de com-

p-Sl incurrir en este tipo de problema significa que sus interfaecs uenen algunas fallas de diseño que debería examinar de nuevo.

Otros usos de las interfaces Recuerde que en casi en todo aquello en que pueda util.ar una clase. cambio. Por ejemplo, usted puede declarar una variable para que sea un upo o. ,,..u

„» e

,

„,„„,„„

Runnable aRunnableObject = new MyAnimationClassU

Cuando una vanab.e es declarada como un tipo de interfaz, sign.fica simplemente que

Cómo crear y extender las interfaces "

UpoRunnable. la suposición es que usted puede llamar a

l punto imponante que debemos captar es que aunque se espera que aRunnableObj ect

Interfaces nuevas Para crear una inIerfa2 nueva, dec]are ,o si

sigllienle.

publie interface Growable { i. 3; i :

■V

-

Día 15

406

_[^£í°[les de 'as clases:

En realidad, esta declaración es igual a una definición de clase, excepto que la palabra interface remplaza a la palabra class. Dentro de la definición de la interfaz, usted tiene

se pueda usar un nombre de clase

pará. cearr paráme.ras genéricos

métodos y constantes. Las definiciones de método dentro de la interfaz son métodds publie

y abstract: usted puede declararlos como tal en forma explícita, o se convertirán en méto dos publie y abstract si no incluye esos modificadores. Usted no puede declarar un mélodo como prívate o protected en una interfaz. Por ejemplo, aquí tenemos una interfaz

y .,ui.»(). Tamban

voi.d growItBigger();

.

>.

*

// explícitamente publico y abstracto

como

.

// implícitamente público y abstracto

}

Observe que, ¿I igual que con los mélodos abstractos en las clases, los métodos dentro de las inicrfaces no tienen cuerpos. Recuerde, una interfaz es diseño puro; no involucra ninguna

9er"'i

" '

olías interfaces en el mismo paquete.

Las interfaces como las clases, pueden pertenecer a un paquete si usled agrega la instrucción package a la primera línea del archivo de clase. Al igual que las clases, las ¡mcrlaces ta.nb.cn pueden imponar otras interfaces y clases de olios paquetes.

Métodos dentro de las interfaces Hay un mico acerca de los métodos dentro de las inicrfaces: se supone que eslos mélodos m>.i abstractos y se aplican a cualquier tipo de clase, pero ¿cómo puede definir los parámetros paia

esos métodos'.' ;Usled no sabe qué clase los estará utilizando! La ivspucsla reside en el IiccIm de que, como ya aprendió con anterioridad, usled utiliza un nombre de inierfaz dondequiera

de imerf"ces no

c. o

«*n existir en

También debemos notar que, a diferencia h . i •

« ^ herencia múll¡pIe. ^ por™ ^7"" de ^-s, |a jeraiquía dc imt,f;lc,s

-merfaces necesite (separada ^ cornTs^

deberá contener una

•amos una definición para una imejfa2 .

lote de otras interfaces:

1

^TjrC

SenCÍlla M PUCde

' ""lrtdos ^ con.stan.es ances.rale,. Aquípresen-

deno.mnada Busylnterface que hereda de iodo un

i 408

Día 15



public interface Busylnterface extends Runnable, Observable

{



Growable,

Fruitiike,

. i

En las interfaces con herencia múkiple, las reglas para manejar los conflictos de nombre de

método son las mismas que para las clases que utilizan múltiples interdices; los métodos que difieren solamente en el tipo devuelto, dan como resultado un error de compilación.

Un ejemplo: enumeración de listas vinculadas Para finalizar la lección de hoy, veamos el ejemplo siguiente, el cual utiliza paquetes, protec

ción de paquete y define una clase que ¡Diplómenla la ¡nierl'a/. Enumera t ion (que es parle del paquete java. útil). El listado 15.3 nos mueMra el código. nH jy02? 1 :

Listado 15.3. Texto completo de línkedlist. java.

package

es un u.so típico del enumerador

collections. _

collections;

2: 3: 4:

public

class

prívate

LinkedList Node

root;

5: 6: 7:

public Enumeration enumérate)) return

8:

{

new LinkedListEnuraerator(root);

9: ¡0:

11 : 12:

class

Node

{

13:

private

Object

14:

prívate

Node

contents;

next;

15: 16: 17: 18:

public Object contents() return

{

contents;

19:

deJ ob

20:

21: 22:

public Node next() return

Oases internas

23: 24: 25:

26: 27: 28: 29:

30:

31:

der°Sa meláfo™ « puede apJ¡car en

rango de snuaciones.

{

next;

class LinkedListEnumerator implements Enumeration { private

Node

currentNode;

LinkedListEnumerator(Node currentNode

= root;

root)

{

. Las

superior-

penenee

un ■

de

S£ mifeó como chses ¿2

clases soportadas por el lenguaje.

Día 15

r 411

A'p-irtir de Java 1 1, usted podía definir una clase dentro de otra clase, como s. fuera un

método o una variable. Estos tipos de clases se conocen como clases internas. El lisiado 15.4 contiene el npplcr Inner, el cual utiliza una clase interna llamada BlueButton |»ra represen

■P~|HSs..o limitado. Un el applc, !nnor dehiJo , '

tar botones selcccionables que tienen un fondo predeterminado de color azul.

El nombre de u

Listado 15.4. Texto completo de inner .java.

1: 2: 3: 4:

import

java.awt.Button;

import

java.awt.Color;

y componamjento complejo lo más __,«•" M'

R

'

'"" ^""^ Cxislc •

n

;ir;i

c M, ,„,,,,„„

-e decir "ha sucedido un error'

Precaución

tratar con el--;-: -r^riemai inciüs° Figura 16.1

El último grupo de excepciones es

'■««««" que eSlá SUcediel al

Ui jerarquía di' clusts

-ceden cuando us.ed „« leyeSndo

^ordrdas j

t

excepciones, y esa, exce¿ones se Paque,e java. io define una clase de

es extendida por otras clases en p^

(EOFException, FileNotFo i

Tnrowab e ,icnc des subclases

imcrnos , „ d ambieme de la u,

J

mucho

plieda h,cer con ellos

de comunicaciones

demás pa.ue.es definen o.ras

de dases- Por Wlo. el

^Exceptxon, ,a cual no sólo

Í

de ^'™la y salid.

Manejo de excepciones que usan excepciones, el compilador

1418

.

Día 16

de Java obliga al manejo de esas excepciones; necesita manejar esas excepciones en su propio código, o simplemente no se va a compilar. En esta sección aprenderá acerca de esa verifi cación de la consistencia y la forma de utilizar las pülabras clave de lenguaje try, caten y f inally, para manejar las excepciones que se puedan presentar.

Ver¡ficac¡ón|de la consistencia de las excepciones Cuanto más trabaje con las bibliotecas de clases de Java, más factible será que caiga en un error del compilador (juna excepción!) similar a éste: BoogieDown.java:32:

Exception

java.lang.InterruptedException

must be caught or it must be declared in the throws clause of

this

metliod.

¿Qué quiere decir esto? En Java, un método puede indicar los tipos de errores que podría lan zar. Por ejemplo, los métodos que leen desde archivos podrían, potencialmente, lanzar errores

IOException, de manera que esos métodos se declaran con un modificador especial que indique errores potenciales. Cuando usted utiliza esos métodos en sus propios programas de Java, tiene que proteger su código contra esas excepciones. La regla es impuesta por el mismo compilador, de la misma forma en que el compilador hace verificaciones para estar seguro de que usled está utilizando métodos con el número correcto de argumentos y de que todos sus tipos de variables concuerdan con lo que les está asignando.

¿Por qué tiene lugar esta verificación? Hace que sus programas tengan menos probabilidades de chocar con errores fatales porque usted sabe, de inmediato, el tipo de excepciones que

pueden ser lanzadas por los métodos que utiliza un programa. Ya no tendrá que leer cuida dosamente la documentación o el código de un objeto que va a utilizar, para estar seguro de que trató con todos los problemas potenciales. Java hace la verificación por usled. Por otro lado, si usted define sus métodos de forma que indiquen las excepciones que pueden 'lanzar. Java le puede decir a los usuarios de sus objetos que manejen esos errores.

Protección de código y captura de excepciones Supongamos que ha estado codificando tranquilamente y de pronto aparece un mensaje de excepción durante una compilación de prueba. De acuerdo con el mensaje usted tiene dos opciones, atrapar el error o declarar que su método lo lanza. Vamos a tratar con el pnmer caso: cómo atrapar las excepciones potenciales.

Para atrapar una excepción, puede hacer dos cosas:

• Proteger el código que contiene el método que podría lanzar una excepción dentro de

try

{

} caThread-SIeePd000)

un bloque try.

• Hacer una prueba y manejar una excepción dentro de un bloque catch.

5

Influjos de W\ La

Día 16

1422

Listado 16.1. continuación 13:

void readNumbers(int[]

14:

inticount = 6;

numArray)

{

int|lastNum = 8;

15:

try¡{

16:

«while

17:

I

18:

Í'

19:

(count < numArray.length)

lastNum = numArray[count++];

{'

if (lastNum == -1) return;

20: 21:

}

22:

}

finally

23:

{ System.out.println("Last

24:

}

25:

return;

number

read:

+

lastNum);

26: 27:

La salida de este programa es la siguiente: First

array:

Last number read: Second

Last

-1

'^

array:

number

read:

13

El bloque try. . . finally, en las líneas 16-24, hace que suceda algo anormal cuando se

llega a la instrucción return en la línea 20. Cabría esperar que return hiciera que el método saliera inmediatamente.

Debido a que están dentro de un bloque try. . .finally, las instrucciones dentro del bloque finally se ejecutan sin que importe la forma de salida del bloque try. El texto "Last number

read" siempre se despliega.

Cómo declarar métodos que podrían lanzar excepciones Un ejemplos anteriores, aprendió cómo tratar con métodos que pudieran lanzar excepciones (protegiendo el código y atrapando cualquier excepción que pudiera ocurrir). El compilador

¡te Java hace verificaciones para estar seguro de que usted ha manejado, de alguna forma, los errores de un método; pero, ¿cómo sabría sobre qué errores informarle en primer lugar? I.a R-sptkM;i es que el método original, indicado en su firma, contiene las excepciones que

podría lan/ailc. Puede utilizar este mecanismo en sus propios métodos; de hecho, es bueno hacerlo para asegurarse de que los demás usuarios de sus clases estén alertas ante los errores que pudieran producir sus métodos.

¿Qué excepciones debería lanzar'

Día 16

^

idea básica es que puede abrir una conexión con un archivo y usar el método read () para

i

í

Dado que el alcance de las variables lócala

bloque extemo en e. que está e, Jo ue \t Z T™?" "tCh « *««( »' ^-ce de,

obtener a.Os de él Esto puede causar vanas excepciones, como un error de d.sco, o un ,men-

to de er más datos de los que contiene e. archivo. En cua.quiera de los dos casos, el método read()"-a una lOException la cual, si no .a captura, haría que c. programa devora su

""tas cláusulas. En un bloque múltiple catch el Íl" hl "^ * "^ mUc las dls-

ejecutado. y el resto será ignorado.

ejecución o que se estrellara.

í ntro de un bloque catch. Podría hacer la .impieza después del erro, y vo.ver a algún esta do de seguridad, arreglando .as cosas lo suficiente para que el programa pros.ga, o s, todo

que

P°''

Wn recurso ex.erno que se haya adqu id

esto falla, guardar lo más posible del estado actual del programa y sahr.

El siguiente ejemplo trata de leer de un archivo y atrapar los errores, en caso de que sucedan:

pnu ,xM«r 1 de ese cod.go dentro de una panf opcio^i

S1* E

try. . .catch. . .finaliy:

u estruaurado un bloque

eso seria duplicar e, m.ismo cód.go en ^

ry while (numBytes a ^

excepciones que tengan mZ^^d T ^^ *"* U""2arla °edare ^ '« Probab-I.dad de ocumr y qUe .engan sentido para el diseño

general de sus clases

Mal estilo al usar las excepciones anad)r una clausu,a vacía catch o una instrucción tTows u D "'

apropiadas para hacer ambas cosas) deiar c-,er ,vn

^ *" '^

P P'° me'°d° (y ^^ razoncs

#

Día 16

1430

IÍ^2Ü!^ÍÜe*«pc¡onales: :H!2Ü2Üi«~res V 'a seguridad

El sistema de excepciones de Java fue diseñado de modo que, si existe la posibilidad de que , ocurra un error se le avisa de inmediato. Si no hacemos caso de esos avisos, o simplemente les damos la vuel.a. es probable que sucedan errores fatales en nuestro programa, errores que

se hubieran podido evitar con unas cumias lincas de código. Peor ¡iiín. agregando ■ nstr.ieciones throws a sus métodos para evitar las excepciones, significa que los usuarios de ellos (objetos que estfn más allá en la cadena de' llamada) tendrán que manejarlos. Lo único que logra con esto e> hacer que su método sea más difícil de utilizar.

^

„z.

Los errores delLmpilador referentes a las excepciones están ahí para recordarle que medite

sobre estos aspectos. Dése el tiempo suficiente para manejar las excepciones que pudieran afectar su código. Este cuidado extra le recompensará ampliamente cuando vuelva a utilizar sus clases en proyectos futuros y en programas más y más grandes. Desde luego, la biblioteca

de clases de JÍ-a se ha escrito con este grado de cuidado, y es una de las razones por las

# *

#

cuales tiene lajfuerza suficiente para ser utilizada en la construcción de todos sus proyectos en Java.

"nBS:""rt!-"«««P.. ~./cli,nt.ít.1

f

Cómo usar firmas digitales para identificar los applets

Una de las suposiciones fundamentales de la estrategia de segundad de los applets de Java. ,-

que usted no puede confiar en nadie en World Widc Web. Ese pensamiento podna sonar alpo

otro de los navegado es quíle da P'° "^^^-a V en

cínico pero en la práctica significa lo siguiente: la seguridad de Java da por he.no que alguien tratará de escribir applets maliciosos, de modo que se previene contra cualquier in.cn-

y Microsoft han presen Ido si

applet debe ¡mp|ementar aa^^J m°mento de escribir es,o. un

„, ;,| respecto. En consecuencia, cualquier curaclcrísüca del lenguaje que pudiera m usada

con abuso, ha sido bloqueada en los applets. Las características prohibidas son las siguientes

vaya a ejecuta, Por fortuna

«omina uno de ,lte¿ le será

. Leer archivos del sistema en el que se eslá ejecutando el applet.

0

m

#

"^ ^ * J*Va 2'

"ar en sus navegadores. ¿ "ej 1lsZ^" ^^ *' ^"^ *>*'*

. Escribir archivos en el sistema en el que se está ejecutando el applet. • Olitcner información sobre un archivo del sistema. • Borrar un archivo del sistema.

i no puede nacer n-íHi „.

. Conectarse a cualquier máquina distinta a la que entregó la página Web que contiene c;

ases llamadas permisos.

j

Lcr ndaa que pueda ser cíañi-

-

Imenie. esta capacidad no es

Día 16

1432

viable con un applet, ya que el acceso al disco es un no definitivo. Para que el juego se pueda realizar, Fishhead debe firmar el applet digitalmente y permitir que el usuario lo establezca ventaja de una firma djgital

como un programador confiable. Este proceso consta de cinco pasos:

ase

1. Fishhead Software utiliza keytool, una herramienta que viene con el JDK, para crear dos archivos encriptados denominados: clave pública y clave privada. Juntas, estas claves constituyen una,tarjeta de identificación electrónica que identifica totalmente a la compañía. Fishhead se asegura de que su clave privada esté oculta a cualquier otra per sona. Como una forma parcial de identificación puede, y debe, poner su clave pública a disposición de cualquieía.

2. Fishhead Software necesita alguien que pueda comprobar su identidad. Manda su clave pública y un archivo descriptivo acerca de Fishhead Software a un grupo independiente en el que podrían confiar los usuarios de Java, Sijnatures "R' Us.

3. Signaiures 'R' Us comprueba la identidad de Fishhead Software, para asegurarse de que es .m grupo lcyfli.no con la misma clave pública que so Ic-s nnió. Cuando ImsI.Ikm.I pasa cl muesireo, Signatures -R' Us crea un nuevo archivo encriptado que se llama cer tificado y lo envía a Fishhead.

JJJ* están clarante identificados. Hága

esta preguma, ¿cuámos esc

:

4. Fishhead crea un archivero de Java que contiene su applet de juego y todos los archivos relacionados. Con una clave pública, una clave privada y un certificado, Fishhead Software ya puede utilizar la herramienta jar para firmar digitalmente el archivero. 5. Fishhead coloca cl archivero firmado en el sitio Web, jumo con las instrucciones para

:*^cuaiqui p^^Zzl!;ZVe podría -quedar un poco «""■»". «tennfícar* alguien. ,,cómo se puede u , T t ^^ MÍU™ en c°njumo para un rasiro

F'shhead?

.

US'" ld Ü'w P"W'«' sola, como idenhllcador de

^^^bTJ^ZI^IT^ZT-^ COrKSp°h^"le- Pino ¡demifican

—era, a,8uien más podría pre,end rí "lT* «- W su Cave privada. j Cuando Signatures 'R'

^ión Prmcipai es asegr;rq^:i

Dado que las cJaVes ppúblicas se se ¡e ¡e pueden pueden d d

e' «üo We, We, Como Como par,e par,e de dee ssusu pp^ ^

;sr

*

^"^ rea'menle a la

?

^^7 ^^7 ^^ ^^ ^ ^ "™ "™< - «™ «

rarla conavc¡a qu 1 , ' "' *?"* '"' ^ ^ ÚeXa^M

esta Cav, pública y compararla c ■^su.u.o de clasificadores pa

™- El cenmeado que se eLc Lc está está

'" «--«ave privad, dc Fis,lhcad.

¿^°o '' t^t"*' ^puede P"M^'>er«au.sado^~,on Ü C'JVe Puhl° V »° h:'>

by.es ?

» «5.

#

Día 17

Un flujo de salida almacenado en búfer se crea con alguno de los dos constructores si-

10:

11:

guíenles:

e,

12:

. BufferedOutputStreamf OutputStream) Crea un flujo de salida almacenado en

13: 14:

búfer para el objeto específico OutputStream.

15:

. BufferedOutputStrean(OutputStream, int) Crea el flujo específico

16: 17:

OutputStream almacenado en un búfer de tamaño int.

18:

El método «rite (int) del flujo de salida se puede usar para enviar un solo by.e al flujo, y el

19:

mftodo writ. - ««> ■- * - * -

Día 18

1464

Comunicación a través de Internet

Hay una gran interacción entre el punto A. que es el documento Web, y el ponto B, su progra ma Java Con el URL se establece una conexión URL. que se utiliza para establecer un lector de Huios de entrada, el cual a su vez sirve para establecer un lector de flujos de entrada alma cenados en búfer. La necesidad de capturar las excepciones que ocurran durante el proceso lo

23:

GetFile frame = new GetFile O;

24:

25:

WindowListener 1 = new WindowAdapterO / publie void windowClosing

connection . new Socket(nombreHost, nu.Puerto);

readLine() para leer una línea de texto del flujo de entrada. Conforme van llegando, el lec tor pone los caracteres en un búfer y los saca cuando se le pide.

Líl ciclo while, de la\ líneas 53-55, lee el documento Web línea por linca anexando cada una al objeto StringBuffer, que fue creado para guardar el texto de la página. Se utiliza un

búfer de cadena, en ve/, de una cadena, porque la cadena no se puede modificar de esa forma

■;

en tiempo de ejecución.

Una vez luidos lodos los dalos, la línea 5b utiliza el método toString( ) para convertir c\ búfer de cadena en una cadena simple, y pone el resultado en el área de texto del programa. I lay algo que debemos notar c.i este ejemplo, y es que la pane del cóüigo que abrió la cone

BufferedlnputStream bis =

xión a la red, leyó el archivo y creó una cadena, está rodeada por las instrucciones try y catcli. Si ocurrieran errores durante la lectura o procesamiento dol archivo, estas instruc

ciones le permiten recuperarse de ellos sin anular lodo el programa. (Un este caso, el progra

ma saldría con un error porque, si la aplicación no puede leer el archivo, no hay nada más que hacer.) El try y caten le dan la oportunidad de manejar los errores y recuperarse de ellos. connection.closef);

Nota

Una de las cosas que no hemos comentado, es el código para el manejo de

«■

eventos que aparece en las lineas 25-30. Este código es necesario para que

la aplicación se cierre correctamente cuando se cierre su ventana; durante el día 21 aprenderé más sobre "Manejo de eventos de usuario con Swing". •

™ »„ dlos en

"*" "'"" "'" !"""«'°

t.

Día 18

Para crear un socket de servidor y unirlo a un puerto, debe crear una nueva instancia de

^ T™

ServerSocket con el número del puerto:

ServerSocket sConnection = new ServerSocket(8B88);

■"■-

#

Par, escuchar en ese puerto (y aceptar una conexión de clicn.es. si llegan» a hacerse) utilice el método accept(): sConnection.accept();

Diseño del programa Trivia

Una vez hecha la conexión del socket. puede utilizar flujos de entrada y salida para leer de y

m

escribir al cliente.

En la próxima sección, "Trivia: un socket simple tipo cliente-servidor", trabajará con algunos

ma que vigüe un puerto determinado, para las conex one

códigos para implementar una aplicación simple basada en un socket.

Para ampliar el entorno de las clases para sock.ts (por ejemplo, para permitir que las conex o es de red trabajen a través de una firewal. o de un proxy) puede utilizar la c ase abstraen, S cketl.pl y la interfaz Socketl.plFactory para imp.ememar un nuevo socke. de capa de

^

re Je diseño se ajusta a la n,ela original de las Cases par., socU-ts . i^«

que esas Cases se puedan tras.adar a otros sistemas que tengan mecan.smos de transport disuntos El problema con este mecanismo es que si bien es cierto que tunc.ona en los caso e c lio no le permite agregar otros protocolos encima del TCP (por ejemplo, para imple-

e, fcn resumen, el servidor realiza las tareas siguientes:

1- Espera la conexión de un cliente.

merTun mecan.smo de encrip.ación como el SSL) o tener múluples implementacones de

2. Acepia la conexión del cliente.

sockets por cada unidad de tiempo de ejecuc.on de Java.

3. Envía una pregunta al azar.

Por estas razones, se ampliaron los socke.s a partir de Java 1.0.2 de modo que las clases So k t y S rve Socket no fueran finales y sí susceptibles de ampliación. Puede crear sub

4. Espera la respuesta del cliente.

5. Verifica la respuesta y notifica al cliente.

clase! de estas clases, que utilicen la .mplementación predeterminada de sockets, o una de su

6. Le pregunta a! cuente si desea que le haga otra pregunta.

prop.a creación. Esto permití posibilidades de red mucho más flexibles.

7. Espera la respuesta del cliente.

Hay otras características nuevas que se han agregado al paquete java.net:

8. Repite el paso 3, en caso necesario

. Nuevas opciones para socke.s. basadas en las opciones BSD (por ejemplo. TCPJWDE ■ LAY

IP_MULTICAST_LOOP,

SO_BINDADDR).

. Muchas nuevas subclases de la clase SocketExcepticn, para representar errores

de red en un nivel de granularidad más fino que el de Java 1.0.2 (por ejemplo, NoRouteToHostException o ConnectException).

Trivia: ivia: un un socket socket simple p tipo p cliente-servidor Para terminar el comentario

b sobre

i

'•• l-i -I>-Ma de. usuano y ten,,,,,:, !,,s „,»■, lillv:ls dcl t,icill, co,lsisU.n cl>.

xidad en Java aquí conexidad en Java, aquí está está un un ejemplo ejemplo de de un^gran» un^

de Java que utiliza las clases para socke.s para imp.ememar una apl.cac.ón s.mple basada la red, denominada Trivia.

0

Comunicación a través de Internet

Día 18

°UtS-r W-ant^- ~-« -— - ■ * ansWerS[num)

String inLine = is.readLine(); if (inLine.length() > 8) < outLine = processInput(inLine);

State = WAITFORCONFIRM •

break;

os.println(outLine); os.flushf);

if

■■'

'

case WAITFORCONFIRM■

(outLine.equals("Bye.")) break;

?

//

State = WAITFORANSWER;

limpia todo

os.ciosef);

else {

is.close(); clientSocket.closeO

catch

(Exception e)

outStr = "Bye."; }

{

System.