Javaen21dias

Page 1

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<.

Métodos de clase

,46

Alcance de variables y definiciones de métodos

Creación de aplicaciones en Java

]47

Clases auxiliares

Aplicaciones Java y argumentos de línea de comandos Paso de argumentos a las aplicaciones Java Manejo de argumentos en su aplicación Java

Resumen Preguntas y respuestas .e de un objr-io

.

v-

w.

^

]4g

• ^ j4g - )5)

)52 :


Contenido

Aprendiendo Java 2 en 21 Díns

DlA 7 USO DE MÉTODOS PARA REALIZAR TAREAS

153

',

Creación de métodos con el mismo nombie, pero con diferentes argumentos Métodos constructores Cómo llamar a otro método constructor

;

Sobrecarga de métodos constructores

Sobreposición de métodos

;

.. 160 .. I6ü .. I62

.. 165

Cómo llamar al método original

.. 166

Sobreposición de constructores

.. 168

Métodos finalizadores

Resumen

.. 158 .. 159

Métodos constructores básicos !

154

;

Preguntas y respuestas

Semana 2 Temas avanzados de Java DIa 8 Cómo poner programas interactivos en Web Diferencias entre los applets y aplicaciones Restricciones de seguridad de applets

Cómo elegir una versión de Java

Control de seguridad mejorado Creación de applels

Actividades principales de applets Un applet sencillo

Inclusión de un applet en una página Web La etiqueta <APPLET>

Cómo probar el resultado

.. 169

.. 169

171 173 174

175 176 177 177

178 180

182 182 . 183 ^

Cómo poner appieis en Web

Más acerca de la etiqueta <APPLET>

' ■

185

HSPACE y VSPACE

CODE y CODEBASE La etiqueta <OBJECT>

.uchiveros JAVA Otros formatos de almacenamiento ] 'aso de parámetros a los applets

'Insumen 'regunias y respuestas

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

La clase Graphics

El sistema de coordenadas para gráficos Dibujo y relleno

. 1S8 . 190 . 191 . 195

. 197

199

. 200 . 202

.. 202

Líneas

Rectángulos óvalos Arcos

:

■■■.■ :::.:

:

:...

:

::..

Copiado y limpieza

texto y fuentes

203 203 207 208 2I2

'..'.'

213

Cree objetos Font Dibujo de caracteres y cadenas

213 213

Cómo obtener información acerca de una fuente

214

Color

:

216

Uso de objetos Color Cómo probar y establecer los colores actuales

216 217

Operaciones gráficas avanzadas mediante Java2D

218

Espacios de coordenadas de usuario y de dispositivo

219

Conversión por cast de un objeto Graphics2D Especificación de los atributos de modelizado

219 220

Colores 20

Creación de objetos para dibujar Dibujo de objetos

Resumen Preguntas y respuestas

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

Animación en Java Pintado y repintado

220'

• •

223 225 228 229

232 232

Inicio y paro de la ejecución de un applet

—5J

233 234

Cómo poner todo ¡unto

2*6

Cómo reducir el parpadeo de la animación

TÍO

El parpadeo y cómo evitarlo Sobreposición de update () Una solución: no limpiar la pantalla

239 240 240

~3*

2-+3

Cómo obtener imágenes Rutas relativas de archivo Dibujo de imágenes

243 244 ~ *

Cómo poner a trabajar las imágenes

246

Cómo crear animación mediante imágenes

248

Una nota acerca de los observadores de imágenes

El ejemplo Neko

Doble búfer

m

231

Control de la animación mediante subprocesos Cómo escribir applets con subprocesos

Recuperación y uso de imágenes

#

246

24S

256

o


Contenido

Aprendiendo Java 2 en 21 Días

258

Una nota acerca del borrado de objetos de Graphics El applet Checkers Recuperación y uso sonidos

Resumen

V.

DIa 11 Construcción de .nterfaces de usuario sencillas para applets

El AWT

;

Componentes de una interfaz de usuario

:

Eventos de arrastre y movimiento del ratón

261

Los eventos ratón entra y ratón sale

2M

Un ejemplo: dibujo de líneas

267 .... 2(.S

-

....269

.... 26')

Adición de componentes a un contenedor

.... 27I

Etiquetas

.... 273

Botones Casillas de verificación

. 274

0??

Listas de selección

.,„

Campos de texto

.,<,.,

Áreas de texto

.^

Listas desplazabas

08J

Barras de desplazamiento y deslizadores

"^

Lienzos

,

Resumen Preguntas y respuestas

DIA 12 ORGANIZACIÓN DE LOS COMPONENTES EN UNA .NTERFAZ DE USUARIO Diseño básico de inlerfaces

T^y

... 289 291

... 292 oy?

Diseño de una interfaz

^

El administrador FlowLayout

"^

El administrador GridLayout

~%

El administrador BorderLayout

"^

Cómo mezclar administradores de diseño

"^

Diseño de interfaces avanzadas

~^

El administrador CardLayout

'

El administrador GridBagLayout

,^

Relleno de celdas

^^

Márgenes

-,l4

Resumen

3I4

Preguntas y respuestas

Ha 13 Respuesta a la entrada del usuario en un applet Manejo de eventos Tipos de eventos El método handleEventO

Manejo de los clics del ratón

Eventos ratón arriba y ratón abajo

Doble clic

Manejo de los movimientos del ratón

258

205

Preguntas y respuestas

317 318

XII

325

325 '.

326

326

Manejo de los eventos de teclado

331

Los eventos tecla abajo y tecla arriba

332

Teclas predeterminadas

332

Un ejemplo: escriba, despliegue y mueva caracteres

333

Prueba de las teclas modificadoras y los botones múltiples del ratón

337

El manejador de eventos genérico

338

Manejo de los eventos de componentes

340

Manejo de eventos de acción

341

Manejo de los eventos de enfoque

343

Eventos del área de texto

344

Eventos de listas desplazable

344

Un ejemplo: el interruptor de colores de fondo

345

' Adición del código de eventos

346

Resumen

349

Preguntas y respuestas

349

DIa 14 Desarrollo de interfaces de usuario avanzadas con el AWT

351

Ventanas, marcos y cuadros de diálogo

352

La clase Window

352

Marcos

352

Cuadros de diálogo Eventos de ventanas

356 361 362 362 363

Menús Menús y barras de menús Elementos de menú Evenlos de menú Creación de aplicaciones AWT independientes

• 364 364

Un ejemplo completo: el convertidor RGB a HSB El diseño del applel Definición de los subpaneles Manejo de eventos Actualización del resultado

El código fuente completo Resumen '. Preguntas y respuestas

v «

366 367 369 371 372

375 377 377


Aprendiendo Java 2 en 21 Días

XII

Contenido

Semana 3 Afine sus conocimientos de Java

379

DIa 15 Funciones de las clases: paquetes, interfaces y otras características Modificadores

Control de acceso a métodos y variables

3S2

Métodos y variables estáticos

388

Clases, métodos y variables final

390

Variables Métodos Clases •.

391 391 392

Clases y métodos abstractos Paquetes

381

39■.

Uso de los paquetes

™4

Nombres completos de paquetes y clases

3ío

El comando import

-"-1

Conflicios.de nombres

396

Una nota acerca de classpath y dónde se ubican las clases

397

Creación do sus propios paquetes Selección de un nombre para el paquete Creación de la estructura de una carpeta Cómo agregar una clase al paquete

™7 397 398 398 398

Control de acceso a los paquetes y las clases

Interfaces

*

40ü

El problema de la herencia sencilla

Interfaces y clases

Implementación y uso de las interfaces l.-nplemeniación de múltiples interfaces

401

4^2 4Ü4C-

Otros usos de las interfaces Coi io crear y extender las interfaces

4Ü4 405

nterfaces nuevas

Métodos dentro de las interfaces

406

Un ejemplo: enumeración de listas vinculadas

408

Tomo extender interfaces

A®'

Clases internas

409 41 I

Rí sumen Pr:guntas y respuestas

DlA 16 CSCUNSTANCIAS EXCEPCIONALES: MANEJO DE ERRORES Y LA SEGURIDAD

4P

413

Excepciones, la forma vieja y confusa

414

I as excepciones de Java

4!5

Manejo de excepciones

Verificación de la consistencia de las excepciones Protección de código y captura de excepciones La cláusula f inally

417

v 418 41S

XIII I

Cómo declarar métodos que podrían lanzar excepciones

422

La cláusula throws

423,

¿Qué excepciones debería lanzar?

423

Cómo pasar las excepciones

424

throws y herencia

425

Cómo crear y lanzar sus propias excepciones

426

Cómo lanzar excepciones

426

Creación de sus propias excepciones

427

Combine throws, try, y throw

427

Cuándo usar excepciones y cuándo no

428

Cuándo usar excepciones

428

Cuándo no usar excepciones

429

Mal estilo al usar las excepciones

429

Cómo usar firmas digitales para identificar los applets

430

Ejemplo de una firma digital

431

Firmas específicas para navegador

433'

Políticas de seguridad

'.

434

Resumen

435

Preguntas y respuestas

435

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

437

Introducción a los flujos

438 438 439

Cómo utilizar un flujo Cómo filtrar un flujo

Flujos de bytes Flujos de archivo

440 440

Filtrado de un flujo

444 445

Filtros de bytes

Flujos de caracteres Cómo leer archivos de lexto Cómo escribir archivos de texto Archivos y filtros para los nombres de archivo

• :

Resumen Preguntas y respuestas DIa 18 Comunicación a través de Internet Conectividad en Java Apertura de conexiones con Web Apertura de un flujo a través de la red

Sockets

Trivia: un socket simple tipo cliente-servidor Diseño del programa Trivia Implemenlación del servidor Trivia

.

,

452 453 455 456 459 460

461 462 462 463

467

468 469 470


V xv I

Contenido

Aprendiendo Java 2 en 21 Dias

Implementación del cliente Trivia Trivia en acción

Resumen Presuntas y respuestas

Cuadros de diálogo estándar

.479

Un ejemplo: la aplicación Inf o

~

Resumen

;

Preguntas y respuestas

;"" 485

DIa 19 JavaBeans y otras características avanzadas

DlA 21 Manejo de eventos de usuario con Swing

s 532

El evento principal Escuchadores de eventos

JavaBeans El objetivo de JavaBeans

4g8

Cómo se relacionan JavaBeans y Java

Cómo establecer los componentes

Métodos manejadores de eventos

534

Trabajo con métodos

La API de JavaBeans Trucos con applets

.491

El método showStatusO

.491

Información de! applet

.491

Creación de vínculos dentro de los applets Comunicación entre applets

. 496

Cortar, copiar y pegar

.. 497

Creación de objetos transfcribles

.. 49S

El portapapdes

.. 502

Invocación a Métodos Remotos

.. 503

La arquitectura de la RM1

.. 504

Creación de aplicaciones RMI

.. 505

Conectividad para bases de datos de Java

... 506

Resumen

... 507

Preguntas y respuestas

509

DIa 20 Diseño de una interfaz de usuario con Swing

...510

Los beneficios de Swing

... 511

Estructura de una aplicación

Cómo agregar componentes a un marco de Swing A trabajar con Swing

Etiquetas

,'

...512 ...514

5|6

^16

Un ejemplo: la aplicación SwinoColorTest

- - ■ " ^

"

Eventos de ratón Eventos de movimiento del ratón Eventos de ventana

Un ejemplo: la aplicación SwingColorTest

Resumen

,..„

Métodos abreviados

^2 ^

5

553

Apéndices

Apéndice A Resumen del lenguaje Java Palabras reservadas

556 ^^

Comentarios

,,, 556 ^-¡

Literales Declaración de variables

55g

0bJel0S

"'.560

Arreglos

560

Ciclos y condicionales

Definiciones de clases

*

^

Importación

5J]

544

...

M8 •■■••■■•• ^

5"+4

Preguntas y respuestas

Definiciones de métodos y constructores

Cómo establecer la apariencia •

Eventos de tecla

^7

Las nuevas características de Swing

Descripciones y nombres de los componentes

.. 541

Eventos de elemento

Operadores

Áreas de texto

Barras de desplazamiento

Eventos de enfoque

515

Campos de texto

Listas de selección

Eventos de ajuste

Asignación de variables

5IÜ

Casillas de verificación y botones de opción

Eventos de acción

5]j

Botones

Información sobre herramientas

¿¿^

Protección Apéndice B Recursos de Java en Internet Sitio Web de este libro

Otros título a considerar

565

565 56fi


n sino de Su,, Mierosysicms

. 5<>6

Acerca de los autores

. 5oK

do sei

. 568

Otros sitios Web sobre Java

U página de libros de Java

JavaWorld

:

libros sería mucho

.

Preguntas mas frecuentes en J..va

Grupos de noticias de Java

Oportunidades de empleo

. 570

S5

s d.vcrt.do. En sus

The Off

. 571 573 573 S7S

575 576 5S0

5 SO

583

™c0" ilIDK

5X3 5S5 586

5X7 5SX

589

ÍNDICE

nttp://v/ww.Prefect.com/]ava2i.


Prentice-Hall Hispanoamericana

Dedicatoria

El personal de Prentice-Hall Hispanoamericana, S.A. está comprometido en presentarle lo

A Eric. por todas las razones comunes (soporte moral, preguntas estúpidas, apoyo en los

mejor en material de consulla sobre computación. Cada libro de Prentice-Hall

momentos difíciles, lomar grandes cantidades de café). —U.

Hispanoamericana es el resultado de meses de trabajo de nuestro personal, que investiga y

refina la información que se ofrece.

A Rita Cracker (de cariño "Nana ") y Mary Cadenhead (de cariño "Abuela " o "Mimi").

Cualquiera debería tener a su alrededor abuelas Um amantes, amadoras y divertidas como estos dos (ounq.u

Como parte de este compromiso con usted, el lector de PHH, Prenlice-Hall

ellas no me dieron el pony que yo realmente, pero realmenu: quería cuando „■„,,, cuco anos). - hoy. .

Hispanoamericana lo invita a dar su opinión. Por favor háganos saber si disfruta este libro, si tiene alguna dificultad con la información y los ejemplos que se presentan, o si tiene alguna sugerencia para la próxima edición.

Reconocimientos

Sin embargo, recuerde que el personal de Prenlice-Hall Hispanoamericana no puede actuar

como sopone técnico o ni responder preguntas acerca de problemas relacionados con el De Laura Lemay:

software o el hardware.

Al equipo de Java de Sun, por todo su intenso trabajo en Java, el lenguaje, y sobre el nave

Si usted tiene alguna pregunta o comentario acerca de cualquier libro de Prentice-Hall

gador, en particular a Jim Graham. quien me enseñó Java y Hoüav;, en un curso in.cns.vo en

Hispanoamericana, existen muchas formas de entrar en contacto con nosotros.

mayo de 1995 y sembró la idea de esie libro.

Responderemos a todos los lectores que podamos. Su nombre, dirección y número telefónico

A lodos quienes compraron mis libros anteriores y les gustaron: compren lambién éste.

jamás formarán parle de ninguna lista de correos ni serán usados para otro fin, más que el de

ayudarnos a seguirle llevando los mejores libros posibles. Puede escribirnos a la siguiente dirección:

De Rogéis Cadenhecd:

Prentice-Hall Hispanoamericana, S.A.

Soy una de esas personas que planea su discurso de recepción del Osear con anterioridad

aunque yo nunca .ral ajé en ningún proyecto que pudiera liderar para ganar un prcm.o de a academia. Si este libo fuera elegible para un Osear, mi discurso podría empezar por ayudar a

Attn: Editorial División Computación

Calle Cuatro No. 25, 2" Piso,

los compañeros de Semillan, quienes han contribuido en gran manera a la calidad de este

libro incluyendo a J> ark Teber, Seo.. Meyers. Tonya Maddox. Eric WoK. y Deborah Fnsbv. A continuación, quis era agradecer a mi ex agente Brian Gilí y mi agente actual Dav.d

Co!. Fracc. Alce Blanco

la audiencia de este ibro. Después del beso, lanzaría los nombres de conocidos personales y parientes a quienes , ebo favores o dinero. Wade DuChene, Jonha.an Bourne. Mark Wmner. Phil Weins.oek. Ene Manuel, Chad Cadenhead, Kelly Cadenhead, Mama. Papa. Cl.ni Moowe. Mane Moewe. Induurial Light and Magic, James Camarón, la Academia. M.ke Rhyner, la Liga an.i-d.famacicn de B'nai Bri.h, Andrew Borokove, Greg WilHams. Walker Com.sano de Texas el sistema d simal Dewey, y la estación de radio KTCK de Dallas -Fort Wortl,

C.P. 53370

Naucalpan de Juárez, Edo. de México.

Rogerverg y le plan aria un beso a mi esposa Mary y a mi hijo Max, quien debena estar entre

Si lo prefiere, puede mandar un fax a Prentice-Hall Hispanoamericana al (525) 5387-0811. También puede ponerse en contacto con Prenlice-Hall Hispanoamericana a través de nuestra página Web: tittp: //www.prentice.com.mx

Finalmente, me gu ..aria terminar con una súplica a toda la gente para que viva en armon.a y paz, y por la aboli< ion inmediata del bateador designado.

j


Introducción Hace tres años, mencionar la palabra "java" traía a la mente una de dos cosas: Una isla de

m

m

Indonesia o una taza de café caliente. Hoy, quienquiera que haya tenido contacto con una

página Web, alguna revista de computación, o una sección de negocios de algún diario, tiene otro concepto de Java: el lenguaje de programación introducido por Sun Microsystems.

Se pueden encontrar películas en los principales videoclubes, atletas en una intriga de

&

crímenes y políticos corruptos que han recibido menos atención que Java. El lenguaje ha lle

9

gado a ser parte del desarrollo de software, como el líquido del mismo nombre.

m

Por una pane Java mantiene despiertos a los programadores hasta tarde, mientras al mismo

m

tiempo otro tipo de Java permite a los programadores dormir mejor después de una jornada de desarrollo de programas.

m

El lenguaje de programación Java alcanzó un lugar importante a fines de 1995 cuando

m

Netscape firmó un contrato para integrarlo en el navegador Navigator. Hoy hay vanas

opciones para agregar programas interactivos a Web, incluyendo Shockwave de Macromedia y ActiveX de Microsoft. Cuando se introdujo Java se revolucionó la naturaleza de las páginas Web. Los applcts de Java, pequeños programas que se ejecutan dentro1 del navegador como parte de una página, sirven para varios propósitos: juegos, multimedia, animación, y otros

efectos especiales. De acuerdo con la máquina de búsqueda Alta Vista, más de un millón de páginas en Web incluyen applets de Java.

A) ser liberada la versión 1.2 de Java, ésta tiene alcance completo sobre Web. El lenguaje es tan popular en Internet que además está disponible para el desarrollo de programas de uso general.

Podría sede familiar el uso de herramientas de programación Java como Visual Café de Symantec y Java Workshop de SunSoft. Estos programas permiten desarrollar programas Java

funcionales, pero la mejor manera de entender todo el alcance de este lenguaje es a través de la experiencia directa de trabajar con él por medio del JDK de Sun (Kit de Desarrollo de Java). El paquete, que está disponible sin costo en Web en http: / / j ava. sun. com, es un

conjunto de herramientas de comandos en línea para escribir, compilar y probar la ejecución de programas Java.

Aquí es donde queremos presentar el libro Aprendiendo Java 2 en 21 días editado por

Prentice Hall. Usted será guiado por todos los aspectos del desarrollo de programas Java

mediante la versión más actual del lenguaje y las mejores técnicas disponibles.

Cuando termine de leer el libro, tendrá razones bien fundamentadas por las que Java ha llega do a ser el lenguaje de programación más comentado durante la última década, y las razones

de por qué podría ser el lenguaje de programación de mayor uso en la próxima década.


Introducción

Aprendiendo Java 2 en 21 Días

• El día 11 empieza una exploración de cuatro días a la programación visual. Usted aprende a crear una interfaz gráfica de usuario para los applets usando el AWT (Kit de herramientas para el manejo Abstracto de Ventanas), un conjunto de clases introducidas en Java 1.02.

Cómo está organizado este libro Aprendiendo Java 2 cu 21 días cubre el lenguaje Java y sus bibliotecas ele clases en 21 días, organizándolas en tres semanas por separado. Cada semana cubre un área amplia y distinta

• El día 12 cubre cómo hacer que una interfaz de usuario luzca bien mediante los adminis

del desarrollo de applets y aplicaciones Java.

tradores de diseño, un conjunto de clases que determinan cómo se organizan los com ponentes en una interfaz.

En la primer semana usted aprenderá el lenguaje Java en sí mismo:

• El día 13 continúa la cobertura del AWT con clases de manejo de eventos, los cuales

. Día I es la introducción básica: Qué es Java, por qué es tan innovador y cómo obtener los programas necesarios para crear programas Java. Incluso creará su primera apli

capacitan a un programa para responder a los clics del ratón y otras interacciones del usuario.

cación Java.

• En el día 14 usted redondea su conocimiento del AWT al aprender a desarrollar ven

• En el día 2, explorará conceptos básicos de programación orientada a objetos al mismo

tanas de aparición, rnenús, y aplicaciones independientes.

tiempo en que son aplicables a Java.

La semana 3 incluye tópicos avanzados y una introducción a Swing, la nueva expansión de

• En el día 3. será iniciado en detalles con bloques básicos de construcción en Java: tipos ile dalos, variables, y algunos tipos de expresiones como las aritméticas y las compara

programación visual al AWT:

• En el día 15 usted aprende más acerca de interfaces y paquetes, los cuales son útiles

ciones.

• Durante el día 4 se profundiza en detalles de cómo manejar objetos en Java, cómo

para agrupar clases y organizar una jerarquía de clases, así como oíros aspectos avanza

crearlos, cómo lener acceso a sus variables y llamar a sus métodos, y cómo comparar

dos del núcleo del lenguaje por sí mismo.

los y copiarlos. También tendrá un primer contacto con las bibliotecas de clases Java.

• El día 16 cubre las excepciones, errores, avisos, y oirás condiciones anormales, genera

. En el día 5, aprenderá más de Java a través de los arreglos, instrucciones condicionales

das tamo por el sistema como por sus programas; también aprenderá acerca de la

y ciclos

seguridad Java.

• El día ( explora completamente la creación de clases, los bloques de construcción bási cos de . ualquier programa Java y cómo ponerlos juntos para conformar una aplicación Java (L n programa que pueda ejecutarse por sí mismo sin depender de un navegador

• El día 17 cubre los flujos de entrada y de salida, un conjunto de clases que permiten el acceso a archivos, el acceso a red, y otros manejos de datos sofisticados. • En el día 18 usted extiende su conocimiento de flujos para escribir programas que se comu

nican con Internet, incluyendo la programación con sockets y el manejo de los URL.

Web).

• Lo i|m ustcil aprendió durante el día (i. lo construirá durante o I día 7. Usted aprenderá más acerca de cómo crear y usar métodos, incluyendo sobreseer y sobrecargar métodos y crea;

• En el día 19 se toca algo de lo más nuevo y las características más sofisticadas del lenguaje en la versión 2, incluyendo JavaBeans, RMI (Invocación Remota de Métodos)

constructores.

y otros temas.

La semana : se dedica principalmente a los applet y las técnicas de programación gráficas

• El día 20 inicia una introducción de dos días a Swing, las nuevas clases sobresalientes que son partes de Java 2. Usted usa estas clases para crear la interfaz de usuario para

como la anii.iación y manejo de imágenes:

una aplicación, a partir de características como una variable de sensación de apariencia

• El di; 8 proporciona los elementos básicos de los applels. cómo difieren de las aplica ción, s. cómo las crean, y acerca de las partes más importantes de un ciclo de vida de

• El día 21 usted finaliza su conocimiento de Swing al activar una inierfaz gráfica de usuario dentro de una aplicación funcional que pueda responder a los eventos del usuario.

un ai piel. También aprenderá cómo crear páginas HTML que contienen applels Java.

. En e día 9 aprenderá acerca de las clases Java para dibujar figuras y caracteres en la pañi illa- incluyendo la cobertura de las nuevas clases Java 2D introducidas en Java 1.2

Acerca de este libro

. En (I día 10, usted crea programas multimedia que usan imágenes, sonido y secuencias de r limación. Usted también tiene su primera experiencia con los subprocesos. Una

Este libro le enseña todo acerca del lenguaje Java y cómo usarlo para crear applcts tanto para

Web como para aplicaciones independientes. Al terminar "Aprendiendo Java 2 en 21 días"

Ion .a de hacer que sus programas manejen varias tareas al mismo tiempo.

usted sabrá lo suficiente acerca de Java y las bibliotecas de clases Java para hacer casi cualquier cosa, dentro o fuera de un applet.

i


Introducción

Quién debería leer este libro Este libro enseña el lenguaje Java a tres grupos: •

Prograinadores novatos.

Convenciones Una Nota presenta piezas interesantes de información, algunas veces técni

Nota

cas, relativas a la explicación del momento.

. denle cinc ha sillo introducida a Java I. I o 1.02

. Dcsarrolladcrcs experimentados en otros lenguajes como Visual C++, Visual Uasic o Deplhi.

Us,ed aprende a desarrollar applets; también conocerá los programas Java mteractivos que se

Un Tip ofrece un consejo o una manera más sencilla de hacer algo.

Tip

LuJcumo parle de un;, página Web y aplicaconcs. programas que corren en cualquu, , ra parte. Cuando uslcd termine "Ap^ulicndo Java 2 en 21 días' sera capa, de salvar

. 1, uier aspecto de. lenguaje y se «en,¡rf lo suficientemente bien con Java para prolund,™ en sus propios proyectos a.nh.-riosos de programación, dentro o Im-r:. de Woh.

Si usied todavía es razonablemente novato en la programación, o si nunca ames ha cscriu. un parama, hicn -dría suponer que ésic es e. .ibro correcto par;, superarse. Puesto «,,k- -hIos osConceptos d.. este libro están ilustrados con programas funcionales, usteU podra .r,hiUa, ,

semanera - ira 'és de, tema, sin importar su nivel de experiencia. Si enuende que son vanables ciclos y fi nciones, se beneficiará plenamente de es.e libro. El upo de persona que

Término Nuevo

quema leer cst, libro le incluye si cualesquiera de los siguicn.es aspectos son ceños:

. Usted es in verdadero mago en HTML, entiende la programación CGI en Perl, Visual Basic, o , n algún otro lenguaje y desea pasar al siguiente nivel en el diseño de pagmus Web.

Una precaución le pone sobre aviso acerca de problemas potenciales y le

.Precaución

Escriba Entrada

ayuda a evitar un desastre.

Los términos nuevos están acompañados de cuadros propios, con- el término nuevo en itálicas.

Un icono ESCRIBA identifica pane del código Java que usted mismo puede escribir. También puede obtener el código del sitio Web del libro. Un icono de entrada acompaña al indicador de comandos.

. Usted tu-o algún conocimiento de BASIC o Pascal, nene ¡dea de lo que es progra

mación. - ha escuchado que Java es fácil de aprender, poderoso y fenomenal. • Usted ha programado en C o C++ durante algunos años, h;, oído acerca de memos rcl;, livos a J; va, y desea ver si vale la pena el entusiasmo.

. Usted h: escuchado que Java es fabuloso para la programación en Web-y desea ver que tan bien íc puede usar en otros desarrollos de software.

Si nunca ha si-.o introducido a la programación orientada a objetos, estilo de programación inmersa en Ja> a, no tiene de qué preocuparse. Este libro asume que no se cuenta con

conocimiento: previos en el diseño orientado a objetos, y usted nene la oponumdad d, ap.uv der lá estrateg a de-desarrollo radical al tiempo que crea sus prop.os applets.

Cómo se estructura este libro Se pretende q ,e es.e libro sea leído y absorbido en un lapso de ,res semanas. Durante cada semana usted lee siete capítulos que le presentan concentos asociados al lenguaje Java y la creación de a ipleis y aplicaciones.

Salida

Un icono de salida muestra el abandono de un programa Java.

El texto que usted escribe y el lexlo que debería aparecer en su pantalla se presenta en upo monoespaciado: It will look

like this

El lexlo que usted escribe también aparecerá en negritas.

Esta fuente simula la forma en que el lexlo aparece en su pantalla. Los marcadores de posi ción para las variables y expresiones aparecen en iráJicas monoespaciadas.

~

Al final de cada capítulo se presentan preguntas comunes acerca del lema objeto del día. con respuestas de los autores.


Semana 1 Los inicios de la programación en Java 1

2

Introducción a Java

Un vistazo a la programación orientada a objetos

3

Los ABCs de Java

4

Lecciones de objetos

5

Listas, lógica y ciclos

6

Creación de clases

7

Uso de métodos para realizar

r :;^.r,

i ysyTt:fíí JííS¿

tareas

# •

# S r .■■'-.t-;.};i-íSj«.^ iStó


Semana 1 :#

I

Día

1

m &

m

Introducción a Java El resultado representa el producto final de casi 15 años de intentos por con

seguir un mejor lenguaje y un ambiente de programación para la construcción de un software más sencillo y confiable. —Bill Joy, cofundador de Sun Microsystems

El campanero loco tenía razón. Es posible ganar dinero en un lugar como éste.

m

—El hombre sin nombre, Un puñado de dólares.

Cuando el lenguaje de programación Java fue dado por primera vez a la luz pública en mayo de 1995, se asemejaba mucho a Clini Eastwood en su papel de pistolero, entrando a un pueblo hostil del Oeste.

Como Clini, Java era un desconocido para el resto del pueblo. Era un lenguaje de programación que se podía ejecutar en una página Web, construyendo un nombre

para si' mismo entre gráficos, texto, auclio y señales de "I3N CONSTRUCCIÓN" por todos lados. La gente venía desde muchos kilómetros a la redonda (la mayoría

mediante enlaces de Internet, pero hubo quien vino en persona a Silicon Valley) para darle una ojeada a este lenguaje.

&s


11

Introducción a Java

Día 1

Las metas de hoy son razonablemente modestas. Aprenderá sobre los temas siguientes:

La leyenda de Java ha sobrepasado un poco algunas veces a la realidad:

. "¡Los programas escritos en Java se ejecutan sin fa.la en distintas plataformas de computación sin modificaciones!"

. "¡Java termina con .a hegemonía de los sistemas operativos de MiaosoU.

. .'¡Java nace que los autores de .ibros de compunción lleguen „ ser ce,ebr,c,des ap.auelidas imcrnacionalinentc!"

A qué se parece Java hoy y cómo llegó hasta ahí. ■

• Por qué vale la pena aprender Java, y por qué es un-justo competidor para otros lenguajes de programación.

• Lo que se necesita para empezar a escribir programas Java, el software, las técnicas y algo de terminología básica. • Cómo crear su primer programa de Java.

',

De, mismo modo, .a leyenda se iden.T.có rápidamente por sí misma con .as hazañas enemalogr;ífic;is tic Clint:

Qué es Java

• "¡Desayuna balas!"

Basándose en la enorme cantidad de publicaciones que Java ha recibido durante los últimos años

. "¡Golpea tan duro que tu abuelo tendrá un magullón!"

y la altísima cantidad de libros acerca de Java (1054 de acuerdo al más reciente comeo de la

. "¡Puede matar a un hombre con sólo parpadear!"

revista JavaWorld), usted podría lener una impresión exagerada de lo que Java es capaz de hacer.

Java es un lenguaje de programación apropiado para diseñar programas que funcionen en conjun to con Internet. También es un lenguaje de programación que hace uso de una melodología cuya programación.

utilidad es creciente en el mundo del diseño de software. Además, es un lenguaje de plataformas

cruzadas, lo que significa que puede ser diseñado para que corra igualmente en Windows de Microsoft, Apple de Macinlosh y la mayoría de las versiones UN1X, incluyendo Solaris. Java se

extiende más allá de los escritorios para ejecutarse en dispositivos como televisores, relojes de

pulso y teléfonos celulares. JavaStation, la computadora de red de Sun, ejecuta el sistema operati

5S

de Java con Cl ni Eastwood: Java es fenomenal.

rap y puedo c inturrear 75 frases por minuto .

vo JavaOS y está optimizada para el lenguaje.

Java es más parecido a lenguajes de programación populares como C, C++, Visual Basic y Delphi, que a lenguajes de descripción de páginas como HTML o un lenguaje de gene ración de scripts sencillo como JavaScript.

Nacido para correr... en Web A Java se le conoce mejor por su capacidad para correr en páginas Web. Los navegadores de Netscape Navigator e Internet Explorer de Microsoft pueden obtener un programa Java de una página Web y ejecutarlo localmente en el navegador Web del usuario.

Estos programas, a los cuales se les conoce como appleis, aparecen en una página Web de manera parecida a las imágenes. A diferencia de éstas, los applets son interaciivos

(tomando la entrada del usuario, respondiendo a ella y presentando un contenido en cambio

Basic" "C nás más", "Algo!", o "Mumps

constante).

Los applets se pueden usar para crear animación, figuras, juegos, formularios que respondan

inmediatamente a la entrada del lector, u otros efectos interactivos entre textos y gráficos en las mismas páginas Web. La figura l.l muestra un applct ejecutándose en la versión 4.04 ele P S.n

Netscape Navigator. Java permite que una persona juegue dominó contra tres oponentes en computadora.


13

Introducción a Java

Los usuarios de Web con un navegador sin soporte de Java podrían ver texto, un gráfico o nada (dependiendo de si el diseñador de la página ofrece una alternativa al applct de Java).

Figura 1.1

Conforme avance en este libro aprenderá más acerca de cómo trabajan applets, navegadores y

Un appla de Java

Web entre sí.

corriendo en Netscape

Nuviii"""'

Aunque los upplcls son probablemente el uso más popular ile Jiivii, son solo un moilo ilc usar

el lenguaje. Como Visual C++, Visual Basic y Delphi, Java es un lenguaje robusto para desa rrollar una amplia gama de programas, soporlar inierfaces gráficas de usuario, conectividad de redes, conectividad de bases dedulos y olía funcionalidad sofisticada. Para diferenciarlos de los

upplcls, a los programas escritos en Java <|iie no se ejecutan dentro tic ¡un navegador Web se les llama aplicaciones.

La biografía no autorizada El lenguaje Java fue desarrollado en Sun Microsystems en 1991 como parte del proyecto

Green, un grupo de investigación con la misión de desarrollar software para e! control de dis positivos electrónicos dirigidos al consumidor final. Los investigadores esperaban desarrollar un lenguaje de programación que pudiera ser ejecutado en aparatos inteligentes del I muro

(televisores interactivos, tostadores de pan interactivos, luces rastreadoras interactivas).

También deseaban que estos dispositivos se comunicaran entre sí, para, que la podadora le pudiera decir a la licuadora que le avisara a usted que los vecinos habían regresado del cole gio y que de nuevo estaban tomando baños de sol.

Para arrancar su investigación, ios investigadores de Green desarrollaron un prototipo de dispositivo llamado Star7, semejanie a un conirol remoto común que se pudiera comunicar con otros de su propia clase. La idea original fue desarrollar el sistema operativo del Star? en

,er cjecu-

&

Stroustrup. Sin embargo, James Gosling, miembro del proyecto Green, al no quedar satisfe

m

lenguaje para mejorar la manipulación del Star7. Al lenguaje se le denominó Oak, en honor al árbol que Gosling podía ver por la ventana de su oficina.

Nota

Sun descubrió más tarde que el nombre Oak ya se había usado, pero nunca

se utilizó el método de Gosling "mira por la ventana" al renombrar al lenguaje. Si lo tuviera, usted podría agregar alguno de los siguientes nom bres de lenguajes a su curriculum en~21 días:

Nota

final de Java 2. el cual permite que los ina virtual del ambiente de

de

usa

-in funciona

m

C++, el popular lenguaje de programación orientado a objetos desarrollado por Bjarne cho con el desempeño de C++ en la propuesta, se encerró en su oficina y escribió un nuevo

c«k» en c»»mo caí decw»!»'»"■!*»■

.

Fresalvaje

Laventanaindiscreta

Agujeronegro

Lavaventanas

m

# #


V Introducción a Java

Día 1

• Java 1.0.2—Es aún la versión más ampliamente soportada por los navegadores Web.

• Java 1.1.7—Ésta es una versión de 1998 con.mejoras a la interfaz del usuario, manejo

Eshoradccomer

de eventos y mayor consistencia en el lenguaje.',

Guardaespaldas

• Java 2—La nueva versión, liberada primero bajo el nombre Java 1.2 para pruebas beta

Solovino

públicas en diciembre de 1997.

En diciembre de 1998, Sun Microsystems liberó finalmente la plataforma

Mota

Java 2, cuyo nombre clave ¡nicialmenle fue JDK 1.2. Es importante notar que

aunque el nombre oficial manejado por Sun con fines publicitarios es Java 2, el kit de herramientas de desarrollo, junto con toda su documentación en

linea, mantiene su nombre original: JDK 1.2. Por tanto, en este libio, sin ánimo de confundir al lector, los términos Java 2 y JDK 1.2 se manejan de mo hábito de estallar en llamas.

manera intercambiable.

. Java es pcquclio -Los programas son más rápidos de descaer desde una pág.na. . Java es seguro -Evi.a que los hackers escriban programa que -sen cW en los navegadores de los usuarios.

. Java es portable -Penóte ser ejecutado en Wtndows, Macintosh y otras plata.ormas sin modificación alguna.

Además Java podría ser usado como un lenguaje de programaron de propósuo gene.! para «liar programas que se puedan ejecutar en distintas pla.a.ormas.

Para demostrar e, potenca, de Java y saWar su proyecto ele £*,ijac,™ de ser arc^o.e„

S3S

Los números de versión del lenguaje Java corresponden al software primario de desanollo de Sun: el JDK (Kit de Desarrollo de Java). Comúnmente denominado como el JDK. actual mente está disponible en las versiones 1.0.2, I.) .7 y 1.2.

El JDK siempre ha estado disponible sin costo en http: / / j ava. sun. com, y su disponibi

lidad es uno de los tactores detrás del rápido crecimiento del lenguaje. Es la primera herra mienta de desarrollo que sopona nuevas versiones de Java cuando han sido liberadas, frecuentemente seis meses o más antes que oíros programas de desarrollo de Java.

Además del JDK, hay más de una docena de herramientas comerciales de desanollo de Java disponibles para programadores de Java, entre las que se incluyen las siguientes: • Visual Café de Symantec ■ JBuilder de Borland •

mente llamado WebRunner, pero lo rebautizaron como HolJau!.

SuperCede

• JFaciory de Rogue Wave • Natural Intelligence Roaster

el lenguaje »»4 te» l»eE» q»e No*»,* to. U pri.ncr, c

^^

* ,9,5 m« 77-^:^ :r;r p ;!'o * ,

• CodeWarrior de MetroWerks

• Java WorkShop de SunSoft

Si planea usar alguna herramienta distinta al JDK 1.2 de Sun para crear programas de Java, asegúrese de que soporte Java 2. Al momenlo Je escribir el libro, el JDK continúa s.emlo la única lieirainienu. que licué soporte completo ¡i la versión 2 ik- esle lenguaje.

expandiendo el lenguaje.

Versiones del lenguaje

Sun ha liberado tres versiones principales del lenguaje Java:

Precaución

Los programas en este libro fueron probados con el JDK 1.2 Beta 3, la versión más anual del kit al momento de la impresión de este libro. Si utiliza algo dife rente al JDK,

gúrt;e antes que soporte plenamente la versión 2 de Java.


17

Introducción a Java Día 1

116

Dime, dime^rita ^^ dc ^ JdK,,

basado en Iniel, el programa resultante se ejecutará en otras computadoras basadas en Intel pero no funcionaría en todas las Macintosh, Commodore VlC-20s, u otras máquinas. Si desea usar el

,, *»

mismo programa en otra plataforma, debe transferir el código fueijte a la nueva plataforma y recompilarlo para producir un código de máquina específico para ese sistema. En muchos casos se requerirán cambios al código fuente antes de ser recompilailos exitosamente en el nuevo

equipo, sobre todo por las diferencias en sus procesadores y otros factores.

La figura 1.2 muestra lo que se obtiene de un sistema dependiente de la plataforma. Se deben producir múltiples códigos ejecutables para múltiples sistemas.

Figura 1.2

^^

^con, versión v,gen,e incoen lo siguiente:

. Swing _Nuevas características paralar unamtc:-* • l

. Arrastrar y coloca, loca, -^J^'

Archivo binario (Penlium)

Programas compilados en forma tradicional.

Compilador (Penlium;

Archivo binario

Compilador (Powor PC)

Archivo binario

^ ^

de una ¡merta de un programa a otra.

(SPARC)

«

Compilador (SPARC)

tres sem-inas.

Los programas dc Java logran esta independencia mediante una máquina virtual (algo así como

,r qué está usted aquí? ., -

una computadora dentro de una computadora). La máquina virtual toma los programas de Java compilados y traduce sus instrucciones en comandos que puede manejar un sistema operativo. El mismo programa compilado, confoimado en un formato denominado código de bytes. puede ser

?^ >

«-t-« nnr mié la senté

ejecutado en cualquier plataforma y sistema operativo que tenga una máquina virtual.

naui-

Término Nuevo

Código de bytes es la versión de código de máquina de la máquina virtual de Java, las instrucciones que comprende directamente.

A la máquina virtual también se le conoce como el iniérprete de Java o el ambiente de tiempo

Javaesindependiente^^ma^^

de ejecución de Java.

Si tiene problemas para imaginarse cómo funciona una máquina virtual, piense en el disposi

tivo de la película original de Viaje a las Estrellas que convierte al español cualquier idioma que hablen los extraierreslres, para la tripulación de la nave espacial Enterprise. El capitán de j8« sobre otros lenguajes.

s.

rograma escrito en Cua ,do usted compila un programa escrito en

^

ler.gu.ye

gy

.„ ,a nviyOría de oíros lene«ajcs.

o c

.^ ^^ sop

.^

James T. Kirk no tiene que aprender un nuevo idioma cada vez que aterrizan en un planeta, ya que el traductor universal convierte sus palabras en una expresión que los exlraterrestres

entienden. Del mismo modo, los programadores de Java no tienen que crear versiones distin tas de sus programas para cada una de las plataformas en las que desean aterrizar pues la

m


Introducción a Java

Día 1

Precaución que

Sin embargo esto no está libre de problemas. Usted se debe concentrar en la máquina virtual de Java soportada por el navegador. Si crea un applet que

use las nuevas características de Java 2, su código de bytes no funcionará en los navegadores que sólo contienen la máquina virtual 1.0.2. Java Plug-in es un complemento para navegadores que Sun desarrolla actualmente, el cual

Java le conseguirá algunas citas similares.)

*

■ *- ■

habilita a los desabolladores a especificar una máquina virtual distinta a la incluida con Netscape Navigator o Microsoft Internet Explorer. Esto permi tirla que los applets de Java 1.1. y 2 funcionaran, con tan sólo especificar su máquina virtual correspondiente. Para detalles de Java Plug-in, puede con sultar la siguiente página Web:

Término Nuevo

http://java.sun.com/products

Por otra parte las aplicaciones de Java sólo se pueden ejecutar en un sistema donde se haya

instalado la máquina virtual de Java correspondiente. Si desea ejecutar aplicaciones de Java 2

en su sistema de escritorio, antes debe instalar la máquina virtual.

,ll:iql,ina, ennu.se muestra la figura 1.3.

Si está acostumbrado a crear código específico a la plataforma como en Visual Basic y Delphi, podría pensar que el intérprete de código de bytes agrega una capa innecesaria entre

Figura 1.3

su código fuente y el código de máquina compilado.

Pniftrtimux tic J" '" <■'" pUiHiJunmis nuil, pies.

Esto provoca algunas consideraciones de desempeño (los programas de Java se ejecutan con

más lentitud que los compilados en código dependiente de la plataforma como C, y la di Código de bytts de Java /

/inlérprele de Java

(Penlium)

(Indepencienle

Código de Java

ferencia de velocidad es el principal punto en contra de Java). Algunas herramientas de de sarrollo incluyen compiladores "justo a tiempo", los cuales pueden ejecutar código de byics de Java a mayor velocidad.

La capacidad de un archivo de código de bytes único para correr por todas las plataformas es

crucial para que Java funcione en Web, ya que Web por sí misma es independiente de la plataforma. Así como los archivos HTML pueden ser legibles en cualquier plataforma, los applets pueden ser ejecutados en cualquier plataforma con un navegador habilitado para Java. Para muchos programas básicos de Java, la velocidad podría no ser una preocupación. Si escribe programas que requieren más velocidad de ejecución que lo que la máquina virtual puede ofrecer, he aquí algunas soluciones disponibles:

• Mediante llamadas a código de máquina específico al sistema en su programa de Java, Intérprete de Java (SPARC)

lo cual lo hace dependiente de la plataforma.

• Mediante compiladores "justo a tiempo", los cuales convierten el código de bytps de Java en código específico al sistema.

Al usar cualquiera de estas soluciones, usted obtiene velocidad a costa de portabilidad de Java. Una aplicación de Java que usa llamadas de Windows para sus accesos a disco no fun cionaría en una Macintosh sin modificaciones.

ocupas d. lo q»c l»y=

u™r"'1

19


Introducción a Java

Día 1

21

m

Java está orientado a objetos de oportuni

dades durante los próximos seis días.

m

Prentice Hall publica otra linea de tutoríales dirigidos directamente a los

Nota

programadores novatos, entre ellos Aprendiendo Java 7.1 en 24 horas,

disponible desde 1997, de Rogers Cadenhead, coautor de este libro.

tSgje¡&

m

Mfflft.

m m

Adéntrese en la programación en Java

programas orientados a objetos.

i

Por hoy dejaremos de lado todas las lecciones de historia, para realizar la segunda mitad del trabajo. Aquí tiene una oportunidad de ver a Java en acción cuando cree su primer programa

- ■-

laOOPdcC+r,'

conceptos de ...ros lenguajes orientados a objetos.

Aprenderá n, s acerca de ,a programación orientada a objetos y Java durante e, d,a _, -Un vistazo ; la programación orientada a objetos .

java es sencillo de aprender

'

en Java: una aplicación.

Antes de empezar, necesita instalar la herramienta de desarrollo de Java 2 en su sistema.

i

1 #

Cómo seleccionar una herramienta de desarrollo Java Para escribir programas Java se ivi|iiii'rc al['.iin tipo ik1 paquete de programación ik' Java. Si mi sistema ya puede ejecutar applcts al navegar por Web. tal ve/ piense que ya está preparado para desarrollo. Pero éste no es el caso. Se necesita una herramienta de programación para poder crear y ejecutar sus propios programas de Java.

Para poder usar este libro a toda su capacidad, debe usar una herramienta de desarrollo que

sopóme plenamente Java 2 y. por ahora, la única opción es el JDK. Ésta es siempre la

U11 homo ,o ..ador Pemium II con tecnología MMX).

C"• >

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 en<el listado 1.1.

Compilación y ejecución del programa en Solaris

Una vez que tenga un archivo .class, lo puede ejecutar mediante el intérprete de código de by.es La versión del intérprete del JDK se llama java, y también es ejecutado desde la Imea

directorio que contiene el archivo fuente de Java Hellodan. java. Si usa el directorio J21work

de comandos de MS-DOS bajo Windows. Ejecute HelloOan cambiándose a la carpeta que contiene HelloDan.class y escriba lo siguiente: java

Use el compilador de Java de línea de comandos que viene con el JDK pura compilar el archivo

fuente de Java en un sistema Solaris. Desde una línea de comandos UNIX, use cd para ir al recomendado para los usuarios de Windows, éste sería el comando que debería usar: cd -/J21work

Una vez en el directorio correcto, utilice así el comando javac con el nombre de archivo:

HelloDan

Javac HelloDan.java

Si su programa fue escrito y compilado correctamente, deberá ver la frase What' s the f re ■ queney, Kenneth? desplegada en la pantalla de su ventana de MS-DOS.

Suponiendo que no hubiese errores, usted finalizará con un archivo llamado

.HelloDan.class. Éste es el archivo de código de byies de Java que puede ser ejecutado por la máquina virtual. Si obtiene algún error, vaya al archivo fuente original y asegúrese de que se escribió exactamente como aparece en el listado I. I.

Nota

Asegúrese de eliminar la extensión .class cuando ejecute un programa Java con la herramienta java. (Escribir java HelloDan.class arrojaré un error.) Además si ve un mensaje de error de "Class not found" , aun cuando este ., en el mismo directorio de HelloDan. class, podria necesitar camb.ar otra

configuración en su archivo autoexec .bat. Vea el apéndice C

Una vez que tenga un archivo .class, lo puede ejecutar con el intérprete de código de bytes. La versión del intérprete de Java JDK se llama java y también se ejecuta a partir de la línea de comandos. Ejecute HelloDan cambiándose al directorio que contenga HelloDan. class y escriba lo siguiente: java

HelloDan

La figura 1.7 muestra la salida apropiada de la aplicación HelloDan junio con los comandos

Si su programa está correctamente escrito y compilado, deberá ver la frase What' s trie

de MS-DOS que se utilizaron para llegar a ese punto.

frequeney,

Kenneth? desplegada en la pantalla.

Figura 1.7 Ejecución Je aplica ciones Javo en unu

Nota

ventana de \1S-DOS.

Si ve un mensaje de error de Tlass Not Found", aun cuando esté en el

mismo directorio de HelloDan.class, tal vez necesite modificar la configu ración de su sistema. Vea el apéndice C.

Volimu:

:^-lj-5)

IJumUl

1-

air.-ctoi-/ ■-■!- >7:\0:.!■-■■■■> k

Resumen

01-M-Sí

Ahora que ya ha configurado una herramienta de desarrollo de Java y la ha usado para ¡•?a Hí-lloD¿ii.cl =:

2 fiii-is) 2 dir(s) ;¿l«üik:

ihai.'ü tho fr-quéney, ::\J21wofle>

'■'■-- "y-""

39,419,ÍOJ

byí<£

escribir su primer programa de Java, puede añadir a su curriculum el título de "Programador de Java".

Esto no es del todo falso, después de todo. Usted no sólo creó una aplicación funcional de Kenr.eth?

Java, sino que también hizo un viaje de un día a través de la historia, fuerza, debilidades y futuro del lenguaje.

31


Semana 1 en páginas Web.

m m

Los appiets son programas de Java que se ejecutan en Web, y las aleaciones son todo aque, software que pueda ser escrito con Java.

Mañana usted será capaz de escribir "Progra

m m

a Objetos

Día

Preguntas y respuestas p ¿Cuál es la relación entre JavaScript y Java? R Tici en iguales las primeras cuatro letras.

Un vistazo a la programación orientada

SÉS«

vr nana, de Laura Lemay. editado por Prcnt.ee Hall.

, -, ,ó,,dc puedo aprender más acerca de Java y encon.rar m^

R Íi1 « e> resto de este Hbro

.<* cua.es

i Aquí hay otros lugares donde puede buscar informado,, de

h n y applets de Java:

2

m m o

A la mayoría de la gente que la prueba por primera vez no le gusta, y podría cues

Algún tiempo después, sin embargo, se cultiva un gusto por la cerveza en quienes continúan bebiéndola.

La programación orientada a objetos, como la cerveza, es un gusto que se adquiere con el tiempo. Es una de las ideas de programación más extraordinaria de los últi mos años, y también fuente de gran consternación para los prograniadores que no están familiarizados con ella.

De algún modo se ha ganado la reputación. La programación orientada a objetos es noticias.)

m

La programación orientada a objetos (también llamada OOP) se parece mucho a la

para que me hicieras beber esto?"

Para presentación de Java, revise los grupos de noucias de Uscnet

0

a objetos tionar la salud mental de quienes cantan sus alabanzas. "¿Qué te hice... —dirían—

debería revisar aquí.

&

una materia que puede ser estudiada y practicada durante años. Sin embargo, la idea central es simple: organizar los programas de modo que reflejen la forma de organización de los objetos en el mundo real.

m


Un vistazo a la programación orientada a objetos

Día 2

ogramación oricniada a objetos, o,

Internamente, cada uno de esos componentes podría ser sumamente complicado y construido

por compañías díTerentes mediante métodos de diseño distintos. Sin embargo, usted no nece sita saber cómo funcionan estos componentes, qué hace cada procesador en las tarjetas y

Éstos son los temas a tratar.

cómo una "A" es enviada a la pantalla de su computadora cuando oprime la tecla A. Cada componente que utilice es una unidad independiente y, como ensamblador de lodo el sistema, a usted sólo le interesa cómo inieructúan las unidades entre sí:

• ¿Esta tarjeta de video cabrá en la ranura de la tarjeta madre? •

¿Este monitor funcionara" con esta tarjeta de video?

• ¿Cada componente producirá los comandos apropiados para interactuar con otros com

ponentes, de modo que cada parle de la computadora sea entendida por cada otra parte? Una vez que conoce las interacciones entre los componentes y las puede empatar, ensamblar todo el sistema es sencillo.

La programación orientada a objetos es muy parecida a construir estructuras a partir de blo

ques LEGO o ensamblar una PC. Mediante la OOP, todo su programa está formado por obje

prini. ru aplicación de Java.

tos diferentes llamados objetos.

iense en términos de pbjetos

Piense

Término Nuevo

ii

,l

Un objeto es un elemento independiente de un programa de computadora, que

representa un grupo asociado de características y está diseñado para realizar

tareas específicas. A los objetos también se les conoce como instancias.

Cada objeto tiene un papel específico en un programa, y todos los objetos pueden tuncionar con otros objetos en maneras definidas.

Objetos y clases La programación orientada a objetos se basa en la observación de que, en el mundo real, los objetos se construyen a partir de objetos más pequeños. Sin embargo, la capacidad de combi

' ,. uchas otras piezas— -

,,

c.,slillos, an

■ , FGO se puede hace todo upo de cosas, c.st.1

( on los bloques Ltuu ;>c i

nar objetos es sólo un aspecto general de dicha programación. También incluye conceptos y

características que hacen que la creación y el uso de objetos sea más sencilla y flexible. La um> ¡maginar.

^. cualqUier cosa que

clase es la más importante de estas características.

Término Nuevo

Una clase es una plantilla que se utiliza para crear múltiples objetos con carac terísticas similares.

Las clases engloban todas las características de un conjunto particular de objetos. Cuando escribe un programa en un lenguaje orientado a objetos, usted no define objetos individuales, sino que define clases de objetos.

ndes HKlependiciues. usted cuenta ton "^ "puede

usar este' sistema mayor pan» resolver

351


Un vistazo a la programación orientada a objetos

Día 2

CoromandButton no tiene que reescribir el código para cada botón de comando que desee usar

en sus programas. Además, puede usar de nuevo la clase CommandButton para crear diferen tes tipos de botones conforme los vaya necesitando, tanto en este programa como en otros.

árboles en general: . Tienen hojas y raíces .

Figura 2.1

Crecen

■ La clase Tree y varios

. Producen clorofila

objetos Tree.

cn „„■,„,„„»

. Bajo o alto . Tupido o ralo .

>e 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 main<) en su lugar, ahora se puede usar la clase Jabberwock como una apli El listado 2.3 muestra el archivo de código fuente Jabberwock .java final, en caso de que haya tenido problemas al compilarlos.

Si tiene problemas con cualquier programa en este libro, puede obtener una

Tip

}

copia del archivo fuente y otros archivos asociados en el sitio Web oficial de este libro en http://www.prefect.coro/java21.

S

Listado 2.3. La versión final de jabberwock . java.

inicrprcic de h va. obtiene el error siguiente: In

class

: void Min(String argv,]) i. ™t d.fm.d

Esle e.or se d be B que e, i^ete de ^ rpníie no sabe qué hacer con el

1:

class

Jabberwock {

2:

String

color;

3:

String

sex;

4:

boolean hungry;

m Q


Un vistazo a la programación orientada a objetos

Día 2

47 j

A partir de una línea de comandos, cambie al directorio que contenga el archivo Jabberwock.class mediante el comando cd. Use el comando java para ejecutarlo a

través del intérprete, como sigue:

5:

void feedJabberwocM) {

6:

if (hungry == true)

7:

{

System.out.println("Yum -- a peasant!

8: 9: 10:

11:

java Jabberwock

),

Al ejecutar la clase jabberwock, la salida debiera ser la siguiente:

hungry = false;

Calling showAttributes ... This is a male orange jabberwock.-

} elsystem.out.println("No, thanks -- already ate.");

The jabberwock is hungry.

12: 13: 14:

15:

void showAttributes() { System.out.println("This is a " + sex +

color

Feeding the jabberwock -• a peasantl

+

Yum

jabberwock.");

Calling showAttributes ... This is a male orange jabberwock.

h. iabberwock is hungry.",;

16:

17:

18: 19:

^" system.out.printlnC'The

The

J.bberwcck is full.»);

22: 23: 24:

25: 26: 27: 28:

29: 3C:

31: 32: 33: 34:

35: 36: 37:

jabberwock is full.

Feeding the jabberwock

28:

21:

i

No,

public static void main (String arguments[]) { Jabberwock j = new Jabberwock() ; j.color =

...

already ate.

.'

• Línea 22 — Se declara el método main (). La primera línea del método main () siem

j.sex = "raale";

pre se parece a ésta, y usted aprenderá acerca de cada elemento posteriormente durante

íyS..7out.pri"t(

esta semana.

j.showAttributes();

");

Syste>n.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<

'

Aunac,ase que hereda de otra Case sel— leona la herencia se le llama superclase. porciona

Slíbc/ase,yalaclasequepro- |>

jerarquía de clases define conceptos abstractos en la pane superior de la jerarquía. Estos con ceptos se vuelven más concretos conforme desciende la línea de subclases.


Un vistazo a la programación orientada a objetos

Día 2

, «„ Cre»do »». »»«»> el.» en ,„„. u.1 «, ,«!«» ,en?, ■* !•«-•—"

51

Los dragones y los jabberwocks tienen características similares (son monstruos grandes y se comen a los campesinos). Ambos tienen garras afiladas, dentadura poderosa y personalidad tipo A. El primer impulso podría ser abrir el archivo fuente Jabberwock. j ava y copiar la mayor parte de él en el nuevo archivo fuente llamado Dragón, java.

Un mejor plan es identificar la funcionalidad común de Dragón y Jabberwock y organizaría damente queden sordos por él.)

Pnn recibir toda la funcionalidad de ComnandButton sin tener que pasar por el trabajo de I -a lima mí clase como subclase ,lc CommundButton. S,. cl:.sc Icn.ln, :.».».",,... ',;

ncionalidad y atributos definidos en Co-ndButton y el comportatmento y

nbmos de las saciases de Co-ndButton. Todo lo que debe hacer es def.mr Ips aspec-

^ que háÍán diferente a su clase de la Case Co-.ndButton. La generacton de súbela es 7^Z mediante e, cua, se definen clases nuevas que Ucncn diferenaas respecto de su supe reíase.

oración ck subclases es la creación de una nueva clase que hereda de una

TÉRMINO NUEVQ

i existente. La única tarea de la subclase es indicar las diferencias de compor

tamiento y atributos entre ella y la superclasc.

Si su clase define totalmente el nuevo comportamiento y no es una subclase de otra clase.

D

etreda Erectamente de la Case obj.ct. Esto le permite acomodarse perfectamente en Írq tí Cases de Java. De hecho, si crea una definición de Case que no md.que una ''I e"le Java asume que la Case nueva es herencia dtrecta de Object. U Case jabberwock que se creó hereda directamente de la clase Object.

Creación de una jerarquía de clases

Si -sfí aculo un uran conjunto de Cases, tendrá sentido que éstas hereden de la j^rqma

Ít«y 2 men una jerarquía por sí mismas. Organizar las Cases de esta manera

• ;;^;n^;r un tiempo Considerable de p.aneaeión. pero las ventajas son ,as s,gluen,es:

en una jerarquía más general de clases. Esto podría desembocar en mucho más trabajo para

las clases Dragón y Jabberwock, pero ¿qué pasa si también quiere añadir Medusa, Yeti, Sasquatch, Grue y DustBunny?Ál colocar el comportamiento común en una o más clases reutilizables se reduce en gran medida el total de trabajo.

Para diseñar una jerarquía de clases que pudiera servir para este propósito, empiece por el principio con la clase Object, la cima de las clases Java. La clase más general, a la cual deben pertenecer un jabberwock y un dragón, se podría llamar Monster. Un monstruo, ge neralmente, podría ser definido como una criatura feroz de algún tipo, que aterroriza a la gente y reduce el patrimonio. En la clase.Monster se puede definir únicamente el compor tamiento que califique el ser feroz, terrible y malo para el entorno.

Podría haber dos clases debajo de Monster: FlyingMonster y WalkingMonster. Lo obvio que las diferencia es que uno puede volar y la otra no. El comportamiento de los monstruos

voladores podría incluir bajar en picada sobre la presa, lomar campesinos y cargarlos hacia el cielo, soltarlos de grandes alturas y cosas similares. Los monstruos que caminan podrían tener un comportamiento distinto y ser más susceptibles al ataque de arqueros. La figura 2.3 le muestra lo que ha hecho.

Figura 2.3 La jerarquía básica Monster.

. L a funcionalidad que es común a múltiples clases se puede colocar en superclases, lo

i:/"!;' se'utilizada repetidamente en todas .as clases inferiores de ,a ..erarquu,

. Los cabios a la superclase se reflejan automáticamente en todas sus subclases, las

La Case jabb.rwock está terminada, funciona correctamente y todo está bien. Ahora acara una Case Java llamada Dragón.

I'


Un vistazo a la programación orientada a objetos Día 2

531

I 52

La herencia en acción En Java la herencia funciona de manera mucho más simple que con las herencias en el mundo real. En el mundo Java no se requieren albaceas, jueces, o cortes de algún tipo.

Cuando se crea un objeto nuevo, Java registra cada variable definida para el objeto y cada

m

variable definida para cada superclase del objeto. De este modo, todo lo que contienen las clases se combina para formar una estructura descriptiva del objelo en uso, y cada objeto Figura

aporta la información apropiada para su situación.

2.4

FlyingMonster

Los métodos trabajan de manera parecida: los objetos nuevos tienen acceso a todos los nom bres de los mélodos.de su clase y superclase. Esto se determina de manera dinámica cuando

ti

se usa un método en un programa en ejecución. Si se hace un llamado a un método en un

objeto en particular, el intérprete de Java primero revisará la clase del objeto para este méto

FourLegged

do. Si no lo encuentra, el intérprete de Jav;i lo busca en la superclase ilc esa clase, y así suce

FlyingMonster

sivamente, hasta encontrar la definición del método. Esio se ilustra en la figura 2.5.

(3 Figura 2.5

Mammal

Repule

m

Ubicación de los

Amphibian

m

inciiiJo\ dentro de una

jerurquia de clases.

Flyin iMonster es una s

,es

oira.s.

El mensaje e enviado al objeto y pasado por la jerarquía de clases hasta que se encuentre una definición

Las cosas se complican cuando una subclase "define un método que tiene el mismo nombre,

Nota

diatamente debajo de • de las clases a organizar.

i

i*

1^'^hc^o a cada subclase.

rentes puntos de la m.sma. El ob'^

a

diseñando una )erarqu

tipo de valor de retorno y argumentos que otro método definido en una superclase. En este caso, la definición del método que se localiza primero (comenzando por el fondo de la jerar quía y desplazándose hacia arriba) es la que se ha empleado. En consecuencia, puede crear un método en una clase que evite que se use un método de una superclase. Para hacerlo,

cree un método con ti mismo nombre, tipo de valor de retomo y argumentos como el método en la superclase. A este proceso se le denomina xobreposición (figura 2.6).


Día 2

Un vistazo a la programación orientada a objetos

551

Las interfaces son un tema que se entiende mejor después de tener alguna experiencia de

Figura 2.6

programación orientada a objetos y Java. Las explorará ampliamente durante el día 15,

Sobrepostción de

El método es sobrepuesto

métodos.

por esla definición

"Funciones de las clases: paquetes, interfaces y otras características".

Paquetes Definición inicia!

En Java los paquetes son una forma de agrupar clases e interfaces asociadas. Habilitan los

bel método

., grupos de clases para estar disponibles sólo si son necesarios y eliminan los conflictos potenciules entre los nombres de clases en grupos diferentes de clases.

Por ahora, sólo necesita conocer esto:

El mensaje se envía al objelc y es pasado por la jerarquía

• ¡jis bibliotecas de clases en Java están contenidas en un ¡mi/ucie llanuiilo java. Las

hacia arriba hasta que se

encuentre una definición que

clases en el paquete java están garantizadas para estar en cualquier ¡mplcmeniación

le corresponda

de Java y son las únicas clases garantizadas para estar disponibles a través de implementaciones diferentes. El paquete java contiene paqueics más pequeños que definen subconjuntos específicos de la funcionalidad del lenguaje Java, como características estándar, manejo de archivos, multimedia y muchas otras cosas. Las clases en otros paquetes como sun y netscape suelen estar disponibles únicamente en implementa-

ciones específicas.

Herencia sencilla y múltiple

• En forma predeterminada, sus clases de Java sólo tienen acceso a las clases en

Fu J-tva a la forma de herencia se le denomina herencia semilla debido a que cada clase Java sólo puede lencr una superase (aunque cualquier supérelas* dada pueda tener múltiples suh-

j ava. lang (características básicas del lenguaje). Para usar clases de cualquier otro

paquete, tiene que referirse a ellas explícitamente por nombre de paquete o importar las a su archivo fuenic.

clases).

/

En otros lenguajes de programación orientada a objetos como C++, las clases pueden tener más de una "upcrclase y heiedar variables y métodos de forma combinada de todas aquellas supcrclases A esta forma se le denomina herencia múltiple, y proporciona la estructura para

que se pued tn crear clases que conformen casi cualquier componamiemo imaginable. Mn embargo, cemplica significativamente las definiciones de clase y el código necesario para

producirlas. Java hace «,ue la herencia sea menos complicada al habilitar únicamente la herencia sencilla.

¡

• Para referirse a una clase dentro de un paquete, se deben listar lodos los paquetes que la clase contiene seguidos del nombre de clase, con cada elemento separado por puntosf.). Por ejemplo, supongamos la clase Color. Está contenida en el paquete awt,

el cual está a su vez en el paquete java. Para referirse a la clase Color en sus progra mas se puede usar la notación java.awt.Color.

Creación de una subclase Como un proyecto final para hoy, creará una subclase de otra clase y sobrepondrá algunos

Interfa :es

métodos. También tendrá una mejor sensación acerca de cómo trabajan los paquetes.

implemcnu,, sea más acl de comprender y diseñar. Sin embaivo. lamb.en podna ser resme-

cuando se crean los applets. Crear applets es diferente a crear aplicaciones. Los applets java

1 , herencir. sencilla h.- ce que la relacón entre clases y la funcionalidad que estas clases

Cuando empieza a programar en Java, el uso más común de la generación de subclases es

,iv¡, (sobre i.do cuand , se cuenta con compórtamelos símil-tes que necesitan ser duplica dos :i lo lar; o de br;./. s Jislimos de l:i jerarquía de clases) O> l:is i.iu-i laces. Jí.v:i resuelve

portamiento. Debido a estas reglas especiales para los applets, crear un applet sencillo es

el problenu del eompí namiento compartido.

más complicado que crear una aplicación sencilla.

Término Nuevo

se ejecutan como parte de una página Web, y por tanto tienen reglas especiales para su com

Jna interf, z es un conjunto de métodos que indican que una clase tiene un com

Todos los applets son subclases de la clase Applet (la cual es parte del paquete j ava. applet).

jonamieni i particular además del que hereda de sus superclases.

Al crear una subclase de Applet, automáticamente recibe todo el comportamiento y atribu tos que habilitan al programa Java a ejecutarse como parle de una página Web.

iií


571

Un vistazo a la programación orientada a objetos

Día 2

• Se da al objeto Font el valor de la fuente Times Román negritas de 36 puntos. La instrucción new crea un nuevo objeto Font con los valores especificados entre parénte sis y este nuevo objeto se asigna a f.

TZ editor de texto y escriba !as instrucciones s.g

\

Al crear una variable de instancia para contener este objeto Font, lo pone disponible para

public class Palindrome extends java.applet.Applet

m

todos los métodos en su clase. El siguiente paso en el proyecto Palindrome es crear un méto

// y aún hay más

t

do que lo use.

Cuando escribe applets, hay varios métodos definidos en la superclase Applet que usted

comúnmente sobrepone a su applet. Éstos incluyen métodos para configurar el applet antes de que se ejecute, para iniciar el applet, para responder a la entrada del ratón, y para que libere

applet.Applet.

recursos cuando el applet termine su ejecución.

Uno de estos métodos es paint (), el cual maneja cualquier cosa que debiera ocurrir cuando el upplet se despliegue en una pagina Web. El método paint () que heredn de Palindrome no

hace nada (es un método vacío). Al sobreponer paint (), usted indica que debería ser dibuja

definir la relación entre las dos clases.

do en la ventana del applet en cualquier momento que necesitara ser desplegado al correr el programa. Añada una línea en blanco debajo de la declaración font, y escriba lo siguiente para sobreponer el método paint (): public void paint(Graphics screen)

{

screen.setFont(f); screen.setColor(Color.rad);

screen.drawString("Go hang a salami,

I"m a lasagna hog!

5,

46);

El método paint () es declarado public, como el applet en sí mismo, pero por una razón distinta. En este caso, paint () debe ser público debido a que el método que está sobrepuesto también es público. Un método de superclase que es público debe ser sobrepuesto por un método público, o el programa Java no se compilará exitosamente.

embalo, todos los appleis deben ser public.

;

,,«ho «».¡*; no asreg

El método paint () toma un argumento sencillo: una instancia de la clase Graphics llamada „ „„ j, „„»,»* „

y

screen. La clase Graphics proporciona el comportamiento para transformar las fuentes y

colores y dibujar líneas y otras formas. Aprenderá más acerca de la clase Graphics durante la semana 2: "Temas avanzados de Java", cuando cree más applets.

declaración:

Font f -. new FontCTi...Ho«n-, Font.BOLD, 36); Esta instrucción cumple dos cosas:

Ya ha hecho tres cosas dentro de su método paint ():

. Le ha indicado al objeto Graphics que la fuente a usar al desplegar texto es la conteni da en la variable de instancia f.

. Le ha indicado al objeto Graphics () que el color a usar en texto y otras operaciones de dibujo son una instancia de la clase Color para el color red.

. Finalmente, ha dibujado el texto en pantalla "Go hang a salami, I'm a lasagna

hog!", en el sistema de coordenadas x,y de 5,48. La cadena será transformada en la

fuente y color indicados.

i


Un vistazo a la programación orientada a objetos

Día 2

591

He aquí cómo luce el applcl después de todo: También puede Importar todo un paquete mediante un asterisco (*) en vez

publie class Palindrome; extends java.applet.Applet { Font f = new Font("TimesRoman", Font.BOLD,

publie void paint(Graphics screen) screen.setFont(f); screen.setColor(Color.red);

todas las clases en el paquete java.awt:

{

import

:

screen.drawString('Go hang a salami, I'm a lasagna hog.

5,

de un nombre de clase. Por ejemplo, use esta instrucción para importar

36);

java.awt.*;

, Ahora, con las clases apropiadas importadas en su programa. Palindrome. java debería

40);

compilarse sin problemas a un archivo de dase. El listado 2.4 muestra la versión final para

En este pumo debió haber notado que algo faltaba en el ejemplo. Si guardó una copia e ¡nicn-

una revisión doble.

ló compilarlo, podría haber visto una serie de errores como el siguicnle: Palindrone.java:2: Class Font not found in type declaration.

Rs.os errores ocurren debido a que las clases Graphics, Font. y Color son parte del paque te java awt y no están disponibles en forma predeterminada. Usted so relir.ü a la clase

Applet en la primera línea de la definición de clase al referirse a su nombre completo de

paquete (java, applet. Applet). En el resto del programa, se refirió a otras clases s.n usar

1:

import java.awt.Graphics;

2:

import Java.awt.Font;

3:

import java.awt.Color;

4:

5: 6:

publie class Palindrome extends Font f =

java.applet.Applet

new Font("TimesRoman",

Font.BOLD,

{

36);

7:

sus nombres de paquete.

8:

Hay dos formas de resolver este problema:

. Referirse a todas las clases exlernas por su nombre de paquete compleio, como java.awt.Graphics,

Listado 2.4. La versión final de palindrome. java.

java.awt.Font, y java.awt.Color.

. Usar una instrucción import al principio de! programa para que estén disponibles uno

publie

9:

void paint(Graphics

screen)

{

screen.setFont(f);

10:

sereen.setColor(Color.red);

11:

screen.drawString("Go hang a

salami,

I'm

a

lasagna

hog.",

5,

40);

12: 13:

o más paquetes y clases en el programa.

Cuál elija es, en su mayor parte, un asunto de preferencia personal: pero si se refiere a una

Guarde este archivo con el nombre Palindrome. java. Puesto que este archivo fuente con

de texto.

clase pública para que se compile exitosamente. El uso de mayúsculas y minúsculas aquí tam

clase en otro paquete muchas veces, tal vez prefiera usar import para dism.nu.r la canndad En este ejemplo se usará lo último.

Para importar estas clases, añada los tres enunciados siguientes antes de la inducción Palindrome:

tiene una clase pública, Palindrome, el nombre de archivo debe corresponder al nombre de la bién es importante, por lo que las letras deben ser idénticas.

Este archivo fuente puede ser compilado de la misma manera que las aplicaciones Java que

usted ha creado hasta aquí. Sin embargo, para poder ejecutarlo, debe crear una página Web

publie

class

import

java.awt.Graphics;

import

java.awt.Font;

Muchos programas de desarrollo de páginas Web, como Home Page de Claris y Dreamweaver

iniport

java.awt.Color;

de Macromedia, permiten colocar un applet Java dentro de una página Web.

para colocarlo.

Si no tiene una de estas herramientas, puede crear una página Web sencilla mediante las ca racterísticas asociadas Java del lenguaje descriptivo de páginas HTML.


Un vistazo a la programación orientada a objetos

50

61

ff

Para abrir la página Web Palindrome. htral mediante un navegador Web, use,el comando del

■ « HTML en cuanto estén asocia-

menú desplegable en el navegador para abrir archivos locales en vez de páginas Web. En Navigator 4.04 de Netscape, el comando es File I Open Page I Choose File. Para abrir la página con la herramienta appletviewer del JDK, vaya al indicador de una

línea de comandos en la misma carpeta que contenga Palindrome. html, y escriba el comando siguiente: Prentice Hall.

Entrada

appletviewar Palíndroma.html

A diferencia del navegador Web, la herramienta appletviewer sólo despliega el applet (o applels) que están incluidos en la página Web. No puede manipular nada más que esté con cn a „,«„» di,«»r,o

tenido en la página.

La Figura 2.7 muestra el applet visto con la herramienta appletviewer.

ti Figura 2.7 El applel Palindrome, ejecutándose en la herramienta appletviewer.

1 Go liang

a

salan n, I 'ni

a

1 as a «na ho«.

Cl

Acplet euiuo

o

de HTML. pero aquí hay dos

Si aún no se familiariza con lo que es un palíndromo, vea la figura 2.7 y lea al revés el enunciado "Go hang a salami, l'm a lasagna hog". Los palíndro mos son palabras y frases que se leen igual en cualquier dirección, sin tomar

(1

en cuenta espacios y puntuación: "Dábale arroz a la zorra el abad". "Dennis and Edna sinned" es un palíndromo, como también lo son "Ah, Satán sees

Natasha" y "To Idi Amin: l'm a idiot". Los tres últimos son palíndromos de la lista gigante de palíndromos de Neil/Fred en la dirección Web: http://www.tsoft.net/-derf/palindronie.html

Resumen Si éste es su primer encuentro con la programación orientada a objetos, podría haber descu bierto de otra forma en qué se parece a la cerveza.

La programación orientada a objetos también es capaz de marearlo, desorientarlo, y tal vez

; ejecutadas con un intérprete Java 2.

Í.I Ü

I II Q

hasta hacerle sentir un poco de náuseas.

. Si el material de hoy parece teórico y abrumador en este punto, no tiene por qué alarmarse.

Estará usando técnicas orientadas a objetos por todo el resto del libro, y se familiarizará más conforme adquiera más experiencia al usarla.

m


631

Un vistazo a la programación orientada a objetos Día 2

Preguntas y respuestas P En efecto, los métodos son funciones que están definidas dentro de clases. Si

ominoso que un episodio de los Expedientes Secretos X.

lucen como funciones y actúan como funciones, ¿por qué no se les llama fun

Para resum.r el materia, de hoy, aquí le presentamos un g.osario de los términos que se

ciones?

R Algunos lenguajes de programación les llaman funciones (C++ las denomina/un-

cubrieron: eron:

¡

ciones miembro). Otros lenguajes orientados a objetos las diferencian de las funciones

de.ntro y fuera del cuerpo de una clase u objeto, ya que en esos lenguajes el uso de ! términos separados es importante para entender cómo opera cada función. Puesto que

la diferencia es relevante en otros lenguajes, y como ahora el término método es de

de otras clases.

Ohieto instancia de una clase. Objetos múltiples que son instancias de la misma clase

2 acl^o a los mismos métodos, pero frecuentemente tienen valores d.stintos para sus variables de instancia.

„■« Es lo mismo que un objeto. Cada objeto es una instancia de alguna clase.

étodo Grupo de instrucciones en una Case que define como deberán comportarse^ los ob e,os de la clase. Los métodos son análogos a las funcione, de otros lenguajes de p,o. elación, peo siempre deben ser ubicados dentro de un, clase. \unuio d, clase Método que opera en una Case en sí misma en ve, de Rancias «pee.Méto

fie as de una clase.

Jos de da«. se les .suele llamar solamente métodos.

yimMe , , clase Es una variable que describe un atributo de una Case en vez de insun,ci-is específicas de la ciase.

*rilMe , , ¡naonato Variable que describe un atribu.o de una infancia de una Case en vez de la :lase en sí misma.

lnle,fciz Especificación de un comportamiento abstracto que luego .as Cases individúate ¡ podrán ii.iplememar.

lene

una supcrclase, y así sucesivamente.

uso común en la terminología orientada a objetos, Java también lo usa así. P

¿Cuál es la distinción entre las variables y métodos de instancia y sus contra

partes, variables y métodos de clase?

R Casi cualquier cosa que se pueda hacer en un programa Java involucrará instancias (también llamadas objetos) en vez de clases. Sin embargo, algunos comportamientos y atributos tienen más sentido si se almacenan en la clase por sí misma en vez de en

el objeto. Por ejemplo, para crear una nueva instancia de una clase, necesita un méto do que esté definido y disponible para la Case por sí misma. De olra manera, usleil

corre entre el dilema del huevo y la gallina (no puede crear un objeto bebé sin la exis tencia del objeto mamá, que tiene un método de creación de bebés; y ningún objeto mamá puede existir sin haber tenido antes un bebé).


m m

Semana 1

m m m

m &

DÍA

3

Los ABCs de Java Como ya lo aprendió, un programa Java está hecho de clases y objetos, los cuales a su vez están hechos de métodos y variables. Los métodos están hechos de instruc ciones y expresiones, que están hechas de operadores.

En este momento, le podría parecer que Java es como las muñecas rusas anidadas lla madas Matrvoshkas. Cada una de esas muñecas contiene una muñeca igual dentro de ella, la cual es tan intrincada y detallada como su compañera más grande. Relájese, babushka; este día retira las muñecas grandes para revelar los elementos

más pequeños de la programación en Java. Dejará por un día clases, objetos y métodos para así examinar las cosas elementales que se pueden hacer en una línea sencilla de código Java.

#

Hoy tocaremos los temas siguientes: • Instrucciones Java y expresiones • Variahles y tipos de datos

• Comentarios • Literales • Expresiones aritméticas

• Comparaciones • Operadores lógicos

m


Los ABCs de Java

Día 3

j.Las instrucciones en Java están agrupadas mediante una llave que abre ({) y la que cierra()). Al grupo de instrucciones organizadas entre estos caracteres se le denomina bloque o bloque de instrucciones. Aprenderá más acerca de ellos durante el día 5, "Listas, lógica y ciclos".

Puesto aue Java es similar a C y C++. gran parte del material en este día les

pa exiliar a los programados que estén versados en esos lenguas

Nota

de una sola letra. Cuando sea necesario, las notas técn,cas como esta

describirán las diferencias específicas entre Java y otros lenguajes.

Variables y tipos de datos En la aplicación Jabberwock que creó el día 2, "Un vistazo a la programación orientada a

iva^

objetos", usó las variables para dar seguimiento a la información.

y expresiones

Tod" hsTireas que quiera cumplir en un programa Java se pueden dividir en un;, seno de

Término Nuevo

instrucciones.

se ejecuta un programa. El valor puede ser modificado en algún punto en el pro

grama, de aquí el nombre.

Una instrucción es un comando sencillo escrito en un lenguaje de programación TÉRMINO _ tlUEVQ

•Las variables son un lugar donde se puede almacenar la información mientras

Para poder crear una variable, debe darle un nombre e identificar qué lipo de información alma

que hace que algo ocurra.

cenará. También le puede dar un valor inicial a una variable al mismo tiempo que la crea.

, as insnuccones representan una necon sencilla que se ,oma en un programa Java Todo lo

En Java hay tres tipos de variables: variables de instancia, variables de clase y variables

siguiente son instrucciones sencillas de Java:

locales.

int agí' = 30;

Las variables de instancia, como lo aprendió ayer, se usan para definir los atributos de un objeto.

import java.awt.dnd;

Systemout.printim-VouTenotthebossof mel");

, Las variables de clase definen los atributos de toda una clase de objetos, y aplican a todas sus instancias.

player score = 41367;

AlgUna instrucciones producen un va.or, como cuando suma dos números dentro de un pro grama. \ es.:.s instrucciones se les llama expresiones.

resulta en un valor a ser producido. El valor puede ser

=: -■ Alinas expresiones producen un valor de retomo numérico, como en el ejem-

B pío de sumar dos números juntos. Otros producen un valor boolcano (true o

Las variables locales se usan dentro de definiciones de método, o incluso en bloques de instrucciones más pequeños dentro de un método. Sólo se pueden usar mientras el método o

bloque va a ser ejecutado por el intérprete de Java, y después dejarán de existir. Aunque los tres tipos de variables se crean de la misma manera, las variables de clase y las de

instancia se usan de una manera distinta a las variables locales. Hoy aprenderá acerca de las variables locales y cubrirá las variables de clase y de instancia durante el día 4, "Lecciones de objetos".

o .ncluso pueden producr un objeto de Java. Hablaremos de ellos más ade.amc.

;5EErS

A diferencia de otros lenguajes, Java no tiene variables globales (aquellas que se pueden usar en todas las partes de un programa). Las variables de

clase y de instancia se usan para comunicar información de un objeto a otro, reemplazando así la necesidad de variables globales.

una i, sirucción en una línea y ésta se compilará cx.losamcnic: ).co .or = "lemon yellow"; ). huigry = false;

Creación de variables Antes de que pueda usar una variable en un programa de Java, usted debe crear la variable declarando su nombre y tipo de información que almacenará. Se enlista primero el tipo de

67


691

Los ABCs de Java

Como indica la última instrucción, usted puede asignar valores a variables múltiples del mismo tipo mediante comas para separarlas.

A las variables locales se les debe dar valores antes de ser usadas en un programa, o el pro

variable:

grama no se compilará con éxito. Por esta razón es una buena práctica darle valores iniciales

int highScore;

String

a todas las variables locales.

username;

A las definiciones de variables de instancia y de clase se les da un valor inicial dependiendo

boolean gameOver;

del tipo de información que contienen:

• Variables numéricas 0 •

Caracteres ' \0'

Booleanas f alse

Objcctos nuil

Nomenclatura de variables En Java los nombres de variables deben empezar con una letra, un carácter de subrayado(

),

o un signo de pesos($). No pueden empezar con un número! Después del primer carácter, los nombres de variable pueden incluir cualquier combinación de letras o números.

un prc¡rama.

.

Li] static void «axn (StrinQ argumentsU ) < jnt total;

ítring reportTitie,

\oolean active;

Nota

Además, el lenguaje Java usa el conjunto de caracteres Unicode, que incluye

el conjunto de caracteres estándar más miles de otros para representar alfa betos internacionales. Los caracteres acentuados y otros símbolos se pueden usar en nombres de variables tan ampliamente en cuanto contengan un

número de carácter Unicode.

m

Cuando se da nombre a una variable y se usa eji un programa, es importante recordar que HamuJasstreet.cityystate:

Java es sensible a mayúsculas/minúsculas. La colocación de las mayúsculas debe ser consis tente. Debido a esto, un programa puede tener una variable llamada X y otra llamada x, y una

Str.ng street, city. state;

variable rosa no es igual a Rosa ni tampoco a ROSA.

val! rLas siguientes instrucciones ere

En los programas de este libro y en cualquier otra parte, a las variables de Java se les da nombres con significado útil que incluyan varias palabras unidas. Para facilitar la identifi

ini zipcode = 90210; St.ing ñame - "Brandon";

b0..lean cneatedOnKelly -= fue; in: age = 28,

cación de las palabras, se aplica la siguiente guía estándar: • La primera letra del nombre de variable es minúscula

• Cada palabra después del nombre de la variable empieza con mayúscula • Todas las demás letras son minúsculas

P


71

Los ABCs tío J.i

■ Día 3 —

Las siguientes declaraciones de variable observan esta regla de nomendatura:

.

demasiado grande o demasiado pequeño para su tipo de variable designado, por lo que usted debería ser precavido al designar el tipo.

Button loadFile;

Término Nuevo

int areaCode;

Otro tipo de número que puede ser almacenado es un número de punto flotante, el cual tiene el tipo float o double. Los número.1! üe punto flotante representan

números con una parte decimal. El tipo float debería ser suficiente para la mayoría de los

boolean piayerSetNewHighScore;

usos, puesto que puede manejar cualquier número de 1.4E-45 a 3.4E+38. Si no es así, se puede osar el tipo double para números más precisos en el rango de 4.9E-324 a 1. 7E+308.

Tídos de variable

Además de un nombre, una dejación de vanab.e debe incluir el tipo de informacon que se

El tipo char se usa para caracteres individuales como letras, números, puntuación y otros

van almacena, El upo puede ser de cua.quiem de los s,gu,e,,es:

símbolos.

El último de los ocho tipos de datos básicos es boolean. Como sabe, en Java los valores

. Uno de los tipos de datos básicos

booleanos pueden contener true o f alse.

. El nombre de una clase o interfaz •

Todos estos tipos íle variables están listados en minúsculas, y usted debe usarlos igual en Ioü programas. Hay clases con el mismo nombre de algunos de estos tipos de dalos pero diferente

Un arreglo

inicial, por ejemplo, Boolean y Char. Éstas tienen diferente funcionalidad en un programa lipos de variables.

Java, por lo que usted no las puede usar cu forirui intercambiable. Mañana verá cómo se usan

Tídos de datos

.

estas clases especiales.

Tipos de clase Además de los ocho tipos de dalos básicos, una variable puede tener una clase como su tipo, como en los ejemplos siguientes: String

algunos tipos de da.os en otros lenguajes de programac.on.

Hay cuatro tipos de da.os que se pueden usar para almacenar enteros. Su uso depende de, tamaño del entero, como se indica en la tabla 3.1.

=

"Walsh";

hair;

Jabberwock

firstMonster;

Cuando una variable tiene una clase como su tipo, la variable se refiere a un objeto de esa clase o-a una de sus subclases.

Tabla 3.1. Tipos de entero.

Tamaño

Color

lastName

Valores auesepueden almacenar

El último de los ejemplos en la lista anterior, jabberwock f irstMonster;, crea una variable llamada f irstMonster que se refiere al'objeto Jabberwock.

Referirse a una superclase como a un tipo de variable es práctico cuando la variable deba ser -2 i47,483,64Ba2,147,483,647 2

i47,,

A.,, ,„ a^i!41775.B»8a0,223,372,«36,B54,775.Bey

alguna de las distintas subclases. Por ejemplo, una jerarquía de clases con una superclase Fruit y iros subclases: Apple Peary Strawberry. Si cica una variable Fruit llamada favoriteFruit, se podrá usar para referirse a un objeto Apple,

Pear o Strawberry.

Declarar un tipo de variable Object significa que puede contener cualquier objeto.


Los ABCs de Java

73

m

El tipo final de comentario puede ser leído tanto por una computadora como por una persona.

Si su comentario empieza con el texto /** (en vez de /*) y termina con */, el comentario

m

será interpretado como un documento oficial del modo en que trabajan la clase y sus métodos

Nota

públicos.

pueden usar esa clase como su tipo.

Este tipo de comentario puede ser leído entonces por utilerías como la herramíenia javadoc

incluida en el JDK. El programa javadoc usa comeniarios oficiales para crear un conjunto de páginas Web que documentan el programa, sus clases y métodos.

Toda la documentación oficial de la biblioteca de clases de Java proviene de los comentarios dé estilo javadoc. Puede ver la documentación del JDK 1.2 en la siguiente página Web: idCooe = 8675309;

http://java.sun.eom/products/jdk/1.2/docs

snappyDresser = faise;

Literales Además de las variables, mmhién ulili/.ará una Hiera! en una instrucción Ja\a.

Término Nuevo

lario.s.

Una literal es cualquier número, texto o información que represente directa mente un valor.

Una literal es un término de programación que significa, en esencia, que lo que escribe es lo Término Nuevo

que obtiene. La siguiente instrucción de asignación es un buen ejemplo del uso de ujia literal:

sión ejecutable de un archivo fuente de Java.

Hay tres diferentes tipos de coméntanos que se pueden usar en ,a programación de Java y los puede usar a su eniera discreción.

Int

year =

1998

La literal es 1998 porque representa directamente el valor entero 1998. Números, caracteres y cadenas, todos ellos son ejemplos de literales.

Aunque el uso y significado de las literales pareyea muy sencillo. Java liene algunos tipos especiales de literales que representan diferentes lipos de caracteres, números, cadenas y va

como en la siguiente instrucción:

int creditHours = 3; //¿sólo un crédito de 3 horas?

lores booleanos.

Literales numéricas

En este ejemplo todo e, texto desde „ hasta e, fina! de ,a Knea es un comen.ano y e, comp,-

Java tiene varias literales enteras. El número 4, por ejemplo, es una literal eniera de tipo de

¡ador áe Java no lo tomará en cuenta.

variable int. También puede ser asignada a las variables byte y short porque el número es

lo suficientemente pequeño para que quepa dentro de esios tipos enieros. Una literal eniera más grande de lo que un int puede contener es considerada-automáticamente como perteneciente al lipo long. También puede indicar que una literal debería ser un culero long

al agregar la letra L (L o 1) al número. Por ejemplo, la instrucción siguiente almacena el valor 4 para un entero long.

long pennyTotal = AL; propuesto.

"

JiA


Día 3

I 74

Los ABCs de Java

Para representar un número negativo como una literal, anteponga a éste el símbolo menos (-).

Si ha usado otros lenguajes como C, esperaría que un valor de 1 fuera equivalente a true y

0 a false. Éste no es el caso de Java (debe usai\ los valores true o f alse para representar

como en -45.

valores booleanos). La instrucción siguiente asigna una variable boolean: boolean toThineOwnSelf = true;

Los sistemas de numeración octal y hexadecimal son convenientes para muchos

Nota

Observe que la literal true no está entre comillas. Si así fuera, el compilador Java podría

usos avanzados de programación, mas no son necesarios para principiantes.

Los números ocíales están basados en un sistema de numeración base8, lo cual

asumir que se trata de una cadena de caracteres.

significa que sólo pueden representar valores de 0 a 7 como un dígito sencillo. En octal, el octavo número es 18 ( o cíe como una literal de Java).

Literales de caracteres

Hexadecimal es un sistema de numeración base16, y puede representar 16

números como un dígito sencillo. Las letras A a F representan los últimos seis

Lasjiterales de caracteres se expresan mediante un carácter sencillo entre comillas sencillas,

dígitos, por lo que los primeros 16 números son 6, 1,2, 3, 4, 5, 6, 7, 8, 9, A, B,

como 'a",'#' y "31. Usted debiera estar familiarizado con el conjunto de caracteres ASCII,

C, D, E. F. .

'

Los sistemas octal y hexadecimal son más apropiados para determinadas ta reas en programación que'el sistema decimal normal. Si alguna vez ha manejado HTML para configurar el color de fondo de una página Web, ya ha utilizado números hexadecimales.

Si necesita un entero literal con numeración ocial, anteponga un 0 al número. Por ejemplo, el número octal podría ser la literal 0777. Los hexadecimales enteros se usan como liieralc-s al anteponer 8x al número, como en 8x12 o OxFF.

el cual incluye 128 caracteres entre letras, numerales, puntuación y otros caracteres útiles en computación. Java sopona miles de caracteres adicionales a través del estándar Unicode de 16

bits.

Algunas literales de caracteres representan caracteres que nq-son imprimibles directamente o accesibles a través del teclado. La tabla 3.2 lista los códigos especiales que puedan represen tar estos caracteres especiales incluso como caracteres del conjunto de caracteres Unicode. La

letra ó en los códigos de escape octal, hex, y Unicode representa un número o un dígito hexa decimal (a-f, o A-F).

Las literales de punto flotante usan un carácter punto (.) para el punto decimal, como se

podría esperar. La siguiente instrucción usa una literal para asignar una sanable double. double myGPA = 2.25;

Tabla 3.2 Códigos de caracteres de escape. Escape

Significado

Todas las literales de punió notante se consideran del tipo de variable double en ve/ de f loat. Para especificar una literal de f loat. agregue la letra RF o fia la literal, como en

\n

Línea nueva

\t

Tabulador

el ejemplo siguiente:

\b

Retroceso

float

piValue = 3.1415927F;

Utilice expolíenles en las literales de punto dolante al usar la letra e o E, seguida del expo

\r

Retomo de carro

\f

Salto de hoja

nente, el cual puede ser un número negativo. Las instrucciones siguientes usan notación expo

\\

Diagonal invertida

nencial:

\'

Comilla sencilla

double

double

x

y

=

=

12e22;

19E-95;

Literales booleanas Los valores booleanos true y f alse también son literales. Éstos son los dos únicos valares

que puede u.-ar cuando se asigna un valor a una variable de tipo boolean o cuando, de algún modo, se requiere un booleano dentro de una instrucción.

\-

Comillas dobles

\d

Octal

\xd

Hexadecimal

\ud

Carácter Unicode

75 |


77

Los ABCs de Java

Día 3

76

Aunque las literales de cadena se usan en forma parecida a otras literales en un programa, son manejadas en forma diferente tras bambalinas.

¡

Al usar una literal de cadena, Java almacena este valor como un objeto String. Usted no tiene que crear un objeto nuevo explícitamente, como lo tendría que hacer al operar con otros objetos, de modo que son tan fáciles de operar como los tipos de datos básicos. En este aspecto las cadenas son poco comunes; ninguno de los tipos básicos son almacenados como objeto cuando se usan. Hoy y mañana aprenderá más acerca de cadenas y la clase String.

Literales de cadena

dc caraclei,s. En Java

Expresiones y operadores Una expresión es una instrucción que produce un valor. Algunas dc las expresiones mas

bay n,íl0dos

comunes son matemáticas, como en el código Cuente de ejemplo que sigue: int

x

= 3;

int y = 4;

cor»»

int

2

=

x

'

y;

La última instrucción en este ejemplo es una expresión. El operador de multiplicación * se

inacciones »!

usa para multiplicar los enteros x y y, y la expresión produce el resultado de la multipli cación. Este resultado se almacena en el entero z.

Al valor producido por una expresión se le denomina un valor de retorno, como ha aprendido. Este valor puede ser asignado a una variable y usado de otras muchas maneras en sus progra mas Java.

La mayoría de las expresiones en Java usan operadores como el asterisco *.

'

Los operadores son símbolos especiales utilizados para funciones matemáticas, TÉRMINO NUEVEO

algunos tipos de instrucciones dc asignación y comparaciones lógicas.

Aritmética ver caracteres

"Precaución

A la mayoría de los Unicode al

,.0.2 sólo soportaba el

Hay cinco operadores que se utilizan para ejecutar la aritmética básica en Java. Éstos se muestran en la tabla 3.3

debe soportarlo para

pueda ser re

el despliegue de cualquier

el sitio Web del consorcio

Suma

3

+

4

Resta

5

7

Multiplicación

5

'

División

14

/

7

Módulo

20

%

7

5


til . Día 3

Los ABCs de Java

Cada operador usa dos operandos, uno a cada lado del operador. El operador resla también se

puede usar para negar un operador sencillo (lo que equivale a multiplicar el operando por -1).

79 i

25: 26:

}

Al usar la división tenga presente el tipo de números con que se maneja la operación. Si almacena una operación de división en un entero, el resultado será truncado a un número

entero, ya que el tipo de datos int no puede manejar números de punto flotante. Como un ejemplo, la expresión 31

/

Si ejecuta esta aplicación Java, produce la siguiente salida: You start with 6 pet amoebas.

9 produce un resultado de 3 si se almacena como un entero.

Two get married and their spouses move in

You now have 8

El módulo de la división, con el cual se usa el operador %, produce el residuo de la operación

Mitosis occurs, doubling the number of amoebas

de división. Usando 31 % 9 el-resultado es 4 ya que 31 dividido entre 9 deja un residuo de 4.

You hów have 16

Observe que la mayoría de \z¡ operaciones que involucran enteros producen un int sin

You now have 12

There's a fight. 4 amoebas move out.

importar el tipo origina! de los operandos. Si está trabajando con oíros números, como

Paramecia attack! You lose one-third of the colony

números de punto flotante o enteros long, debería asegurarse que los operandos tengan el

You end up with 8 pet amoebas.

Daily upkeep cost per amoeba: $0.12

mismo tipo con el que usted quiere lerminar.

Total daily cost: $0.96

El listado 3.1 es un ejemplo ce aritmética sencilla en Java.

En esta sencilla aplicación Java, las tres variables están creadas con valores iniciales en las

lineas 3-5: el entero x. el en,ero corto y, y el número de pumo flotan,,- a. Como el upo prede terminado para los números de punto flotante es double, se antepone una f a la literal .12

Listado 3.1. El archivo fuente amoebamath . java . 1: 2:

putlic static void main (String arguments[]) { x

=

6;

4:

short

y

=

5:

float a =

3:

6: 7: 8:

para indicar que es del tipo float.

class ¿«oebaMath { int

El resto del programa usa operadores aritméticos para dar seguimiento a la población de una colonia de amibas. (Ninguna amiba resulió dañada durante la preparación de este día.)

4:

.I2f;

System.out.println("You start with "

+ x +

"

pet amoebas.");

System.out.println("\tTwo get married and their spouses ¡nove in.');

9:

10: 11 : 12:

x

=

x

+

"

+ x);

System.out.println("\tMitosis occurs,

doubling the number of

14:

15:

16:

x! =

x

2;

System.out.println("You now nave "

+ x);

System.out.println("\tThere's a fight.

" + y + " amoebas move

out.");

17: 18: 19: 20:

21:

22: 23: 24:

x

=

x

-

y;

Systen. out. println ("UParamecia attack! the

colony.');

x ■=

x

(x

/

3);

Más sobre asignación La asignación de un vaJor a una variable es una expresión, debido a que produce un valor. Por esta característica, usted puede encadenar las instrucciones de asignación unidas de la

siguiente manera:

System.out.println("You now have " + x);

-

puede usar el operador + para combinar estos elementos en una cadena sencilla.

Hoy, en páginas adelante, aprenderá más acerca del uso del operador +.

amoebas."); 13:

de salida estándar, la cual suele ser la pantalla.

System.out. println() toma un argumento sencillo dentro de sus paréntesis: una cadena Para poder presentar más de una variable o literal como el argumento para println (), usted

2;

System.out.println("You now nave

Este programa también utiliza el método System. out.println() en varias instrucciones Este método se usa en una aplicación para desplegar cadenas y otra información para el dispositivo

You lose one-third of

System.out.println("You end up with " + x + " pet amoebas."); System.out. pri.it ln("Daily upkeep cost per amoeba: S" + a); System.out.println("Total daily cost: S" + (a * x));

x = y = z

=

7;

En esta instrucción, las tres variables finalizan con el valor 7.

lid


Los ABCs de'ava

Día 3

81

#

80 siempre se calcula ames de que se

déla

Término Nuevo

Incrementar una variable significa agregar 1 a su valor, y decrementar una variable significa sustraer 1 de su valor.

El operador de incremento es ++ y el operador de decremento es --. Estos operadores se colo can inmediatamente después de, o inmediatamente antes de, un nombre de variable, como en

de ejemplo:

el siguiente código de ejemplo: ;

int x = 5; x = x + 2; • - v - x + 2 lo primero que En la expresión x - x + ¿. l

ocurre es

que

■alcula x + 2 . El resultado de

se ca

este cálculo. 7. se asigna entonces a x.

uv común en progra-

int

x

x

x++;

=

= 7;

.

m

En este ejemplo, la instrucción x = x++ incrementa la variable x de 7 a 8.

Estos operadores de incremento y decremento pueden ser colocados antes o después de un nombre de variable, y esto afecta el valor de las expresiones que implican a estos operadores. Término Nuevo

equivalentes a:

Los operadores de decrcmento c incremento son llamados operadores ele ¡"cjiju

si se listan antes de un nombre de variable, y operadores de posfijo si están

después de un nombre.

3.4. OPERADORES DEASIGNAGÓN.

m

En una expresión simple como standards- -;, usar un operador de prefijo o posfijo no cam bia el resultado. Sin embargo, cuando las operaciones de incremento y decremento son parte

de una expresión más grande, es importante la elección entre operadores de prefijo y posfijo.

m

Supongamos las dos expresiones siguientes.

cada lado de su in

on

P

eme$_ por ejemp,0 si

int

x,

x

42;

=

y,

y

=

x++;

z

=

++x;

z;

Éstas arrojan valores muy distintos por la diferencia entre el prefijo y el posfijo. Al utilizar operadores de posfijo como en y = x ++, y recibe el valor de x antes tic ser incrementado por 1. Cuando se usan operadores de prefijo como en z = ++x, x se incrementa por 1 antes de

que el valor se asigne a 2. El resultado final de este ejemplo es que y es igual a 42, 2 igual a 44 y x igual a 44.

mismo valor:

Si aún tiene problemas para identificar su funcionamiento, aquí está nuevamente el ejemplo

x = x / y + 5;

con comentarios que describen cada paso: int x, y, x = 42; y _ x++.

2 = ++x;

mcrerfento y decremento^^awectk

h^^_

2; _

// x, y, y 2 ya están declaradas // a x se le ha dado el valor de 42 // a y se le ha dado el valor de x (42.^. antes de ser

// incrementada y entonces x se ha incrementado a 43 // x se ha incrementado a 44, y 2 toma el valor de x

p


Día 3

Precaución

Los ABCs de Java

Como con los operadores cortos, los operadores de incremento y decremento

'i pueden producir resultados inesperados "al utilizar expresiones extremada-

Jmente complejas. El concepto de "asignar x a y antes de que x se Incremente" ,jno es precisamente correcto, ya que Java evalúa todo en el lado derecho de :luna expresión antes de asignarle su valor al lado izquierdo. Java almacena /•algunos valores antes del manejo de una expresión para que un posfijo tra-

íbaje como se ha descrito en esta sección. Cuando no esté obteniendo los ^resultados esperados de una expresión compleja que incluye operadores de

"¿prefijo y posfijo, trate de romper la expresión en varias instrucciones para : ^simplificarlo.

83

Operadores lógicos Las expresiones que producen valores booleanos, como las operaciones de comparación,

se pueden combinar para formar expresiones más complejas. Esto se maneja a través de operadores lógicos, los cuales se usan para las combinaciones lógicas AND, OR, XOR, y NOT

lógico.

Para'las combinaciones AND se usan los operadores lógicos & o &.&. Cuando dos expresiones booleanas son enlazadas por los operadores & o &&, la expresión combinada devuelve el valor

true sólo si las dos expresiones booleanas son ciertas.

Veamos este ejemplo, tomado directamente de la película Harold & Maude:

Comparaciones

# #

:.

boolean unusual = (age < 21) & (girlfriendAge > 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

Mayor que

x

>

3

Menor que o igual a

X

<= 3

Mayor 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

<

25 produce un restituido ya se;i truc ti falsc, ilcpeiiilicnilo del valor tle-1

entero age. Pi esto que age es 31 en este ejemplo (lo cual es menor a 25), a hip se le da el valor booleano de f alse.

valor de true a unusual y la segunda expresión nunca se evalúa.

int age = 3::; =

' /!

; son false, el operador " produce un valor false.

La combinación NOT usa el operador lógico I seguido de una expresión sencilla. Invierte el valor de una expresión booleana de la misma manera en que un símbolo menos inviene el signo positivo o negativo en un número.

ñ •s


m

85 1

Los ABCs de Java

#

Dia 3

llcvlH:,w

,.o, ,-u,

< Suelve

a.o,

Operador

Notas

new

Con el operador new se crean nuevas instancias de clases; () en este

(tipo)expresión

caso es para convertir por casting un valor. (Mañana aprenderá acerca de ambos temas.) Multiplicación, división, módulo.

especialmente en el día 5.

Suma, resta.

Precedencia de operadore

^

<

>

—-

eniza el valorado la expresión.

m

Desplazamiento de bits a la izquierda y derecha.

csublccKÍ;1

<=

Pruebas de comparación por relación.

>=

Igualdad.

!=

AND

&

XOR

OR

Én .enera,, e. orden de. primero a, ühimo es el siguiente: ". ()pcr.c¡«.K-s de incremento y decrcmento

&&

AND lógico.

¡ ¡

OR lógico/

? .

Versión corla de if . . . then. . . else (expuesta en el día 5).

= +* .= •= /= %= -=

Asignaciones varias.

4=

Más asignaciones.

¡= «= »= >>>=

__

. Opci iciones aritméticas

Volviendo a la expresión y = 6 + 4 / 2, la tabla 3.7 muestra esa división evaluada antes de

. Coir puniciones

la suma, por lo que el valor de y será 8.

.

.

Ope, aciones lógicas

Para cambiar el orden en que se evalúan las expresiones coloque paréntesis alrededor ilc las

^ones de asignación

,cuU en ,a c,P-ón

S¡ dos o,v aciones tienen la misma prec*» • 1

?&^

expresiones que se deberá evaluar primero. Anide un conjunto de paréntesis dentro de otros

para asegurarse que las expresiones se evalúen en el orden deseado (la expresión de paréntesis más interna se evalúa primero). La siguiente expresión produce un valor 5:

Xso.»r.s primeros en ser evaluados.

y =

(6 + 4)

/

2

El resultado es el valor 5, porque 6 + 4 se calcula antes del resultado, 10, que es dividido Notas

entre 2.

"Mediante Mediante los los parémesi pa. «:..«■--

" <;

vnrhh|e, dentro de objetos y

sirve para «ner acceso a métodos >var^ ■ /

, .vmindrán mañana), ios u»

clases (se expon"""'

arreglos, i

+*

. ■

¡

- instanceo-f

Este operador dev

una instancia de \ expone mañana).

^

^.^ cn |os ,,,.,]

'osieiioniienie en la seni.iiui. i

basándose en si el objeto e

m

Los paréntesis también pueden ser útiles para nwjorar la lectura de una expresión. Si la prece dencia de una expresión no es inmediatamente clara para usted, añada paréntesis para impo ner la precedencia deseada, de modo que la instrucción sea más sencilla de entender.

H!

I!


Los ABCs do Java

Día 3

Resumen

Aritmética de cadenas

Concatenar significa enlazar dos cosas. Por convención se ha elegido este verbo Término Nuevo

;

Quien abre una a una las matruskas queda algo decepcionado al llegar a la muñeca más

Como se estableció previamente hoy. el operador ♦ tiene una doble vida fuera del mundo de las matemáticas. Puede ser usado para concatenar dos o más cadenas.

871

tas rusos para crear muñecas aún más pequeñas, hasta que alguien alcance el límite subatómi co y se declare el ganador.

Usted ha alcanzado la muñeca anidada más pequeña de Java, lo cual no debería ser una

mar, unir, cornbinar, enlazar y conjuntar).

desilusión. El uso de instrucciones y expresiones lo habilita para comenzar a construir méto

En varios ejemplos, ha visto instrucciones que se parecen un poco a esto:

dos efectivos, lo cual hace posible objetos y clases efectivos.

String firsíName = "Raymond"; „„„„>. System.out.printlnf'Everybody loves ■ + firstName),

Hoy aprendió a crear variables y asignarles valores; usar literales para representar valores

Estas dos líneas hacen que se despliegue el texto siguiente:

dades al tiempo que desarrolle objetos para programas Java.

numéricos, caracteres y cadenas y trabajar con operadores. Mañana podrá usar estas habili

Everybody loves Raymond

Para resumir el materia! de hoy, la tabla 3.7 lista los operadores que usted ha aprendido.

El operador ♦ combina cadenas, otros objetos y variables para formar una cadena sencilla^ En

Imagínese que es una muñeca matruska y revíselos cuidadosamente.

firstName.

Trabajar con el operador de concatenación es más sencillo en Java por la manera en que

Tabla 3.7. Resumen de operadores.

■ Operador

puede manejar cu »quier tipo de variable y valor de objeto como si Iueran una «den* S> 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

<=

Menor que o igual a

==

Igual

expresión siguieni:: myNarae +=

"

i

pequeña en el grupo. Idealmente, los avances en microingenierfa deberían habilitar a los artis;

para describir el acto de combinar dos cadenas (destacándose sobre pegar, engo

el ejemplo precédeme, la Hiera) Everybody loves se concatena al valor del objeto Stnng

;

Mayor que o igual a

Jr ";

Esta expresión es equivalente a la siguiente:

i =

Diferente

myName = myNaír; +

&&

ANO lógico

" Jr.";

En este ejemplo >. 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.

.

<

de esa cadena.

En realidad el objeto Random no genera números de manera aleatoria. En vez de ello, loma un

En este caso la clase String no es común. Aunque es una clase, hay una forma sencilla de

número de una secuencia extremadamente grande de números. A esto se le llama generación

crear instancias de esa clase mediante una literal. Las otras clases no uenen ese atajo;

para crear instancias de esas clases usted nene que hacer.o de manera explica med.an.e el operador new.

pseudoaleaioria de números, y se usa en muy diferentes lenguajes de programación. Para poder tomar un número diferente de la secuencia de números aleatorios, al objeto RandomO se

le debe dar un valor de semilla. Esta semilla puede ser enviada cuando el objeto se construye. El listado 4.1 es un programa Java que crea objetos Random con new de dos maneras dife

Nota

Qué hay acerca de las literales para números y caracteres?, ¿no crean obje-

rentes.

, os también? Realmente, no lo hacen. Los tipos de datos primitivos para números y caracteres crean números y caracteres, pero por ef.cenca en

ealidad no son objetos. Usted puede colocar envolturas de objetos alredelor de ellos si necesita tratarlos como objetos (lo cual aprenderá mas tarde ■n este libro).

Listado 4.1. El texto completo de handomnumbers.java. 1:

import

java.útil.Random;

2:

3:

class RandomKunbers

{

4: 5:

Uso de m.'W

Para crear un o jeto nuevo, utilice el operador new con el nombre de la clase de la :ual desea

crear una instai cia, seguido de paréntesis:

String team!-ame = new StringO; Random rand nfo = new RandomO; jabberwock = new JabberwocM );

m

#

Los parémesi son importantes: no hay que retirarlos. Los paréntesis pueden estar vacíos en

publie static

6:

Randon

void main(String

r1,

argumenís[])

{

valué

r2;

7: 8:

r1

9:

System.out.println(■Randoro

=

new

Random(); 1:

"

+

r1.nextOouble());

valué 2:

"

+

r2.nextDouble());

10:

11:

r2 =

12:

System.out.println("Randoi«

new Random(8675389);

13: 14:

}

cu o caso se » creado el más simple objeto básico, o b,en pueden contener argu, «

de'terminan I. s valores inicia,es de variables de insume» u otras cuahdades míe a s de s

objeto. Los templos siguientes muestran objetos que están s.endo creados con ar .amentos. GregorianCalendar date = new Gre0orianCalendar(64, 6, 6, 7, 30); Point pt :

new Point(0,0);

I a cantidad v tipo de argumentos que puede usar dentro de los parén.esis con nev están d finidos p. 'r la clase en sí misma mediante un método especial llamado connruc o, (Ho>

Íp Irá , ás acerca de los constructores.) Si trata de crear una nueva insumo. « una Case

Cuando compile y ejecute el programa, la salida deberá verse como la siguiente: Random valué

1:

Random valué 2:

0.312596.1341023068 0.754788115099576

En este ejemplo se han creado dos objetos Random distintos usando argumentos distintos para la clase listada después de new. La primera instancia (línea 8) usa new RandomO sin argumen

tos, la cual crea un objeto Random alimentado con una semilla de la hora en curso. Su valor


Lecciones de objetos

'■

Observación acerca de la administración

de memoria

Si está familiarizado con otros lenguajes de programación orientada a objetos, quizá se pre gunte si el operador new tiene un opuesto que destruya un objeto cuando ya no lo necesite.

.-o.no la semilla.

,.. i;neas 9 Y 12 devuelve e) próxi-

La administración de memoria en Java es dinámica y automática. Cuando crea un objelo nuevo, Java asigna aulomálicainenle la canlidad apropiada de memoria para ese objelo. Así no

tiene que asignar explícitamente ninguna memoria para objetos. Java lo hace por usted.

usa una .itera, como la segunda sem,-

1V. La segunda l

S3j

# m

Por esta razón, no tiene que desalojar la memoria utilizada por un objelo cuando haya termi nado de usarlo, pues para enlonces éste ya no tiene referencias activas de sí (no será asignado

a ninguna variable que usted siga usando, o almacenado en ningún arreglo). Java lienc un recolector de basura que busca objetos sin usar y recuerda a la memoria qué objetos están en uso; por lo que no hay que liberar la memoria en forma explícita, sólo asegúrese de no con tener ya un objelo que desee descartar.

m

Acceso y establecimiento de variables de clase y de instancia Hasta este momento usted pudo crear su propio objeto con variables de clase y de instancia definidas en él ¿pero cómo irabujar con estas variables? ¡Es muy sencillo! Las variables de

clase y de instancia se comportan igual que las variables locales que aprendió ayer. Sólo reficrasea ellas en forma ligeramenle distinta a como lo hace con respecto a las variables re gulares en su código.

ué hace new

v¡] ,nslal)C¡, ric ia das

uando u«e- - ^ operador new ^ =. «^^ ^ fin

Cu

:lJ¡1. * rea la .««.«TU. parac. > - ' ^ 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:

<

• El tipo de cada uno de los argumentos utilizados cuando se llama al método

La aplicación SeeMethods pudo haber sido hecha con cualquier clase de objetos. Cambie la

Rando* rd = new RandoM);

6:

Si un objeto es de la clase actual o una de sus superclases

línea 6 de SeeMethods. j ava para crear un objeto diferente y dar un vistazo a sus interiores.

7: 8:

(int i - ».

x

i-MBthod-

" + methods i])>

Systsm.oüt.pnntln( Method.

9: 16:

Le reflexión es muy usada por herramientas como navegadores de clases y depuradores, como

una manera de aprender más acerca de la clase de los objetos examinados o depurados. También es requerida por JavaBeans, donde la capacidad de un objeto para consultar a otro

11:

12: 13:

t

acerca de lo que puede hacer (y entonces solicitar que haga algo), es útil cuando se cons

}

truyen aplicaciones más grandes. Aprenderá más acerca de JavaBeans durante el día 19, "JavaBeans y otras características avanzadas".

.

El paquete java.lang.reflect.incluye las clases siguientes:

• Field

Maneja y encuentra información acerca de variables de clase y de instancia

• Method

• Array

m USTAD^T.USAUBADEJ^APU^^ lili M

Maneja métodos de clase y de instancia

• Constructor

da de la ; plicación

n:M.t',od:p«Micfin.ln.tive1.v..lanfl.C1.ss

Maneja arreglos

• Modif ier

Dccodifica información acerca de cl;ises, variables, métodos (que se

describen en el día 15, "Funciones de las clases: paquetes, interfaces y otras caracterís ticas").

Además, habrá una gran cantidad de métodos disponibles en una clase de objetos llamada

JI-ÜSS; SS2

Class que ayuda a unir varias clases que tienen que ver con reflexión.

•i =5? ^

La reflexión es una característica avanzada que usted podría no estar listo para usar en sus

programas. Será más útil cuando usted trabaje en la señalización de objetos, JavaBeans y otros, de la programación más sofisticada de Java.

java.^ng.InterruptedException

java.utii.Random.setSeed(long)

0: Method: public synchronized voxd J

1V Method: public void 3ava.util_

Maneja los métodos especiales para crear nuevas instancias de clases

d

extBytes(byte[l)

nextint()

13: Mtthod: public long >a™au"*iRandOm.nextFloat()

Resumen Ahora que ya ha bebido profundamente de la implementación de la programación orientada a objetos en Java, está en una mejor posición para decidir cuan útil puede serle en su propia programación.


Dia4

110

"el vaso medio vacío", la programación orientada a objc-

Semana 1

está tan profundamente inmersa en Java.

Y si es de los que ven "el vaso medio lleno", vale la pena que use la programación orientada a

objetos por los beneficios que ofrece: disponibilidad mejorada, rcu.ili.acio,, y man.ennn.cnU,

una clase.

Finalmente, le dio un primer vistazo a la «flexión, una manera de hacer que una clase revele

detalles acerca ele sí misma.

A este punto va tiene las habilidades para manejar las tareas :nás simples en el lenguaje Java.

ÍTio „* falta son arréelos, condiciona.es y ciclos (los cuales se vean mañana), y cómo definir y usar clases (en. el Jía 6, "Creación de clases ).

Preguntas y respuestas

P .ístoy confundido acerca de las diferencias entre los objetos y los tipos de datos primitivos, como int y boolean.

R los tipos dedeos primitivos en el lenguaje (byte. short, int, long, float, dou ■

ÍT. boolean y ch.r) representan las cosas más pequeñas. No son objetos, aunque de níuch-,s manera se puedan manejar como objetos: Pueden ser asonados a vanables >

■ ^ o entro y fuera <ie los métodos. Sin embargo ,a mayoría de las operacones que funcionan exclusivamente en objetos no íuncionarfn en tipos de d;,,os Pr,m,t,vos. Los objetos son instancias de Cases y como tales suelen ser tipos de datos más comple jos que los números simples y caracteres, que suelen contener números y caraetces

Día

5

Listas, lógica y ciclos Si usted escribió un programa Java con lo que sabe hasta ahora, el programa le podría parecer algo soso. Si usted escribió un programa Java con lo que sabe hasta ahora, el programa le podría parecer algo soso. Rsta última oración no se repitió dos veces por un error editorial. Es una demostración de cuan fácil es que las computadoras repitan la misma cosa una y otra vez. Hoy aprenderá cómo hacer que una parte de un programa de Java repita su ejecución mediante los ciclos.

como instancia o variables de clase.

Además también aprenderá cómo hacer que un programa decida hacer algo basado en lógica. (Tal vez una computadora podría decidir que no es lógico repetir la misma oración dos veces seguidas en un libro.)

«tro, de modo que pueda pasar a través de ella?

madas arreglos.

P -No hay apuntadores en Java? Si usted no tiene apuntadores, ¿cómo puedo suponer que haré .,*, como listas vincu.adas, donde .enga un apuntador de un nodo a K No es del todo ceno decir que a fin de cuentas Java no posee apuntadores, sólo que no

Le apuntadores explícitos. Las referencas a objeto, son. efectivamente, apuntadores. Pír I aloo con» uno li«a vino,.»*.. us,ed crearía una Case Ha-uada Nod.. la cua

L fiable de instancia tambiín de, tipo Node. Para vincular cure s, los objetos odo -«ene un objeto nodo a la vanab.e de instancia de. objeto inmechatamente antes ck cTenVlfsu. Pues/o que las referencias a. objeto son apuntadores, las hstas v.nculadas configuradas de eMa manera se componan como usted esperaría que lo h.c.eran.

Incluso aprenderá a organizar grupos de la misma clase o lipo de dalos en listas lla Lo primero por hacer en la lista de'hoy son arreglos.


Listas, lógica y ciclos

1131

Día 5

String[]

difficultwords; i

Point[] int[)

.

hits;

guesses;

Usted verá los dos estilos utilizados en los programas, y como no hay un consenso sobre qué

Java. En al^

estilo sea más legible, la opción es más bien una cuestión de preferencia personal.

Creación de arreglos de objetos Después de haber declarado la variable de arreglo, su siguiente paso es crear un arreglo de

domemos, o quizas 1,000.'

:

L.,,,lic,1u1s Mu, lico.. d •'»»»'" "I" '"

-"=::-~h'11'~11"~'"

objelo y asignarlo a esa variable. He aquí las formas de dar este paso: •

f

Utilice el operador new.

#

• Inicialice directamente el contenido del arreglo. Como los arreglos son objetos en Java, puede usar el operador new para crear una nuevi' iastancia de un arreglo, como en la instrucción siguiente:

pu

c*.. .encr un arrcg»o ^= - *

String[]

^ CO111O enteros.

Par;iCrCar un arreglo en Javn, haga )o sigúeme:

Esta instrucción crea un nuevo arreglo de cadenas con 10 posiciones que pueden contener

objetos de tipo String. Cuando crea un arreglo de objetos con new, debe indicar cuántas posiciones contendrá el arreglo. Rn realidad estas instrucciones no colocan objetos en las posiciones; eso lo debe hacer usted posteriormente.

Los arreglos de objetos pueden contener tanto tipos primitivos (como enteros o booleanos),

,Oec1;,eun:,va,,a,e para que conten eUr

como objetos:

, Cree un nuevo arrodo de objeto y aagneU, ?.

Amiacene

inform

playerNames = new String[10J;

int[)

ación en ese arregR

temps = new int[99);

Cuando usted crea un arreglo de objeto mediante new, todas sus posiciones se ¡nicialuan ,

Declaración de variables de

automáticamente (0 para arreglos numéricos, f alse para booleanos, ' \0' para arreglos de lo habr4

carácter, y nuil para objetos):

También puede crear e inicializar un arreglo al mismo tiempo. En vez de utilizar new para crear el objeto de arreglo nuevo, encierre los elementos del arreglo entre llaves, separándolos

Para arencarlas de las de^ ^

(1,, vacíos al objeto o upo de dalos, o al n

con comas:

";:,11.,,cCÍone, sientes son eje^S de desceñes <Wv.ir,.,b

,

StringU

chiles =

"habanero", strinp

im

de

"thai"

{

"jalapeno",

"anaheiin",

"serrano"

};

!:-^

onsl1;

w después de. upo de .n.onn.cón-ve. del

La palabra clave de Java nuil se refiere al objeto nuil (y se puede usar para cualquier referencia de objeto). No equivale a cero o al carácter ' \0' como las constantes NUIL en C.

m m


L¡star., lógica y ciclos

Día 5

Insistimos: La longitud del arreglo es 10, pero su subíndice sólo puede llegar hasta 9 Los

arreglos uncían su numeración en 0. Siempre que trabaje con arreglos, tenga esto en mume y

reste 1 a la longitud del arreglo para obtener su elemento más grande.

Modificación de los elementos de un arreglo Como vio en los ejemplos anteriores, puede asignar un valor a una posicio,, específica de

un arreglo al colocar una instrucción de asignación después del nombre del arreglo y el

subíndice, como en el ejemplo siguiente: myGrades(4]

=85;

sentence[0]

=

"The";

sentence[i0] = sentence[0];

lo, aunque puede se, también una «pn*.o,

--

^ ^.^ inician

Algo importante a tener en cuenta es que en Java un arreglo de objetos es un arreglo de refe

rencias a dichos objetos. Cuando asigna un valor a una posición en ese tipo de arreglo está creando una referencia a ese objeto. Cuando mueve valores entre arreglos, como en"el último

de los ejemplos anteriores, está reasignando la referencia cn vez de copiar un valor de una posición a otra. Los arreglos de un tipo de dalos primitivo como int o f loat copian los va lores de una posición a otra.

Jc, mS>». eco « orfimo al ™» " •'" °J* * l0

Los arreglos son razonablemente sencillos de crear y modificar, pero proporcionan una canti dad enorme de funcionalidad a Java. Usted se encontrará a sí mismo corriendo entre arreglos

confome avance en el uso del lenguaje. siguientes:

Para finalizar la discusión acerca de los arreglos, el listado 5.1 presenta un programa sencillo

Strlnol] M.tX.!.p.rt-"-«rlnoIiBl;

que crea, inicializa, modifica y examina las partes de un arreglo.

Listado 5.1. El texto completo de arraytestjava.

l¡ s dos lí 1:

class ArrayTest

{

2: 3: 4: 5:

6:

Stringf) firstNames = { -Definís", "Grace", "Bjarne", "James" }; Stringf] lastNames = new Strin0[firstNames.length]; void printNames()

{

'

■int i = C;

,:„„ tlíil u, -Ci, «nstancias excepconales. n . ^

iicc,v:. ..o las «c piones. ,.C6mo puede es :«_

,

^^ ^ -^^^ iii.i,iltflll

^

^ s^ pros

System.out.println(firstNames[i] ■ "

int len = bea leSpeak.length;

+ lastNames[i]);

System.out.println(firstNames[i] + "

importar el tipo:

"

" + lastNamesfi]);

11!


Listas, lógica y ciclos

117]

Día 5

Finalmente, el método main () desarrolla lo siguiente: • La línea 22 crea una instancia inicial de ArrayTest para que se-puedan usar sus va riables de instancia y métodos. • La línea 23 llama a printNamesO para mostrar a qué se parece el objeto ¡nicialmcnie.

15: 16:

.printl(

El resultado son las primeras cuatro líneas de la salida; observe que se inicializó el

17:

+

arreglo f irstNames, pero los vaiores en lastNames son nuil. Si un arreglo no está

lastNames

18:

inicializado cuando se declara, los valores de las posiciones iniciales estarán vacías:

19:

nuil para los arreglos de objetos, 0 para números y f alse para los booleanos.

void main (String arguaentsl)) í

2e:

rS?..* a -n.- ArrayTest();

21: 22:

a.printNanesO;

23:

Svsteit.out.printlnt

ix.stHa.es 10] - '■Ri

21: 25:

' 27:

• Las líneas 25-28 establecen los valores de cada una de las posiciones en el arreglo lastnames a las cadenas reales.

• La línea 29 llama a printNames() una vez más para mostrar que ahora el arreglo lastNames está lleno de valores, y cada nombre y apellido se imprime como usied

esperaría. Los resultados se muestran en las últimas cuatro líneas de la salida.

a.lastNamesl3] - 'Gosling ,

28:

a printNamesO;

25:

3f: ' 3V.

Nota

}

Si usted no reconoce los nombres de este ejemplo, podría pensar que los autores están manejando referencias de sus amigos en este libro. Todos ellos son importantes desabolladores de lenguajes de programación de computa

U<alida tic: ?r-.¿rama es como sigue:

dora: Dennis Ritchie (C), Bjarne Stroustrup (C++), Grace Hopper (COBOL) y James Gosling (Java).

Una última observación acerca del listado 5.1, es que es un ejemplo terrible de estilo de pro Der.m

Ritchie

gramación. De suyo cuando se trabaja con arreglos, usted puede usar los ciclos para circular a

Grsce Hopper

través de los elementos de un arreglo, en lugar de trabajar con ellos individualmente. Esto

-arn ¡ Stroustrup

hace mucho más pequeño al código, y en muchos casos más sencillo de leer. Cuando apren

j'snes GoslinQ

da acerca de ciclos hoy mismo más adelante, verá este ejemplo reescrito con diferente estiio.

Arreglos multidimensionales Si ya ha usado arreglos en otros lenguajes, podría suponer que Java puede manejar arreglos

lor inicia! en la, pospones.

f irstNames, dcoWo a que

c, mismo número de P—

inici,. Cuando ,: usa en un

multidimensionales: arreglos con más de un subíndice que permiten la representación de más de una dimensión.

Las dimensiones son útiles cuando se representa »)go como una malla x, y de elementos de arreglo.

,..,,,_-,-1\

v main O •

Java no sopona arreglos multidimensionales, pero usted puede lograr la misma funcionalidad al declarar un arreglo de arregios. Estos arreglos pueden también contener arreglos, y así sucesivamente, para cuantas dimensiones se necesiten.

las poMCione: dü .irn-pi

#


Listas, lógica y ciclos

Día 5

1191

Hay dos variables definidas en este método: x y y. El alcance de la variable y es el bloque

intUIl coords = newint[i2]H2);

0

coordsiaiiei = 1".

%

coordsi0lli] = 2;

dentro del cual está, y sólo puede ser usada dentro de este bloque! Se podría dar un error si tratara de usarla en otra pane del método testBlockf). La variable x fue creada dentro del método pero fuera del bloque interior, por lo que puede usarla en cualquier parte del método. Usted puede modificar el valor de x en cualquier parte dentro del método y se retendrá este

valor.

. ;

,

De suyo las declaraciones de bloque no se usan solas en una definición de método, como

.I

• Instrucciones de bloque

*„„„,„„««

os cinco días, entre oirás

cosas, p;ira las dos siguientes:

están en el ejemplo anterior. Usted las usa a través de las definiciones de clase y mélodo, igual que en la lógica y estructuras de ciclos que aprenderá a continuación.

Condicionales if Uno de los aspectos clave de la programación es la capacidad de un programa para decidir qué hará. Esto está manejado a través de un tipo especial de enunciado llamado condicional. Término Nuevo

. P-in definir las instrucciones que , •

.

t tiui uLMiii»

i > st' pucvlo visar hhio

Una condicional es una instrucción de programación que sólo se ejecuta si se cumple una condición específica.

La condicional fundamental es la palabra clave if. La condicional if usa una expresión booleana para decidir cuándo se deberá ejecutar una instrucción. Si la expresión devuelve un valor true, la instrucción se lleva a cabo.

He aquí un ejemplo sencillo que despliega el mensaje "You cali thai a haircui?" sólo con una do

condición: Si el valor de la variable age es mayor que 39:

dentro de una definición de clase.

variables

if

(age > 39)

System.out.println("You cali that a haircut?");

tote m«l»s d«n,,o de »n Ww

^

m

„, ,a cll;l,

Si desea que suceda algo más en caso de que la expresión if devuelva un valor f alse, se puede usar la palabra clave else. El ejemplo siguiente usa tanto if como else: if (blindDatelsAttractive == true)

ti alcance de una variable es el bloque en e

restaurant = else restaurant =

"Benihana's"; "Burrito Hut";

La condicional if ejecuta diferentes instrucciones basadas en el resultado de una prueba void testBlock()

{

booleana sencilla.

int x = 10; {

//

inicio de bloque

int y = 40;

m

y

=

}

//

y

+

x;

-fin de bloque

La diferencia entre las condicionales if en Java y las de C o C++ es que Java requiere que la verificación devuelva un valor booleano (true o f alse). En C, la verificación puede devolver un entero.


Día 5

Listas, lógica y cicló

Con if usted sólo puede incluir una instrucción sencilla como el código a ejecutar después

de I. prueba. (En e, ejemplo anterior está asignada la variable restauran.) ^ en, argo en

jav. puede aparecer un bloque dondequiera que lo haga una ms.rucoón sola. S, deso haca ,|,o más que una solu cosa ceno resultado de un enunciado if. pon*, esas ,nsm,cc,oncs

dentro de un bloque. Observe que el siguiente segmento de código, es una ex.cns.on del objc,o Jabberwock que usted creó el día 2."Un vistazo a la programación oricniada a objetos : if (attitude == "angry" )

{

18:

La salida del programa es como sigue: ' Valué is i.

...

Valué is 2. Stevenl

Valué is 54.

} VyVtea.out.println ("The jabberwock is in a good rnood.');

Stevenl Valué is

íf ^"T/stem.out.printlnCIt still is hungry, though.");

decir if (hungry == true). Para las pruebas booleanas de este upo. dejar luera 1, ult.nu

parte de la expresión es un método abreviado común en programación.

El listado 5 2 nuestra otro ejemplo simple, en esta ocasión en forma de aplicación completa. L 'lase Even->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<

e.evenCheck(1346);

19: ■}'

System.out.printlnCThe jabberwock is angry ), _ Systemiout.println ("Have you made out a will? )l;

Bste ejemplo usa .a prueba (attitude -- "angry , para determinan si ^^

e.evenCheck(77),•

17:

El operador condicional Una alternativa a las palabras clave if y else en una instrucción condicional es usar el ope rador condicional, también conocido como operador ternario, llamado así porque tiene tres

términos.

El operador condicional es una expresión, lo que significa que devuelve un valor, a diferencia

del if más general, que sólo puede dar por resultado una instrucción o un bloque para ser eje

cutado. El operador condicional es más ú.il en condicionales cortas o simples y luce como en la siguiente línea:

test ? trueresult : falseresult;

m #

m

t #

t


Listas, lógica y ciclos

1231

Día 5

switch

(grade)

{

,

case ;a; ; ' ' "" System.out.println("Great job -- an Al"); . break;

case

.

. •

'B':

System.out.println("Good job -- a Bi");, break;,

casé

'C: System;out.println("Your grade was a C.");

■■■'•■•

break;

.

default: System.out.println("An F ■- consider cheating!"); int

ourBestScore;

La instrucción switch se basa en una prueba; en el ejemplo anterior, la prueba está en el

if (myScore > yourScore)

valor de la variable grade. Dicha variable, que puede ser de cualquiera de los tipos primitivos

ourBestScore - «yScore,

byte, char, short o int se compara con cada uno de los valores case. Si después de la

p i e g

prueba se encuentra una coincidencia, se ejecutan la instrucción o instrucciones; si no se encuentra, se ejecutan la instrucción o instrucciones default. La pane default es opcional.

El

Si se omite y no hay coincidencia para ninguna de las instrucciones case, la instrucción switch finaliza sin ejecutar nada.

labia 3.6 del día 3.

La implementación Java de switch es limitada. Las pruebas y valores sólo pueden ser tipos de datos primitivos que sean convenibles a int. Usted no puede usar tipos primitivos más ^r una variable con.,

grandes como long o f loat, cadenas, u otros objetos dentro de un switch, ni tampoco puede

verificar por cualquier otra relación distinta a la igualdad. Estas restricciones limitan al switch a los casos más simples. En contraste, las instrucciones if anidadas pueden funcionar

prob"por *""*'■ ir (oper == + ) ■■ addargs(arg1,

instrucción switch.

arg2), arg2);

(oper)

case

{

'+': addargs(arg1,

arg2);

'

break; case

else if (oper == '") multargs(arp,

Lo siguiente es una revisión de if anidada mostrada previamente. Ha sido reescrito como una switch

else if (oper == '•') subargs(argi,

para cualquier clase de prueba en cualquier tipo.

'*':

subargs(arg1,

aro2),

arg2);

break;

else if (oper == '/')

case

' -':

multargs(argi,

arg2);

break;

case

Un método abreviad - para las instn.cc.oncs

lenguajes de prograi lación es agrupar proel

jav-, puede hacer lo antenor mediante la in:

El Guíeme es un cumplo del uso de switch

m

Centre sí en una sola instrucción. En

'/': divargs(arg1,

arg2);

break;

switch, la cual se compona como en C.

Hay dos cosas que cuidar en este ejemplo. La primera es que después de cada caso, usted puede incluir una instrucción resultante sencilla o más; tantas cuantas necesite.


Listas, lógica y ciclos

Día 5

124

is:

default:

16:

funcione. La segunda son .as ,= ,nslri,cion break en una seco instruccioneS para esa co,nc,

cncuen.

^

^^

^

ase^ una

^

.^.^ ^ ^ hasla

nc , > »

^

* brea* o el fin». Je swltC^bn B

return "

17:

se

^ „„„„,„« ,0

18:

19: 28:

debcrú incluir break para asegu-

21:

i

publie static void aain (String arguMents£J) { NunberReader n = new NunberReaderO; String nuo = n.convertNu»(4) + n.convertNu«(1) +

|

System.out.println(-413 converts to " + nua);

n.convertNum(3);

22:

23: 24:

9

}.

la Sjouienie llave que cierra ()).

Un uso 0,,, -e h ^ * break .cede

He aquí la salida del programa:

misn1as instrucciones. Para cumphr con «

cncucnl,,.

^

nillgun resuhado; switch ejeeman, las la

««ch.

«guíem

valores de 2, an

odd

switch

^

i >

(x) 2:

case

4:

x

is

413 converts to four one three

El corazón de este ejempio es, por supuesto, la instrucción principal switch a la mitad del método en las líneas 4-16. switch toma el argumento entero que fue pasado a convertNun.()

y, cuando encuentra una coincidencia, devuelve el valor apropiado de la cadena. (Observe que este método está definido para devolver una cadena, a! contrario de otros métodos que ha definido hasta este punto, los cuales no devuelven nada. Mañana aprenderá más acerca de

r.umber.

case

Pür ejemplo, en

{

esto.)

case 6:

sv.tem.out.printlnrx is an even nu.ber. d.f.ult:

);

# #

t ¿i m

No se necesitan instrucciones break en el programa NumberReader debido a que se usa la

instrucción return en su lugar; return es similar a break, excepto en que interrumpe total mente la definición del método y devuelve un valor simple. De nuevo, aprenderá más acerca

de esto mañana, cuando vea cómo definir métodos.

Hasta aquí, probablemente ha visto suficientes métodos main () para saber qué está pasando, pero veamos este méiodo rápidamente.

• La línea 20 crea una instancia nueva de la clase NumberReader.

conver-tlt().

• La línea 21 define una cadena llamada num que será la concatenación de los valores de cadena de los tres números. Cada número se conviene mediante una llamada al método 1:

2:

3: 4:

5: 6:

7: 8:

9:

16:

11: 12:

13: 14:

convertNum().

class N .mberReader { String convertNum(int val)

switch (val)

{

case

0:

return

case

1:

return

case

2:

return

case

3:

return

case

4:

return

case

5:

return

case

6:

return

case

7:

return

case

8:

return

case 9:

return

• La línea 22 despliega el resultado.

{

"zero

"

"one

";

"two

";

Ciclos for El ciclo for repite una instrucción por un número especificado de veces hasta que una condi-

"toree

"four

"

"five "six

" ";

"seven

"eight

"nine

"

, ción se cumple. Aunque los ciclos for frecuentemente son usados para la iteración simple en la cual se repite una instrucción por un número preciso de veces, se pueden usar para casi cualquier tipo de ciclo.

í!


Listas, lógica y cicios

Día 5

'est0es' USIed Pde*>*>* 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 <

cuerpo del ciclo

• Las líneas 3 y 4 declaran los arreglos; arrayl es un arreglo de enteros, los cuales se inicializaron a algunos números apropiados. array2 es un arreglo de números de punto notante de la misma longitud que arrayl, pero no tiene valores iniciales

bool

e.m, .Í<18>. Si la cxprcs.on devuelve true

9 #

m

# #

t


i

Listas, lógica y ciclos

El cuerpo del ciclo se ejecuta una vez antes que se evalúe la condición de prueba, i < 16; entonces, si la prueba la evalúa como true, el ciclo se repite una vez más. Si es f alse, el

„„„.,

1 ciclo termina1. Tenga en mente que en los ciclos do el cuerpo del ciclo se ejecuta al menos una vez.

El listado 5.6 muestra un ejemplo sencillo de un ciclo do que imprime un mensaje cada vez que el ciclo itera (10 veces, para este ejemplo):

Escriba 1:

arrayí (Recuerde que esa

Listado 5.6. El texto completo de dotest.java.

class DoTest {

2:

public static void main (String arguraents[]) {

3:

int x

4:

do 6:

{

System.out.println("Looping, round " + x);

7:

x++;

8:

} while

9:

10:

1;

(x <= 16);

.-,}

}

.

La salida del programa es como sigue:

Salida

Looping,

round

Looping,

round 2

1

Looping,

round 3

Looping,

round 4

Looping,

round 5

Looping,

round 6

Looping,

round

7

Looping,

round

8

Looping,

round 9

Looping,

round

10

Interrupción de los ciclos En todos los ciclos, el ciclo finaliza al cumplirse una condición probada. Podría suceder que durante la ejecución de un ciclo ocurriera algo por lo que usted quisiera salir del ciclo antes

ción.povloqicsiéstaes

menos una ve ..

de su término. Para eso puede usar las palabras clave break y continué.

^5

i;in>poco lc ^' N

Usted ya conoce a break como parte de la instrucción switch; break detiene la ejecución de una instrucción switch, y ei programa continúa. La palabra clave break, cuando se usa

*

con un ciclo, hace lo mismo: detiene inmediatamente la ejecución del ciclo actual. Si ha

una vez. Los celos de se parecen a esto:

do {

_ ^

i++¡ //

} while (i < 10>;

m

cuerpo del ciclo

anidado ciclos dentro de ciclos, la ejecución continúa con el siguiente ciclo exterior. De otra manera, el programa continúa con sólo ejecutar la instrucción siguiente después del ciclo.

131


if

(i • X++ > 400) break out;

//.aquí va el ciclo interno // aquí va el ciclo externo

ciclo:

int count = e¡

while (count < userDatai.length) { if (userDatai[count] == 1)

userSaSTícunt] = (float) userDatai[count++];

#

na al celo intenor y reanudaría la ejecución con el ciclo externo

Íl T e

f or anida-

cuatro, ambos ciclos finalizan al mismo tiempo.

Escriba Listado 5.7. El texto completo de labeltest. java.

count2 =

public static void main (String argumentsf]) {

4:

thisLoop:

t

for (int i = 1; i <= 5; 1++)

6:

int count = 8 int

25:

J;

for (int j

7:

,

while (counf* <= userDatai .length) {

9: 11:

:[count2++] - (float)userDatai[count];

Ciclos pt;quetados

ciclo fuera d I ciclo actual.

L la etique: , después de la palabra clave, como en el

°Ut 'for

( nt i = 0; i <1

w ile (x < 50) {

i ls

' 3

j);

}

La salida del programa es:

Salida

,. .> «,<». de un

«. „„ c<k . «dio o • la »8"'

{

System.out.prlntln("en(J of loops");

12: 13:

J++)

break thisLoop;

contii ue; userData

} <= 3;

if (( i ♦ J) > 4)

8:

if (userCatai[count) =- 1)

= 1;

System.out.println("i is " + i + ■

con « »

i is 1, i is 1 i is 1, j is 2

i is 1, j is 3 i is 2, j is 1 i is 2, j is 2 i is 2,

j

t # #

1: class LabelTest {

que llevar registr . de dos contadores de arreglo d.lcrenies:

m

is 3

end of loops

Como puede ver, el cic.o iteró hasta que la sumaa de q de ii y y jj fue fue mayor mayo que 4> dos celos salieron sal bl dos celos all bloque exterior y se desplegó el mensaje final.

en(onces jos


Día 5

Semana 1

cic,Os y lógica, puede hacer que la computadora

Ahora que ya ha sido introduc, o a a« decida cuándo desp.egar repetiente

usted aprendió como deCarar una

cambiar elemenios del arreglo. Con las ,n

ueco

^^f y ¿tch. ¿t. puede p d,n^^ ^^ .„ aprenJl0

girsc a pa.es diferentes de unpro,- basado^ J ^ ^^ ^ ^ ^ UM p0,

Vale ,a pena repet. Usted usará ja»a. Us

* #

en*

Pregunta;; y respuestas

nesI)araunlf.Cu-.«.

Día

6

■"

lf ,cnn¡ ,6,1.

«»

„„ ,«vo ,„„„,« * W.v.V...

Creación de clases

R

Sí; :

m

° °"os ""íU1'jC! de p"» n, n^ciud»: por.

c ,,„,», „, I.,,

cuÍIÍT 1

q

laS daSeS de Ia biblio[e« ^ Java

que usled puchera necesitar (String, Math y similares).

w

Hc^usted va a ,a cabezade la Case por lo que ha aprendido de,,enla, al crear

ciases e identificar lo siguiente:

• Las panes de una definición de clase

• La creación y uso de variables de instancia • La creación y uso de métodos

• El método main () que se utiliza en las aplicaciones Java

• El uso de argumentos pasados a una aplicación Java

m m

M HUÍS

m


Creación de clases

4:

npfinición de clases

137

■ String sex;.

5:

boolean hungry;

6:

int age;

7:

Esta definición de clase contiene cuatro variables. Éstas son variables de instancia porque no

class Ticker { //

están definidas dentro de un método. Las variables son las siguientes:

cuerpo de la clase

• color

L forma germinada, las clases heredan de ,a Case Object. la cual es la sudase de todas las clases en la jerarquía de clases de Java.

• sex

Si su clase es una subclase, la palabra clave extends se usa paro indicar la superch.se de la

Una cadena que indica el género del jabbciwiKk

• hungry

nueva clase. Observe a la siguiente subclase de Ticker.

Una variable booleana que es true si el jabberwock está hambriento y f alse

en caso contrario

• age

class SportsTic<er extends Ticker { //

El color del jabberwock (por ejemplo; naranja, limón, amarillo limón, u ocre-

quemado)

cuerpo Je la clase

La edad del jabberwock en años

Constantes Las variables son útiles cuando usted necesita almacenar información que se pueda modificar al ejecutar un programa. Si el valor nunca se debiera modificar durante la ejecución de un programa, puede usar un tipo especial de variable denominado constante.

Término Nuevo

Una constante, también llamada variable constante, es una variable con un valor

que nunca cambia. Esto podría parecer una contradicción, dado el significado de la palabra "variable".

variables locaies. 1a siguiente sección detalla los métodos.

Definición de variables de instancia e! día 3, Ene! día 3,

"Los / BCs de Java", aprend.ó cómo declarar e ini Los / .bu uc «v» , t

c»,,o

Las constantes son útiles para definir valores compartidos para lodos los métodos de un obje to; en otras palabras, para dar nombres significativos a valores que no cambian en todo el calizar las v .nables locales

t^

objeto. En Java, usted puede crear constantes para todos los linos de variables: instancia, clase y local.

de instancia se

Nota

;.,,„,„„, v

Las variables locales constantes no eran posibles en Java 1.0.2, pero se agre garon al lenguaje desde Java 1.1. Esto es importante si usted quiere crear un

applet que sea totalmente compatible con Java 1.0.2. Aprenderá más acerca de esto durante la semsna 2, "Temas avanzados de Java".

cual hereda de su : uperclase, ReptUe.

1: class Jabtxrwock extends Reptile { 2:

3:

l'iirn dcclnrur umi consumió, uso ln paliihrn clnve final miles de la lUx-liinición de variulili- e incluya un valor inicial para esa variable, como en la siguióme: final float pi = 3.141592; final boolean debug = false;

final int numberOfJenny = 8675309; String color;

# #

t m


¡i

Creación de métodos desempeñar durare su existencia).

J

V 'aS dlVerSaS IarCaS ^C ésle

final int LEFT = B;

final int RIGHT = 1;

Definición de métodos

alignment se declara como un int:

•- ■-——

con lo siguiente:

-

Las definiciones de método tienen cuatro panes básicas • El nombre del método

• El upo de objcio o tipo primiiivo devuclio por el método • Una lista de parámetros

thxs.alignn-ent = CENTER;

• El cuerpo de un método

También puede verificar una alineactón dada:

Las tres primeras partes de una definición de método conforman Jo que

switch (this.alignment) {

se denominayí/wü del

^fLargarse de .lin..cion L break;

C88' "°lTnUr».r.. <* alin..ci6n derecna break;

Encargarse Oe .Iin«ci6n central

alende, acerca de estas partes de la ^^Z^^Z'*

breaK;

this.alignment = CENTER; this.alignment = 2;

Variables de clase Como aprendió en las lecciones an^enojc

«do. en ve, de ser almacenadas ,ndw,dua,n

us vanab.es de clase son bue;as pan^^ 0 para llevar un registro de informan relat.a

dc dMe aplican B una clase como un ^ ,a dase

^

^ un COI1Junto de ob.e.os.

Upa,b,a Cave static se usa en la declaran de clase par

como en lo siguiente:

^^t maXObjects - 1.;

r.,Ur»Typ, „ «, 1¡po primiljVo „ C,,M M ^


Día 6

140

Oh

„ ,e si este método devuelve un arreglo de objeto, los corchetes del arreglo pueden ir

Observe que s, e te me

21:

^ ^ ^ ^ ^^ Puesl0 que la forrna

22:

r:,o:rÜS^e!r, así se usa en lo, ejcmp.os de este li.ro, co.no el siguiente:

23:

}

intl] makeRange(int lower, int upper) { // cuerpo de este método

Lasalida 'del programa es la siguiente:

L lista de parámetros del método es un conjunto de declaraciones de variables, separadas por

cc^ emre paréntesis. Estos parámetros se convierten en variab.es locales en el cue^o del

Salida

The array: [ 1 2 3 4 5 6 7 8 9 10 ]

método, recibiendo sus valores cuando se llama al método. ;

Usual puede tener instrucciones, expresiones. Humadas de métodos a otros objetos cond, dónales, ciclos, etcétera, en el interior del cuerpo del método; todo lo que usted ha apruul.do en las lecciones anteriores.

A menos m,c un método haya sido declarado con void co.no su tipo de retorno, el método

# a un

for para nnpnmtr los valores del nuevo arreglo.

La palabra clave this

Luclve algún tipo de valor al finaliza, Este valor debe ser devuelto exphcuamcnte en algún

#

objeto o pasar el objeto

punto dentro del método, mediante la palabra clave return.

comoHin argumento

El lisruio 6 2 muestra un ejemplo de una clase que def.nc un método makeRanget). Este

Le los (un límite inLior y un Hm.te supenor) y crea un arreglo que connene todos

*

,os enteros entre esos dos límites. Los límites se incluyen en el arreg.o de enteros.

1 :

class

int arrU = "*" *ntl <uPPer " lower)

3: 4:

arr[i]

6:

return

8:

lower++;

this.resetData(this,; // llanda al método resetData, definido en // esta clase y pasándolo // al objeto actual

return this;

18:

tjUc esto se ssume en íorm:i *iiitnmóiir"i prtP „■

■puMic static void main(String arguments[]) {

11 :

int theArray[];

12: 13:

'14: 15: 16: 17:

i..,.,..:, v „ tM „ pc,.¡ ■

como sigue:

theArray = theRange ^nakeRange(1, 18); System.out.print("The array: [ ")! for (int i = 8; i < theArray.length; i+*)

t = X>'

+

);

.

r ■

i

j

r

J"iomatica. For ejemplo, puede referirse a ambas variables de uenniajs en la clase actual simplemente por nombre, porque

ui¿.í> esta implícita en esas referencias Por lo [-inr~i

RangeClass theRange = new RangeC^ass(),

System.out.print(theArray[i]

18:

,, devuelve el objeT£) actual

En muchos casos podría no necesitar hacer uso explícitamente de la palabra clave this, ya ""

arr;

}

9:

19:

=

}

7:

26:

]

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

5:

gUmem° a UIVm¿1Od°- COm° Val0r ^vuelto para el método

//la variable de instancia x para este objeto

langeClass {

in •[] makeRange(int lower, int upper) {

2:

"í

ctua 2«» P

actual, etcétera. Los sigujemes son ejemplos del uso de this:

Listado 6.2. El tfxto completo de rangeclass . java.

'

i*

"k-

""' 'f 0S Prlmeros dos

/; la friable de instancia x para este objeto

resetDatafthis); // namada al método resetData method, definido // en esta clase

Systera.out.println(*]");

Mota

La omisión de la palabra clave this para variables de instancia, dependería de la ex,stenc,a de variables del mismo nombre declaradas en el alcance

local. En la próxima sección verá más acerca de este tema.


Día 6

Ésta es la salida: test =20

"°mbre >- definició" La primera, una

oca?con' el7m.smo nombre, pero> con ^^ d Val°r local 10 L test dentro local el valor 20. C°" La variable

u na

1Ón'

Ío2 Z

—-

d ,a pane que dcf.nc c. alcance ta «cenado su ejecución.

variable deja Ce existir cando la pane

Us variables d : clase y de msu.«..al .t

° 0Cl1 ) riW

- E1 "^odo printT..t(, to

aislar este prob.ema mediante

SÓ1° USar test Para referi- a la varia-

^ ^ ^ „„

^^ ^ (lo sl| clslsl.

método cu: ^

Teau^ .

c t un oh

¡

ble de insume.. o de clase en, .

"

this ble: loca

encontrarla.

Wi'ble

na subclase

PreV'r!°S Para CambÍar ^ Val°r de Una Va"íible dc ¡"«""i pero ,a varia-

h"13 m°, fiC3da- Otra íaI'a dC P"»*™™^ « ^ cuando us.ed conv.erte por

b r3a que S£ese3 °tra: SU Var¡abledesde dC ÍnSta"CÍa P°d- encambiar , d° deb.do valor dse "" estaba^obteniendo la supenrla.se vez de™¡«su

.tda^r/Í, T le C°mpOnamÍenI° es ser «ufcloso «>n las variables definidas en odas las superclases de su clase. Esta precaución lo previene de duplicar una variable que

está en uso en un nivel superior en la jerarquía de clases.

Paso de argumentos a métodos Cuando usted llama a un método con parámetros de objeto, los objetos que pasan dentro del

cuerpo del método son pasados por referencia. Cualquier cosa que usted le haga a los objetos

dentro del método, afecta a los objetos originales. Tenga presente que entre tales objetos se mcluyen los arreglos y todos los objetos que es.án contenidos en arreglos. Cuando pasa un arreglo a un método y modifica sus contenidos, el arreglo original es afectado. Los tipos

primitivos, por otro lado, son pasados por valor.

f

El listado 6.4 demuestra cómo funciona esto: Listado 6.4. U clase passbvbeference. 1: class PassByReference {

2:

3:

. int onetoZero(int arg[]) int count = 6;

I


Creación de clases Día 6

1451

144

'Las líneas 14-16 establecen los valores iniciales para este ejemplo. El primero es un arreglo de enteros; el segundo es una instancia de la clase PassByReference, la cual es almacenada en la variable test. El tercero es un entero simple para contener la cantidad de unos en el

L.STADO 6.4. CONTINUADOR

arreglo.

for (int i = 6; i < arg.length; i**) {

4:

5:

if (arg[i] == D i

6: 7:

Las líneas 18-22 imprimen los valores iniciales del arreglo; usted puede ver la salida de estas

líneas en la primera línea de salida.

arg[i]

8:

La línea 24 es donde las cosas suceden realmente; ésta es donde usted llama al método definido onetoZero() en el objeto test y lo pasa al arreglo almacenado en arr. Esie méto do devuelve la cantidad de 1 s en el arreglo, que usted entonces asigna a la variable numOnes.

9: 10: 11:

return count;

12:

¿Lo ha podido seguir hasta ahora? La línea 25 imprime la cantidad de unos (el valor que usted obtuvo de vuelta del mélodo onetoZero()). Devuelve 3, como usied esperaría.

13: 14: 15:

16:

int

nuroOnes;

La última sección de iíneas imprime los valores del arreglo. Puesto que una referencia al objeto del arreglo se pasa al mélodo, modificar el arreglo dentro de ese mélodo modifica la copia original del arreglo. La impresión de Jos valores en las líneas 27-30 lo prueba (la última línea pie la salida muestra que todos los unos en el arreglo han sido cambiados a ceros).

17: 18:

19:

System.out

26: 21: 22: 23: 24:

System.out. println("]");

Métodos de clase

numOnes = test

Ones

=

numOnes);

La relación entre las variables de clase y de instancia es directamente comparable a cómo

funcionan los mélodos de clase y de instancia.

25:

26:

Los métodos de clase están disponibles para cualquier instancia de la clase misma y pueden ' estar disponibles para otras clases. Además, a diferencia de un método de instancia, una clase

27: 28:

29: 36:

System.out.println("]");

no requiere una instancia de la clase pura que se pueda llamar a sus mélodos.

31:

Por ejemplo, las bibliotecas de clases de Java incluyen una clase llamada Math. La clase Math define un.conjunto1 desperaciones matemáticas que puede usar en cualquier programa en

i- cualquiera de sus diferentes tipos de números, como en el ejemplo a continuación:

Ésta es la sal da del programa

float ro'pt = Math.sqrt(453.0);

Val jes of the ar-ay: [1 Nunoer of.Ones = 3 Nev valúes of th '. array:

«345087 0 34

System.out.print("The larger of x and y is " + Math.max(x, y));

Para definir los métodos de clase, utilice la palabra clave static delante de la definición del

. cucnn el número de un » en e, arreg.o y devuelve ese va,or. . Sumíi iye con un 0 a c:« a 1 en el arreglo.

mélodo, tal como usaría static frente a una variable de clase. Por ejemplo, el método de clase.max () que se usa en el ejemplo anterior podría tener la firma siguiente: 'static inf max(int arg1, int arg2) // cuerpo del método

}

.

t

é


Creación de clases

Día 6

La clase punto de inicio para su aplicación sólo necesita una cosa: un método main() Al

cade,»-

d^sTd: I3' CÍÓ"' d métOd° main'' M l0 PrÍmer° *" SC llama- A ^ **™ ""da

el t'empo m SOrpre"derle; ha eStad° Creando "P^aciones Java con métodos nain() todo

como ». in«.

La firma para el método main () siempre luce así: int count -

;

p.r..lnt(, -o un entero

En ,a instrucción anterior, el valo

con un «lor de 42, y éste es almacenado

publie static void main(String argumentsm / //

cuerpo del método

'I

La ralta de una palabra Cave .«tic a. frente de. n-

!

He aquí un recorrido de las partes del método main()

-t

• Publie significa que este método está disponible para otras clases y objetos. El método

Rancia. Los métodos de jns— opera en un £, ^ ^

mainf) debe ser declarado public. Durante la semana 3 aprenderá más acerca de

publie y prívate.

• static significa que main () es un método de clase.

• void significa que el método main () no devuelve un valor.

• main () toma un parámetro, el cual es un arreglo de cadenas. Est, argumento se usa para argumentos de programa, que conocerá en la próxima sección.

El cuerpo del método n.ain() contiene cualquier cód.go que usted necesite para iniciar su apl.cac.6n, como la inicialización de variables o la creación de instancias de clases. Cuando Java ejecuta el método n.ain(), tenga presente que main() es un método de clase Una mstancta de clase que contenga main() no se crea automáticamente cuando su programa

■Creaciójid^cwo^^^^

esta en ejecución. Si desea tralar esta clase como un objeto, tiene que crear una instancia de

ella en el método main ().

Clases auxiliares Su aplicación Java puede tener sólo una clase o, en el caso de programas más grandes, podría

estar compuesta de muchas clases, donde se crean y usan diferentes instancias de cada clase

appleu requic :n un poco n«* * « naveBador. así como para d>bujar y

m.entras la apl.cación se está ejecutando. Usted puede crear tantas clases como desee para su

e, $islema grffico

programa.

pequeñas

Si está usando el JDK, las clases deben ser accesibles desde un directorio que

esté listado en su variable de ambiente CLASSPATH.

En tanto Java encuentra la clase, ésta será utilizada por su programa mientras corre. Observe,

cla« qm

sirve pomo pumo de

sin embargo, que únicamente la clase de punto de inicio necesita un método main(). Después

íí


Día 6

los

métodos dentro de varias clases y objetos usados en su programa

dos cuando realmente se ejecute el programa.

Aplicaciones Java y argumentos de línea de comandos

Escriba 1

-

class EchoArgs {

2 3

,.public static void main(String argu^entsí]) {

4

System.out.printlnrArgun.ent ■ + i + -..

5

la depuración de entrada o indicar un nombre de anduvo para ser cargado.

m +

arguroentsfi]);

6:

7: }

Paso de argumentos a las aplicaciones Java

#

L0SÍgUÍemé es un eJemP'° d^ ^'rada para ejecutar este programa java EchoArgs Wilhelm Niekro Hough 49

línea de comandos.

P,,, pasar argumentos a un programa Java en Windows o Solaris, se deben agregar a la línea

Loman^,. ejecutar e> programa. Lo sigincn.c muestra un WU, java MyProgram argumentOne ? three

Salida

En los ejemplos anteriores se pasaron tres argumentos a un programa: argu.entOne. e,

Sl 2 y thr... Observe Muc cada argumento es,á separado por un c,u,

Para agrupar argumentos quc ,ncWyen ^¿^

■dob.es. Por ejemplo, e, argumento -Noyóes ,o SJx^J^

Argument Argument Argument Argument

0: Wilhelm 1: Niekro 2: Hough 3:

49

He aquí otro ejemplo de entrada para ejecutar este programa: java EchoArgs "Hoyt Wilhelm- Charlie Hough Y aquí la salida que produce:

cuanl es enviado al programa y recibido u.ilizando el método maxn(,.

Salida

Argument 8: Hoyt Wilhelm Argument 1: Charlie

Argument 2: Hough

Manejo de argumentos en su aplicación Java

Cuando una apUeaci.n se escuta con <^^^^Z

a^e > H

"cadenas y pasa el arreglo al método mam() de la jplit.icion. kl

ta: I»"!"*» entre

arreglo de argumentos.

una unidad

main():

public static void main(String argumentsl)) { // cuerpo del método

Nota

íT0 d,enar9Ument0S en Java no es a^logo a argv en C y UNIX. En parr. arg[OJ o arguments[0J, el primer elemento en el arreglo de argu-


Creación de clases

Día 6

método, como sigue

^:;: r crnirios ^^ ilamad° ParSeInt' Cambie <* '/«• 6 para usar ese

sum += Integer.parselntíargumentsfi]);

El programa se compila exitosamente. Ejecute ia apücación de ,a siguiente n.anera: java SumAverage 1 2 3

La salida producida que usted debería ver es: Sum is: 6

|, Average is: 2

Resumen

Zcl * y - de averigua, qué hace. A SUMAVERAGE.JAVA.

2:

int

3:

sum

=

i - •! i < .r,»«nt..l.nBth; !♦♦) t

4:

fcr (int i

5:

!

sura += arguments[i),

• Variables de clase y de instancia, las cuales contienen los atributos de una clase v obje-

6:

¿cabiae r rr de en:Aprendió cómo deciar

7:

vanables locales y como declarar constantes.

8: 9:

«le una Case. í"110"1'" ^'^ defi"e ' lndUyend° laS PaneS d£ "^ fi™a de ^'«to. cómo s? laa"palabra 3 ""iclave"this mélOd0' CÓm° " alPaSa" '0Sanual ar8U"lenIOS a '« -'odos y cómo usar para referirse objeto

16:

11:

12: 13:

el

"'^ ;l '» '■«

usted solía usar con

1:

devolve ,

} }

c:

SumAverage.java:6: Incompatible type

f

+=. can't convert

java.lang.String to

sum += arguments[il;

_■ Aun cuando usictl

h

Hasta mañana, la lección ha terminado.


Día 6

Preguntas y respuestas

■J V

Semana 1

P usted mencionó que las variables locales constantes no pueden ser creadas en

íl|M,U.|s que son compatibles con .lava 1.0.2. ¿Por qué desearía yo crear programas

,|ue no usen las características del lenguaje en Java 27

R La razón más probable es que usted está tratando de crear un applc. que funcione en la mayoría cié los navegadores. El soporte completo para las versiones posteriores a 1.0.esiá retrasado en navegadores como Netscape Navigator e Internet Lxplo.er de

Microsoft, aunoue JavaSofl está trabajando para corregir esto. La situación se expone ampliamente durante el día 8, -Cómo poner programas interactivos en Web .

P Ei. mi clase, tengo una variable de instancia llamada origin. También tengo en un método una variable ¡ocal llamada origin, la cual a causa del alcance de una

variable, queda oculta por la variable local. ¿Hay alguna forma de aislar el valor

de la variable de instancia?

R l a manera más sencilla es procurar no darle a sus variables locales los mismos non,-

bres que los'que tienen sus variables de instancia. Si siente que debe hacerlo, utilice this.origin para referirse a la variable de instancia y origin para refer.™ a la va-

Día

7

riablc local.

|. Fscrihí.... programa que loma cuatro argumentos, pero si le doy menos argumen-

[i interrumpí abruptamente su ejecución con un error de tiempo de ejecucon.

R „ ,,.-,, de !a canudad y ,ipt. He ^umentos que W™^™^" devuel >c un mensaje de errorr si no lo» ha recibido.

Uso de métodos para realizar tareas .Los métodos son, defini.ivan.enie. la pane más importante de cualquier lenguaje orientado a objetos, debido a que definen toda acción de un objeto.

Las clases y objelos proporcionan un marco de trabajo. Las variables de clase a' de

instancia brindan una forma de describir qué son bs clases y los objetos, única-''

mente los métodos pueden definir el comportamiento del objeto (qué es capa/ de

hacer y cómo inleraciúa con otras clases y objetos);

Ayer aprendió bastante acerca de Ja definición de métodos, y pudo aplicar este

conocimiento a crear programas Java. Sin embargo, podría llegar a olvidar algunas características que hacen poderosos a los métodos (características que hacen que

sus objetos y clases sean más eficientes y más sencillos de entender) Hoy .pren

derá acerca de las siguientes características:

,.

,. Sobrecarga de métodos. Cómo crear métodos con múltiples firmas y defini-

: ,

dones,, pero con el mismo nombre.

• Creación de métodos constructores. Los métodos que le permiten inicializar objetos para establecer su estado inicial cuando se crean.


Uso de métodos para realizar tareas

J .-I

Día 7

El próximo proyecto es crear un método sobrecargado. El listado 7.1 muestra una definición

de clase simple para una clase llamada MyRect, la cual define una figura rectangular con cua tro vanables de instancia para establecer las esquinas superior izquierda e inferior derecha del

rectángulo: x1,

Escriba

sistema.

yi,

X2 y y2.

Listado 7.1. Los inicios de myrect . java.

class MyRect { int x1 = 0; int y1

= 0;

int x2 = 0;

int y2 = 0;

io.cca de clases de Ja dosvalueOf O tremes.

}

de, ülro por dos cosas:

Mota

■dad de aromemos cpie toman.

' LaUin'1'

. l'.l li|>11 l'': t''"ns

"" ,-.U);■ ^ c;k1:i aip»"01 J

Aunque haya compilado exitosamente este programa, podría no ejecutarse debido a que no hay un método main (). La versión final podrá ser compila da y ejecutada cuando usted haya terminado de construir esta definición de

d» co» «I »»»■»

clase.

Cuando se crea una nueva instancia de la clase MyRect, todas sus variables de instancia se ¡ni-

aal.zan en 0. Usted puede añadir un método de instancia buildRect () p;ira asignar las va

nables a sus valores correctos como las dos esquinas de un rectángulo. Este método toma cuatro argumentos enteros y devuelve el objeto rectángulo resultante. Debido a que los argumentos

tienen Jos mismos nombres que las variables de instancia, la palabra clave this se usa dentro del método cuando se refiere a las variables de instancia. El siguiente código es para buildRect () : MyRect buildRect (int x1, int yi, int x2, int y2) { this.xi

= x1;

this.yi

= yi;

this.x2 = x2; ' this.y2 = y2; return this;

Con este método se pueden crear rectángulos ¿pero y qué tal si usted quería definir las dimensiones de un rectángulo en una forma distinta? Una alternativa podría ser utilizar obje tos Point en vez de coordenadas individuales. Para ¡mplementar esta alternativa, puede

sobrecargar buildRect () para que su lista de argumentos tome dos objetos Point. Observe

Jo siguiente:

MyRect buildRect(Point topLeft, Point bottomRight) i x1

= topLeft.x;

y1

= topLeft.y;

x2 = bottomRight.x;

155 L55J


Día 7

156

157 |

t 25: y2 =

-.-.-

bottomRight.y;

26:

;

return "this;

.

>

iara cue -l^cione el método anterior, se debe importar la clase Point al inicio del archivo

27:

f i

2e:

32:. 33:

Úi siguiente es una definición para un método sobrecargado: xi.:= topLeft. x;

37: 38:

y2 =

40:

-x2 = (x"1 + w) ; " (yi

return

+

St

35:

x2

36:

-vi-'- topLeft.y;

-■•■

void printRect(){

34:

MyRect twildRect(Point topLeft, int w, int h) { ""' ■

39:

h);

this;

rect = new MyRect();

41:

}■'"■

Syste«;out.prlntlnrcalling

42:

rect.printRect();

44:

,a de clul con todos sus métodos: tres métodos bu

#

rect.buildRect(25, 25, 56, 50)-

43:

un método main().

#

return this;

31:

U. lór,na:i.osib,e de dcímir el ,ee,ángulo es usar ul,a «quina, supe, u,r. un aUo y un ancho.

;;

(xi + w);

,,y2 = (yi + h);

38:

YueiXu'para. que Java pueda encontrarla.

yi = topLeft.y;

X2 =

29:

System.out.println("**•");

45: 46:

:

points 47: 48:

Listado 7.2. El texto completo de myrect .java,

49: 1:

2: 3:

import

class MyRect int x1

= 6;

5:

int y1

= 0;

6:

mt

x2

=

8;

7:

int

y2

=

a;

10:

11 : 12: 13: 14:

53: 54:

. ■

rect.buildRect(new Point(ie,i0)

55:

56:

57:

MyRect ¿uildUectlint S1, int y1,

9:

51: 52:

{

4:

8:

System.out.println("***");

50:

java.awt.Point;

.'. '

this.xi = x1;.

■-■

this.yi = yi; this.x2

=

this.y2

= y2;

x2,

int y2)

{

x2;

return this;

58:

rect.printRect();

Systei». out. println ("**-");

}

Lo siguiente es la salida:

Salida

15: 16: 17:

18: 19: 28:

21: 22: 23: 24:

MyRect buildRect(P0int topLeft, Point bottornRight) x1

=

topLeft.x;

yi

=

topLeft.y;

x2

=

bottomRight.x;

y2

=

bottomRight.y;

return

this;

■ Calling buildRect with points (10,10) MyRect: <10,

10, 20, 20>

point

50

5e).

)j


Uso de métodos para realizar tareas

Métodos constructores básicos L- Métodos consecres !ucen mucho como métodos regula.es. con dos diferencias básicas:

n llamados. Puede de ar el componam.emo ron.cr

• Siempre tienen el mismo nombre que la clase. • No tienen un tipo de retorno.

en las líneas 17-23

bottOmRight)

*-

í

: topLeft.y,

MyRect

Escriba 1: 2:

os cn.cros. Con

3:

««««o argi.mcn.o

4:

-

Listado 7.3. La clase person.

class Person { String ñame;

'

int age;

5:

Person(String n, int a) {

6:

ñame

7:

age

8:

=

n;

-

= a;

9:

10:

void printPerson() {

11: 12:

}

13:

System.out.printCHi, my name is Sy.tM..ut.printlnr. X ..-*.,.

14: 15: 16:

;

17:

P = new Person("Luke", 50)p.printPerson();

18: 19: 20: 21:

22:

23:, 24:

System.out.prlntln("

");

System.out.println("

•■);

P = new Person("Laura", 35)p.printPerson();

}

Lo siguiente es la salida del programa:

Todos los ejemplos que usted ha creado

T

¡Jijm Hi-_my ñame is Luke. I am 50 years oíd. my ñame is Laura. I aro 35 years oíd.

ilamado PrlntP.í.on() pan, que e.Xo s pueda o eda ■presentar" " ' a"sí mismo, y un métodométOd° objeto se Min (, para probar las cosas


Uso de métodos para realizar tareas

Cómo llamar a otro método constructor A prime» >- * "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:<tq coMnn^mrrr».JAW

import java.awt.Point; class Myfiect2 { int xi = o; = e;

5:

int y1

6:

int x2 = 0; int y2 = 0;

7:

8: 9:

int

x,

y,

11:

radius;

this.yi

12:

MyCircle(int xPoint, int yPoint, int rad.usLength) < this.x =

> 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: <- + x1

Syit«..out.println(V + x2 + ",

y2


Uso de métodos para realizar tareas

Día 7 162

Creación de métodos que sobrepongan a métodos

existentes

, Para .sobreponer un método, ,odo lo que tiene que hacer « crear un método en su subclase que

tenga la misma firma (nombre, tipo de retorno y lista de argumentos) que un mftodo dormido por la supcrelase de su clase. Como Java ejecuta la primera definición del método que encuentre

que coincida con la firma, la nueva firma oculta la definición original del mé.odo.

Aquí tiene un ejemplo sencillo; el j¡slado 7.5 muestra una clase simple con un método llamado

printMe(). el cua] imprime el nombre de la clase y los valores de sus variables de instancia. 44:

rect.printRect();

45:

System.out.println*

Escriba

).

46:

1:

47: 48: 49:

Listado 7.5. El texto completo de printclass.

class PrintClass {

2:

int x = e;

3:

int y =

1;

4:

50:

rect.printRect();

51:

System.out.prmtln(

5:

)

void printMe()

6:

52:

7:

53:

8:

54:

9:

55:

{

System.out.println("x is " + x + ", y is • + y)■ System.out.println("I am an instance of the class this.getClass().getName());

10:

El listado 7.6 muestra una clase llamada PrintSubClass, que es una subclase de MyRect

PrintClass. La única diferencia entre PrintClass y PrintSubClass es que es.a última

: <25, 25, 68.

tiene una variable de instancia z.

Escriba Listado 7.6. El texto completo de printsubclass.java. 1: class PrintSubClass extends PrintClass f

2:

int z = 3;

3:

Sobreposición de métodos Cuando usted Ua.na a un método de -»*^

.ri(ikMniic ^ mélodo nacia arriba en I. jerarq-a

cla« del objeto. Si no la encuentra pasa 1 Han» ^ ^ ^^ ^ y „„,. mclodos llc clases has.a que la localice. La heren u «petidan^e en «ibcU-e, «n tener «,uc

Sin embargo, podría haber ocasiones en que u

^ ^.^ ^ ^ ^^ a fc

a es£ méiodo para sobreponer

Séwdo. pero q- tenga un componam.e„» *-mo ^^ ^ qu£ £¡ m¿todo de una 0. defina un método en una subclase

vez

^ ^ subdase y se ejccula

4: 5:

6: 7-

8:

publie static void main(String arguments[]) { PrintSubClass obj = new PrintSubClass(): }

}

obj.printMeí):

He aquí la salida del programa: x

is 0,

y is

1

I am an instance of the class PrintSubClass


Usd de métodos para realizar tareas

165 I

Día 7

m

Cómo llamar al método original Suele haber dos razones por las que usted necesita sobreponer un mélodo ya implemcntado por una superclase:

• Para remplazar por completo la definición del método original.

• Para agregar comportamiento adicional al método original.

ver en la salida anterior.

En cuanto a la primera razón usted ya lo ha aprendido: sobreponer un método y liarle una nueva definición, oculta la definición del mélodo original. Hay veces, sin embargo, en que el comportamiento debería ser agregado a la definición original en vez de remplazaría por com pleto, sobre lodo cuando el comportamiento está duplicado tanto en el método original como S6I0 U Case c,ue usted este

aplicación y por tanto, .eeun

ejecutando con el interprete o,

en el que lo sobrepone. A! llamar al método original en el cuerpo del método que se sobre pone, usted puede agregar lo que necesita.

Use la palabra clave super para llamar al método original desde una definición del método. La palabra clave pasa la llamada hacia arriba en la jerarquía, como se muestra a continuación:

• ti clase. printSubClíissZ es i • ■

ilt|o 7 7 uuieslra esta

void myMethod (String a, String b) // hacer cosas aqui •super.myMethod(a,

// ; PRINTSUBCLASS2.

{

b);

posiblemente hay que hacer algo más aquí

La palabra clave super, muy parecida a la palabra clave this, es un marcador de posición para la superclase de la clase. La puede usar donde quiera que utilice this, pero super se

refiere a la superclase más que a la clase actual. Por ejemplo, el listado 7.8 muestra los dos métodos printMe() distintos usados en el ejem plo anterior.

Escriba 1: 2:

Listado 7.8. Los métodos printmeí ).

// desde PrintClass void printMe()

{

3:

System.out.printlnCx is

4:

SysteiB.out.println("I am an instance of the class"

5:

"

+ x +

",

y is

" + y) ;

this.getClass().getName());

6:

7: ■

v se ll.ma al mciCHloprintMeO.s

8: 9: 16:

11:

«••■-*

//desde PrintSubClass2 void printMe()

{

Systen.out.println("x

yis

System.out.println("I an an instance of the class this.getClass().getName());

z is

m


Día 7

tamicnto adicional sin problemas:

::sSobíeP:;s;:prinicra msinicción-usicd n°

// desde PrintClass

íroíí.írintlnCl » } thxs.getClassO.getNameO)

if (condition == true)) s(i2

System.out.printlnCX is " ♦ * . System.out.printlnCY is + y),

ongina>

//

y

añadir

solamente

la

sUper(i,2,;

//

llamar

un

constructor

namar a

un

constructor

pore.

desde PrintSubClass

void printMeO {

super.prmtMeO;

Systera.out.printlnCZ

is

nÍsÍ cu ,au'PUe efear "" ^ "" ^ C°nStrUCt°reS C°" firmas opiatamente

aistintas de cualquiera de los constructores de la superclase. X is 0 Y iS 1 Z

is

un, V

da adicional/

3

Sobreposición de constructores Técnicamente, los métodos constructores ™ ¿

nomb e

J nucws süll ccaüos en vez

el mismo nombre que la clase actua . los

dc SC1- .ccd.dos. Este sistema e, ^»n Sl, dase, se manda Humar al constructor a W

ve, nunda

^ ^ m,loi)o conM,,ltMOr de

ar

class NamedPoint extends Point { String ñame;

NamedPoint(int x, int y, string ñame) {

Si,, emha,,o. a!

¡niciaHzacita de su objeto, no solo ,n,c,ah tamb,én cambiando el contenido de vanab es q« y. cxplíci.amenie los métodos constructores de la supere!.. .

uli,¡cc super.noneretfeJ método (argumentos).

Para llamar a un método en una »P«^»l^¿ de mé,Odo a llamar, se un.iza .a .orma Como los métodos constructores no tienen un siguiente:

super(argi, arg2, •••);

illicializar x ■

import java.awt.Point;

succsivamcnu-. Por lo tanto, la

in,a;,,,Mc,ón ocurre en .odas panes du

"CCCSÍ'C-

r

Listado 7.9. La clase nameopoint.

dc su superclasc. y ese constructor

Uamar-»n cóndor

-"

» cual extiende la clase Point de,

super(x,y);

this.name = name;

'

publie static void main (StringJ] arguments) {

NamedPoint np = new NamedPoint(5, 5, "SmallPoint"):

System.out.println("x is ■" + np.x); System.out.println("y is " + np.y);

System.out.println("Name is " + np.'name);


Día 7

168

Uso de métodos para realizar tareas

La salida del programa es como sigue: x

is

5

y

is

5

Ñame

■ usar finalize()

is SmallPoint

El método constructor definido aquí para NamedPoint llama al mélodo constructor de Point

para inicializar las variables de instancia de Point (x y y). Aunque usted mismo puede ,n.-

Resumen

cializar estas variables fácilmente, tal vez no podría saber qué más está hacendó Point para

inicializarse h sí mismo. Por lo tanto, siempre es una buena idea pasar métodos constructores hacia arriba en la jerarquía para asegurarse que todo se configure correctamente.

Métodos finalizadores

diferente,

condiciones í

;

-os métodos que e«iminan

Los métodos finalizado.™ son casi lo conirarió a los métodos constructores. Un nwwdo cons tructor se usa para inicializar un objeto, y los nu.odos finalizados se llaman justo ames de que el objeto sea recolectado como basura y se reclame su espacio de memoria.

El método finalizado,' es f inalize(). La clase Object define un método finalizador prede

finido que no hace nada. Para crear un método finalizador para sus propias clases, nene que sobreponer el método f inalize {) usando esta firma: protected void finalize() throws Throwable < super.finalize();

Preguntas y respuestas

P Vo creé dos métodos con las firmas siguióles-

Nota

La parte throws Throwable de esta definición de método se refiere a los

errores que pudieran ocurrir cuando se llama a este método. En Java a

los errores se les llama excepciones: aprenderá más acerca de estas en el

día 16 "Circunstancias excepcionales: manejo de errores y segundad". Por

ahora, todo lo que usted necesita es incluir estas palabras cave en la definición del método.

Incluya cualquier actividad de limpieza que desee hacer para este objeto dentro del cuerpo de

ese método f inalize (). También puede llamar a super.f inalize () para que las superclascs de su clase puedan finalizar el objeto, si lucra necesario.

Puede llamar usted mismo a) método f inalize() en cualquier móntenlo (es un método

„,„.., oíros). Sin embargo, llamar a f inalizeí) no activa un objeto para que sea env.ado ;. la basura. Sólo cuando se eliminan todas las referencias de un objeto, éste se marca como Cliniinable.

misma l,Ma de parámetros, ¿cómo sabría Java a cuál llamar''

re"™? <*«» -> ¿P"edo crear métodos ,„.

td l

purñmetrl


Semana 2 Temas avanzados

de Java

8 Cómo poner programas interactivos en Web

9 Cómo mejorar la apariencia de sus programas con gráficos,

fuentes y color

10 Adición de imágenes, animación

Silt

y sonido

11 Construcción de interfaces de usuario sencillas para applets

12

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

13

Respuesta a la entrada del

usuario en un applet

14 Desarrollo de interfaces de

usuario avanzadas con el AWT

i

H</¡*

SlSi


Semana 2

i1ii I»

Día

¡3m >".«'

Cómo poner programas interactivos en Web

s aden'ás ^ Web una eran

de programadores aún están aprendiendo e, lenguaje para ,,cn^ applts

I

É

m

Li

i* MI

^!í^ZVT.enfocó a apremier ;lcerCil deI lcng^e Jav:i p»s- ~-

loci.» u.xL,,,tc. une, de los prognun.s tJUC llslc,| clvrt ,„„,,„ ; |ic.li;ioi , . semana pasará al desarrollo de applets. •"-.u.h.i.ln J.,v.,. I.M..

I


Cómo poner programas interactivos en Web

Día 8 174

Restricciones de seguridad de applets

Hoy usted inicia con lo básico: ■

Debido a que los applets de Java se ejecutan en el sistema del usuario, hay algunas resine-'"

.Las diferencias enueapplets y aplicaciones.

.

c.ones senas en cuanto a lo que un applet es capaz de hacer. Si no hubiera estas restricciones

Cómo crear un applet sencillo.

un programador de Java podría escribir fácilmente un applet que borre archivos de usuario

.Cómo colocar un apple. en una página Web.

recolecte información privada del sistema y cometa otras infracciones de seguridad.

:

Como una regla general, los applets de Java se ejecutan bajo un modelo de seguridad "mejor

seguro que lamentarlo". Un appie! no puede hacer nada de lo siguiente:

• Leer o escribir archivos en el sistema de archivos del usuario.

Diferencias entre los applets

• Comunicarse con un sitio de Internet distinto al que sirvió la pásina Web que incluyó el applet.

y aplicaciones

i

a¡ licactol,esI*a»

"

• Ejecutar ningún programa en el sistema del usuario. "

• Cargar programas almacenados en el sistema del usuario, como programas ejecutables

e, archiv0 <

y bibliotecas de rutinas compartidas.

Todas estas reglas son ciertas para los applels que se ejecutan bajo Netscape Navigator o Mtcrosoft Internet Explorer, los navegadores más favorecidos actualmente por los usuarios Otros navegadores con capacidades Java y herramiemns de desarrollo Java podrían habilitarle

para configurar el nivel de seguridad que desee, permitiendo algún nivel de acceso a archivos o directorios específicos para conexiones de red a sitios selectos de interne!.

A guisa de ejemplo, la herramienta appletviewer permite configurar una lista de control de

acceso, para las carpetas que un applet pueda leer o escribir archivos en ellas. Sin embargo

un desabollador de applets puede asumir que la mayoría de la audiencia estará usando un '

navegador que implememe las más estrictas medidas de seguridad.

Las aplicaciones de Java no tienen ninguna de estas restricciones de los applets. Pueden

aprovechar por completo las capacidades de Java.

: crear

ion v la ¡n<crfaz del naveSador'

ción y

Tir^ciño funcione tanto como un applet

Es posible que un programa de ava «nc

procedimientos para crear

SL aleación. Aunque ^ ^ X« entre sí. Las característica r^^

ser gradas a, correr elpro.ar.a

Precaución

Aunque el modelo de seguridad de Java hace extremadamente difícil que un applet dañe el sistema del usuario, nunca será 100% seguro. Busque "applets hostiles" en Web y encontrará exposiciones de temas de seguridad en diferentes versiones de Java y cómo han sido resueltos. Incluso podría encontrar ejemplos de applets problemáticos para quien utiliza navegadores de Java. Java es más seguro que otras soluciones de programación Web

como ActiveX, pero todos los usuarios de navegadores deberían familiari zarse por si mismos completamente con este tema.


Cómo poner programas interactivos en Web

Dia8

177 i

176

La programación de aplicaciones usará las características más recientes y mejores de Java 2. Una vez que los navegadores encuentren una forma de alcanzar a los desarrolladores del lenguaje, usted podrá utilizar las bibliotecas de clase de Java 2 en sus applets. A través de este libro se harán notar las diferencias de versión. Ocasionalmente el compilador Java mencionará estas diferencias cuando utilice una característica de Java 1.0.2 que lia sido remplazada con una mejor solución como en Java 2, y también se le hará una advertencia al respecto.

Control de seguridad mejorado El modelo de seguridad descrito hasta este punto es el que se introdujo con Java ! .0.2, La versión actual de Java incluye una forma para que un usuario de Web pueda confiar en un applet, de modo que ese applet se pueda ejecutar sin restricción en el sistema del usuario, tal como lo hace una aplicación.

Java 2 habilita controles de seguridad muy específicos para ser colocados en un lugar o ser dirección Web:

removidos de los applets y aplicaciones. Esto se loca durante el día 16, "Circunstancias

http://java.sun.com/products

excepcionales: manejo de errores y seguridad".

Creación de applets La mayoría de los programas de Java que usled ha creado hasta ahora han sido aplicaciones

de Java, programas simples con un método main() sencillo que se usa para crear objetos, asignar variables de instancia y Humar a otros métodos.

Los applets no tienen un método main() que automáticamente se llama para iniciar el procra-

sisiema con un intérprete de Java 2.

ma. En su lugar, hay varios métodos que son llamados en punios distintos en la ejecución de un applet. Hoy aprenderá acerca de estos métodos. ':

í

I

i

Todos los applets son subclases de la clase Applet en el paquete java.applet. La cl.'ise Applet proporciona dos clases de comportamiento que lodos los applets deben tener:

• Comportamiento para funcionar como pune de un navegador y manejar ocurrencias como la recarga de la página en el navegador.

• Comportamiento para presentar una imerfuz gráfica de usuario y lomur la emiadj ifo usuarios.

Aunque un applet pueda utilizar tantas ciases cuantas necesite, la clase Applet es la prin

cipal que activa la ejecución del applet. La subclase de Applet que usted crea toma la forma siguiente:

putolic class yourApplet extends java.applet.Applet { // aquí va el código del applet

} mroduje.ronallenouajecnJaval.lo2


■ Día 8

public void start() { // aquí va el código

HH5 • la cíase Applet cuando ocurren eventos específicos.

omportarse en forma diferente.

Paro

,as «pecffic» al

necesita ser desplegada o redesplegada.

public void stop() { // aquí va el código

Destrucción fieos y otras cosas.

L, des(rucción suena más aspen, de lo que es. E, mé.odo destroy,, hilbililll al appta a u,l,,a uevidudes de l,,np¡c/.a jus,o ;,,lt.s de que cl n,ism«, sea /ihcnulo de n,L,,,,.r¡a o con-

c cIL?^ IL?^ ;.'

Inicialización .;

PUede US:" US:"" CKle mélüd° |Wii fioil'uilaf ej fioil'uilaf cu»"«u¡fr subproceso en eje-

eenoo !qeT,enga recursos "'" CUÍ"qUÍer °llü °bJCI° C" CJR'u<:idn- C" ^"^'• «X^n» ««troy« a especíeos que necesiten ser liberados, como los subprocesos

I pple haya creado. Para proporcionar e, componam.cn.o de limpie., para su apple,. sobre-

ponga el método destroy () como sigue: public void destroyf)

{

// aquí va el código

sobreponer cl mciodo init () como sigue public void init() {

// aquí va el código

Tal vez le llame la atención la diferencia entre destroy,, y finalize,). que se describió en el día 7, "Uso de métodos para realizar tareas" El método

destroy() se aplica sólo a los appiets en tamo que f inalizef) es de

proposito general para un objeto sencillo de todo tipo de limpieza posterior

en si mismo.

k i ñ


Día 8

180

Web

Java tiene un colector de basura automático que administra la memoria por usted. El recolector . reda™ memoria de los recursos después de que el programa ha termmado de usarlos, por .o que usted norinahmcntc no tiene que usar métodos como destroyf). Pintado

iraport Java.awt.Graphics-

<t

[ DE PALIMDRQME . JAVA.

iiport java.awt.Font-

*

import java.awt.Color;

El pintudo es U forma en que un applet despliega algo en pantalla, sea texto, una línea, un . , do coloreado o una imagen. El pintado puede ocurrir muchos cientos de veces duran delo de vida üe un applet: una vez que el app.e. ha sido iniciando, de nuevo s, la ven ana del navegador esitraída desde el segundo plano de otra ventana en pantalla de nuevo s, la

Publie class Pallndrome ex

9

vL,.n Sel navegador se mueve , tremes posiciones en la panu.lla. y as, por el csi.lo

Ustld debe sobreponer el método paint () de su subclase Applet para desplegar cualquier

screen.

cosa. El método paint () luce así: publie void paint(Graphics g) { // aquí va el código

Este app|et sobrepone el método paint O

Observe que aquerencia de otros métodos descritos en esta sección, paint <, toma „„ aju-

men,o: una instancia de la Case Gr.phio. El objeto se crea y es pasado a p.int () pe«el

avegador por lo que usted no tiene que preocuparse por ello. S.n embargo, siempre d be .

"X '-lase oUi» (Pa- de. paquete java.awt) dentro de, cod.go^de su app e , comúnmente a través de una instrucción i.port en la parte superior de su archivo fuente Java, como en el siguiente ejemplo: import

Tip

181

java.awt.Graphics;

Si usted importa muchas clases desde el mismo paquete, como las clases del

AV^T puede usar el carácter comodín para cargarlas todas a! rn.smo t.empo.

,a el

ío ejemplo, la instrucción i.port J,va. awt.-; carga todas las Cases publ,

n.j,,

ca Zpaquete java.awt. Sin embargo, la instrucción i.port no meluye las subclases del paquete, por tanto la Instrucción xmport j ava . awt. •; no incluye las cla-.es del paquete j ava. awt. image.

»b.¡0.

4,

Un applet sencillo ,,, el .lía " ''Un vistan a la programación orientad, ;, objeos". usted ereó un :Wlci sck.IIo Ese .pplet serevisa aquí por una razón diferente: para tomarlo como un ejemplo de progra mación de applets. El listado 8.1 muestra el código de dicho applet.

» ,,,ls,n<MndoM

0,0

I,.,,:!! Palin.r-o.e que dJp.iega e, texto -Go h.nD a ..l..i. I •■ a l..aBna ho0. y utilizó el applei como ejemplo de la creación de una subclase.

T

■ »" I-

Figura 8.1 !

I

i

i

Dibujo del applet.

;

40^

ang a salami, I'm a í!lsagna ho&


Día 8

Si usted implementa los métodos correctos del applel en su clase (init(), start(),

V:

siop() paTnt (), y así sucesivamente), su app.e. funcionará sin problemas y »n neces.dad

¡I

de un punto de salida explícita.

does not support Java!

18: <Mpplet> 11: </B0Dy> 12: </HTML>

Inclusión de un applet en una página Web

Después de que haya creado la Case o clases que componen su applc. y las haya condado en archivos de clases, debe crear una página Web para colocar el applet.

, os ,np.c,s se colocan en una página meante la etiqueta <APPLET>. un comando Je pmgn, n' ación HTML que funciona como otros elementos de HTML. Hay numerosas hcnam.eMUs

Tallo definas Web con. Home Page de Car, y Dreamwcaver de Macromed.a, qUe se pueden utilizar para agregar applcis a una página s.n usar HTML.

El archivo de clase

El propósito de <APPLET> es colocar un applet en una página Web y controlar có.nn luce con

-■-. web que :

relación a otras partes de la página.

n-r un direcIorio

Los navegadores cort capacidades Java usan la información contenida en la etiqueta y ejecu

tan los archivos de clase combados en e, app.et. En esta seccon penderá a el - appleLs de Java en una página Web y a servir los archivos de Java ejecutables en \Uh en .oda

*' ^PP-C en un programa, £ L

u^de^ '

suficientemente grande.

dimensión.

^

~

"'Ur S£gUro dc Proporcionar una ventana lo

La sección siguiente asume que usted tiene suficientes conocimientos para

Nota

c ibir páginas HTML o que sabe utilizar una herramienta de desarrol o en

P^a generar HTML. Si requiere ayuda en esta área, le sugenmos las

d-endo de de ver ver un un aPP,eI aPP,eI de de Java Java

siguiente: Aprendiendo s puoHcar en Wet con HTML de Laura Lema,

¡

s que no pueden manej.r

porque su 1Z1^J.T " ÍCnil! 4UC * ^ 'd l sopona. Si usted no especifica navL^dor no lo

l algo entre <APPLET> y <MPPJT> .

en el lugar del apple,.

' " naVe-;id"re^ fue no .soportan Java no despliegan nada

La etiqueta <APPLET>

L, enqueta <APPLET> es una extensión especial a HTML para incluir apple.s de Java en pag,-

Z

:M istado

«¡queu, es soportada por todos los navegadores que mj manejan pg programa de Java. ill dde una página ágina Web 8 2 muestra un ejemplo sencillo Web con con un un apple, apple, mc.u.do. mc.u.do.

Listado 8.2. El texto completo de palindromepase.html 1:

<HTML>

2:

<HEAD>

4:

</HEAD>

5:

<BODY>

alterno con.que se ,eS h does

Cómo probar el resultado

11

3: <TITLE>The Palindrome Page</TITLE>

yd

not

support

íl


Cómo poner programas interactivos en Web

Día8

~~~~~~~

tos app'eli

■■-*-"pSE

-~"~———-—

——____

Más acerca de la etiqueta <APPLET>

En su forma más simple, la etiqueta <APPLET> utiliza los atributos CODE, WIDTH y HEIGHT

TaSTnT;hlTtíV:m^.aprOpÍ^ ye~ <"* y *»* => ^PP'et en ese aspa-

f ,<APPLET> inclu>* *™ «iribuu.s que le pueden ayudar a integrar mejor un

dentro del diseño lotal de una página Web.

Figura 8.2

\ota

- Ui i>óa'¡n(i Web PalindromePage.html

V: en Navigator.

<APPLET> son casi idénticos a los de la

M»fam«mc«f«l«>

Go hang a salami, I'm a lasagna h«)g. ALIGN

El atributo ALIGN define cómo será alineado el ;,pple, en una página Web en relación a otra.s

panes de la pagina, liste atributo puede tener uno ele nueve valores:

• ALIGN=LEFT alinea el applet a la izquierda del texto que sigue al applet en la página. • ALIGN=RIGHT alinea el apple. a la derecha del texto que sigue al applet en la página.

• ALIGN=TEXTTOP alinea la parte superior del applcl con la parle superior del texto más alto en la línea.

Cómo poner applets en Web

-

• ALIGN=TOP alinea el applet con el elemento más alto en la línea (la cual puede ser otro applet, una imagen, o lo más alto del texto).

• ALIGN=ABSMIDDLE alinea la mitad del applet con la mitad de! elemento más grande en la línea.

• ALIGN=MIDOLE alinea la mitad del upplel con la mitad de la línea de base del texto. • ALIG!M=BASELINE alinea la parle mas baja del applel con la línea base de! texto. Esle

valor es lo mismo que ALIGN-BOTTOM, pero ALIG^BASELINE es un nombre más

soporta» el lenguaje. „ „ «„.. «*iv<»

descriptivo.

»s«d nc=c«» <*»» de » servido, Vv*

• ALIGN=ABSBOTTOM alinea la parte baja del applet con el elemento más pequeño en la linea (que puede ser la línea base del texto u otro applet o imagen;.

Para finalizar el formato que se especifica con el atributo ALIGN, puede usar la etiqueta HTML de rompimiento de línea «BR» con el atributo CLEAR. Éste toma tres valores: • <BR CLEAR=LEFT> continúa desplegando el resto de la página Web en el siguiente margen izquierdo disponible.

• <BR CLEAR=RIGHT> continúa desplegando en el siguiente margen derecho disponible.

m


Cómo poner programas interactivos en Web . <BR CLEAR=ALL> continúa desplegando en el siguiente margen izquierdo y derecho disponible.

Figura 8.4

Espacio vertical v

.'.

horizontal.

La f.gura 8.3 muestra varias opciones de alineamiento, en las cuales la carita sonriente es un applel. Figura 8.3

_»«-, «*..•..«-»•—»-«>

(>l>iinili-\ ilr ¡iliiii-n-

ción del a¡>i>lcl.

.«—«,-. jr» —._«.i.»~~i—••-—«

dei

página Web que contiene el appJ

la página

:

«orio que I, pági,,, Web:

7

^ mismo

««■

es u un —es

"amado Bix'class dcl -"ismo d.rec-

Si utiliza una herramienta de desarrollo de Web que le permite colocar appiets Java en una

página.'us.ed debería poder asignar el atributo ALIGN al elegir LEFT, RIGHT, o uno de los valores dentro del programa.

sitio Web aherno, para cargar I

do BiX.class de í

HSPACE y VSPACE

Mediante los atributos HSPACE y VSPACE se configura la cantidad de espacio en pixeles entre

^

un applc. y st, texto que lo rodea. HSPACE controla el espacio horizontal a la .z.qu.cda y

HEIQHT-4. WIDTH-4M>

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:

<APPLET CODE=-ShOWSmiley.class- WIDTH=45 HEIGHT=42 ALIGN=LEFT VSPACE=50 HSPACE=10> Requires

Java

</APPLET>

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 <APPLET>, 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 </APPLET>

La etiqueta <object>


Cómo poner programas interactivos en Web

Día 8

188

i°' archivo de texl° ° cualc!uier <** «sa).

cuso*

ía <OBJECT> .orna la forma siguiente:

hf1gHT-40

?,

W "« servidorquecontengael archivo.

" C°neX¡Ón ^ SÍ "^ ^*

e toma obtene, un applei y todo lo que necesita pañi ejeem-us

te de <APPLET> a <OBJECT> requiere los cambios siguientes:

™- ° ->rMw jar ^ ^¡

í

archivo JAR. el

cantidad de arch

"" archivo *

;: fadürTncqueüblenerddscrvidonusleJpualc**™y•*«"-

...r*.«*.-.*« que el tamaño

el lado del na.e.

Tior

7 escomprimir y ejecutar los archivos)

jlg

d

ores ravisaiore imemet Exptórer ¡> 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:

<HTML>

2:

:mLE>The PaHndrone Page</TITLE>

3: 4:

</HEAD>

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:

</OBJECT>

11:

</BODY>

12:

</HTML>

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

^ es mediame <APPLET> u ^ ^ obücne y ejccuU,

<0BJECT> 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

|<m

^^

,

■> "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.

<APPLET copE=-MyAP¿let.class- ARCHIVE--appletstuff.zip" WIDTH-1B8 HEIGHT=100> </APPLET>

El archivero por sí mismo es un arch.vo Zip sin comprimir. Los archivos Zip estándar no son «conocido, pues usan alguna forma de compresión para hacer más pequeño el archivo.

• Una etiqueta especial de parámetro en el archivo HTML. • Código en su appleí para analizar esos paramaros

S. las clases auxiliares podrían estar contenidas dentro o fuera del arch.vo Z,p lo, nav"; es de Netscape buscarán en ambos .ugare, El atributo ARCHIVE es ignorado por "os niveladores o visualizados de applets que pudieran toparse con esta pagina Web.

Internet Explorer de Microsoft reconoce un tercer tipo de forma» de archivero para la entrega

/A¡

e l,s de Java: el archivo CAB. Éste es una abreviatura de la palabra cabinc, (gaveta , u ., Lid" grunar archivos entre sí y comprimir.» para una entrega más rápida a través de *cb. Los archivos CAB se crean con una herramienta de Microsoft llamada CABarc. Actualmente

dtmro dc

está disponible sin cosió en la dirección siguiente: http://www.microsoft.com/workshop/prog/cab/

Mediante CABarc, usted puede comprimir todos ios archivos de clases y algunos más requeri dos por un app.e, en un archivero individua!, que tenga la ex.ens.on de arch.vo . cab. Para especificar e ,c archivero se utiliza un parámetro llamado cabbase con la enqueta <PARAM> »

HÍSÚ y el valor de e.bb.., «e establece para e. nombre de. archivo . c.b. Lo s,gu,emc .s

un ejemplo:

<APPLET CODE=-DanceFever.class» WIDTH=200 HEIGHT=450> <PARAM NAME="cabbase' VALUE="DanceFever.cab > </APPLET>

<PARAM NAME=size VALUE="24"> A Java applet appears here </APPLET>

valor de

dos pariíinelros del applei

, y uno nombrado size con un valor 24.

El uso de la e.ique.a <PARAM> es e| mismo para los app.ets

vez de la etiqueta <APPLET>.

que usan la etiqueta <0BJECT> en


Cómo poner programas interactivos en Web Día 8

Listado 8.4.

Los parámctrU son pasados a, carg^

recuperarlos parámetros con e méto

S^4

El texto- inicial para newpalindhome . java.

1:

import

2:

import java.awt.Font;

3:

iraport

4: 5:

java.awt.Graphics; java.awt.Color;

"

\

■■■ '

-:

publie class NewPalindrome extends. java.applet.Applet {

6:

Font

f = new Font("TiraesRonian",

Font.BOLD,

36);

7:

initffcomola siguiente

publie void paint(Graphics screen)

8:

tneFontName * getParameter( -fonf );

{

screen.setFontff);

9:

screen.setColor(Color.red);

18:

screen..drawString("Go hang a salami, I'm a lasagna hog.", 5,

11:

40);

(

nombres de los parámetros en B|' "^b i¡£i6n de letras mayúsculas y mer,e, incluso deben ut,l,za--I,, m «m. °^eecuminirigs"> 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 c<ipiando la clase Palindrome original, c decíase, como muestra el lisiado 8.4.

5,

50);

El listado 8.5 muestra el resultado final de la clase MoreHelloApplet. Compile la clase para que tenga listo un archivo de clase.

1931


Día 8

|194

Cómo poner programas interactivos en Web

Cargar este archivo HTML en Netscape Navigator produce el resultado que se muestra en la

Listado 8.5. El texto completo de newpalindrome.java.

figura 8.5.

1:

import

java.awt.Graphics;

2:

import

java.awt.Font;

Figura 8.5

3:

import

Java.awt.Color;

La ¡lanilla

4: 5:

publie class NewPalindrome extends

java.applet.Applet

6:

Font f = new Font("TimesRoman",

7:

String

palindrome;

publie

void

Font.BOLD,

{

36);

apBBMp

-:*" 0

NewPalindrome.html

carnada con Netscape Navigator.

9:

paint(Graphics

screen)

screen.setFont(f);

11:

screen.setCoJor(Color.red);

12:

screen.drawString(palindrome,

".. -J..

*il • U W -

No, sir, prefer prison

8: 10:

1951

{

5,

50);

13: 14:

publie void init()

15:

irfi.-j-,. .-

{

palindrome = getPararaeter("palindrome");

16: 17:

if

18:

palindrome =

(palindrome ==

Al -

.*

Si no se especifica un palíndromo en el código para NewPalindrome. el valor predeterminado

nuil)

"Dennis and Edna

f

es Dennis and Edna sinned . El lisuuJo 8.7 croa un archivo HTML sin im:i etiqueta de

sinned";

19:

páramenos para ÑAME.

20:

Listado 8.7. El texto completo de newpalindrome2 . htul.

Ahora cree usted el archivo HTML que contiene este applet. El listado S.6 muestra una nueva 1:

página Web para el applet NewPalindrome.

Escriba

Listado 8.6. El texto completo de newpalindrome . html.

<HTML>

2:

<HEAD>

3:

<TITLE>The New Palindrome Page</TITLE>

4:

</HEAD>

5:

<BODY>

1:

<HTML>

6:

<P>

2:

<HEAD>

3:

<TITLE>The New Palindrome Page</TITLE>

7: 8:

Your

4:

</HEAO>

5:

<BODY>

6:

<P>

9: 10:

7:

<APPLET CODE="NewPalindrorae.class"

8:

<PARAM NAME=palindrome VALUE="No,

9:

Your

10:

browser does not

support

prefer prison">

Java!

</BODY>

12:

</HTML>

</APPLET> </BODY>

Como aquí no se proporcionó ningún nombre, el applet usa el predeterminado, y el resultado

:1

es lo que usted esperaba. Déle un vistazo a la figura 8.6.

</APPLET>

11:

<APPLET CODE="NewPalindrome.class" WIDTH=600 HEIGHT=100> browser does not support Java!

WIDTH=600 HEIGHT=100>

sir,

, ir

Resumen

Observe la etiqueta <APPLET>, la cual designa el archivo de clase para el applet y la altura y ancho apropiado (600 y 108, respectivamente). Exactamente debajo de ella (línea 8) esiá la

Es discutible la razón por la que los applets siguen siendo el centro de atención del desarrollo

de Java, más de dos años después de que el lenguaje fuera liberado por primera vez al público.

etiqueta <PARAM> que se usa para pasar el palíndromo al applet. En este ejemplo, el

Sin embargo, los applets permanecen como el uso público más grande de Java, porque son

parámetro ÑAME es palindrome, y VALUÉ es la cadena No,

elaborados y colocados en miles de sitios de World Wide Web. De acuerdo con la máquina de

sir,

prefer prison.

búsqueda AltaVista en http://www.altavista.digital.com, hay más de 1.200,000 pági nas Web que contienen applets.


Cómo poner programas interactivos en Web

Día 8

196

Preguntas y respuestas

Figura 8.6.

>P_.Teiigo un applet que toma parámetros y un archivo HTML que le pasa esos

La página

NewPa Iiíi<frome2. html

■-r.-jwremetros, pero cuando mi applct se ejecuta, todo lo que obtengo son valores

íiirgoilti ton NéiScu¡*e.

Dcnnis and Edna siiined

nuil. ¿Qué estii pasando ¡kjuí?

R ¿Los nombres de sus parámetros (en el atribulo ÑAME) corresponden «aclámeme con

los nombres que usted está probando en getParameter () ? Deben ser exactos, incluyendo mayúsculas y minúsculas, para que se pueda realizar la correspondencia Asegúrese también que sus etiquetas <PARAM> estén dentro de las etiquetas <APPLET> de apertura y cierre y que no ha cometido ningún error de escritura.

P ¿Hay alguna configuración especial requerida para que mis programas de sen* \

r

Debido a que se ejecutan y son desplegados dentro de páginas Web, los upplets pueden usar

los "i-álkos inicríuz de usuario y estructura de eventos proporcionados por el navegador Web. EsJcapacidad proporciona al programador de applets mucha funcionalidad que le ahorra irabajo duro adicional.

Hoy aprendió las bases para la creación de applcls. incluyendo lo siguiente:

. Todos los applets son subclases de la clase java.applet .Applet, la cual proporciona el comportamiento que el programa necesita para correr dentro de un navegador Web. . Los applc.s tienen cinco métodos principales que cubren las actividades que un applet desarrolla a! momento de su ejecución: init (). start{), stop(), destroy () y

paintO. Estos métodos son sobrepuestos para darle funcionalidad a un applet.

. Los applets son colocados en las páginas Web mediante la etiqueta <APPLET> de HTML o una herramienta de desarrollo Web que pueda manejar applets. Cuando un navegador con capacidades Java carga una página que contiene un applet, carga el archivo de clases descrito con la etiqueta <APPLET>

. Para acelcaf e! tiempo que .orna cargar un applct desde un servidor Web. usted puede

usar los archivos de archivero de Java, el atributo ARCHIVE de Netscape, y el parámetro cabbase de Microsoft.

. Los appleis pueden recibir información desde una página Web medíame la etiqueta <PARAM> en asociación con un applet. Dentro del cuerpo de su appiet, usted puede lener acceso a esos parámetros a través del método getparameterf).

dor Web puedan presentar applets de Java en páginas Web?

R Se requiere muy poco por parte del servidor para ofrecer applets de Java junto con

documentos HTML, archivos de imágenes y olro.s archivl)S. Mudl()s üc |os puqucltfS dc

servidor comercialmeme disponibles ofrecen sopone adicional para Java Si no lo

hacen, configurar el servidor para presentar applels dc Java requiere que se asocie la

extensión de archivo .class con el tipo MIME application/octet-stream Consiilic la documentación dc „, servidor p:lr¡1 llliiyor informado,, a-s,xvio :l los lipos

MIME.

P Los applets no tienen una línea de comandos o un (lujo dc salida estándar, ¿como puedo hacer una salida de depuración sencilla en un applet como

System.out.printlnO?

R Dependiendo de su navegador u otro ambiente habilitado para Java, usted podría tener una ventana de consola donde aparezca la salida de depuración (el resultado de

System.out.printlnO), o bien podría ser resguardada en un archivo de registro. (Netscape tiene una Consola Java [Java consolé] bajo el menú Opiions: Internet Explorer utiliza un archivo de registro que usted debe habilitar al elegir Oplions I ■

Advanced.)

Puede continuar imprimiendo mensajes mediante System.out.printlnO en sus applets (no olvide quitarlos cuando haya terminado, para que no confundan a sus usua

rios reales).

.


Semana 2

Día

9

Cómo mejorar la apariencia

de sus programas con gráficos, fuentes y color

Una de las mejores formas de impresionar a un conocido que no sea programador

es con un programa que despliegue gráneos. Tal vez el tío Pedro no aprecie los

detalles de los ciclos bien construidos o una jerarquía de clases ele"ante pero si le

muestra la secuencia animada de un pequeño bailando -La galliniia". quedará

asombrado de su pericia como programador.

Hoy empezará a aprender a ganar amigos e influenciar a la cerne al escribir progra

mas que usan gráficos, fuentes y colores.

Para usar las características en sus programas, usied ,,,¡11,,;, d.iSCS dcl p.1()l)e|L, java.awt, el cual proporción;, la mayoría de las monerías visuales do J;,v•■ Con' estas clases dibujará textos y figuras, como círculos y polígonos, en un apple. Aprenderá a usar fuentes y colores distintos para las figuras que trace


Día .9

¡200

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

También empezará a usar las características de dibujo mejoradas en Java2D, un conjunto de í clase»introducidas en Java 2 que ofrece algunas características que atraen a la vista: '-

Listado 9.2. El texto completo de

'-• Ob|Clos desasociados. •

Patrones de relleno degradados,

Dibujo de líneas-de anchos diferentes.

map . html.

1: <body bgcolor="#C4c4c4">

2: <dlv align="center">

widtn=35e>

La clase Graphics

Un applet concibe las operaciones gráficas en forma parecida a la de un lienzo. Usted ha usado previamente el método drawString () para dibujar texto dentro de un applet. La fuente

del texto y el color fueron elegidos antes de dibujar los caracteres, del mismo modo que un artista elegiría un color y una brocha antes de pintar.

El tcx.o no e's lo único que puede dibujar dentro de la ventana del applet. Usted puede dibujar

5:

</dlv>

6:

</body>

La figura 9.1 muestra la página y el app|cl cargados en Nc.scape Navigator. Figura 9.1

Dibujo de un texto en una ventana del

applel.

líneas, óvalos, círculos, arcos, rectángulos y otros polígonos.

1 ;, mayoría de las operaciones básicas son métodos debidos en la el.se Graphics. l-n ....

applet usted no tiene que crear un objeto Graphics para poder dibujar algo (como recordara, uno dé los parámetros de! método paint() es un objeto Graphics). Este objeto représenla la ventana del applet y sus métodos se utilizan para dibujar dentro del applet.

La clase Graphics es parte del paquete java.awt, por lo que iodos los applcts que dibujen algo deben usar la instrucción import para que todos los programas puedan utilizar Graphics.

El listado 9.1 es un applet sencillo que usa el método drawString(> para desplegar texto, como lo ha hecho previamente con el applet Palindrome.

Listado 9.1. El texto inicial de map . java.

1:

iniport |ava.awt.Graphics;

2'

3: publie class Map extends java.applet.Applet { A:

5:

e!

publie void paint(Graphics screen) {

' }

screen.drawString("Florida",

185, 75);

Todos los comandos básicos de dibujo que conocerá hoy serán métodos Graphics que son «amados dentro de. método paint (, del apple,. Éste es un lugar ideal para tocias las opera-

cones de d.bujo porque paint () es llamado automáticamente siempre que la ventana del applet necesite ser «desplegada. Si otra ventana de algún programa cubre al applet y éste

requ.ere ser «dibujado, colocar todas las operaciones de dibujo en paint () asegura que

ninguna parte del dibujo quede fuera.

Este applet utiliza el método drawString () del objeto screen para dibujar la cadena ■Florida- en las coordenadas 185, 75. El lis.ado 9.2 muestra el código HTML que despl.ega este applel luego de ser compilado en un archivo de clase.

Continuaremos agregando al apple. Map cada mé.odo de dibujo que se abarque en esta

sección.

'


Día 9

Cómo mejorar la apariencia de sus programas con gráficos

El sistema de coordenadas para gráficos Como dra«String(), todos los métodos de dibujo tienen argumentos que indican las coorde

Líneas

nadas x y Algunos toman más de un conjunto de coordenadas, como una línea, que tiene una

y M p"ni° •*

coordenada x, y pra identificar su pumo de inicio y .ira coordenada x, y para su pimío Imal.

El sistema de coordenadas de Java usa pixelcs como su unidad de medida. La coordenada de origen 0 0 está en la esquina superior izquierda de la ventana del applet. El valor de

*■ ■»■»>

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» - **, .«• <™° * »™ P-*

37,

screen.fill0val(245,130,15,15); for (int ax = 50; ax < 150; ax += 10)

20:

24:

10 };

screen.fillDval(235,140,15,15); screen.fillOval(225,130,15,15);

18:

s.guientes a. método p.int () del apple. Map:

12,

screen.drawPolygon(poly);

17:

valores x y y •

94, ¡81,

Polygon poly = new Polygon(x, y, pts);

16:

,a. ,. , *

120,

118, 56, 68, 49, int pts = x.length;

14:

medios círculos.

191,

int y[] = { 12,-15, 25, 71, 209, 278, 310, 274, 18B, 171, 174,

10,

10,

0,

-180);

}

La figura 9.10 muestra el applet Map que ha sido pintado con los métodos do dibujo básic

de Java:

50.120 Figura 9.10

50.130

El applel Map.

50,140

sí1™*

b*

¿ ¿i

50,150

50,160 50,170

ciclo ay se ejecuta nuevamente.

# • #

incluyendo todas las instrucciones de d.bujo que se v.eron durante c.

V

import java.awt.Graphics;

2:

import

Aunque ningún cartógrafo temería perder su trabajo ante este despliegue de la hechura de un mapa, el applet combina una muestra de la mayoría de las características de dibujo de que

34: public cías, Map extends i^

goza la clase Graphics. Un applet como éste podría ser expandido mediante los objetos Font

l\

y Color, y se podrían reorganizar las operaciones de dibujo para mejorar el producto final.

s". P \-

I'

8:

1

java.awt.Polygon;

public void paint(Graphics s r en

screen.drawStringCFlonda", 185, 75), screen.drawLine(185,88,222,80);

Screen.drawRect(2, 2, 345, 345);


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

Día 9

La clase Graphic, también incluye alguna funcionalidad de corte y pegado que .ncluve la ventana del Applet:

. Hl método copyArea( 5, copia una región rectangular de la ventana del apple, en otra región de la ventana.

. E. método clearRect;), limpia una región rectangular de la ventana del applet.

>

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<) es

toma un argumento sencillo, un objeto Color. setBackground(Color.white);

> 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) <

Arc2D.Float wave = new Arc2D.Float(ax, ay, 16, 16, 6, 180, Arc2D.0PEN); screen2D.draw(wave);

bpaini^ new GradientPaint<eF,OF,Color.green, 50F,50F,Color.orange.true); screen2D.setPaint(gp);

GeneralPath fl = new GeneralPath();

Algunas observaciones acerca del aPplet Map2D-

fl.moveTo(10F,12F); fl.lineTo(234F,15F); fl.lineTo(253F,25F); fl.lineTo(261F,71F);

fl.lineTo(344F,209F); fl.lineTo(336F,278F); fl.lineTo(295F,310F);

fl.lineTo(259F,274F);

nibles bajo Java.awt

7

Pnes de dibuJ

Cl °bjCI0 Graphics ^ represe.ua la ven.ana del

fl.lineTo(205F,188F); fl.lineTo(211F,171F); fl.lineTo(195F,174F);

línea

mérodo setStroke,, de


Cómo mejorar la apariencia de :

Día 9

ventana del applci en Map2D.

#

co,or verde en 0 0 al para l0¡

y el objeto gp recién creado.

relleno actual.

=-

se al estado de Florida y

d Preguntas y respuestas en negr¡tílS a la n.i.ad.

l no™-, y o.ro para

la

19;

de d.bujar como p,r;, ;lo,cu:,, el espacio que )e sigue

de un applet. Ya puede

ventana de app"-i. "

\ \

m


Semana 2

Día

10

SE-''.

Adición de imágenes, animación y sonido <"•«>

11


Adición de i

Día 10

y sonido

234

aliciar el progr.ima

:; ¿l*.

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

Para ejecutar un subproceso, se llama a su método startn

ejemplo previo:

"'cioao start (), como en esta instrucción del

runner.start();

.■mío extends como implements. public void run() {

implements Runnable *

vi»»» . 1

, que * o.ro n,odo «o

p;ir:, iniciar mi suhproceso.

}

// lo que hace realmente el applet

appl:con subprotesüs-Sc '"« pan, los d.b.jos y cambiar

"gUrando10 C™ '(>d<)'"

cosas emre

^ npommta«o.

detener e, subproeTo '

U^"¡—^amiento que el subproceso

SUbpr°CeS0S « ü- «« '^'^ «op() pnra

1"'

haber sidü

Ul ..ase Tnrea. es pane de,

ia instrucció11 sigllieme; Tnread runner;

Sor nuil has.aquee.obje» sea creado rearme.

v-iriable runner tendrá el

Precaución

Hay un método stop() que podría ser llamado en objetos Thread para

S psr::r?Tha desaprobado de ia «^^." ss^

eTecucin 1, '' Pr°CeS° ™ '^«^¡üdades en el ambiente de ejecución del programa y puede introducir errores en su operación que son

235|


Día 10 1236

runner.start();

„„ d. .OTO P.<> *»"

public void stop()

{

if (runner 1= nuil) cesos múltiples.

}

runner = nuil-

I asociado con el applei. y usar los : en un programa con >ubpro,vsos.

Cómo poner todo junto

b

vc

public void run()

{

2sr,2S? repaintf);

cn

try

{

Thread.sleep(ieee);

> catch (InterruptedException e) { } li/.ncioncs a

Public void Paint(GraPhics screen) / theDate = new Date();

Figura 10.1

^

¿/ í//»/</e/ Dln<

screen.setFont(theFoñt);

screen.drawstring(" + theDate.toString(), i6, 50);

en Netscape Navigator.

Sun Mar 08 11:09:10 EST 1998

u coIóquei°en

r^^zr ya que

iroport

java.awt.oraphics;

import java.awt.Font; import java.útil.Date;

public class DigitalCloc implements Runnable

.«•■-"•"4)i g.

Date

theDate;

10'.

Thread runner;

I!!

public void start() {

1

13: 14:

if (runner == nuil) {

runner = ne« Thread(ttus);


Día 10

V sonido

acción incluso dibujar. En realidad nunca vería nada en pantalla porque

^

ciclo whae(,,an,es de hacercua,qUier oleosa.

En esta secc,6n se ve este app.et desde la perspectiva de las panes rea.es de animac.ón y mas tarde manejará las partes que administran los subprocesos.

,

| destruir nbpm^'™^^^

™ "o hacen.otra cosa que crear y

a que todo io que hacen es cOnfigu °

Parama.

k

Jos subprocesos utilizados por el

rn.as 8 9 definen dos variables de instancia básicas: theFont y theDate, las cuales con-

líen o^eíos Representan la fuente actual y , fecha actual, respectivamente. Después aprenderá más acerca de esto.

A,uí,os métodos start,) y .top() inician y detienen un subproceso:,a mayor pane de.

.S^

trabajo del applet está en el método run () (líneas 25-33).

Dentro de run () es donde realmente ocurre la animación. Observe el ciclo w.ile,) dentro

TL método (a. inicio con la instrucción en .a línea 27); la expres.on runner « fhisThread devolverá un valor true hasta que el objeto runner so coni^re a nuil lo

de la ™

I":, ocurre en e» método stop< > de. app.et). Dentro de ese ciclo whil. se construye un cuadro sencillo de animación.

, pausa por

.000

crear animaciones.

mi.isegundos (1 segundo) antes de que se rep.ta el c.Jo.

S:S=H

'

'Os lm'hlc»«« M «|uc cl.be dcso.nban^rsc

El parpadeo y cómo evitarlo método paint().

repaint(). éste llama el

nunejar errores si se presentan. Estas instrucciones serán desemas en el "Circunstancias excepcionales: manejo de errores y segundad .

3 Este objeto nuevo Date se asigna a la variable de msianc.a

el -b de cadro,

a PlZu\ se crea un nuevo objeto theDate que contiene .a fecha y hora

Runnable.

2

L, 1(nea .0 defme una tercera variable de instancia para esta clase llamada runner de. tipo Thread, la cual contendrá el objeto subproceso para este applel.

P»p>dc,,,.

l d,b.jo y la ,¡mp¡ra; „ „„,

Ha, do, ,,,,,e« prtn

- ■—• *-

239 i


Día 10

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

¡240

public void start() { if (runner == nuil) {

•»

runner = new Thread(this)■

runner.startf);

0.sot

public void stop() {

paint(g);

runner = nuil;

L

-

o.

»

public vold run()

{

de updateO par:, reducir el parpadeo.

Color.getHSBColorfe, (float)1.0,(float),.0).

Una solución: no limpiar la pantalla

La primera solución para reducir el ^^^Z^^!7^' solución funciona sólo para algunos app e s P despliega una cadena sencilla (Look to t

^^^

^ ^^ ^ presenta en colores

^^

// itera entre los colores

int i = 0;

parpadea terriblemente

Thread thisThread = Thread.currentThreadf);

wnile (runner == thisThread) { setForeground(colorsíi) ) • repaint();

10.2 muestra el resultado.

;

Figura 10.2

try

} caten (InterruptedException e) i

CnlorSwirl nmliaiw

Netscape NnviS"1'"'-

{

Thread.sleep(200);

if (i == colors.length ) i = 0;

Look to the Cookie! 3

public void paint(Graphics screen) { screen.setFont(f);

^

-

import

screen.drawStPinoCLook to the Cookie..», 15, 50);

java.awt.;

¡i public class Cdorswirl extends Java.appXet.*ppl.t 6.

implements Runnable {

V

F0nt f - new Font("TinlesRoman", Font.BOLD, 48);

9.

color colorst] = new Color[58];

,1(J':

Thread runner;

• L. Une. 9 define un« vanab.e de ins.anc,:, colors. ,a cua, es un ílrre2,o de 50 tos. Al lnitIJr el app,L.,, ,0 primcr, quc UMe

^


Adición de imágenes, animación

21.30, e, llenarloeo.

color

Al crear de antemano lodoi loi objelos, usieil ,ác¡1 precatalat «..o,

Aprenderá más tarde otro método para reducir el parpadeo; una técnica ^ ^ ^

Re^^'f" y Uso de imágenes APPlet y Graphics para

las Cses

Cómo obtener imágenes

*-

-chivos de clases de JMa, por ^ ""*" ^'^ dí lüs por Z lo que Us,cd u.Mcd henc c,uc mdicarle a Java dónde encobrarlos

ápida y fácil de crear el arreglo de colores.

^y: el proceso se repiie hasta el infinito.

«* , He

». y »■ es sencilla: sobreponer upcJatel) y quitar la part = donde sí _l. P ' » no se necesha limpiar porpue no esta c:—o - P^

com/]ava21/images/booK

lcx(o update (,

« presen, .,

applei ColorSwirl modificado,

¥

1

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

) Al agregar estas tres

líneas se detiene el parpadeo.

^^^

¥

Nota

U«ed puede enerar ,a primera ^^j^^T^ nombre en el sitio Web de este l.bro, en http^ I™ P' y en el mismo lugar la versión mejorada como BetterSwiri. ]

La clase Applet tiene dos métodos que se pueden usar pan, crear un UP| h . ,. una d.reccón específica dentro del programa: "' M" U"llZiir


Dí;i 10 ¡232

ara cainhiar |;l apariencia de lo q,,e se des,,|i,v , .... „„ -

"s.ed dibuja lo que de.eu ver despicado, llan^ ZZ'^T """ ^ !" ^ "

nuevoarepainto.yasísucesivameme.

»,

r •1 ■

Java.

•""'"■'uon. el cu.-uln, m;ls ,cim,l. |;| iriibiijo real «.erre en o.ra

pane ele! app|c,.

ülF o JP1£G, cómo obtenerlas del

j

' usarlas en la 'os a

PreCaUCiÓn

Aunque pu

mé'°d° P-i"tO. drt^. hacer todas ¡as

solicitudes para dibujar e El método repaint () es

esto, cuando llame a repaint Oo-r-r "" ^ d"Plie9Ue' MaS tarde verá paint (> P°r° cre^r una secuencia animada. ~

co,!f,0lecoiuaia y Par° de 'a ejecución de ^ applet del día K, "Cónio poner programas intei íetiv w ■•

úc

start() y stop() son llamados cuando un applei ¡nica y termina su ejecución

«an rápido como puc

stoP(, :t.^;: '!"L::;::i ^^-v ai ^ ^ - ^~ »«> ^ los .,p,,|u.s «,lo necesitaron usar paint () una ve/.

Pintado y repintado

Con la animación y oíros annleí* de i-k-i •„.-

" dt olio programa.

^pucüesoUd,» a, sistema de manejo de ven.anas d. Ja. quc

|;l vclllana con el

requieren start n « «t /

'

''

,-

"" P'°CeN0 >' 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 <lcl ¡ijtph'l Neko.

,,,, estar HsH, ,an, es,e proyecto, copie «, o. disonó ^ creado previa,,, me, los siguientes nueve archivos de imagen del s...

http://wvw.pi efect.com/java21 de este libro: Awakel . gxf, RiBht i.Qif' Rl°ht2-°lf-

Ícrltchi.Bif scratch2.gif, Sleepi.gif. Sleep2.gif. Stop.g.fyvawn.gxf.

Paso 2- organice y cargue las imágenes en su applet

La idea básica".-n el app.e, NeKo es tomar la serie de imágenes y desplegarlas de una en una para crear la i\\ ariencia de movimiento.

9

para tener un seguimiento de la imagen actual

a desplegar.

public void init() { String nekoSref] stop.oif,

. «sera ch'íf 9

(int i=0; i < nekoPics.length; i nekop.csfi] = getlrcageígetCo^ images/" + nekoSrcfi]);

:;:z: *

Paso 3: anime las imágenes

r ri '^

Neko tiene el siguiente comportamiento en el

C°" SUbProcesos. P™ este propósito se usará el

programa:

#


Día 10

.

Ejecu,a desde el lado izquierdo de la pantalla

.

se detiene a la mitad y bosteza

void nekoRunfint start, int end) { for (int i = start- i < ehd; i+=i0) x

=

i;

i

// intercambiar imágenes if (currentlmg = = nekoPics[0])

. So rasca cuatro veces

currentlmg

". se leTama y corre

hacia fuera por la derecha de la panta.la

orden de los pasos como se desee.

nekoPics[i j ;

repaint();

pause(150);

}

2r:

=

else currentimg = nekoPicsf0];

La última iá

pane de la instrucción for() inc incrcmeni-i,-I,-i-i "'«"'«-rcmuií.i d udo

1/1 pixeles • i 10 cachi ve/, empujándola

para el cuerpo del método:

vid nekorun(int start, int end) { //

•■ -*

pendiente de hacer

publie void paint(Graphics screen) {

if (currentlmg ¡= nuil) screen.drawlmage(currentlmg, x, y, this);

ld.s e» los etemenios « y I del jra d cicl0 „,„ ,„ valort, ,«r,

íí'd obieT^

9('' C'

S, no «o hiciera

asi, el objeto tendría un valor nuil.

!

ZllZ ""I

'-" coníl-

) cío

través del L-icl)-

//corre de un lado de la pantalla hacxa el centro

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

imáecnes sea, retiradas y aparezca una nueva.

pause () al af plet que se pu

como se iiHies ra aquí:

t

void pause( .nt time) {

Precaución

<-t*"no

El método size( j de la clase Applet ha sido desaprobado después de Java

UU por lo que si usted está escribiendo este applet para permanecer con

Jf'M() aT rempla2ar con 9etSi"< )• q^ modifica la llamada a lo siguiente:

nekoRun(0, getSize().width / 2);

try {

Thr .ad.sleep(tirae)i

} caten (InterruptedException e) { )

La segunda actividad que Neko emprende es detenerse y bostezar. Esta acción es un cuadro uk I o Ce la ;,m,,1;lcl()ll (]lie „„ sc ,c|,jk. po,. ,„ i|hc ^

mente en vez de ser implemenlado con sus j)ropios méiodos.

^ ^ ^


Día 10

i 252

J^^ejmágenes. animación y sonido

Todo ,o que tiene que suceder para desp.egar cada una de estas imágenes es .o «guien*:

repaint(); Pause(250);

. Cambiar el valor de cúrrente al objeto Image que debiera desplegar.

#

; 1

currentlmg = nekoPicsm •

'•epaintO;

. Llamara repaint().

pause(250);

. Hacer una pausa por determinado lapso de tiempo. He aquí el código:

// detenerse y hacer una pausa

,

currentlmg = nekoPics[2);

Se llama al método nekoSleep (, en el m ilnA ^omo se muestra aquí: mtlOdo run' J deI »PPki con un ^umemo de 5_ // dormir por cinco "turno.:" nekosieep(5); s

repaint();

6 //

currentlmg = nekoPics[3);

en ~

■•epaintO;

!

'- brecha. He ñqu¡ ,as ?nilnicci

)

mclod°

(, p;,, ^ cí íaIÜIalIj,a por

repaint();

M

eces se ha de desplegar cuando Neko se rasca la oreja. vece

pause(500)¡

nekoRunfx, si2e().width +

Paso 4: finalice siguientes comprenden el método, void nekoScratch(int numTimes) <

for (int i = numTimes; i > 0; i--M currentlmg = nekoPics!4]; repaint();

Para que cada cuadro se mez -| > ■ |

pause('i5S);

¡"icio del método run().

repaint();

setBackgrourid(Color.vvhite);

currentlmg = nekoPics[5'j; pause(150);

de 4: rascarse

cuatro

' " *"" " VlenIuna dc/

En esíe appiei hay mucho código go que miüz. ió :

Den.ro de. método run«, de, applet, se llama a, método r.ekoScratch,, con „„ argumento //

0Cada rrin fondo ~una*•cuja Cuadro "e labianc°-si animación«• .endrj

blanca alrededor.

1''. "g«gue la insinjcciún sigui guicnle al

v ,'

r una anisenci,,:.:. Observ a ani Obs f . n ÍT^ diftremes Parpadco en este applei, ya que el tamaño d '"" ""''^ ^ redwir la ranIidad de problema se minimiza Por lo cl ""T" * "' ^ ^ dÍbujo son Ian W"^"* W

veces

nekoScratch(4);

void nekoSleep(int numTimes)

»• "»l*lo I— el jpplei Neto.

{

for (int i = numTimes; i > 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 <*"«« ^^ s appleut (loca.,zarU, cargarlas y «aria* ccm». También aprendió cómo usar ^^j ^¡marlM). a ,,-avcs del método drawimage() para dcspleg

no es muy buena, es lomarse una siesla antes de iniciar la animación, para suspender mientras las imágenes se cardan. La tercera, la mejor solución, es usar observadores

de imagen para asegurarse que no haya parles de la animación que se reproduzcan antes de que las imágenes hayansido cargadas. Para más detalles revise la docu mentación de la ¡nterfaz ImageObserver.

m


Semana 2

Día

11

Construcción de

interfaces de usuario

sencillas para applets Con la popularidad de los sistemas operativos Macimosh y Windows, la mayoría de los actuales usuarios de computadora espera que sus programas desarrollen una

mu faz gráfica de usuario y hagan cosas c,uc puedan controlar con el r.,,rtll P,, el lugar de trabajo el derecho de apuntar y hacer clic está en primer .ugar, por encima

de la v,da. la hbenad y el objetivo de lograr un buen plan de retiro.

E.staS amenidades de software son gratas para el usuario pero no para el programador en muchos lenguajes. Escribir programas de manejo de ventanas puede tener

una o más tareas que representen un reto para un desarrollador novato.

Por fortuna, Java ha simplificado el proceso con el AWT (Kit de Herramientas de Manejo Abstracto de Ventanas), un conjunto de clases para la creación y uso de inte-

laces gráficas de usuario.

Hoy usted tendrá que usar el conjunto de herramientas para crear una interfaz de

usuano para un applet. Utilizará las técnicas de Java 1.0.2, debido a que permanece

como la versión estándar del lenguaje emre la audiencia de usuarios de applets.


Día 10 '

Para preparar la prueba del applet Fillmore, haga |o Slguienle:

ta acerca de los observadores de imágenes

!l^ >odo dra«() es ,a pa.abra Cave thi.. Corno recordara por,. "

t:

• Cree un subdirectorio nuevo en el directorio \j2iwork llamado images

s se puede utilizar dentro de un objeto para rcfer-rse a s,

'Í

'f1eSlC d'-^° elesde e« .si.io Web de es.e er archivo ch . jpg PrJ1 uier que ya esté en su sistema h ■

2S SECl'X^ -ras le es,, cargando U, arcb,,S de ..neos.

Cómo poner a trabajar las imágenes carga de una imagen desde un URL > 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' >• d<« '™<>dos de |a clase Inage y a.muc,-

escaLde

C°m° T**" "^ ^ *

escala de la imagen en las líneas 17-18.

Í

iWidth / 4, iHeight / 4, thit),

l pídeme R.lmo». En la línea 20. es.a variable se incremen.a pan, que |0 feo

más grande aparezca 10 pixeles a la derecha de la versión más pequeña


Construcción de interfaces de usuario sencillas para applets

Día 11

C°mpOnemeS' c°n'enedoreS y administradores de diseño que usted responsable del control del usuano.

^

^^

Cuando haya aprendido a crear programas m

^

Sw¡ngl,

de Java 2 para crear aplicaciones en el día ¿U, u

El AWT

algo

v-nfinas mejor c onocido como AWT. es un

y re

o desde e, r,,6n ye, tedado.

s acerca de «Smo usar otras clases que heredan de |a ,nis,na súplase.

Componentes de una interfaz de

usuano

„. de. usuano

a genera, y funcionad en todos ,os s,stemas en que se ejecute.

al crear applets de Java con el AWT es que algunas

Adición de componentes a un contenedor

Un componente se agrega a un contenedor a través de los pasos siguientes: • Crear el componente. funcionar una interta

ma5

navegadores como sea pos.ble.

appiets con ventanas en ianio>

• Llamar al método add () del contenedor con el componente.

TL

S aPP'elS S°" C0mened0reS' USIcd I»** -r e, método add,, dentro de

e, para agregar un componente en forma directa a la ventana del apple.

I

Mediante elAWT.unainterfa.de usuano consta de tres cosas:

zio dd awt - -

„ nüeda ser colocada en una inierlaz de usuar>o,

. Componen*. Cualquier cosa que p

^^^ dcsplazahlcSi menús ío

habilitados para hatur ci

„.«- -,,.» Un ob cí

CI1 U1, contenedor. Usted no vera el adm.msu.

.-o cM mu ,malu/i pcro jcll.

i i «.nueie 1 ava . awt. Para hacer que lodas las clases

Todas las clases de. AWT son parte del P*luc estén dispoiubles en un programa, se pueüc r¡or de un archivo de código fuente:

import

i!

java.awt.-;

la etiqueia dei boió Button panic = new Button("Panicl");

Ésta crea un objeto Button que se etiqueta con el texto "Panic! ■. T

nit¡v;imcn,c verá los resultados de su trabajo.

b ^^^ siguicnlc cn la parlc supe-

>ed 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;

<2

3

a

c •=

o. .h=

cj

81

-

"i:

O

•-

"

o

■o

o

VI

3"

? .^

(O

C

O *^

'-*

3 "O

."í

S

o

'C

'—1

rtj

c .9

C

3

ai

S

c

Ql

QJ

o

•"

QJ

W

Vi

j K

3

o

o

_j

x.

QJ

m

W

¿i

C

F

o

JO

«j

3 Ol

CT ■"

V

!_

^

O

gj

,/>

~O

10 H

Q

"" X) " fl)

E 8 ° =

S "> » 2 o "o

.2 O O -S

'£ c ^ £

*"

"O

.c

^i

a 3

O

-

ai

ni

a

O

c X)

i-

•S o "2 o.

■C "O

S £ c -o

—L

S

■o

2 Q.

r3

c

=

-^

X _

O "2

T3 c3

S5

'2

s. e

s —

« ."2

a)

■ 2" *-J

P

3

■2, c x)

§ Ü

-

lúa y. UJ

3

"u JZ p-

? —

Ü ■o

?3

O" u

u

c

&>-

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

<u

•o

.5

-*■

c

cj"

T3

■b o >c aj

o

U

'•-

o

o

5

o I

r-

v

8

S

-^

o

§

3

c

U

2

o V)

4 6

«

+^

Q

Q. at)

t-

^O

+

<

Q.

U

3

Ul

U

Ü

P

2 «

g.

3

o-

<J

-

o

O

o

o

S

-^

2

o

"O

"3 M

.2 "2 2-

^2

i.

—.

T3

a

«

XJ

o

sa

i "8

S •■"

o

T3

3 a. ■« «

S

■- >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» <t)

O

O

L. ■H

H

-H

o ■í

— —

c

c

o

a. ro

Q.

C£l ^


Puede crear un botón mediante alguno de los constructores siguiemes: • Button (, crea un botón sin una etique.a de texto que indica su función • Button(string) crea un botón con la cadena dada como una etique*. 18.

;ear T yOlT^ 'Utt°n' USI¿ddelPU£dC Sü -"-' ™» ").«— tr.ng) obtener la e.ique.a ,ex,oCOnfi»uw con el método getLabeK

public void init() {

n".

setFo(); setFont(lf);

setLayout(layout);

12:

El lisiado 11.3 contiene el

add(lefty);

13:

add(center);

14:

add(righty);

15:

Escriba Listado 11.3. El texto coMHFTn D£ vcr.java.

16:

17:

apple, VCR, elciual despliega vanos comandos ftft.ni.iaa.» en

}

Pn.ebe el funciona-niemo

de este applet con ,a siguiente «iqueu, «ique

1:

<APPLET>:

import java.awt.1

2: 3:

SB widtn=i75>

4:

<.ppl.t

public cl... VCR extends java.applet.Applet Button rewind = new Buttonf Rewind");

5:

Button play = new Button (»Play) ■

6:

Button ff = new Button("Fast Forward")-

7:

.Hardllnerr se coloca en el

rramicnia a usarse para

Button stop = new Button("Stop") •

8:

Button eat = new Button(»Eat Tap¿");

9:

10: 11:

public void init()

12:

Figura 11.2 El applet Labels.

SE3E ¡

1.3:

321

14: 15:

BUcdlnfl hcartl

16:

{

add(rewind); add(play); add(ff);

add(stop); add(eat);

17:

Pruebe el funcionamiento del applet VCR con el sigguiente código

HTML:

width=300>

1J „„„., „ a

"■ olones.

^ do

l,"

ewer. Observe q,,. ,1 bo.ún .,„

,7línea debidü u que llü h"Ma -ficien« «»**» -1»"'-

3PP ' dC 50ü PÍXd" dC "nch0 C" V" dc 30°. "« «neo botones estarán


275|

Escriba Figura 11.3

1:

El tip/ilei VCR.

2:

publie class

4:

Checkbox

5:

Checkbox

6:

Checkbox

7:

Las casillas de

8:

donadas" o vacías. Por lo

9:

aU. So- » P»

Checkbox Checkbox

10:

12:

{

c2.setState(true);

add(c3);

15:

add(c4);

16:

add(c5);

17:

18:

C4 = new Checkbox("Toro Stoppard")-

c5 = new Checkbox("Ivana Trump");'

add(c2);

14:

roí) ca.fi//<M

c2 = new Checkbox("Paulina Porizkova")■

c3 = new Checkbox("Ivan Reitman")-

add(d);

13:

</«■ í/iVí

CheckACzech extends java.applet.Applet f

c1 = new Checkbox("Milos Forman");

publie void init()

11:

Figura 11.4

HTML,

import java.awt.*;

3:

Casillas de verificación

Listado 11.4. El texto completo de checkaczech

]

}

La figura 11.5 muestra la salida de e.s.e nppiet, cuyo funcionamiento puede ser verificado con la

siguiente etiqueta <APPLET>:

dcseleccionadas al mismo tiempo.

Figura 11.5

sanaba cualquier oto de los ««.mes que e

El npplcl

-lalx HtM

j P P~W.. P.u» o.. r i..» ii«..■o

r im>5i«ü«m d r i>— i,^

cada como una etiqueta

Para organizar varias casillas de verificación den.ro de un grupo, de modo que sü,0 una pucda

«r seleccionada a la vez. se crea un objc.o CheckboxGroup empleando una insiniccion como la i|iie sigue:

verificación está seleccionada o no

CheckboxGroup radio = new CheckboxGroup();

El objeto CheckboxGroup se mantiene al tamo de >odas lus casillas de verificación del eruno. Usted usa este objeto como un afúmenlo adicional ;ll construcior Checkbox.


Construcción de ¡nterfaces de

Día 11

276

12:

add(pi);

13:

con ,a cadena dada que penen^ n« *»

¿^.^ úc QIra ,mncru cs t8l...

icrccr argumento es igual a true si w >-

add(P2);

14:

add(P3); add(p4);

16:

add(P5);

17:

18:

Precaución

}

Java 2 e, método constructor

E1 ejcnp.0 sigu.en.e crea un grupo y dos easiHas de verifican u,e ,e penen**,

Figura 11.6

CneckboxGroup betterDarrin = new Checkt,oxGroup(> . ^

Elapplet PickAPole.

^.

H, obje,o be«erD£ ,rin se usa ¡«.^¿^ITÍP^-^-"'

ciona el objeo ri. :! ccual uene la et>que,a 0^ ^ ^ ^'tru. sin ulifincam^ como el .crnl,e,nh,-o de, grupc a la ve., por llo que ees ,m^. ,m^. -

nineuna casilla selt :x¡onada.

rayS«or Kieslow .ki. c! di-cor de /»,„/. Bhwro v /f^.

^^ ^ ^ ^ una casllhl dc

^ verificación Se,ec^dl

" ""

Listas de selección

Checkt»*

sus: http://www.mcp.com/personal/

illllili

^ »"Cu-« O. e. cual devuelve la


Construcción de interfaces de

12-

* many lm.s P«' •«* do you access y

kte»?

Figura 11.7

usuario sencillas para applets

sPan.addltem("Julio Iglesias');

add(span);

''

14.' }

Ejemplo de unti lisi" de .selección.

E1 primer paso para crear una lista de selección es crear un objeo Choic. pangue contenga I:, Lo. como se.muestra en la insirucción siguiente: Choice gender = new ChoiceO;

^

^

rin0> Cn el

oí^Las instructores siguientes agregan dos elementos a la lisi:. do sesión *xo. gender.addltem("i.'.ale");

=200 width=i50>

Figura 11.8

twuiiii'i'j IB

El applet

SelectASpaniard.

gender.addltem("Female") ;

A cont.nuacón puede ^ .«««O - ^ - '» ^ "^ ^ ^ " '" ^^ do la lista de selección a un contenedor.

Trecaución

,„„,,„„„„.

lÍNl.Il,H.li,.i,,ii

Ia «- » - Posición

;-r

• El método 9etselectedltem(, dcv.oK, eI Iexl0 del elemcmo ^ • E método ,.lect( Jnt, seleccjona e| ^

• E, meiodo ulntl8tring) seltícciomt | 1:

import

java.awt.*;

3! publie class SelectASpaniard extends java.applet.Applet { 4: 5:

6: 7: 8: ■9:

10:

Campos de texto

Choice span = new ChoiceO; publie void init() { . ... span.addItem("Pedro Almodovar ), span.addltemC'Antonio Banderas span.addItem("Charo");

span.addltemCXavier Cugaf');

),

dase TextField

el texto que no

U" C°mponenIe

Puede crear un campo de texto medíame a.guno de ,„

. a panir de la

construc.ores ,¡guiemcs:

• TextField,) crea un campo de ,cx.o vaco sin un ancho especuleado. '


^

Día 11

Escriba

ÍTcon T.xtFi.ld(S^n9. int, para applets -superiores a la

para app,ets

' Et TEXT0 COMPLETO DE OUTOFSITE

1:

2:

. TextField(Strin9) crea un campo de .cx.o Heno con el ,cx,o espechcado y s,n

m

3: 4:

ningún ancho especificado.

ancho de un campo de texto únicamente tiene relevancia bajo un administrado,-

2

La ins,rucc,ón «guíeme crea un campo de ,cxto vacío con un espacio sulle,en,e para 30 carac-

6:

m

7: 8: 9:

:

IB:

11:

Se hubiera po lido miliar \, insiruceién «guíeme si usted hubiera proporcionado el texto ini

17:

cial "Puddin N.

18':

Tañe" en el campo de icxu» ñame:

Te.tField n3n,e = new T8xtField(-Puddin N. Tañe", 30);

#

add(address);

add(passwordLabel);

password.setEchoCharacter(•• ■) •

add(password);

19: 20:

m

add(addressLabel);

15: 16:

y

contraseña a n iradas indiscretas.

En J-.V, I ü -> ,ara configurar un carác.er común se utiliza el método setEchoCharacter

X e >:; .ase TextFiel,. (En verdones subsecuentes de, lenguaje se debe usar

ochar, C,a,,,. Si se usa una Leal para especificar el caracú,, ™*£™™ Lcada por chillas sencilla, como en ■ * ■ Java in.erpreía como un objeto Str.ng cualquier liicr: \ que aparezca entre H, ejemplo s,g nente crea un

ll dbl com.llas dobles.

campo de texto .establece un signo (*> como e, carácter que se

omparable a la fisura 11 9 íFn I, „ - 'J"M'"

comp;

iseño para prevenir este probieJa ,

diseño

■"lU"> dC ':' Vt""l:l":1 Pilr" )»o.luc¡r una *:ilid

^ SeCC'dn ^"^ " USar '°S ad'»¡»¡^^ore.s de

mostrará en ci amo el texto se escriba en el campo: TextField p;sskey = new TextField(i6); passkey.setE:hoCharacter('#') ;

y

m

add(site);

14:

TextField nume = new TextField(3B);

");

publie void init() { add(siteLabel);

12: 13:

teres:

m

5:

. TcxtFloid(Strinto, i«> crea ,.., campo do ,cx.» con ,. ,«,„ y :«K-h» especiólos.

Figura 11.9

&<'PpleiOutOfSite.

e está escribii ndo.

ene v.,os m.odos ql,e ,, Jlüttfcll ül¡l¡/ar

• El método B.tText (, devue)ve e|

• Eln.dodosetTextfSfrinp) llenada "upo con el

campo,

lexio indicado.


Construcción de ¡nterfaces de

usuario sencillas para applets

determina si el campo puede o no ser editado. Un e, campo sea editado y true ,o permite (que es ,o prede-

e

-Editas () devuelve un va.or boo.eano ind.cando s, e, campo puede ser

ediiable (t.rue) o no (false).

! *

I

eJ funcionanliemo de) apple(

;

lrBi

Áreas de texto

En la figura] 1.10 se muestra la salida del appiet cargado con el appletviewer. Figura 11. i o El appiet Virginia.

el componente.

Para crear un área de texto, utilice alguno de los constructores siguientes:

. TexTArea() crea un área de texto vacía de un ancho y alto especificado.

.

. TextAreaU.t, int) crea un área de «x,o vacía con .a camidadI indicada de hncas (prinicr averno) y c. ancho de caracas (sequío argu.ncuo).

. Terrea (Strina) eren un área de texto que connene la cadena ,nd,cad, de ancho y alto no especificados.

,

i,

de texto cuando se inicia la ejecución del programa.

:

1:

2: 3: 4:

import

java.awt.

publie class Virginia extends java.applet.Appiet { String letter = "Dear Editor:\n

+

5:

6: 7: 8: 9: 16: 11:

12: 13: 14: 15:

16: 17:

18:

me the truth,\n"

+

"is there a Santa Claus?\n\n "Virginia 0'Hanlon\n"

+

"115 West 95th Street\n" + "New York";

TextArea lt;

publie void init()

{

lt = new TextArea(letter, 16, 50), add(lt);

Listas desplazables

283 i


Construcción de interfaces de usuario sencillas para applets

Día 11 I 284

En .a figura 11., i se muestra la sa]ida del app)et; la etj

tjque[a

M

i siguiente:

Figura 11.11

seleccionado a.la vez.

indicada de elementos

El applei Hamlet con Chmilius, Polonius, y

Horario seleccionados.

Í ÍÍ

remezo para loH, " 8el'"(i#It) tnÜMJiin ^().C°-«temS() ,amb,én tiene e, m,s remplazo para los piogramas Java 2: getltemCount

add(String).)

m,smo

Ele,emplo silente crea una Ustay.ea.de dos elementos:

™'¿fplaable se pucdc cicgir más

.addl-.■.<•euild.nst.rn ,-,

^ zable con siete . lementos.

^ 9]etSieleCteÜInüe™s<) «"vuelve un arreglo de enteros que contiene ,a

sición del mdicc para cada elemento seleccionado.

• El método getselectedltems () devuelve un arreglo de cadenas de caracteres que cont.enen el texto de cada elemento seleccionado.

Barras de desplazamiento y deslizadores

Listad. >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>

<3pplet code-crosshair.class"

i

Resumen

</applet>

los componentes del AWT.

El AWT Figura 11.13

«unpos 4ue us.ed

El applet Crosshair.

i'"a ^ applct. cen el niclodo add() del

contenedor.

m m

hacer útil |a inlerfa2 grán¿

»nás acerca de lo que se necesi,. para

un,

Canvas.

Lo simiente está sucediendo en la clase Crosshair:

- -* de estos

.Y, Hnea 4 crea un objeto Gri-L.yout que ser, crecido co.no c. adulador de nara la clase en la línea 8

Preguntas y respuestas

O

p^

sido extremadamente lentos p ,

¡.0.2,

es lo que sucede en la clase:

' . Us Hnea, ,6 y .7 determinan e, punto en e, ™ o un applet de Java , .0.2

S12e ()

Z

im >d'

es.ándar cuando se escriben 1DDH V

Hace Cárnicamente cada vez que y

f

r evUar .os avisos de desaprobación cuando comp.lc

desaguadores de ^1^^ el cual haría po«ib.e «^^

» «te navegadores han

'"" Vereiones dd

libro-Microso/i

' Java '-0'2 SÍt'Ue S¡endo el

habilhadc* para J;lv, pucda corL o, ^ ™rlos CÜII

,

i

Mívmrox

y p;ira dibn¡ar cuatro laic

r:¿lt*¿l „,,,,

=,

para desarrollar una interfaz

Sin embargo, usar el AWT

de Java.

beneficios en otras áreas


Semana 2

»

Día

12

Organización de los componentes en una

interfaz de usuario Rara poder dar algún tipo de forma a una ¡merfaz dlscñ¡ldü

ldü

las diversas pla

CQn

s que soportan el lenguaje

El punto de inicio está en los administradores de diseño básico.


Día 12

292

_22f2Ífffííldelos.componentes en

Diseño básico de interfaces

void lnit() setLayout(lm);

Como aprendió ayer, una interfaz gráfica de usuario diseñada con el ANVT es algo muy fluí-

# una interfaz de usuario

{

do Redfmensionar una ventana puede causar estragos en su interfaz, a, moverse los componenies a posiciones que no tenía consideradas.

Esi-. fluidez es por necesidad. Java se implcmenta en muchas plataformas distintas y hay .Ufemias sutiles en la manen, en que cada piaufonna despea botones. ,,:,m,s ,1, dosp.:.,a-

,

los

iniiMili' y similares.

Con lenguajes de programación como Visual Basic de Microsoft, una posición de! compo-

El administrador FiowLay out

Z"Je"una ventana esta definida precisamente por sus coordenadas x, y. Alguna, herra-

n.icn.as de desarrollo de Java penniten un control similar sohre un;, inicrla* a ,™,-s de sus propias clases de manejo de ventanas.

::

Mediante el AWT. un programador ohtiene más control sobre la apariencia de una in.crfaz mediante los administradores de diseño.

f -pierdo o derecho d^ «owLayout. RIGHT debena ser e, J

Diseño de una interfaz

Un administrador de diseño determina cómo se habrán de organizar los co.nponen.es al ser

d7 del7constructor, como en lay instrucción

slSu

agregados a un contenedor.

E1 ;ltlmm,M,ndor de diseño predeterminé es .a clase FlowLayout. I:s,a Case ^^ los componentes fluvan de izquierda a derecha en el orden en que se agregan al contenedor.

La variable de ciase FlowLavout

clTdcl hay más'espacio, empieza ^mediatamente un nuevo renglón de componentes

Tfmtpd

debajo del primero, y continuará de izqu.erda a derecha, en ese orden.

El AWT incluye cinco administradores de diseño básicos: FiowLayout, GridLayout, Bo^erLayout CardLayout y GridBagLayout. Pan, crear ,m ¡ulnúnis.nulor de ;Mseno

pan!oledor, se L una instancia de, contenedor mediante una instruccon co.no la siguiente:

1: 2:

FiowLayout fio = new FiowLayout();

Después de crear un administrador de d.seño, usted lo convierte en el administrador de un comedor a ,r:,vcs de su ,né,odo setLayout (). Hl admimstrador de d.seno ya ueK esta, csl¡lh,,cido antes de agregar cualquier componente a! contenedor. Si no se esped.ca un administrador de diseño, se usará el diseño de Unjo.

L,s inscciones sieuien.es representan el punto de inicio para un applct que crea un adminí rador de diseño y usa setLayout (), por lo que controla la d.spos.c.on de todos los com ponentes que se agregarán a la ventana del applet: public class Starter extends java.applet.Applet { FiowLayout ln = new FiowLayout();.

3: 4: 5:

6: 7: 8:

9:

10: 11: 12: 13: 14:

15:

Butto

n cb =. new ntw Butto Butt0

-ÍS

(>c-9la:

.

,

Button d - new Button("Deadbea «');

!

í = MW Butt0"("Evidence- • f = new ButtonCFüBiti

yout lm

public void init() { setLayout(lm)•

add(a);

add(b);

9

'

2#


Día 12

i-

Listado 12.1. continuación add(c);

16:

"

add(d);

17:

add(e);

18:

add(f);

19:

do» „;,„„«„,„ „

28: 21:

ut(10,3);

se utilizó la

Piira producir la salida mostrada en la figura ,2.1 con e, appletv.ewer s

componed, componed, coT^^ofadS^™;,"1' eSPaCÍ° ^'^^ ** horijMn horijMntal

de cuadrícula con ]0 renglones 3 colum, ¡ 1

siguiente diquela <APPLET>:

vertical de 8 pixeles:

<applet cod.-Alph.b.t.cl«.

''

</applet>

E

Figura 12.1

Seis bolones organiza¡los cu mi diseño ile flujo.

dis*

En „ :w,tl MP»,»«t. el

aüicionales al consiructor FXowLayout (). cl , „,„■„, -nt inti loma los iresargumemossiguiemes.cn orden: El constructor FlowLayout(¿nf,

^nL,

i^,

. La alineaoói, que debe ser FlowLayout .CENTER, FlowLayout .LEFT o FlowLayout.RIGHT.

. El espacio horizontal entre componentes, en pixeles. . 1-1 espacio vertical, en pixeles.

B Cierne cons.rucor crea un admmistrador de d.se.o de Jjo con componen.es cenado un espacio horizontal de 30 pixeles y un espacio honzontal de 10.

FlowLayout fio = new FlowLayout(FlowLayout.CENTER, 30, ie);

BUttcncaroI=newButto

Utton

=

newBuno

(

«er);

Bul]""^•■"••""«onCMik.-?; Button bobby = new Button(»Bobby-,; publie void init() { setUyout(family}; add(marcia); add(carol); add(greg);

add(jan);

add(alice); add(peter);

add(cindy);

a la derecha. Cuando todas las celdas del re

(Maro

Button 9reg = new ButtonC'Greg-,; Bütton jan = new Button("Jan", : Button alice = new Button(-Ali¿.-|. BUttoncindy

T"" S'8UÍCn": cre:1 un disc

"*' "" CSpltao hor>™^ 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 <APPLET>:

«ppl.t cod.-Bunch.cl«." height=i68 width=i60>

component)

</applet>

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íi<iiii:.íiekin i e los componentes 1. ::j<> el diseño de bon es.

'* í

publie void init() { setLayout(b); add("North", north)add("South" south); add("East", east); add("Wesf", west);

12: 13: 14:

,^t

15:

m

16: 17:

'X~ia?W» i^vt* i'-'?'.

*'i

-

18:

19:

north = new Button("North");'

Button south = new Button( "South" •

7:-

}

}

add("Center

,

center);

t

m


una ¡nterfaz de usuario u ,:r¡ÍB !wemt ,8rega „„ h.i«ht-12. width-18.>

<aPPlet

pane.add(dialogue);

</applet>

Cómo mezclar administradores de diseño

e|

Diseño de interfaces avanzadas ZX t

,„ en»»- el

El administrador CardLay out :

"- "« «^ ,1:1 n,..,,,!,, C.

dos cosas que tener en mente cuando se trabaja con paneles:

„„,.

' . E1 pane, se Lena con componentes antes de ser coloco en un con.cncdor mas grande . El panel tiene su propio administrador de diseño.

Los pane,S se can con una simple »amada al constructor a h Case Pane, como Se muésira en el ejemplo siguiente:

Panel p; ne = new Panel O;

heredan . 1 co

:ls inwr lcc,Ones luientes crean un

administrador de diseño y lo aplican a un objeto Panel

llamado >ane:

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<"Card - + 1/iabfi]);

33:

34:

do ce:

35:

cc.shcwtthis, "Fact Card");

36: 37:

card.show(this, "Card

38:

current++;

39:

i-urrentj, current)-

current

= 0;

repaint();

42:

try

43:

iri por

r

if (current > 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, « <«**« como c,r«.

setLayoutfgridbag?;

Gri^agConstraints() ;

variable current.

. Línea ^8 -El valor de current se incrementa en 1. constraints.gridx =0constraints.gridy = a-

constraints.gridwidth'= t constraints.gridheight = í-

constraints.weightx = 30- ' constraints.weighty = 30'

Figura 12.4 Un naipe desplegado

en un diseño de mullínaipe.

"•nejar »„ ,¡po d« ,in,¡,¿ónS , J Jf

,.,

l ], cSmooren.e puede tomar más de una celda en la cuadrícula,

,„»„ ,eTOr un „,„,,

Paso uno: diseñe la cuadrícula

maneras.

iIUX¡|¡ ,r llamada G

Grld£agconstraints se dcHnen ccUIr posición, dimensiones, alineación ;cslncLncsy cada componente, dcnnc

lades de cada componente que se coloque en la

„ La relación entre la cuadrícula de bolsa, las

En w rom- n,s .enera,, ,a creación de una cuadrícula de bolsa .mpl.ca los ^ >„

¡ Crear un obJCto ori-.t^y

^

' como lo haría para cualquier administrador de diseño.

2. Crear una nueva instancia de GridBagConstraints. 3.

Establecer las restricciones para un componente.

"

entes:

ponen,e puede

^Xc^s I

rengfón final, que abarca dó coLI

y los campos de tex.o enen celdas.

T

Pr°PiaS CUadnCUlaS

c UMN

* ° V (como en el botón OK en el

«' botón ocupa dos columnas de


Organizan de los compone» en una interfaz de usuario

Día 12

Figura 12.5 Un diseño de cuadrícula de bolsa.

gbc.gridx = gx; gbc.gridy = gy;

9bcgridwidth = gw; Qbc.gridheight = gh; gbc.weightx = wx;

Figura 12.6 El diseño de cuadrícu

gbc. weighty = wy

la de bolsa de la figu ra 12.5, con una cuadrícula impuesta.

- ceidas con sus coordenadas , y ^£^

lc ^dara póstenoste. *^>™™ ^^ a la derecha de eU. es la ,.0. celda. La celda supenor .zqrnenta es W L

L¡1 cclda a la derecha de ésta es 0. P-ando

^ ^ ffl ,,

publie void init() {

succsiv;1111,,llc. Bisele sus ccM:,s o

¡«.uicnla es ü,l,la «gu,c,Hc c o -, ' ¿ ¿ cuando desarrolle e. cód.go para este

constraints.fill = GriOBagConstraints.BOTH;

Figura 12.7 El diseño de cui drícu-

Iti de bolsa de l< figu ra 12.5. con coi rile-

' * pci"i

nadas de celda.

Paso ios: cree la cuadricula

Ahora r pesemos . Java y empecemos a m*^ ~¿^ en pape . En principio, usted se va «, enU«, exc u las pr0l orciones correctas. Para esto, podna se

^ ^^ cün la cuad,alla y

^ ^^ ^ marcadores ^ ^^ y definen dara.

// etiqueta de nombre

buildConstraintsfconstraints, 0, 0 i Button labeli = new Buttoncla«¿: ■ •

%ba9í"°nStraÍntSabl

i ■:■-

»ca. por )„ que

,

100 1B(U. 100-100)-

s

,.„„„


Día 12

307 i

o

Ahora auenda .os deulte ¿Cuáles son los va.ores para .as resecciones que usted ha msertado en el método buildConstraintsO?

¡

mmmmm

¿^¿^Z^^

la ocupación (0,2). Aquí, a diferencia de los com^Z e o Gi

dos argumentos de buildConstraints ()) son 0 y 0, respectivamente.

Los siguientes dos argumentos enteros son gridwidth y gridheight. No son anchos ni nen.e cubre sólo una celda, por lo que los valores para ambos son 1.

Los dos últimos argumenlos enteros son para weightx v weiflhty. que se mitan para

""" Í/X'UÍL'"la- lh""fc C11"*™

« 2 (ocupa dQS co¿na -"'- ^o a que «, Ce,da ocupa varias coiumnas. y 9 ^feight es I (ocupa únicamente un renglón):

^^^?::::^:;: iodrsS iosreslriccio"« ''e cada * compo-

esquina superior izquierda.

Este botón esta en 1. esquina superior izquierda, por .o que su grid* y gridy dos primeros

que ocup. dos co.umnas en el

al administrador del diseño v lu«.an

-estra «, resu)lado en este ^TS^fnoT C°mP°neme a) ^ La ««- "í

exactas aquí, o asegurar que todo es.é alineado De Í, ""■ Pre°CUparSe de ias ^porciones

Ce que la caadrfeuta sea funciona,, que ,^ e, 1 ^ '" ^ "^""^ ^ a"UÍ «

no estéé pasando nada extraño quecosas).

q

c ,d

COma°celdas * rcnS'Olieii ColuranM^ L °""correcto, Sliei yy Co encimadas, 3S ^ lu«Jr y ese tipo

Figura 12.8

Diseño de cuadrícula de bolsa, primer paso. ambos valores a 100. Los pesos se verán en el paso tres.

Ñame ■'!■' I '■'!■■■'.■>'

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 '«<° £

' '

' !»• V> //texto nombre ' 0' 40^ //contraseña

\' )' l> »¿¡ //texto contraseña ' ' '' '■ 20)-' //botón 0K

Proporciones correctas

Figura 12.9

Diseño de cuadrícula

de bolsa, segundo paso.

to en la li.'ta anterior.

Si observa la figura 12.6 (la imagen del panel con la cuadrícula sobrepuesta), verá que la .segun da columr 1 es mucho más grande que la primera. Si fuera a elegir porcentajes teóricos para esas

columnas, podría decir que la primera es 10 por ciento y la segunda es 90 por ciento. (Esto es una esti.iv ción; y es todo lo que necesita hacer también.) Con estas dos supos.ciones, usted las puede asi, .nar a las celdas. No necesita asignar algún valor a la celda con eP botón OK. porque

grandes espera que sear]

la celda .)' upa ambas columnas y allí los porcentaje-, no luiwu.narún. Agregúelos ¡, las punierados celda', la etiqueta del nombre y la del campo de texto del nombre: buildCoistraints(constr.aints, 0,

0, 1,

1.

//nombre

10,

büudCo,straintsiconstraints, 1, 0, 1, 1, 90.

; Qué pas 1 con los valores de las dos celdas restantes, la etiqueta de contraseña y el campo de texto? Pu »to que las proporciones de las columnas han sido previamente establecidas por la enqueta 1 e nombre y de campo, usted no tiene que volver a establecerlas aquí. Déle tanto a estas celí as, como a la primera del bolón OK, los valores 8:

buildCoistraints<constrair.ts, 0, 1, 1, 1, 0, 100); //contraseña biiildCMStraintslconstraints,

1,1,1,1,0-

ena funcionar a ,a ¿

//texto nombre

100); //texto contrasena

buildCcistraints(constraints, 0, 2, 2, 1, 0, 100); //botón 0K

Observe aquí que un valor 0 no significa que la celda tenga un ancho de 0. Estos valores son pro| orciones, no valores de pixel. Un 0 simplemente significa que la proporción ha s.do

estiblec da a algo distimo; todo-lo que 0 dice es "organícelo para que llene el espacio".

-'ed.obtiene si utili,, ,« m,smas componentes reales.

Figura 12.10

Diseño de cuadrícula d^ bolsa, casi lisia.

í fiasswonii:,!

puede remplazar los botones marcadores es- Puesto que ya ha configurado todo.

asi. La figura J2.10 muestra lo que

como antes y remplaza los botones con los


Organfcaclon de lo, componen... en una interfaz de usuario

Día 12'

Lo que se «.* olvidando son .as restricciones que organi,an los componentes dentro de la . celda Hay dos de ellas: f ill y anchor.

El valor predeterminado de anchor es GridBagConstraints

f

CENTEfi

r-

f5

ir

alores, definid» como variables en la clase GridBagConstramts:

. GridBagConstraints.BOTH, extiende el componente para llenar la celda en ambas direoiones.

,

. 6rid iagConstraints.NONE, hace que el componente se despliegue en su .amano mas

„ „„ componn

=.

pequeño.

. GridBagConstraints.HORIZONTAL, hace que el componente se cxt.end;. en la d.rcc-

*

ción lorizontal.

S 00,,,.

. GridI1aoConstraints.VERTICAL. extiende el componente en la .Ihvcco» v,n,d. '.

c ° '""•'''"' "Cados hori/iWitalinenlc (p;»;i que inicien 1111:1 línoi niili

se extiendan al ancho de la celda).

Nota

Tenga presente que este diseño es dinámico. Usted no va a establee

las

dLenÍones en pixeles reales para ningún componente; en vez de ello, J

le indica a esos elementos en qué direcci6n pueden crecer ya que un

panel puede ser de cualquier tamaño.

• El bolón no tendrá f ill y estará alineado al centro,

lisio se re/'leja en el código completo al lina) de es,;l sección.

Paso cinco: haga ajustes

Por lo común, mientras usted trabaja con sus propios programas y diseños de cuadrícula de ^,^1 diseño resullanle pide que se piense un poco en él.

d7

Í IT

el'código ,ar., este ejemplo, se agregó esta línea al método imt( ): constraiits.fill = GridBagConstraints.BOTH;

Ahora ya «be .o que hace. Para ,a verstón fina, de este apote, usted podra el.minar esa línea y añadir valores f ill para cada componente independiente s, as, lo desea.

La según, ««necion que afecta .a aparición de un componente en la celda es anchor. Esta restriccir , se aplica únicamente a los componentes que no se ajustan a oda la celda, > le d

e

1 WT dónde colocar al componente dentro de la celda. Los valores pos,ble, pa.aK

n anchor son GridBaoXonstraints.CENTER, que alinea el componen* tamo non-

ces es, i noJ tener un diseño casi linnles,

pífife

P

perfecto cada vez.

e'rl

a tr Í de es e nH]S al SeZ™ la «P«™¡on hasta este punto, podría seHe útil

co po e co

po

e

S° "ea P°r línea' a*Purind0* «««c ent.ende las distintas partes que ,o

Listado 12.5. El

texto completo de ñamepass. java

"'. mo vocalmente dentro de la ce.da o alguno de los ocho valores de d.recoo,

1: import java.awt.*;

GridBa<Constraints.NORTH

GridBagConstraints.SOUTH

3: publie el... «„„„, ,n,M, )„,,.„„,!.,.,,,„„ {

Gr.dBaiconstraints.NORTHEAST

GridBagConstramts.SOUTHWEST

GridBa Constraints.EAST

GridBagConstraints.WEST

GridBa¡Constraints.SOUTHEAST

GridBagConstraints.NORTHWEST

"■


Organización de los componentes en una interfaz de usuario

Día 12

'

312

8: 9:

gbc.gridx

=

gx;

gbc.gridy

=

ay;

gbc.gridWidth

10:

=

gbc.weightx

12:

=

14:

_

La sigui

La siguiente etiqueta <APPLET> sirvió para probar e, funcionamiento de este applef

wx;

XítCOd""

gbc.weighty = wy;

13:

gw;

gbc.gridheight = gh;

11:

~

Button okb = new Button("OK");

LISTADO 12.5. CONTINUADOR 7:

~

;

*° width-24t>

Cuando compile eSte app,et, la llamada al mélodo setEchoCharacter(, en I, linca linca 48

15: 16:

c^rrzrr'*dbi

17:

18:

setLayout(gridbag);

19: 20:

de nombre

21: 23:

25:

28:

29:

add(labeli);

ipadx agrega espacio a cualquier lado del componente, e ipady lo agreda arriba y abajo.

31: 32: 34:

35: 36:

,/ etiqueta de contraseña

, ,, e, «)!

,lUUdConstraints(cons tr

41:

42: 43: 44:

47: 48:

49:

add(label2);

50:

51 : 52:

53: 54:

55:

TextField tfpass = new TextFieMU.

Para incluir un inset para su diseño, tiene que sobreponer el método insetsO para Java 1.0.2, o el método getlnsets (, para Java 2. Estos métodos hacen la misma cosa ints).

gridbag.setconstraints(tfpass,

Dentro de los métodos get Insets(, o insets (,. cree un nuevo objeto Insets, donde el ons rucor de h, clase Jnsets tome cuatro v:,,o,cs enteros que representan los n.ár.cnc, upeñor. «quinto, mfenor y derecho de. pane,. El método insets () deberá entonces

add(tfpass);

botón OK

T"lar CamÍdad d£ eSPaC'° ülreded°r d£l Panei m¡™- L» clase Insets

Los márgenes determinan el espacio entre las orillas de un panel y sus componentes.

// campo de texto de contraseña

tfpass.•etEchoCh.r.et.r{'>,

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:

<■ ™

2, 2, i, e. 2e>;

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

<v -a

Í3

o

-J-.

V-

O

^(

O

./:

5

c

r-

<r.

1>

cr

3

u

J <

.— —

.=

r3

«

a-

p

"2

■—

-^

c

"S i 2

j=

'i x :j

O

id

U

JD

^

'-»

c

=

(y

£

3 CU

-íj

?*-»

5

">

o

o -o

2 J=

o

S ,2 °"

o fc

o

;=

=

M

o

lili s

V

t-

cu D a.

>.

e O

O

<"

» p.

3

o

¿ U

S 1 -B

3

O

5

s

e

1

u ?3

tea

O U

en

2

E

■o

1 '

cu

o

~

3 C

■O

3 'c

N

<-

° a

te -S

0.

c

0 í-

H 5" =: -o"

c "• § ~

C

u

ü S 3

■•5

«So

a 1 g.

•O

«o»

lis §•

11 1

i i i

"° -i a

4j

> fD k-

D en cu

o.

3

>í

>»

Q.


Semana 2

Día

13

Respuesta a la entrada del usuario en un applet !„„-

„ reipj,u a

Hoy aprenderá, aplicando las técnicas de Java I 0 •> có,n« h

maneje los eventos para que sus oraran,,

Sador Web que sopc^ L. D ra T

7

*C^

Sng, aprende. . manejar Jos ^

q

applcI


Día 13

1318

é)

J^fstaa la entrada del

usuario en un applet

Manejo de eventos Alf o de lo que aprendió al crear applets por primera vez es que, cada vez que se ejecuta el

programa hay fuerzas que trabajan "tras bambalinas". El sistema de manejo de ventanas de

»„,«„„„„. ,ouseUp()

„,

Java llama automáticamente a métodos como paint (), init () y start () cada vez que los necesita, sin que usted intervenga.

Al igual que en la programación de applets, el manejo de los eventos involucra métodos que son llamados en forma automática cada vez que el usuario realiza uno de esos eventos.

Tipos de eventos Un evento se genera en respuesta a casi todo lo que un usuario puede hacer durante el ciclo de vida de un programa de Java. Cada movimiento del ratón, clic o tecla, genera un evento.

En sus programas usted no tiene que tratar con todos los eventos que pudieran ocurrir. En vez

de eso, maneja aquellos eventos a los cuales desea que e! programa responda, ignorando los

Manejo de los clics del rató ratón az del programa.

en cualquier parle de |a

demás. Por ejiMiiplo. si el usuario hace clic cu cualquier lugar cu la ventana <U'I appU'l. o piv si'nía una (cela, usted espera que el programa actúe en respuesta a ese evento.

É ¡tos son algunos de los eventos que se pueden manejar en sus propios programas:

• Ches del raían. Ratón abajo (botón presionado), ratón arriba (botón suelto) y clic del ratón (oprimir y soltar en el mismo sitio).

• Movimientos del ratón. Entradas o salidas del puntero del ratón a un componente de la interfaz, o arrastre del ratón (movimientos del puntero que ocurren con el bolón pre sionado).

botón y un evento ratón arriba ., « en diferentes etapas del clic.

• Tedas presionadas. Tecla presionada, tecla liberada y tecla digitada (presionada y libe rada).

• Eventos de interfaz de usuario. Botón presionado, movimiento de la barra de desplaza miento hacia arriba y abajo, activación de menús contextúales, etcétera.

0 m

El método handleEvent() E manejo de eventos es el área donde se han dado los cambios más importantes entre Java I J.2 y su presente versión 2. Los eventos se generan y fluyen a través del sistema casi en la rr.isma forma, independientemente de la versión del lenguaje que esté usando al crear el prog ama. La diferencia estriba en la forma de recibir y procesar los eventos. L n Java 1.0.2, lodos los eventos que ocurren durante el ciclo de existencia de su programa

f uyen a través del mismo y son manejados por un método llamado handleEvent(). Este r tétodo está definido en la clase Component, heredada de java.applet.Applet.

". El siguiente „ un ejemplo de1 ZáÍ c boxean mouseDown(Event

permile 1ue s"«dan cosas dtferen-

ii; ust:d sobrepone ia *"«


Día 13

320

JíffPíífftaaJa entrada del

usuario en un applet

del evento al entrar a través de los argumentos x y y al método CVI>

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 {

••

»<


Día 13

325|

Listado

ic boolean iiouseDown(Event

System.out.println("Too many spots.");

21:

#

evt

f #

22: 23: 24:

25:

void addspot(int x,int y)

26: 27:

28:

xspots[currspots]

=

x;

yspots[currspots]

=

y;

„ ,

{

Click count: 1 Click count: 2 Click count: 3

currspots++;

29:

#

repaint();

30:

31: 32:

public void paint(Graphics g)

33:

#

{

g.setColor(Color.blue);

34:

for (int i = 0; i < currspots; i++) {

35:

g.fillOval(xspots[i]

36:

- 10, yspots[i]

10,

20,

20)5

37:

38:

39:

}

Manejo de los movimientos del *

Usted pi ede cargar este applet en una página con el siguiente HTML:

doS ,¡po,

ratón

a, fc ,„„„«.

<applei code="Spots.class" height=250 width=250> </appli t>

Doble clic ¿Qué s cede si en el evento de ratón que le interesa hay más de un clic? 6O qué tul s, usted

Iré ,n clic doble o un clic uiple? La dase Event de Java le proporciona una variable

Eventos de arrastre y movimiento del rató ratón mancr i:

publdc boolean n>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 <«*»' —tpoint r

""^ dlb"J;lr ^^^ lo <i™


Día 13

Respuesta a la entrada del usuario en un applet 58:

59:

Listado 13.2

•;

12:

13:

#

# #

14:

setBackground(Color.white);

ends[i].y);

// dibuja la línea actual g.setColor(Color.blue)-

63: 64:

16:

}

17:

public boolean »ouseDovm(Event evt, int x, int y) { if (currline < MAXUNES), {

19:

anchor = new Point(x,y);

20:

if (currentpoint 1= nuil)

65:

g.drawLine(anchor.x,anchor.y currentpoint.x,currentpoint.y,;

66: 67: 68:

}

return true;

21:

}

elSeSyÍte».out.println("Too many Unes.");

23: 24:

*

62:

public void init() {

15:

16:

:.

60: 61:

22: _

// número de lineas

Pruebe esle applet con el siguiente HTML:

return false;

25: 26:

27: 28: 29:

public boolean mouseUp(Event evt, int x, int y) { if (currline < MAXLINES)

30:

31:

return

32: 33:

35:

}

36:

public boolean mouseDrag(Event evt, int x, int y) {

37:

if (currline < MAXLINES) { currentpoint = new Point(x,y);

38:

39:

^^

true;

repaintO;

40:

return

41: 42:

else

43:

true;

return false;

44:

#

#

45: 46:

#

ends[currline] = new Point(x,y); currline++;

49:

currentpoint = nuil; anchor = nuil;

51:

repaintO;

52: 54:

55:

56: 57:

—-

para recibir entradas Más adelarn^ Zc H

de enfoque. Es más fáci, eme'der f ™S escribir en ese cL^o con" cíTn ^ que recba e, enfoque. Tol ^ i"" 0"°

.ex.0. E?cursor Pa;;;;, ca:e; 7:si picnsa picns en un

/l8urar para que tengan,.

*

COn eVentos

C' . « P«oden con-

starts[currline] = anchor;

48:

53:

^r ;:r:tz:t teela teela sese genera gene un event°de

void addline(int x.int y) {

47:

50:

#

Manejo de los eventos de teclado

else return false;

34:

{

addline(x,y);

}

public void paint(Graphics 9) í

// dibuja las líneas existentes

for (int i = B; i < currline; i++) {

enfoque a un

quit.requestFocusf)¡

'"

Puede asignar el enfoque a una ventana de apple, lla.ando a, método request.ocus () de,

331


apple,

Los eventos tecla abajo y tecla arriba Para manejar .os eventos en un teclado, utilice el método keyDown(): public boolean keyDown(Event evt, int key) {

^^Il£USBTÁNDAR Tecla inicio ;i fin

Tecla RePág (Pagc Upj

Tecla AvPág (Page Down) Plecha hacia arriba

caracteres, ilc este modo: currentchar =

(char)key;

P'<x-hu liacia abajo F'ccha a la Í2tjUicrc|

cnid,, vo q»í votocs son producidos po. «]UÍ carjclc

a la derecha Tecla F]

.printlnCCharacter:

Tecla F2

+ (char)key)

Tecla F3 Tecla F4 Tecla F5 Tecla F6

public boolean keyUp(Event evt, int key)

{

Tecla F7 Tecla F8 Tecla F9

Teclas predeterminadas

Tecla FIO Tecla Fl

lisa es,as , ^as. usted puede

L (Lusa a, usar estas

Tecla F! 2

caracteres if

(key == Event.UP) { //

■ •

Lo L C ,c los va,ores contenidos en estas variables de Case son enteros. lambién puede un liz

l ar la instrucción switch para probarlo


Día 13

Figura 13.3. El applcl Keys.

así, la ventana del arJet n u requestFoc^(); de no' teciado. Recuerde esta dife encTa "a21 i' '"^ ^ '3 6

usen eventos de teclado Para pedi ex .

este a

Pf°band° applets

tana de app.et. mejor use r^^"^ 6' enf°^e «»™ "« ven-

s menos complicado que los c,ue utilizó ames, ya que sólo nene ,rcs

y los valores de ese carácter. Ésta es la definición de la clase .mc.al: import

java.awt.Graphics;

import

java.awt.Event;

import

java.awt.Font;

import

java.awt.Color;

case Event.DOWN: curry

publie class Keys extends java.applet.Applet {

curry

char

currkey;

int

currx;

int

curry;

+=

5-

break; case Event.UP: .=

5;

break; case Event.lEFT: currx

-=

5;

break;

l). Aquí, init() es responsable de tres larcas:

o de letra del applet (en este caso. Helvética negrita

deÍ6 puntos) y es.ab.ecer I, posición mica, de. carácter (e, centro de la pantalla, menos algunos puntos para ajustado ligeramente hacia arriba y a la derecha).

case Event.filGHT: currx

+=

5;

break;

default:

currkey = (char)key; repaintf); return true;

publie void init() {

currx = (size().width / 2) • 8; curry = (size().height / 2) • 16; setBackground(Color.white);

setFont(new Font("Helvética", Font.BOLD, 36)), requestFocusO;

f" del carácter. Si el evento « l

.imiiiivininitn ictbc i i'ih ni:i instrucción en el nieiotio ínii \) "- "•■ >-

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"<- •

el componente que la maneja, la ventana del applet en este caso.

nada que dibujar, así que ^ ^ ¿ Nota

En versiones anteriores de Java no era necesario llamar a r.qu..tFoc« )

para que la ventana del applet recibiera entrada desde el tee .do. pod«

enfocar la ventana haciendo clic en ella. Esto funcona todav.a en las ult.mas

"«do que us,cd dibuja,. e, :lpp)e, s6,o „■

publie void paintfGraphics g, { if (currkey l= 0} { 9drasti

no tiene un carácter inicial y 0, de


Dh-13

336

-l^üPííüÜfja entrada del usuario en un applet

El listado 13.3 muestra el código fuente completo del applet Keys. Listado 13.3. Texto completo de keys .java. 1:

2:

3: 4:

5:

6:

import

Java.awt.Graphi.es;

import

java.awt.Event;

import

java.awt.Font;

import

java.awt.Color;

48:

}'•' "T •■;:/.-1 .„■. ,..,.,,,,, :

public class Keys extends java.applet.Applet {

7:

8:

char currkey;

9:

int

currx;

10:

int

curry;

11: 12:

public void init() curry =

14: 15:

requestFocusO;

18:

21:

}

public boolean keyDown(Event evt, int key) {

22:

switch

23:

case

(key)

break;

25:

case

Event.UP:

27:

curry

28:

break;

29:

case

eurrx

31:

break; case

-= 5;

Event.RIGHT:

currx += 5;

33:

break;

34: 35:

-= 5;

Event.LEFT:

30: 32:

{

Event.DOWN:

curry += 5;

24:

26:

-16;

setFont(new Font("Helvética",Font.B0LD,36));

17:

20:

(sizep .height / 2)

.

// predeterminado

setBackground(Color.white);

16:

19:

{

currx = (size().width / 2) -8;

13:

default:

currkey =

36:

(char)key;

37:

38: 39:

repaint();

48:

return

true;

41: 42:

43: 44:

public void paint(Graphics g) if

(currkey

!= 0)

{

{

del ratón, los eventos de


Día 13

Java asignan internamente las acciones derecha y central a las teclas mod.ficadons Meta y Control (Ctrl), respectivamente. Probando las teclas modificadoras, puede avenguar que botón se usó y ejecutar un comportamiento para esos botones, distinto al que usar.a para

#

E| ™ét°do handleEvent(:) luce as'í:' ■ ■> '

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 *

<=' ratón y ei teclado.

e*™eme igua] que ¡os mélodos de ^^ ^.-como

}

Asimi.mo observe que handleEvent () devuelve un valor booleano. igual que los métodos indivi. uales para eventos individuales. Aquí el valor devuelto es particularmente importante:

si usial pasa el manejo del even.o a otro método, tiene que devolver í alse (e! método que llame también devuelve true o f alse). Si maneja el evento en el cuerpo de este método,

devuc Ive true; si pasa el evento a una superclase, ese método devolverá true o f alse; usted no tif ne que devolverlo personalmente.

Manejo de los eventos de componentes

n hace que pase un objeto extrl ln ¡ CT° 7"'° ^ repreien- «le ««" (e" CMe CÓd>¿°- 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 <0 I

2

ID

a> <a

c

g •o

u a w

o -H

JJ

O11

a> 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

<u

c OJ

V)

E

"d.

";

V5

1>

■ —

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-£

^

<u •« | -3

3 y

= 5

=

tü £ <

C

o

5 2 '= 4J

c

U

5

= 5

II I |J

13 c

o. "o -o -•-

^

=

c *-•

£ £ 3 2 .á. •5

g 3 5 3

2 2 ? o (« ¿

5 H

^

*-*

-

ü

=>

O

C

v-

*j

c. 3

i II! í

y;

3 u- 5 5

_Ju(nu-J


Día 13

Para los evemos seleccionar l.sta y dese.eccionar lista, no es fácil obtener^métodos^ que se

puedan sobreponer para su uso. Para esos eventos tiene que uul.zar handleEvent(,, de la siguiente forma:

public boolean handleEvent(Event evt) { if

(evt.id == Event.LIST_SELECT)

ID de evento ■

SCROLL_ABS0LUTE

Lo que representa

SCROLL_LINE OOWN

handleSelect(Event);

else if (evt.id == Event.LIST_DESELECT) handleDeselect(Event);

SCROLL_LINE_UP

else return super.handleEvent(evt);

SCROLL_PAGE_OOIVN SCROLL_PAGE_UP

Í^iñrcrior. cm- llamada pcrmi.c que los «ros even.os pasen sin contranemp al método original handleEvent ().

°r de

Eventos del área de texto L,s <re-,s de ,cx.o tienen los mismos eventos que los campos de texto. l':,a atrapar los even-

fondo

3

toVcle enfoque puede utilizar los métodos gotFocus() y lostFocus(): public boolean gotFocus'Event evt, Object arg) { }

public boolean lostFocus(Event evt, Object arg) { //

. • ■

Eventos de listas desplazables

Figura 13.4

El' upplet SetBack. '■..'.'.Ümü-ií^i •".'■•

Fstas l.stas generan «res tipos diferentes de eventos: seleccionar o defeccionar un etanento

^vidual de una Hsta da como «altado un evento de seleccon o cancc.ac.on d. hsta. > 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 +-<

•o CO

c o

cu

0) r\

H c

c

3

o

3

CQ

II

01 c

+j

o

c

3

x:

CO

•o

T>

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: <applet code='SetBack.class- widí </applet>

a

Preguntas y respuestas P

T

madas para este botón (es'

Presiona e, botón), pero no

para

n7 lmpIemCntar "evoluciones de Ha-

arbitrario. En C++, sólo

ejec"te un '"dtod«>

í-¿;° ;

actiono, elcual de^ar comenído ent'"" dC

« crear un componamiento di éreme

dase de su botón. Este aspecto delT

función-En 's "*

^^ e ! T" ^ *"

"' neCeS"a CTCar UIW subc'»« en la

o -de, de ,llaneJ0 üe :p:;;^: :iuie;;:T(:vacrazones por ias 'SUS propios """ponentes

es mucho más fácil y eficienie cumHn '. -T

28: 29:

d

redButton = new Button("Red");

11:

23:

"*

ion-

setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)),

1C:

22:

redondeará sus conocimientos

cutarf características como las ventanas

c6d¡go de ,a interfa2yde u;u¿CUJnd0 " C°d'=ü del —,o no e.s.á demasío ligado al


Semana 2

Día 14 Desarrollo de interfaces

de usuario avanzadas

con el AWT

* awt <kíi * ■ apren-

„„„„,

Cén,o «tacta» ,os

«aun». „,„„„ , „,„„, Menús.

Cómo crear aplicaciones AWT independlientes.

™. «tanfa «M


Día 14

35,

#

Ventanas, marcos y <^dros de dij^ogo

^ Tín :"ewFrame<"My Cool Window) •

„„ dcn.cn» * ,n,c,te de « «^* ^ j ,„,,,„,„, » «,>M~,nc»

r:::;:s;r:™»»,- * - ■ - -«

»-■■

- - -

in.setLayout(new BorderLayo

Corth, !!ne Bí? in.atídCNorth-

«n..ddccnt.r-,

#

r^pT

pendientes de Java.

g° aJUSla eI lamaño de !a «»^ a 100 pixe-

les de ancho por 200 de al.o win.resize(100, 200);

#

Puesto que distintos sistemas tieren diCerenie, ¡ l

soluciones para esos pIxe,es> es dificü

B. U-- -

cada plataforma. Las ventana, qui

pequeñas para otra.

n

v

"CXiJaü"„ muy n b>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-— £<*

Window-),

(window.isShowing/))

25:

errores y seguridad".

{

.isShow window. showM;

}

Escriba 1:

FI6URA 14.1

2:

/:/ ni'i'lei >' l« vaiumu

3: 4:

que produce.

5:

import java.awt.»;

class BaseFramel extends Frane { String^essage -Th is . window...

6:

7: 8:

setLayout(new BorderLayout())•

10:

11:

í

12: 13:

Escriba 1:

2: 3: 4:

5:

BaseFramel(String title, { super(title);

9:

Labei-

14: 15:

import java.awt.*;

public class PopUpWindow extends java.applet.Applet {

Insets getlnsets() {

return new lnsets(2e,0,25,(

18:

Fratne window;

Button open,

16: 17:

19:

cióse;

}

6: 7: 8:

9: 11:

12: 13: 14:

add(open);

cióse = new Buttonf"Cióse

height=200 width=200>

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. «,<" li.ll:. Jd •'-•■•»: "» campo de texto y un botón en un diseño de borde. El método getlnsets () agrega algunos márgenes y el método' action(), que maneja la acción del botón OK del dialogo. El método action() hace dos cosas: oculta el diálogo en la línea 28 y lo retira, y en la línea 29 cambia el valor de la etiqueta del marco ancestro y lo convierte en el nuevo valor del texto.

Objetos de diálogo de archivo

¡Tantas clases para un simple applet! Las diversas ventanas y las clases de eventos asociados

hacen complicado al applet. Aunque, en este punto, debe estar tranquilo de cómo cada parte

#

de un applet liene sus propios componentes y acciones, y por la forma en que se ajustan todas sus parles.

'os applet, ,a mayoría d.*^^^1"'""» * ***** h excePdones de «9"'«*i aplicaciones independices ° ™S fáC" USar

Cómo adjuntar diálogos a ios applets

cuando trata de usar estas instancias F<

Los d>álogos sólo se pueden adjuntar a los marcos. Para crear un diálogo, .tiene que pasar una

instancia de la cías, Frame a uno de los métodos constructores del diálogo. Esto implica que no puede crear cuadios de diálogo que estén adjuntos a los applets. Como los applets no üenen marcos explícitos, usted no le puede dar un argumento de «narco a la clase Dialog. S.n

^

embargo recurriendo a una trampa de código puede acceder al objeto frame que cont.enc ese

applet (normalmente, el navegador o la ventana misma del visor del applets) y usarlo como V

el

marco para el diálogo.

Este códi»o uiilba el método getParent () definido para todos los componentes del AWT. l-l método g'tParent () devuelve el objeto que contiene este objeto. Por lo lamo, el ohje.o

Ma f°rma Crea m diálogo para cargar un archivo.

^

«*» U" d^° * archivo, pero se usa

nrchiro °

guardarlo. (La única diferen

<ie archivo no abre

ancestro (dentro de todas las aplicaciones del AWT) t.ene que ser un marco. Los applets se comportan del mismo modo. Llamando repetidamente a getParent(). estará en posibilidad

de tener a.xeso a una instancia de Frame. Éste es el código que puede poner dentro del applet:

Object anchorpoint = getParent()

while (!

(anchorpoint instanceof Frame))

anchorpoint = (

(Component) anchorpoint ).getParent ();

En la primera línea de este código, usted crea una variable local llamada anchorpoint para

que con., nga el futuro marco para este applel. El objeto asignado a anchorpoint puede ser de much; s clases, por lo tanto declare su tipo como Obj ect.

Las dos Ineas siguientes del código son un ciclo while que llama a getParent () en cada objeio dit .-reme de la cadena hasta llegar a un objeto Frame. Observe aquí que, para que el

método g -tParentí) funcione, y ya que este método está definido solamente en los objetos

f-

nómbÍe'd'el ^^ ^

QetFile(,. Ambos le desvuelven c dZ

-memo, podra abnr e, J

"

* <»>* '« cienx- us^i puede (,b,enor el S 9etDire«ory,, y

Eventos de ventanas

que lo he.cdan de Component, tiene que convertir por cas. el valor de anchorpomt a Componer t cada vez.

Después c , h salida del ciclo, el objeto contenido en I;, variable anchorpoint será una insuman

de h di* Frame (o una de sus subclases). Entonces, podrá crear un objeto Dialog adjunto a ese marco ye «ivertir anchorpoint una vez más para est.tr seguro de que tiene un objeto Frame: TextDia.og di = new TextDialog((Frame)anchorpoint, ■En :er Texf,

true);

con la variable de instancia id

#


Día 14

1362

363 i Tabla 14.1.

Eventos de ventanas.

Cuándo se presenta

Nombre del evento

Se genera al destruir una ventana mediante el cuadro Closc, o el

WINDOWJJESTROY

elemento Cióse en el menú.

Se genera cuando la ventana estaba oculta por otra y es traída

WINDOW_EXPOSE

al frente. WINDOW_ICONIFY

Se genera al minimizar la ventana.

WINDOW_DEIC0NIFY

Se genera al restaurar la ventana.

WINDOW_M0VED

Se genera al mover la ventana.

disable 0 ;

habilitarlo de nuevo):

Elementos de menú

Menús Sólo nos queda hablar de un elemento de la interfaz de usuario en el AWT: los menús

Una barra de menús es una colección de menús. Un menú, a su vez, contiene una colección de elementos, los cuales pueden tener nombres y, algunas veces, métodos abreviados de teclado opcionales. El AWT proporciona clases para todos estos elementos de menú, entre ellas MenuBar, Menú y Menultem.

Menús y barras de menús Termino Nuevo

Una barra de menús es un grupo de menús que aparecen a lo ancho de la pantalla en su parte superior. Como forman parte integral de la ventana, usted

no puede crear barras de menús en los applets (pero si ese applel tiene una ventana indepen diente, la ventana puede tener una barra de menús).

Para crear una barra de menús en una ventana específica, debe crear una nueva instancia de la clase MenuBar:

MenuBar mbar = new MenuBar();

Para establecer esta barra de menús como el menú predeterminado para la ventana, utilice el método setMenuBar() (definido en la clase Frarae), de la siguiente forma: window.setMenuBar(mbar);

■limibión puede añadir menús individuales (Archivo, Kdiiur. ele.) ¡i la hami de menús, creán dolos y agregándolos con add(). El argumenio para el constructor Menú, es el nombre del menú lal como deberá aparecer en la barra de menús. Menú myMenu =

La clase CheckboxMe

new Menu("File");

mbar.add(myMenu);

lar:


Día 14

1364

rrss¿

myMenu.add(coords);

P

,

llc pin agregar un separador al menú (una línea que se usa para separar grupos de

Rnalmen.c. P

g

S

»

^^ ^ ^^ am „,, j;ll,,1,1 ^ t.üllu> ,Ul|ll,1;

tÍÍcÍC JavJorcan un Cemento separador de menú y lo agregan ,1 menú .yMenu. Menultem msep = new Menultem("-");

Dentro de) método main n

myMenu.add(msep);

Cualquier elemento de menú se puede desactivar con el método dxsable<, v se acuva üc

L-vo medíame enable(). l-«s clc.ncn.os desac.ivados no son m,jc.os «le ^u»,, Menultem item = new Menultem("Fill"); rjyMenu.add

(item);

item.cüsable();

Eventos de menu menú venio:» uc . hecho de seleccionar un elemento de menú con el ratón, o con un métodc, abrev,a o desde

I Sado. ucncra un evento de acción. Puede manejar ese evento a .raves de, mundo action(). como lo ha estado haciendo durante los últimos dos d,as.

Adcnvís de lo. evento* de acción. CheckboxMenuItems genera even.os de sclccci.n y dese-

¡ección de lisia, los cuales se pueden manejar mediante handlrfvent ().

r mforme v. procesando eventos «enerados por elementos de menú y ciclemos de casilla de S Ja" no o de que como ¿hec^xMenuIte, es una subclase de .enulte. no nece;¡m^ «« elemento de menú como un caso especa.. Puede manejar es.a accon dd. mismo modo en que maneja otros métodos de acc.ón.

Creación de aplicaciones AWT independientes L-ación de Java 1.0.2.

isma forma en las aplicaciones de Java y en los app.ets.

uú.i,ar de la misma

Para controlar y maneiar I


Día 14

1366

public void windowClosing(WindowEvent e)

{

win.hideO;

win.destroyO; System.exit(0);

£1 diseño de/applet

U mejor forma de iniciar Ja

Un ejemplo completo: el convertidor RGB a HSB

Como una oportunidad para darle otra utilidad al material de días anicriorcs, presentamos un

ejemplo de applet que nos muestra la creación del diseño, los paneles anidados, la creación de la interfaz y el manejo de los eventos.

La figura 14.3 muestra el applet que usted creará en este ejemplo. El applet ColorTest le permite tomar colores de los espacios de color sRGB y HSB. los cuales describen los colores basados c. el contenido de rojo, verde y azul, o los valores de tono, saturación y brillante/. respectivamente.

Figura 14.3 Elup¡¡lcl Color Test.

El applet ColorTest tiene tres parles principales: un cuadro de color en el lado izquierdo y dos grupos de campos de texto en el derecho. El primer grupo indica los valores sRGB; el segundo los HSB. Si cambia cualquiera de los valores en cualquiera de los cuadros de texto,

actualizará el cuadro de color con el color nuevo, con los mismos valores del otro grupo de cuadros de texto.

Este applet utiliza dos clases:

• ColorTest, que hereda de Applet. Ésta es la clase que controla al applet.

• ColorControls, que hereda de Panel. Esta clase se crea para representar un grupo de tres campos de texto y para manejar las acciones desde ellos. Se crean dos instancias de esta clase, una para los valores de sRGB y otra para los de HSB, y se agregan al

z^

applet.

Por su complejidad, y porque puede crear confusiones, trabaje en este ejemplo paso a paso.

Al final de esta sección se muestra el código completo para este applet.

del upo Colore™ T orcontrols PPara controlar los


Día 14

^

ColorControls RGBcontrols, HSBcontrols; Canvas

swatch;

Ahora puede avanzar a. método init (), donde tiene lugar toda la iniciación básica y el diseño del applet. Para inicializar el applet siga estos tres pasos:

, Gree el diseño de las partes grandes del applet. Aunque aquí funcionaría un diseño de ' flujo es mejor crear una cuadrícula con una fila y tres columnas.

2. Cree e inicialice los tres componentes de este applet: un lienzo para el cuadro de color

n

con el AWT

369 I

Definición de los subpaneles i

La ciase ColorControls tendrá m

q^ rePreSenIan ,os valores RGB y ^^

-anejar los subpane.es

. -belase de Applet porque en reaL/d

heredarla de Panel; 1 Import java.awt.*; .,,-.'...

Pant;'- Defínala para

^ColorControls extendV Panel {

y dos subpaneles para los campos de texto.

3. Agregue esos componentes al applet.

El paso 1 es el diseño. Utilice un diseño de cuadrícula con un espacio de 10 pumos para

**

separar cada componente:

setLayout(new GridLayout(1, 3, 5, 15));

El paso 2 es la creación de los componentes, primero el lienzo. Tiene una variable de instan

*-

cia para contenerlo. Aquí crea el lien/.o e inicial!/,, el fondo en negro: swatch = new Canvas();

swatch.setBackground(Color.black);

referenca a una instancia de ia

También necesita crear aquí dos instancias de los paneles ColorControls inexis.cn.es hasta

ColorTest applet;

^ZZo. Pues* qul todavía no ha creado ,. Case, usted no sabe cómo se .ra el eons-

#

<«

-

U"° «

T.«tFi.«

RGBcontrols = new ColorControls(...); HSBcontrols = new ColorControls(...);

El paso 3 es agregar los tres componentes ai panel del appleu en esta forma:

C'S°' "^ "" '"él0<i° con«™cior. Dentro del

constructor hará mucho de lo

^''"" ^ ^ *"*" **" "' mÍ^1'

-ar ,„ campos de texto y

add(swatch);

add(RGBcontrols);

add(HSBcontrols);

M.n.ras trabaja en el diseño, agregue ios márgenes para el apple. 00 puntos a lo largo de todos los bordes):

publie Insets getlnsetsO

{

return new Insets(i0, 10, 10, 10)L

]- y, Uceó hasta ahí? En este punto usted debe tener tres variables de instancia, un método init () con dos constructores incompletos y un método getlnsetsO en su clase

CoTo^est. Continúe la creacón de. d,seño de. subpane, en .a Case ColorControls, para que pueda llenar estos constructores y terminar el d.seno.

pueda utilizar en ios campos' RGB

^ '° baS'S'me t>cnérica como '':lra 1¡UC la dÍfiere" dnícamcnlc e" Un

«pecto: las etique.as para e. ,ex«o-

UMed puede plr e<¿ ^ X

necesita uno más: ]a referencia del

constructor.

.

9

2

lrUctor de dicha clase. En ese caso, coloque algunos constructores vacos, desPu,> podra llenar los detalles.

t

''

entos de)

ColorControls(ColorTest parent

i

'

co"s'rucl°^ «' ColorTest. También

'nChjldo' misma W «ambién puede ob.ener de)

Stri"9 11, Stringl2;stringI3)


Día 14

1370

1 i Inicie esle constructor estableciendo primero el valor de parent a la variable de instancia applet: applet

=

parent;

.

.

:

thisipara pasar él objeto CoIorT est

constructores:

a estos

A continuación, cree el diseño de este panel. También puede usar un diseño de cuadrícula

para estos subpaneles, como lo hizo para el panel del applet, pero esta vez la cuadrícula lendrá tres filas (una para cada uno de los pares de campos de texto y etiquetas) y dos columnas (una para las etiquetas y otra para los campos). También debe definir un espacio de 10 puntos entre los componentes de la cuadrícula: setLayout(new GridLayout(3,2,10,10));

= new TextField("0");

^^^ontrois para

Manejo de eventos

tfield2 = new TextField("0");

tfield3 = new TextField("0");

Agregue estos campos y las etiquetas apropiadas al panel, medíanle los tres parámetros restantes del constructor, como texto para las eiiqueias: add(new Label(H,

'"-alizar

"titear vafores ¡n¡e¡.l«adorí «« forma para un Zl

apropiadas:

tfieldi

' los va(or" <*«

son o, por eso po

ppet en afgún otro ^

Ahora, ya puede crear y añadir los componentes al pane!. Primero debe crear los objetos campo <lc lexlo (inicializados con la cadena "0") y asignarlos a las variables de inslaiuia

Label.RIGHT));

2

add(tfieldi);

add(new Label(12,

Label.RIGHT));

add(tfield2);

add(new Label(13,

opuesto para reflejar el

Label.RIGHT));

add(tfield3);

-* ■—

Usted ha terminado el constructor de la clase ColorControls del subpanel. ¿Ya terminó el diseño? Todavía no. También puede añadir márgenes alrededor del subpanel, solameme en la pane superior e inferior, para mejorar un poco el diseño. Agregue aquí los márgenes, lal como lo hizo en laclase ColorTest utilizando el método getlnsets(): publie

Insets getlnsets()

return new Insets(10,

{

10,

0i 0);

}

j Ya casi termina! Ahora tiene colocado el 98 por ciento de la estructura básica y está listo para seguir, pero le falta un paso: regresar a ColorTest y arreglar los constructores vacíos para el

.update(this)-

return true;

else return false;

Mibpanel. de modo que se igualen con los consmiciores para ColorControls.

En el método action (i u

El constructor que acaba de crear para ColorControls tiene cuatro argumentos: el objeto

generada realmente por ,n

ColorTest y ires diquelas (cadenas). Recuerde cuando creó el meuxlo init () para ColorTest.

Aaregó dos marcadores de posición para crear nuevos objeios de ColorControls. Ahora cambie esos marcadores de posición por las versiones correctas. Asegúrese de agregar los cuatro argumentos que el constructor necesita para trabajar: el objelo ColorTest y

ésa es la única acción que va

as/fue, ,lame al méJ0 upd.t.^^^Tr

que refleje los nuevos valores. Debido a que e í la actualización, precisamen.e por eso ne eslta enT *"

al método correcto en el momento prec so

disPonib)es

d aPP'et'

de ,cxro.

"acer ,oda

"ue Pueda


Día 14

con el AWT

Actualización del resultado

Ahora viene la parte difícil: hacer la actualización basándose *n los nuevos valores de

cualquier campo de texto que haya cambiado. Para este paso, necesita definir el método update () en la clase ColorTest. Este método toma un solo argumento: la instancia

Colorcontrols que contiene el valor que cambió. (El armenio !o toma de los métodos de evento en el objeto Colorcontrols.)

y actualizar el lado HSB del nwi p" "'""" ^^^()'Necesila crear un nuevo objeto Color puede crear un nuevo obipm mi/,~

¿No interferirá este método con el método update() del sistema? No.

Mota

, i

Con Jos tres vaJores RGB usted

newcolor(value1> 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<));

Tnl valúes = íníeger.parselnt(controlPanel.tfield3.getText());

P¡.doS y re3!¡enJo «| ,2 , HSB|e] •= 368; HSBJ1] '=108; HSB[2) ■= 108;

los „„„,„« .pro-


Día 14

^

Ahora ya tiene los números que quiere. La última parte de la actuaban pone nuevamente estos valores en los campos de texto. Desde luego, ?s.os valores son aun números de punto

con el

El código fuente completo

"otante de modo que tiene que convenirlos a ints antes de convertidos en cadenas y

d puede Segu¡r Jas ihmL

HSBcontrols.tfieldi.setText(StrinQ.ValueOf((int)HSBW));

HSBcontrols.tfield2.setText<Strin0.value0f

int HSB 1

'a ciase del apple, ColorTest, y ej

«=ü -aginarse ,o que esta pa

guardarlos:

.

HSBcontrols.tfield3.setText(String.value0f((int)HSB[2])),

Ya estamos a medio camino. La siguiente parte del apple, es la que actualiza los valores RGB cuando cambia un campo de texto en el lado HSB. Esta parte es el else en el gran

if...else c,ue define este método y determina qué es lo que se debe ae.ualuar. una ve

dado el cambio.

Es más fácil generar va.ores RGB, tomándo.os de los valores HSB, que hacer todo£ proceso a la inversa Un método de la clase Color, getHSBColor(), creu un nuevo obje.o de Color a

partir de .res valores HSB. Una vez que obtiene un objeto Color, puede extraer laclmenle los

publlc void init() {

vires RGB III inconveniente, desde luego, es que aetHSBColor ,o,«a .res armemos Je punto Dotante y que los va.ores que usted nene son los va!ores enteros que pre.en.uuhzar A, Samar a getHSBColor, tendrá que convertir por cast los valores enteros de os campos de

setUyout<new GrldLayoutM

swatch = new CanvaS()-

' '

3

'

,ex.o a f loats v dividirlos entre el factor de conversión apropiado, bl resuliaJo de

geTnSBColor e's un objeto Color. De ahí en ade.ante, simplemente puede asonar el objeto a la variable local c de modo que la pueda usar de nuevo ñus .cíclame, c = color.getHSBColor((float)valuei

/ 360,

(float)value2 / 100, (float)value3 / 1

Una vez estableado d objeto Color, oetuaüzar los valore de RGB implica h extraen de esos valores desde ese obje.o Color. Los métodos OetRed(). SetGreen() y oetBlue(),

Public Insets getlnsets() 1

}

definidos en la clase Color, harán justamente eso:

retur" "*w Insets(10, 1e, 1e, „,.

RGBcontrols.tf ieldi .setText (String.valueOf (c.getRedO ));

BGBcontrols.tfield2.setText(String.valueOf c.oetGreen

),

RGBcontrols.tfield3.setText(String.valueOf(c.getBlue())),

Por último, y

sin que importe s, cambiaron los valores de RGB o HSB

cnnbiar el color. Asimismo, observe que setBacXground no red.ln.ja la p auu.málica. así que csiablezca de inmedialo mi nieiodo repaint (): swatch.setBackground(c);

sv/atch. repaint();

¡Ya está! Lo logró. Ahora, compile las clases ColorTest y ColorControls. cree un arehivo HTML para cargar el applel ColorTest, y verifíquelo.

1

void üpd.t.(ColorControl, controlPanel)

c = new Color(valuei, value2, value3)-

floatrj HSB = Colop.BGBtoHSBv.Sei ' ' valúes, (new floatf31))-

HSB[0J .= 36e. HSB[1]

.=

10e.

HSB[2]

•= 180;

l >>>•


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<: nnr,intr >, 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<int nurcDays, long numPages) {

-todos los métodos

son

Acceso protegido y una variabie a ,

• Las subclases de una clase.

• Las demás clases del mismo paquete Wrater. pe ro

ienen el acceso para haeeilo. no tiene

Para hacer eso ul¡I¡ce eI modjficador pr(Jtecte£ji

protected boolean weNeedMoreCalgon ¿ true;

385


Día 15

387|

Nota

También se preguntará por qué son diferentes estos dos grupos. Después de todo ¿qué las subclases no forman parte del mismo paquete que su

superclase? No siempre. Applet es un ejemplo. Ésta es una subclase de

3 ava awt. Panel pero en realidad está en su propio paquete, j ava. applet.

La forma en que el acceso protegido difiere de los accesos predeterminados es la siguiente; las variables protegidas están disponibles para las subclases, aun cuando no estén en el mismo paquete.

P.sic nivel de control ele acceso es útil cumulo «|uiere lacilin.r cjuc muí subclase se .inplemcnie a sí misma. Su clase podría utilizar un método o variable para ayudar a la clase a que haga su trabajo Debido a que una subclase hereda mucho del mismo comportamiento y atribuios,

podría tener la misma tarca por hacer. El acceso protegido le da a la subclase una oportunidad

De la misma clase

De cualquier clase

. en el mismo paquete

¡ De cualquier clase fuera del paquete De una subclase

en el mismo paquete

sí no

.De una subclase fuera , del mismo paquete

sr

si

de usar un método o variable de ayuda evitando, al mismo tiempo, su utilización par una clase no relacionada.

Considere el ejemplo de una clase AudioPlayer, la cual reproduce un archivo digital de audio. AudioPlayer tiene un método llamado openSpeaker(). un método interno que intcraciu» con el hardware para preparar las bocinas para que reproduzcan el sonido. openSpeaker() no es importante para los que están fuera de la clase AudioPlayer, de modo que, a primera v.sia,

Control de acceso y herencia «.«do' original.

comral de ,raso

quizá la quisiera hacer prívate. Un segmento de AudioPlayer se vería asi: class AudioPlayer

{

private boolean openSpeaker(Speaker sp) { // detalles de la implementación

tacer

Este codioo funciona bien s. no se derivaran subclases de AudioPlayer. Pero, ¿qué pasaría si usted fuer"a a crear una clase llamada StreaningAudioPlayer que fuera una subclase de AudioPlayer? Esta clase podría requerir acceso al método openSpeaker() para sobrepo nerlo y proporcionar una corriente de inicialización específica de audio para las bocinas. Usted no quiere que el método esté disponible para cualquier objeto (por lo tanto no debería

ic en las subclases;

de aceeso

ser publie), pero sí quiere que la subclase tenga acceso a el.

r de acceso

Comparación de los niveles de control de acceso

Las diferencias entre los diversos tipos de prolección se pueden volver muy confusas, particu larmente en el caso de los métodos y variables protected. La tabla 15.1, que resume con

exactitud lo que está permitido y dónde, ayuda a aclarar las diferencias entre las lormas de protección, desde las menos (publie) hasta las más restrictivas (private).

rabie de En Estados Unidos, un cód^ po17^7

valores del 10000 al 99999 ñero „

postales.

r ""

9' Per° °tr0S emerOS fuera

C¡nC° dí8itos: son vá)idos Ios

rango no pueden ser códigos


Día 15

388

Para evitar que una clase extema establezca la variable zipCode en forma incorrecta, puede

f

declararla prívate con una instrucción como ésta:

puede usar el nombre de un objeto dÍ ■

prívate int zipCode;

, es lllejot. uliliar c| nJ™^ h cIase- P-o en ei caso de las variables

Sin embargo, ¿qué pasaría si otras clases requirieran la posibilidad de establecer la variable zipCode para la clase con el Tin de hacerla útil? En esa circunstancia, le puede dar acceso a

otras clases a una variable privada, a través de un método de acceso dentro de la misma clase que contiene a zipCode.

i

Los métodos de acceso toman este nombre porque proporcionan el acceso a algo que, de otra forma, estaría lucra de los límites. A través de un método para proporcionar el a.-ceso a una

variable privada, usted puede controlar cómo se utilizará esa variable. En el ejemplo del códi go postal, la clase podría evitar que alguien más estableciera zipCode en un valor incorreclo.

Suele haber métodos de acceso separados que pueden leer y escribir una variable. Los méto dos que leen tienen un nombre que comienza con get, y los que escriben tienen un nombre que comienza con set, como en setZipCode(iní) y getZipCodefmtj.

Nota

Esta convención se está haciendo cada vez más estándar con cada versión de Java Usted debe recordar cómo ha cambiado el método size() de la clase Dimensión a getSize() a partir de Java 2. Tal vez quiera utilizar la misma con vención de nombramiento para sus propios métodos de acceso como un

1:

medio para que la clase sea más inteligible.

2: 3: 4:

5:

Es una técnica común, en la programación orientada a objetos, utilizar estos métodos para acecsar a variables de instancia. Esta técnica hace que las clases sean más reui:^:.b!cs porque las protege contra un uso inapropiüdo.

6: 7: 8:

.

9: ■

10:

Métodos y variables estáticos

Un modificador que ya ha utilizado en los programas es static. presentado-durante el día 6.

-Creación de clases". El modificador static sirve para crear métodos y variables de clase, publie class Circle

11: 12:

18:

{

area(float r) pi

*

r

*

r;

{

19: ;

21:, 22: 23: 24:

^""""^«"«s.addlnstanceo;

publie

.20: return

}

14: 15:

17:

publie static float pi = 3.14159265F; publie float

Countlnstances() {

13:

16:

como en el ejemplo siguiente:

ei " C°l0r-&lack ° "rcle.pi

}


Día 15

La salida de este programa es la siguiente:

Salida

Started with 0 instances Creates

10

Variables

instances

Este ejemplo tiene un cierto número de características, de nudo que tómese su tiempo para leerlas línea por línea. En la línea 2 usted declara una vanable de clase prívate para con-

tener el número de instancias (llamadas numlnstances). Es una variable de clase (declarada static) porque el número de instancias es importante para la clase como un todo, no para cualquier instancia individual. Además es privada, de modo que sigue las m.smas reglas de los métodos de acceso de las variables de instancia..

se

""""*eambian SU Va'Or-

C0n ,as variables el

ia constante ^

^ «««.tic para convertir . nu""- »° tiene muchas razones

para darle . cada objeto>

vanable de clase con la

Observe la iniciación de nunünstances a 0 en esa misma línea. Del mismo modo en que se inicializa una variable de instancia al crear la instancializa, se inicializa una variable de clase al crear la clase. Esta inicialización de la clase se da esencialmente antes de que suceda cualquier otra cosa en esa clase, o en sus instancias, de modo que la clase del ejemplo trabajará tal como se planeó.

En las líneas 4-6. usted crea un método get para esa variable de instancia privada con el fin de obtener su valor (9etNumInstances()). Este método también queda declarado como un método de ch.se" y:, que se aplica dircca.ncme „ la variable do clase. Hl ,,iólhIo 0CtNumInStanccs()

..adición al lenguaje de las clases internas

"° cambió como P™ de la

Métodos

se declara protectefj, en oposición a public. porque sólo esta clase, y quizás las subclases, estarán interesadas en ese valor; por lo tanto, las demás clases no lo pueden ver.

Observe que no tiene un método de acceso para e«ablecer el valor. La razón es que el valor de I-. variable se debe incrementar sólo cuando se crea una nueva instancia; no se debe

s

establecer en cualquier valor aleatorio. Por lo tanto, en vez de crear un método de acceso, lo

^odtficador f mal en la declaración de clase, como en el ejem-

.^.final void getMaxwellSmart() {

que crea es un método privado especial llamado addlnstanceí) en las l.neas 8-I0 que mc.t-

£™:rrrmo fr•es para hacer

mema el valor de numlnstances en 1.

Las líneas P-14 crean el método constructor para esta clase. Recuerde, los constructores

se llaman cada vez que se crea un nuevo objeto, lo cual hace que éste sea el lugar log.co para llamar a addlnstance() e incrementar la vanable.

Por último, el método nmin() indica que lo puede ejecutar como una aplicación de Java y probar todos los demás métodos. En el método main(). usted crea 10 instancias de la clase Countinstances. reportando el valor de la vanable de clase numlnstances al terminar M cual, podemos predecir, será 18).

Clases, métodos y variables final

El modificador final se utiliza con las clases, métodos y variables para indicar que no cam

biarán. Tiene un significado diferente para cada cosa que pueda finalizar, de acuerdo con lo siguiente:

• Una clase final no puede tener subclases.

. Un método final no puede ser sobrepuesto por ninguna subclase. • Una variable final no puede cambiar su valor.

#

Pío stguiente:

Java. ejecuta un método.Trime^ ver Sea 1 T" verifica a su superclase y poTúZ"

7 ^ """ etUxmttar ei

encontrar e, métOdo. £,a secute" SL00"011111^ ^ " * ^^ haSta

y facilidad de desarrollo.

*" "" P°C° de Velocidad «" aras de la flexibilidad código de by,es

nunca va a carnbiar aunouel soLpíZZ métodos a mél0d0s de tipo f inal de que el método sea sobrep

desámente este cambio J La biblioteca

o,

muchas pa

más

a

e'imina la "Osibilidad

T UM SUbC'aSe' de «-o que analice cuida-


Día 15

1392

^Pf^te^nterfaces y otras características

.Publie abstract:class BróadwayBoogieWcogie {

Los métodos prívate son finales aunque no se declaren asi porque no

Nota

pueden ser heredados por las subclases bajo ninguna circunstancia.

dos y variabies que son útiles par 2T.1 «ÍsT 7"es ia

s Cases mediante e. modificador final en la declaración de ,a clase, como en el

componente genérico que se ¿ueda agreg" iu¡> M 7

ejemplo siguiente:

un objeto Component en un programa

publie final class AnotherFineMess {

una clase

final no se pueden derivar subclases. Al igual que con los método, finales, este

duce algunos i introduce algunos beneficie» de velocidad en el lenguaje de Java, a expon** ^ la

flexibilidad.

^

Las c,ases abstraes también pueden conten Iodos TT^ * ^ "" "lélOd°S-

métodos sin implementacién. Estos métodcs se m 1

"' °S ^ S°" '"^ úc

ta. Los métodos abstrac.os se decLn on"l ^ódT T'3" '" SUbdaSeS de la clase ^c

-étodo abstracto en una clase no ablc e¡™^\^^- No puede declarar un

abstractos, mejor ütü¡oe una imer^^ ^^^

Paquetes empezar desde el principio.

finales amónicamente, de modo Todos los métodos en una clase final se convierten en quc no tiene que utilizar un modificador en sus declaraciones.

No tendrá muchas razones pan, hacer que sus propias Cases sean finales porque las Cases que pueden legar su comportamiento y atributos a las subclases, son mucho m-. unles.

Clases v métodos abstractos

v>>*

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 <U -o

1 2

■o.fe

=

g?

cr

a.

a

c

o

so

5P '—

2

c

p •-

¡i p

.-§ 3

3 =

_

Ti

.c

IIII ._

«>

.2

1/1

c

g *

u «

"■ 5 —

<« u

"

a.

SJ I

-o

a s §

i | o .

i 11..

o

u

-

8. u

0

a "2

■3-^2 8 "¿

-^

O

3

3. g s E." .ü

1 3 E •- 'ü

-c £

2 "^

o

n

i iI

c

2

'.a. .2

^ 5

•= -o

1=1

c

« S. Í

■£. = -.o

«

o

m

» i

<3 o

2

g

11 § i -s -i§ 2 3 3.|-3 .5 =-S

o

„•• .2

S

"o ^ 3

o

o"

3 s s-

6.

'i §"

1 cd

ia.a2 I« ti

g

P

O

«í

-

^1

Z. ■* S 3

3

o

C

=

e

g

o

•J

s ^

o

I

-

O

3

"H ■^3

'> c: <u

en

J C

=3 O

a.

a.

3

u

.E

3

o c

E

c

S

por-

O c

c

5 o

3:

S. t™ .

2-

c

o

= u

a.

s Ti

c

O ■a fü

If

-S

«j

o

í

c

o.

0

w

cu

1

s ^

¡S

1

K

_

<u

E

T3

c 3

5

0

ai

Í i 0.

(O

■£

'5. 0

.—

a

p

5 c

o.

"S

o

i

-o

*~*

S

o

5

o-

**

2

C

.5

O-

ni

01

|

"a £

c

OJ

■8.1

Q.

(0

+-

■re

c

0/

(0

3.'

-

J

j

I I.

ai

2

0

m

*

5.'

5 o E-SI; ™

O

u

cu

o.

Q

L.

~q¡

a

c

r

c

ra

o a. E

W

flj

■^

u

0 c.

<u

3

zr

a.

H

"3

II U

u

& 3

I §

o -

O

p

1 5

1 3-ü

+5 S

0)

»/i

O

3

-y.

■3

2 E.

S

O,

3 cr

«

..

a z

0

1

t.

2

a

o

°

°

í

=

U

-H

8.

I-5-

o-

a

c

p

o

o

o

c

2

-o

a- °

3

3 " -S cr

«

u

o

55

Í3 c S

■o

« -í

.2, S. .s "¿

3

§■ E "-.

11

g

•5

CL. _O

II

" tí

CL T3

l!

>

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

" <-'- que f «¡n que sea u .si.nplcmente:

declarado implícitamente como tal (growItBiggerQ):

publie abstract void growlt();

que s

««■ tí. ¿De qu¿ lipo w a

Growable con un método declarado explícitamente publie y abstract (growItO) y uno publie interface Growable {

I^Í^J^ríacesyotrasc^Kterísticüs

interface Fruitlike {

■ic abstract germinate(F ruitlika

self)

implcmentación.

Además de los métodos, las interfaces también pueden tener variables, pero dichas variables ■' deben ser declaradas como publie, static y final faciéndolas consumles). Al igual que con los mélodos, usted puede definir en forma explícita una variable para que sea publie. static, y final, o ésta será definida implícitamente como tal si no utiliza esos modilieadores. Aquí tenemos la misma definición Growable con dos nueuis variables:

;i) ubJeio aprojiia,

class Orange extends Fruit { '

9erminate(Fruitlike self) / ,, "9e the0^9e = (Orange,self;

publie interface Growable {

publie static final int increment = 10;

long maxnum = 1000800; // se vuelve pública, estática y final

'

publie abstract void growlt(); //explícitamente público y abstracto void growItBiggerO; // implícitamente público y abstracto

}

I as inierfaces deben tener protección pública o de paquete, igual que las clases. Observe, sin embar-o que las interfaces sin el modificador publie no convienen sus métodos auiomauca-

mcnie'a publie y abstract ni sus constantes a publie. Una interfa/ no-public también

licnc métodos y constantes no-public que puedenser utilizados únii-amcmc por las clases y

Cómo extender interfaces

Al 'gual que con Jas ciases ustrH „

4

-erfaz hereda de olra inlerfaz, e^^^ '»

de método que definió su "superimerfa^7£LL T" -«.nd.. ta, como ,o haría en una definici^e c,^ ^ "

en una .jerarqufa. Cuando una

defÍDÍCÍOn«' >'

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 <W:' ""

■tton "l> Cl""ic"c '"'"'«* ^nl.u.

ac°™jable es .mplemen.arla como clase interna.

^ol^^^Z,^^^0^:de la c)ase que ia comiene-

dase Blu.Button, e. nombre !„„„«Cu tTÍ™ f T"' "" C' J couiTon. cl

publie class Inner extends java.applet.Applet { Button b1 = new Button("0ne"); BlueButton b2 = new BlueButton("Two");

5: 6: 7:

publie void init()

8: 9:

add(í>1);

10:

add(b2);

11:

«e deben incluir

{

el aPP,et

Inner. class e InnerS-

class BlueButton extends Button {

12:

BlueButton(String label)

13:

{

super(label); this.setBackground(Color.blue);

14:

15:

16: 17:

18:

La figura 15.1 se produjo en appletviewer con la siguiente etiqueta HTML: ■

opplet :ode="Inner.class" wiútn=i00 height=i00> </applet>

Figura 15.1 El apiilel hmcr.

!*_

En este c¡ :mplo, la clase BlueButton no difiere de una clase de ayuda que esta inclu.da en el

mismo ar -ñivo fuen.e que la clase principal de un programa. La única diferencia cons.sie en M la clase d: ayuda está definida dentro del archivo de la clase, lo cual tiene vanas ventajas:

.la. clases internas son inasibles para .odas las demás clases, lo cual significa que usted n lie ic que preocuparse por los conflictos de nombres entre las clases internas y las demás el: íes.

. La ■ cl-iscs internas pueden tener acceso a las variables y métodos que están dentro del al< anee de una clase de nivel superior, acceso que no tendrían si fueran una clase separad

ponen sus códigos a dis-


Día 15

1412

Finalmente, aprendió a implementar interfaces y clases internas, dos estructuras de mucha utilidad para diseñar una jerarquía de clases.

Semana 3

Preguntas y respuestas P Utilizar métodos de acceso en todas partes, ¿no hará más lento mi código de Java? R No siempre. Conforme los compiladores de Java mejoren y puedanjerear más opiiiniwiciones, estarán en posibilidad de hacer que los métodos de acceso ^.-an automática mente rápidos, pero si está preocupado por la velocidad, siempre ejará en posibilidad de declarar los métodos de acceso como final y serán tan rápidos^como los accesos directos a las variables de instancia.

J

P ¿Se heredan los métodos de clase (static) igual que los métodos de instancia? R No. -os métodos estáticos (de clase) ahora eslán predetermmadosieomo final. ¿Có.no, entonces, puede declarar un método de clase no final? La respuesta es que no

pucí e. No está permitida la herencia de métodos de clase.

Día

I> Has índome en lo que he aprendido, los métodos prívate abstract y los métodos o el ises final abstract no parecen tener sentido. ¿Son legales? R No. como ya se figuró, son errores de compilación. Para que sean útiles, los métodos ab: tract deben ser sobrepuestos, y de las clases abstract se deben derivar subclases, per) ninguna de esas dos operaciones serían legales si también fueran prívate o f ii al.

Circunstancias

excepcionales: manejo

de errores y la seguridad g Los Los

Los prod prognmudores de cualquier lcm-u-.i de errores, programas que nunca se de,"

cualquier situación JeiegZ^ un esfuer20 J

esos programas no cxis.cn.

/

--iones

co

f

M anonrates

d° 'aS b"enas inIC-

n yr

L

nan, d.spositivos de hardware que no

se imagine.

'" ?°'' CSC""bi

^d ^^ ** ""*»

/^

tiempo suficiente para corruptos que no tienen ,a

r

^ "°

tOne*lones dc red 4ue no fH1,c¡0.

solares, gremlins, lo que

l^\?\'¿

asad?


DUi 1G

14

iÍ^ÍÜ™ÜexceP<¡°nales: ^^Ülflf^ores y,a seguridad

En Java a este tipo de eventos extraños, que pueden hacer que un programa falle, se les llama excepciones. Java define un cierto número de carac.eríslicas del lenguaje que imian con esas excepciones, incluyendo las siguientes:

. Cómo manejarlas en su código, y recuperarse con estilo de esos problemas potenciales. :

°CUm° Un e™ Status diferente a ,).

. Cómo decirle a Java, y a los usuarios de sus métodos, que usled espera que se presente una excepción potencial-. . Cómo creai una excepción, si es i|ue la delecta.

. Las limitaciones de su código, y cómo se va haciendo más robusto a partir de bexcepciones.

Además de las excepciones, aprenderá el sistema establecido para Java 2, que permite a los applels hacer cosas en un programa que normalmente causarían excepciones de seguridad.

Cuando usted comienza a •

Excepciones, la forma vieja y confusa

Manejar condiciones de error, en la mayoría de los lenguajes de programación, requiere de mucho más trabajo que manejar un programa que se ejecuta en forma apropiada. Pueden

crear una estructura de instrucciones muy confusa, similar en funcionalidad a los blooues de Java if . . . else y switch. para manejar los errores que se pudieran presentar.

Como un ejemplo, suponía las instrucciones siguientes, que muestran la estructura de cómo se podría cargar un archivo desde un disco. Cargar un archivo es algo que puede convenirse en un problema debido a múltiples circunstancias: errores de disco, errores desarchivo no encon

trado, y otros similares. Si el programa necesita los datos de ese archivo para lunc.on.tr ade cuadamente, dube tratar con cualquiera de esas circunstancias ames de continuar. Ésla es la eslru:tura de una posible solución: int if

status = loadTextfile(); (status

!= 1)

{

// na su;edido algo anormal, descríbalo

switch

(s

case cas< case

atus)

{

2:

// no se encontró el archivo 3: // error de

disco

4:

II

archivo

corrupto

def;.ult: //

otro

error

} // arcr-ivo cargado,

continúe con el programa

Las excepciones de Java cometió un error en su código


Día 16

^

I 416

Exception es

^Sc >'rde^ la ciase° NuilPoi^erExcePtion

• Otras excepdones ,aleS como Z0FJepl

cui-txceptionyMalformedURLEx

CeSn K» explícita, por .os programas que escribe usted. ,:, u,-,ninn ■•l!.n/.i.r".fs apropio, po..,.* >•

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 <= mybuffer.length) {

'"«lly. E) ejemplo liguÍ3Ille nos Les,

mylnputStream.reacl(myBuffer);

")_

try

10 Exception - only read • + nu.By.es);

{

Tr3 I

closeTextfile();

Agrama uuHzando ,a .«formación parcia. que sacó del arch.vo. o quizá desee dcsp.egar un

ÍTJSL de «ccpcioncs están organizadas un una jerarquía y usted puede uuh.ar una su*

En realidad la instrucción finaliy es mil fucra ,. ,

para ejecutar un código de limpieza d-spué deÍ " eXCCpCI°"CS; lumbi¿"

el ultimo caso, unlice una insLcción t"y ^

de la misma instrucción catch.

EOFException y FileNotFoundException. Atrapando lOException, tamben captura instancias de cualquiera de las subclases lOException.

■ Qué pasa si usted quiere atrapar excepciones de ..pos muy diferentes que no es.én relaciona-

dos por herencia? Puede utilizar múltiples bloques catch para un solo try. as,:

Escriba 1: 2: 3: 4:

5: 6:

t rv i II código que puede generar excepciones

7:

\ catch (lOException e) {

8:

}

// maneja excepciones de entrada y salida

\ catch (ClassNotFoundException e2)

}

{

//maneja excepciones de clase no encontrada

v catch (interruptedException e3) {

// maneja excepciones de interrupción

9:

10: 11: 12:

class Final {

intfj numi = { 12j 15j

intf]

10j 8j

_^ 7

= { 1. 5, 20, 8, 1, 13 );

an

P«^ utilizar ° co«—. Para

perü sin la instrucción-catch

das. dondequiera que se espere unn supérelas, puede atrapar grupos de excepco.es dentro Como un ejemplo, hay varios tipos diferentes de excepciones lOExc.ption tato como

-a copú,

} catch (lOException e) <

Aquí el "otro códiao de limpieza" puede ser lo que usted quiera; puede seguiradelante con el

Los ejemplos que ha visto hasta aquí, atrapan un tipo específico de excepción Debido a que

esIra

ddc

readTextfilet);

// otro código de limpieza

cuadro de diálogo que le permita al usuario seleccionar un archivo d.lcrcnic.

b'°qUe CatCh c¡uc «acuerde será

La cláusula finaliy

Al poner su método read () dentro de un bloque try, podrá manejar tranquilamente ese error

• numBytes++;

P

.

in = new Finalf)-

System.out.println("First array ")•

fin.readNumbersírin.numi)'' Systen,.oUt.println(«SecOn<; array. ... fln-'-eadNurabers(fin.num2); ''


Circur

[lía -16

yer.length)

son ian comunes (no común.!, por su naiu

,

,;

lralar con elta,. En particular, ^^™^^*Z thrOws. Tiene,, un cualquiera de sus subclases) -o uenen que 1 «*« « «

lratamicnto especia, porque pueden ocun r cn.cu.lqu,^

mylnputStream.read(myBuffer)• '

numBytes;++

RuntimeException (o

"

^

...

/

'

dc Jl,vu.

,„,.,„„„„, ,„>

2=s=ss= W^w^/fcto.pc™

no

.¡cheque preocuparse por ellas. .¡c

^^

Usted no tiene que declarar que su método las lanza.

Nota

■ Desde luego que, si lo desea, también ¡

NBta

ella. En

sección aprenderá como lanzar excepciones.

esos errores y excepciones que se lanzan <

cláusula throws, 9*'°^"™**°™^ excepciones que no sean de tiempo

throws y herencia

de ejecución.

0 .—.—■

, -; ,,/.r r-niíc'wi v son candidatos poten-

Todas las demás excepciones se aenomman ever/x ,^W< • . .

cíales de una cláusula throws en su método.

! e,,K es «n. »

publie class RadioPlay {•

" ■

public void startPlayingf) throws SoundException'{'

public class StereoPlay extends RadioPlay { public void startPlaying() {


Día 16

I 426

ii^ííí^Üfi^epciona/es:

^Sí^if^ores y la seguridad

Lo contrario de esta regla no es verdadero: un método de subclase no puede lanzar más excep ciones (ya sean excepciones'de tipos diferentes, o de clases más generales) que el de su superclase. mngún vaIor. Si e) n)é(odo

Cómo crear y lanzar sus propias excepciones

a su melod0,

'Coda excepción licué dos lados: el que lanza la excepción y el que la atrapa. Una excepción se puede lan/ar varias veces hacia varios mélodos ¡mies de que la alrapen. pero a la larga será capturada y manejada.

¿Quién hace rcalmei|e el lanzamiento? ¿De dónde vienen las excepciones? Muchas de las excep ciones son lanzadas |k»r la unidad de tiempo de ejecución de Java o por mélodos dentro de las mis

mas clases. JJsied tafiibién puede lanzar cualquier excepción estándar definida en la biblioteca de clases de Java, o puede crear y lanzar sus propias excepciones. Esla sección describe lodo eslo.

Cómo lanzar excepciones Declarar que su método lanza una excepción, le sirve solamente a los usuarios de su método y

Pe

¡a q.ue csld cre;|,uJo ^

al compilador de Java, el cual hace una verificación para asegurarse de que todas sus excep

ciones han sido manejadas, pero la declaración en sí no hace nada para lanzar esa excepciórrp eso lo tendrá que hacer usted mismo en el cuerpo del mélotlo.

Recuerde que todas las excepciones son instancias de alguna clase de excepción, de las cuales hay muchas definidas en la biblioteca estándar de clases de Java. Necesita crear una nueva instancia de una clase de excepción para poder lanzar una excepción. Una vez que

Normalmente las clases

tenga esa instancia, ulilice la instrucción throw para lanzarla. La forma más simple de lanzar una excepción es la siguiente: NotInServiceException()

nis = new NotInServiceException();

ás allá de estas tres ]■.

Poner en sus

throw nis;

^^

class SunSpotException Sólo puede lanzar objetos que sean subclases de Throwable. Esto difiere de

Nula

las excepciones de C++, las cuales le permiten lanzar objetos de cualquier tipo.

Dependiendo de la clase de excepción que esté utilizando, ésta podría tener también argu

mentos. El más común de ellos es un argumento de cadena, el cual le permite describir el

problema real con mayor detalle (lo cual puede ser muy útil para propósitos de depuración). He aquí un ejemplo: NotInServiceException()

nis

=

new

NotInServiceException("Exception:

throw nis;

Datábase

Not

in

Service"

Combine throws, try

y throw

«« ~ las otras Cases. Las puede

C°m° '° "an'a C°" °lras ^


Día 16

429¡

1

public void responsibUExceptionalMethodO throws iOException .{ MessageReader mr = new MessageReaderO;

;

.

i

try { }

mr.loadHeader();

catch

(lOException e)

{

// coloque el código que manejará // la excepción

throw e; // vuelva a lanzar la excepción }

}

' Esto funciona Po,que los manejadores de excepciones se pueden anidar. Usted maneja la excepción haciendo algo responsable con ella, pero decide que es dentado «nponan e

Cuándo no usar excepciones

como para no darle la oportunidad a un manejad*, que podría estar en el método que IU«u. de manejada a su ve.,. De esta forma, las excepciones flotan todo el cam.no a lo argo

dena de llamadores de métodos (normalmente, sin ser manejadas por la mayona e el os hasta que, finalmente, el mismo s.s.ema maneja las que no han «do atrapadas, abortando su programa y mandando un mensaje de error. Ésta no es una mala ,dca en un parama ndc-

**

^

Tndiente pero en un applct podría hacer que se detenga el navegador. La mayona de los

adobes se protegen'a sí mismos de es.e desastre, atrapando .odas las excepciones cada

ve/, que ejecutan un applet, pero nunca se puede estar seguro. S, le es pos.blc amp.u una excepción y hacer algo inteligente con ella, hágalo.

Cuándo usar excepciones y cuándo no

■ Dado que lanzar, atrapar y declarar excepciones son concentos reh.c.onados y pueden llegar a ser muy confusos, aquí damos un resumen rápido de cuándo y que hacer.

Cuándo usar excepciones Si su método llama a otro mé-odo que contiene una cláusula throws, usted puede hacer una de tres cosas:

. Manejar la excepción mediante las instrucciones try y catch.

. ,.:,s:,r'l, excepción ;. I» cadena que IU.ni:. TO.mlo su propi.. clausula throws , su definición de método.

. Realizar los dos métodos anteriores, atrapando la excepción mediante catch y lanzán dola de nuevo en forma explícita mediante throw.

En casos en los que un método lanza más de una excepción, puede manejar cada una de ellas !n Za disnma Por ejemplo, podría atrapar algunas de esas excepciones m.entras pernee el paso de otras hacia la cadena que hace la llamada.

e su programa.Ls excep ,1- debe T

que estén fuero de su control.

e" CaS0S realmenle excepcionales.

- cód,g0 sea más complejo; adem 7S ot sÍ "t**™™ ^'^ E" &M «t0 "-« q«* anejar .odas ,aS excepciones ,^1^^°"" " " "'"^ ™ ^ 'e'^" 1« Por las excepciones, ,e «. «Lto^^^^ ClMndo ™* « **> «evar

aconsejable declarar un método para que láncelo

P

lnVolut-r:'d;ls- No es

mí. excepciones pueda ,anzar su m ,o o mTcó "T' hmUChaS eXCCPCÍ°neS' >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-

<* a no ser que la persOna que |os desam)JJe

applet.

. Desplegar una ventana que no incluya el aviso estándar "Ventana de un apple, de Java-

■ que el programador es confiable" "_ "' * * UÍUari° PílSe a lravés de) Proc«° Para

java 2 permite que los applets realicen lodo lo que puede hacer cualquier aplicación de Java, poro sólo si vienen de un proveedor de applets confiable y contienen la tirina digital para verificar su autenticidad. Una firma digital es un archivo encriptado que acompaña a un pn -

grama, indicando exactamente de quién viene. El documento que representa esta firma d.g.i.' gnatures

se llama certificado.

Para inspirar confianza, un proveedor de applets debe comprobar su identidad mediante un grupo llamado autoridad de certificación. Lo ideal es que estos grupos no tengan ningún t.|*

.R.

appiei s*utijj2

de Java

fishhead Software ofrece >

-

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<«, el^ cual'" só|o

descargar su clave pública.

Este proceso es todo ¡o que necesita Fishhead Software para poner su applet a disposición de quienquiera que confíe en la compañía io suficiente como para ejecutarlo en Web. Una de las personas que decide confiar el Fishhead, es un usuario de Web llamado Gilbert, quien tiene

pama independiente bien establecida.

^ *'

Ceni(1"c'ü» v¡»¡era de otra con,-

un navegador con soporte para Java 2. Su proceso es más fácil:

1. Gilbert se da cuenta de que no puede ejecutar el nuevo applet de juego de Fishhead. mu antes establecer a la compañía como un programador confiable. Descarga la clave pública de Fishhead.

2. Después de decidir que Fishhead es una organización confiable, Gilbert utiliza otra he rramienta de seguridad del JDK, j arsigner, junto con la clave pública de Fishhead. para agregar a la compañía a su lista de programadores confiables.

Ahora, Gilbert puede jugar el applet de Fishhead con absoluta confianza. Dependiendo de

cómo estén establecidos los permisos dentro del applet, éste podría leer y escribir archivos >

abrir conexiones de red, así como otras cosas no muy seguras. Esto significa que el sistema

nttp://wvw.sun .com

Firmas específicas para navegador

Al momemo de cscrihir ,.« . i-i

.

Par, »., prop,,,s „.„„„„„„ Si us^",^, ™ *^"""»« * *»O y »l« u


Día 16

134

Í!^2f!!^fiexcepc¡onaleS:

^Üífiü^es V la segundad

435 |

Para firmar un applet y usarlo en Microsoft Internet Explorer, se requiere lo siguiente:

. Una identificación digital Microsoft Authenticode, de una empresa como VeriSign c Thawte, cqmpañías que comprobarán su identidad. . Internet Explorer 4.0 o superior.

a visión general de la

. Las siguiefiles herramienias del Microsoft Java Software Developiiicnt Kil:

w,,, „, ,„„ ,

cabarc.efe, chktrust.exe, signcode.exe, y los archivos javasign.dll y signer. di. Este kil está disponible descargándolo de Microsoft en: http://vlw.microsoft.com/java/download.htiii.

Para firmar un applei y usarlo en Netscape Navigator se requiere lo siguiente:

. El-software Netscape Object Signing que publica identificaciones digitales, el cual : puede adquirir en alguna de las compañías lisiadas en la página Web

Resumen Hoy aprendió cómo Je avud

https://certs.netscape.com/client.html.

.' El software Netscape Signing Tool, el cual está disponible en la página Web

http://developer.netscape.com/software/signedobj/jarpack.html.Signr

Tool tiene una característica para utilizar un certificado de prueba antes de darle la

si,, lJU, mi))l),.k. s, ^m.

identificación digital.

Nota

La documentación para el uso de estas herramientas está disponible en los sitios de Microsoft y Netscape. Además, Daniel Griscom, de Surtable

Systems, ha recopilado un excelente recurso de firma para el código Java en la siguiente dirección Web:

e su

méuxk> quc ¿stc ^

1

Además de la informaci

http://www.suitable.com/Doc_CodeSigning.shtnü

J ambién aprendió Jas b

Políticas de seguridad

Antes de Java 2. había la creencia implícita de que se debía confiar en todas las aplicación^ y se les permitía usar todas las características del lenguaje.

Para facilitar la creación de aplicaciones más limitadas, ahora las aplicaciones tienen que pasar por el mismo escrutinio de seguridad de los applets.

m

norma,

üna íonm

appleI C0|)

Peguntas y respuestas

En la práctica general, esto no cambia la forma en que se escriben o ejecutan las aplica-

ciones- las que usted haya creado durante la lectura de este libro no deben encontrar mngun

error de secundad al ejecutarlas en su sistema. Esto ocurre porque el establecimiento de M

#

política dc"seguridad, durante la instalación del JDK, es lo más liberal posible permit.endok todas las características disponibles a las aplicaciones.

La política de securidad está guardada en un archivo llamado java.policy. Este archivo

está en la subearpeta lib\security\ de la carpeta principal de instalación del JDK. Emc

ocuparan por e,,os. Las excepciones e ^7

norma, de, código de Java, yPaunquc

^»'

^ 7* * 'enera" 'X>' "' *™iA

t ^^


Día 16

1436

código cometida por el programador, y por lo tanto sólo necesitan imprimir un error para indicar esalequivocación. Las excepciones que no son de liempo de ejecución (excepciones IOException, por ejemplo) son condiciones que, debido a su naturaleza, deben ser manejadas explícitamente por cualquier código robusto y bien desarrollado.

Semana 3

La biblioteca de clases de Java se ha escrito utilizando sólo unas cuantas de éstas, pero

son de extrema importancia para utilizar el sistema con seguridad y corrección. F.l com pilador le ayuda a manejar estas excepciones apropiadamente, mediante la verificación y restricciones de throws.

>"

P ¿Hay alguna forma de evitar las restricciones tan estrictas colocadas en los méto dos por la cláusula throws?

R Sí. Suponga que lo ha pensado durante mucho tiempo y ha decidido que necesita evitar la restricción. Casi nunca se presenta este caso porque la solución correcta es regresar

y rediseñar sus métodos para que muestren las excepciones que necesita lanzar. Sin embargo, imagínese que por alguna razón una de las clases del sistema lo tiene amarrado ' con una "camisa de Cuera". Su primera solución será extender la clase RuntimeException

para hacer una nueva excepción exenta. Ahora la puede lanzar porque la cláusula

Día

throws que le estaba molestando no necesita incluir esta nueva excepción. Si necesita muchas excepciones de ese tipo, un enfoque elegante seria mezclar algunas nuevas interfaces de excepciones en sus nuevas clases Runtime. Usted está en libertad de escoger

cualquier subconjunto que quiera atrapar de estas nuevas interfaces (ninguna de las excepciones normales de Runtime necesita ser atrapada), mientras que a cualquiera de las excepciones sobrantes de Runtime se les permite ir a través del. de otra forma molesto, método estándar en la biblioteca.

Mane; de datos a través

ae /os flujos de Java

M;/';;^--

-

«„„,,, ,„,„„,. aum

*


Día 17

1438

439

Puede manejar todos los datos en la misma forma una vez que aprenda a trabajar con un flujo

de entrada, ya sea que venga de un disco, de Internet, o incluso de otro programa. Lo con

trario se aplica a los flujos de salida.

'■

C1OM,,

Los flujos son un mecanismo poderoso para manejar datos, pero usted no pagará por esa

potencia fon clases difíciles de implementar.

Introducción a los flujos

es I*

En Java,,lodos los datos se escriben y leen usando flujos. Los Mujas, ni igual que los cuerpos de agua que eomp.inen el misino nombre, llevan algo de un lugar .1 olio.

Término Nuevo

'•" ""¡'i-ieres individuales

r

Un flujo es una rula seguida por los dalos de un programa: Un flujo de enmiela envía datos desde una fuenie a un programa, y un flujo ¡le salida envía dalos

desde un programa hacia un desuno.

Como m

Hoy tratará con dos lipos diferentes de flujos: flujos de byles y flujos i\c caracteres. Los hylr\

un flujo

llevan culeros con valores que van desde 0 a 255. Hay una extensa variedad de datos que se

pueden expresar en fórmalo de byles, incluyendo dalos numéricos, programas ejecutables, comunicaciones de Inlernel y códigos de byles; estos últimos son archivos de clase ejecutados

por una máquina virtual de Java. De hecho, iodos los lipos de dalos imaginables se pueden expresar usando hyie-. individúale'.. o una serie de bvles combinados entre ellos.

Término Nuevo

* ■■■«»

Los flujos de caracteres son un tipo especializado de flujo de byles que sólo maneja datos de texto. Se distinguen de los flujos de bytes porque el conjunto de

caracteres de Java sopona Unicode, un estándar que incluye muchos más caracteres de los

c

■>-«

■*»«

„,„

que se podrían expresar uliüzando byles solamente.

Cualquier clase de dalos que comprenda texto debería utilizar flujos de caracteres, incluyendo archivos de lexto. páginas Web y otros tipos comunes de texio.

Cómo utilizar un flujo Ya sea que esté utilizando un flujo de byles o de caracteres, el proccdimienlo para usarlos en Java es casi el mismo. Ames de que empiece a trabajar con los detalles especílicos de las

SÍn fi""«-

uso puede asociar un fíh

elases java. io. sería útil dar algunos pasos a través del proceso de crear y utilizar flujos.

*

I'ara un flujo de entrada, el primer paso es crear un objeto que esté asociado con la fuente- de dalos. Por ejemplo, si la fuente es un archivo en su disco duro, se podría asociar un objeto FilelnputStream con este archivo.

Ya que Icnga un objeto de flujo, podrá leer información de ese flujo con alguno de los méto

dos del objeto. FilelnputStream incluye un método read() que devuelve una lectura de bytes desde el archivo.

dolasesto suena confuso en lo h siguien(es ^^

,0. ,e,u,:¡ —,„_


Día 17

1440

* m

Flujos de bytes

Todos los flujos de bytes son una subclase de InputStream o OutputStream. Estas clases son abstractas, de modo que no puede crcaMinJIujo creando objetos de estas clases directa mente. En vez de eso, usted crea flujos a través de una de sus subclases, como la siguiente:

• FilelnputStream y FileOutputStream

int newByte = 0;

while (newByte !=' . u ¡

Son flujos de bytcs guardados en archivos

}

de disco, CD-ROMs, o en otros dispositivos de almacenamiento.

• DatalnputStreara y DataOutputStream Son flujos de bytcs en los que se pueden

newByte = df.readf)-

System-O"t.Print(newByte

■);

Este ciclo lee todo el archivo referido por

leer datos como enteros y números de punto flotante.

de un carácter de espacio. También vo. Usted se —■-'-

" '"

InputStream es la superclase de todos los flujos de entrada.

; ;

Flujos de archivo

entrada de archivo. El método cióse (, del í! T*

La aP''cació" «^Bytes del listado J7 , „....

de leer el último by,e „ es.e arch.vo E

La mayoría de los flujos de byles con que trabaja, es probable que sen flujos de archivo, los cuáles se utilizan para intercambiar datos entre sus discos, CD-ROMs, u otros dispositivos

<ema, asociados con el archivo abierto

de almacenamiento a los que se pueda referir mediante una rula de carpeta y un nombre de

«

cada

í>arecida pura lcer "" ^ J¡bcrar '<« ocursos del sis

archivo.

Usted puede enviar bytes a un flujo de salida de archivo y recibir bytes de un flujo de entrada

1:

2:

de archivo.

3: 4:

Flujos de entrada de archivo

5:

Un flujo de entrada de archivo se puede crear con el constructor FileInputStream( string). B argumento de cadena debe ser el nombre del archivo. Puede incluir una referencia de ruta con el nombre del archivo, lo cual permite colocar el archivo en una carpeta diferente a la clase que lo carga. La siguiente instrucción crea un flujo de entrada de archivo desde el archivo scores. dat: FilelnputStream fis - new FileInputStream("scores.dat");

Después de crear un flujo de entrada de archivo, podrá leer byles desde el flujo llamando a su método read (). Este método devuelve un entero que contiene el próximo byte (carácter) en

el flujo. Si el método devuelve un -i, lo cual no es un valor de byte (carácter) posible, esio significa que ya llegó al final de! flujo.

6: 7:

9: 10: 11: 12: 13: 14:

15: 16: 17: 16: 19:

int). Los argumentos de este método son los siguientes:

20:

• F.l elemento dentro del arreglo donde se debe guardar el primer byte de los datos. .

publie class ReadBytes {

P->lJC«.tl

FilelnputStream file =

8:

Para leer más de un byte de dalos desde el flujo, llame a su método reaú(byte[), int, • Un arreglo de byles donde se guardarán los dalas.

import java.io.*;

int count = 0;

while (¡eofj

{

int input = fiie.read(,;

System.out.Print(input .

}f (input == -1) else

eof = true; count++;

file.closefj;

21:

22: 23: 24:

El número de bytes que se va a leer.

A diferencia del otro método read(), éste no devuelve dalos desde el flujo. En vez de ello, devuelve un eniero que representa el número de byles que se han leído, o -1 si no se le>o ningún byte ames de llegar al final del flujo.


Día 17

En este programa tiene lugar lo siguiente:

Sy-

De suyo estas cías

. Líneas 5-10 Se crea un arreglo enteros llamado data con 66 elementos.

. Líneas 12 y 13 Se crea un flujo de salida de archivo con el nombre de archivo pie gif. en la misma carpeta que el archivo WriteBytes. class.

. Líneas 14 y 15 Mediante un ciclo, se circula a través del arreglo data y se escribe

utStrea. que manejan ■;,„» espílleos Je III-

tración.

Filtros de bytes

cada elemento en el flujo del archivo.

. Linca 16 Se cierra el flujo de salida de archivo.

• Después de ejecutar este programa, puede desplegar el archivo pie. gif en cualquier nave

gador Wet o herramienta edT.ora de gráficos. E, un archivo pequeño de imagen en formato OH7, como el que se muestra en la figura 17.1.

Como un ejemP,o de ,o an.erior, imagine ,uá) de ,s

lgU'en ie Presta un )¡bro y us,ed lo lee complco

Figura 17.1

El archivo pie. gif (agranitado).

Flujos almacenados en búfer

Un flujo de emrada almacenado en búfer. Uena és,e con jados, y cuando un programa necesita esos datos' busca ongmal del flujo. Es.o es mucho más efici

a recibir un libro página

qUe 1Od;iví:i "° ha» ^ nlancen Mfcr es il!linJ

Cn ei fl"J" va a rcm.S;,r los PSfuerZ,;

por milizario.

" -^i Filtrado de un flujo

Flujos filtrados son los que modifican la información enviada a través de un

nu/o ya existente. Se crean mediante las subclases FilterlnputStrea. o

FilterOutputStream.

que represema e Unlo y e 2\ nu f

disponible, devolverá -i

'

^

También puede utilizar el método read(6yre/;

curad,, c cual carga los da,os de. nujo cí un L

f'"al M ñu->° 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.<ftyt./J. int, int, escribe múltiples by.es desde el arreglo de by.es «pen

cado. Los argumentos para este método son el arreglo de bytes. el punto de m.c,o del arreglo

21:

22:

y la cantidad de bytes que debe escribir.

23:

20:

24:

25:

26:

Aunque el método write() toma un entero como entrada, el valor debería

Nota

27:

ser desde 0 a 255 Si usted especifica un número mayor que 255, sera guar

28:

cuando ejecute el proyecto que creará más adelante en esta misma sección.

30:

dado como el residuo del número dividido entre 256. Esto lo podrá probar

29:

31:

}

class ArgStream {

int start = O;

int finish = 255;

ArBStrea»(lnt st, int fin) / start = st;

boolean wrlteStreamí) /

try {

34:

41:

java.io.*;

o

publie static void main(String[] arguments) {

5:

int

6:

int finish = 255;

7. 'i

°;;

= 6;

if (argunents.length > 1) { start = integer.parselnt(arguments[ej);

finish = integer.parselnt(arguments[1]);

P"on.

e.getMessage());

45:

46: 48:

51:

3: publie class BufferDemo {

System.out.println("Exception■

return false;

44:

50:

2:

+

"tch (lOException e) {

43:

49:

start

return true;

42:

47:

4:

buff.cióse();

40:

en búfer desde el archivo y vuelve a leer los bytes. El listado 17.3 conuene el cod.go fuente.

out «=

System.out.'printf- • + out).

38:

Después de escribir en el archivo delex.o. Buf f erDe.o crea un Hujo de en.rada^

#

t;

39:

java BufferDemo 7 64

import

fUf!eredOutPtsf

35:

37:

en la siguiente instrucción:

1:

FileOutputStreamf-numbers.dat")• BufferedOutputStream buff = ne°

33:

36:

En el proyecto siguien.e, la aplicación Buf f erDe.o escribe una sene de by.es en un flujo de salida almacenado en búfer, «ociado con un archivo de texto. El pr.mero y e ulumo enteros de la serie, están especificados como dos argumentos de línea de comandos, como

,tado 17.3. Texto computo de bufferdemo .java,

'

FileOutputStream file = new

32:

Cuando los datos se dirigen hacia un flujo almacenado en búfer. no serán enviados a su des,ino has.a que el flujo se llene o se llame al método f lush() del flujo almacenado en bufer.

l

finish = fin;

52: 53: 54: 55:

56: 57:

58:

boolean readStream() { try

{

FilelnputStrean file = new

FilelnputStream( "nunibers. dat"

BufferedlnputStream buff = „" * BufferedlnputStream(fiie)•

int in = e; do

{

in = buff.readM;

í-T (in != -1)

Systera.out.print(" • +in)

(in != -1);

'

;¡¡


Flujos de datos

Listado 17.3. continuación return

catch

true;

(IOException _,

.

System.out.println("Exception:

e.getMessage())

* puedan ,ccr o cscrili IJl^ lc ,Í üu " T ™ ; byte, doubla, noat, C^^ "^ *" """ ■í ri'ujod- .„, ,

.C""S'r"CIOr0ataInPutStream(^/'"íSfreafli). Kl

un Hujo de entrada de archivo" ^"^ C'""'" "" ""^ ^ l"""'iul:i illlllilrt-":"1» ^» Por otra pane, un flujo de salida de da.os necesi,, ci ccns.ruc .or

O.t.OutpütStr.«,flUfpl/tSt/,M). t, cua| Writing: 4 5 6 7 Reading:

4

5

6 7

8

9

10

11

12

13

8 9

18

11

12

13

„ de en,,-

• readBoolean(),wríteBoolean(to0jean)

• readByte(),writeByte(i/7íeeer)

• readDouble(),writeDouble(doüWe) • readFloat(),writeFloat(fioar)

constructor ArgStream().

• readlntf), writelnt(iV)í)

• readLong(),writeLong(Jon5) linca 16 para volver a leer esos bytes.

• readShort(),writeShort(¿nr)

.....»»

o,,,

d.,

do read () se utiliza para recibir datos.

. Se cierra el flujo almacenado en búfer.

en Mte « .»

. Por ejemplo, el mé.odo readFloat,, devuelve un valor f loat


Día 17

1450

los flujos de Java

Como una alternativa, puede esperar que una EOFException (excepción de fin de archivo)

36:

sea lanzada cuando el método de lectura alcance el final del flujo. El ciclo encargado de leerj

37:

for

38:

los dalos se puede encerrar en un bloque try, y la instrucción asociada caten sólo debe

(checkNumber % i == return false;

39:

mnnejar objetos EOFException. Uamc :i cióse () en el flujo y cuide otras tarcas ile limpieza

40:

dentro del bloque catch.

return true;

41:

42:

Esto queda demostrado en el próximo proyecto. Los listados 17.4 y 17.5 contienen dos pro

451

}

gramas que utilizan flujos de datos. La aplicación WritePrimes escribe los primeros 400 números primos como enteros, en un archivo llamado 400primes.dat. La aplicación ReadPrimeSslee los enteros de este archivo y los despliega.

Escriba 1:

Escroa 1:

2:

LisIado 17.4. Texto completo de writeprimes.java.

inporf

3: 4:

java.io.*;

3:

6:

class WritePrimes

{

publie static void main(String arguments[])

5:

int[]

6:

int

7:

{

numPrimes

candidato:

=

//

int candidate = 2;

9:

while

el número que podría ser primo

(numPrimes < 408)

if

{

11:

primes[numPrimes]

12:

numPrimes++;

11:

=

13:

{

14:

candidate;

15:

19: 20:

{

18:

// Escribe en el disco la salida

19: 20:

FileOutputStream file = new File0utputStreamC468primes.dat");

21:

BufferedOutputStream DataOutputStream

23:

{

while (true)

buff

=

data

> catch (EOFException eof) / buff.close();

} catch (IOException e) {

22: 23: 24:

new

25:

}

= new

DataOutputStream(buff);

24:

r

25:

for (int i = 0;

26:

i++)

— primos, se cscnbe,, en ,;,s ,,11CJ n

data.closef);

28: 30:

i < 480;

data.writelnt(primes[i));

27: 29:

{

System.out.print(in + ' »

21:

BufferedOutputStream(file);

22:

try

int in = data.readlnt();

18:

16: try

DatalnputStream data = new Datalnputstreain(buff};

17:

candidate++;

15: 17:

utStream buff = new

Bufferedlnputstrea dl

16:

13: 14:

10: 12:

(isPrime(candidate))

ril!InPUtStre<" ni<10<)P'i'"es

9:

0;

8:

FilelnputStream me = new

8:

primes = new int[480];

7:

10:

class ReadPrimes {

5:

2: 4:

import java.io.*;

}

catch

(IOException e)

{

System.out.println("Error

--

+ e.toStringO);

31: 32:

33: 34:

35:

publie static boolean isPrime(int checkNumber) double root = Math.sqrt(checkNumber);

-' ** ^ -ociado con un arch.vo ,,aniado

{

de sa,ida a,macen;,do

« asocia con ., flujo , ^

nuevo fluj0 de sa)ida

' II


= FileReader("index-

'

;KK|,>s incluidos en

na ve. que tenga ""''^"^f^Ívo:1' ^ ^ , para leer la

gj slguiente caraciei c

^/e! número de d . re^cnaríl, Z^;.,^^húmero caracteres u leer. to inicial md.cado V ^.^ ^ el ponto inicial

de bytes. En vez vez de de ^ ^ ,e,eron. o devuelve-1M

.spec¡ficudo con ^

carac,rcs anus

, ^^^

^^^^ y

^.^ el übje,o

El método siente carga un arü,v despliega sus caracteres.

int

do {

inByte;

_ text.read0".

t,t

.

*.....?..-

*<


Día 17

1454

de Java

28:

^íT^o P» crear un BufferedReader se puede uti.izar e, sigu.ente constructor: .°Buff .r.dRe.der < Wr> Crea un flujo de canceres almacenado en búfer. asociado

}

21: 22:

23:

8y»t..,out.prlntln("Error -. ■ + e.t¿ tb5tring());.

}

con el objeto especificado Reader, como FileReader.

. BufferedReadertfleader, int) Crea un flujo de caracteres almacenado:en búlcr, asociado con el Reader especificado y con un búfer de tamaño int.

Un flujo de caracteres almacenado en búfer se puede leer utilizando los métodos r:ead () y

readSTr,], int, int) descritos en FileReader. Puede leer una línea de texto usando el

areljivo ReadSource3 Java"0""5 ^ e'l da: C' °hjCIÜ FileReatJer asociado «w. el

de búfer se

método readLine().

El método readLine() devuelve un objeto String que con.iene la próxima línea de texto

í TC.*« ¡ncluiri carácter o caracteres que representan el fina, de una línea. S, se llega

- - *■«■« dc entrad.,. c. ohJ,

al final del flujo, el valor devuelto de la eadena será .gual a nuil. Un final de línea está indicado por cualquiera de los siguientes: •

Cómo escribir archivos de texto

Un carácter de línea nueva ('\n')

. Un carácter de retorno de carro ( ' \ r')

. Un carácier de retorno de carro seguido de una línea nueva

El proyecto contenido en el listado 17.6. es una aplicación de Java c,ue .ec su propio arch.vo fuente a través de un flujo de caracteres almacenado en buler.

1 :

3: 4:

#

5:

#

7:

6: 8: 9: 10: 11:

# #

publie class ReadSource {

publie static void .«iiUStringl] arguments) { try

{

FileReader file = new FileReader("ReadSource.java

boolean eof = false; while

eof

14:

else

15:

18: 19:

(!eof)

{

String line = buff.readLine()r if (line == nuil)

13:

17:

);

BufferedReader buff = new BufferedReader(file);

12:

16:

clases de escritura de flujos debe

java.io.*:

=

true;

System:out.println(line);

}

buff.cióse();

} caten (IOException e)

{

para convenir enaceres de

Hay dos constructores Filewriter: FileWriter, ct ■

bolean). La cadena indica el nombre

* -o, e, aumento booiJno

import

de

Unicode en bytes.

la cual puede incluir una ruta para

Escriba 2:

,. aplicacióI1 ReadSource es e) a

,de,

• write(ii7t) Escribe un carácicr.

con el punto de'intóo'y

Ircn " f " ' T""

1

" nujo de coraciere«. > «« -"- actual

4ue con las

455 i


Manejo de datos a través de los

confusión con las para eliminar cárpelas

os estos méiodos se deben nuinej.ii <.

Un, vet comwklo en n»y»scula,

1:

import

java.io.*;


Día 17

|458

459, Listado 17.7. continuación cap.convert();

6: 7: 8:

9: 10:

11:

class AllCaps { String

sourceName;

u

12: 13:

AllCaps (String sourceArg) sourceName =

14:

sourceArg;

El nombre del archivo que se va a

15:

ejecutar AUCapsDemOi como en £, j

16: 17:

void convertí) try

18:

20:

{

la línea de comandos, al

íavaAUCapsDemo TempFile. java

{

// crea objetos de archivo

19: 21:

Allc^^emo. java y darle un nombre

como TempFile. java.

{

File source = new File(sourceName);

i

File temp = new File("cap"

+ sourceName +

".tmp")¡

22:

#

23:

// crea flujos de entrada

24:

FileReader fr = new

,

Resumen

FileReader(source);

25:

BufferedReader

26:

in =

new

BufferedReader(fr);

27:

—■■=•---=■

28:

29:

//

30:

FileWriter

crea flujos de salida fw =

new

Filewriter(temp);

31:

BufferedWriter

32:

out

=

new

BufferedWriter(fw);

33: 34: 35:

boolean eof

36:

int

37:

do

inChar

= =

false; 8;

{

38:

inChar = in.read();

39:

if (inChar != -1) { char outChar = Character.toUpperCase(

40:

}

42:

else eof

43: 44:

} while

45:

in.close();

46:

out.close();

=

true;

(!eof);

„,„ t, ^ it

47:

48:

boolean deleted

49:

if

}

54:

caten

(IOException e)

{

SysteiJ!.out.println("Error

52:

53:

(deleted) temp.renameTo(source);

56: 51:

(char)inChar

out.write(outChar);

41:

}

catch

(SecurityException se)

System.out.println("Error

-

{ -

, ^ e

*j


Ola 17

1442

-^!Í^l^ilÍ^ide ,os flujo.

Si usted ejecuta este programa, obtendrá el siguiente mensaje de error: Error

--

java.io.FileNotFoundException:

i

class.dat

«lida de archivo

Este mensaje dé error se ve como el tipo de excepciones generadas por el compilador, pero en realidad viene del bloque caten en las líneas 21-23 de la aplicación ReadBytes. La excep ción es lanzadaípor las'líneas 6 y 7, porque no se pudo encontrar el archivo class.dat.

Usted necesita|in archivo de bytes en el que pueda leer. Éste puede ser cualquier archivo, una elección adecuada ¡es el archivo de clase del programa, el cual contiene las instrucciones del

código de bylef ejecutado por la máquina virtual de Java. Cree este archivo haciendo una copia de Readlytes.class y volviendo a nombrar la copia class.dat. No renombre el

Los usuarios de Windows 95 y Windows NT pueden utilizar el MS-DOS para crear class.dat. Vaya a la carpeta que contiene ReadBytes.ciass y utilice ei siguiente comando de DOS: copy ReadBytes.class

class.dat

.■—\

Los usuarios de UNIX pueden escribir lo siguiente en una línea de comandos: cp

ReadBytes.class

S:t:r r■va ■ ^

Con e, constructor Fiie0utPlJtStream(Sf ■ ^ archivo oue agregue datos despudc^7' ^"^ *** ™" »" "«Jo de sa,id,

e -h,vo y e, argumeilt0 booJ^o ^ *J -chivo emente. La cadena' espec, c sobreescnbTT cualquier ^ 'i8re£;lr i8re£;lr dl cualquier infió información exi.s.en.e dalos. « veze de

archivo ReadBytes.class, o no estará en posibilidad de ejecutar el programa. *

Tip

Tenga mucho cuidado aJ especificar w ,,-

«rrarlo. El método write (byteI] i t

Í" d

este meIüdo son el arrezo

^

class.dat

y'L cn el Jrcf"vo, uiilice el método cióse ()

de

Cuando ejecute el programa, cada byte de class.dat se desplegará, seguido de un comeo

del número total de bytes. Si utiliza ReadBytes.class para crear class.dat. el resultado las últimas líneas será algo así:

49 2 28 82

43 182 C 23 54 4 178 0 20 1B7 0 11 89 21 4 184 0 26 183 0 16 16 182 0 18 182 0 24 182 0 21 21 4 2 160 0 8 4 61 167 0 6 132 3 1 153 255 209 43 182 0 19 178 0 20 187 0 11 89 18 1 183 0 16 29 l 0 17 182 0 24 182 0 22 167 0 29 76 178 0 20 187 0 11 89 18 3 16

cla,s wnteBytes

3 0 16 43 182 0 25 182 0 18 182 0 24 182 0 22 177 0 1 0 0 0 93 0 S 607010

0 8 0

7 0 0

53

12 0 9 0

13 0 60 0 93

Bytes

0

5

000

14

90

10 0

16 0 63 0

0 96 0

read:

0 21

0

97

0

22

17 0

0005000604070606010

11

0 23

10 0 67 0 0

22

0

0

12

18 0 71

122

0

4

0

0 49

0

13 0 55

0

14

0 5

0

19 0 83 0 20 0 90 0 1?

1

0

58

0

0

0

2

0

57

-1

1121

185, 285, 84 254, 105, 33

«8

La cantidad de bytes desplegados en cada línea depende de! ancho de la columna que pueda

ocupar el texlo en su sistema. El número de bytes que aparezca, depende del archivo

lJ

para crear class.dat. oseo;

> catch (IOExc.ption e) /

«y«te..out.println(-Error - ■ ^,

4


460

Día 17

Preguntas y respuestas

Semana

P Un programa en lenguaje C que utilizo, crea un archivo de enteros y otros datos. ¿Puedo leerlos con un programa de Java? R Sí puede, pero algo que debe tomar en consideración es si su programa representa

enteros en la misma fcrma que lo hace un programa de Java. Como recordará, todos los programas se pueden representar como un byte individual, o como una serie de bytes. En Java, un entero se representa utilizando cuatro bytes organizados en lo que se

conoce como un orden big-endian. Puede determinar el valor del entero combinando los bytes de izquierda a derecha. Un programa en C implementado en una PC Iniel. es probable que represente enteros en un orden little-endian. lo cual significa que los byies deben arreglarse de derecha a izquierda para determinar el resultado. Para poder utilizar un archivo de datos creado con un lenguaje de programación distinto al de Javu. tendría que aprender técnicas avanzadas, como corrimiento de bits.

Día

Comunicación a través de

Internet

La biblioteca de clases de Java incluye el paquete java.net, que hace posible la

comun.cacón en una red con sus programas de Java. El paquele p oporcio a

abstracciones de p^aforma cruzada para operaciones simpes n2 2 ,,as I.

conexa y recuperación de archivos por medio de pro.ocolos com 1 de w b

y la creación de sockets básicos tipo UNIX.

Si utilizamos este paquete conjuntamente con flujos de entra

escnb.r arch.vos en la red es tan «c¡, como leer y escrib,


Día 18

1462

Hoy podrá escribir algunas aplicaciones de Java para Web y aprender por qué es más difícil hacer lo mismo con un applet. Creará un programa que pueda cargar un .documento de Workl

Wide Web e Investigará cómo se crean los programas cliente-servidor.

Cónectivídad en Java Termino Nuevo

CoiU'ctiviiltul es la capacidad de hacer conexiones desde su applet o aplicación a un sislcma. a llaves ilc l.i reil. La concclividail cu Java se iMipIcinciil.i a iraves di-

las clases del paquete j ava. net. Desde luego que hay restricciones. Los applets ele Java no suelen leer o escribir del.disco de

Ejecutar su navecador en I-,

=r~ rr

Cargar sus archivos de clase

la máquina en que está corriendo el navegador, ni se pueden conectar a oíros sistemas distin tos al sistema en que fueron guardados originalmente. Aun con tales restricciones, usled podrá lograr mucho y sacar ventaja de Web para leer y procesar información en la Red.

-*■—■ - -

Esta sección describe dos formas sencillas de comunicarse con oíros sistemas de la Red: • getInputStream() es un método que abre una conexión a un URL y le permite sacar datos de esa conexión.

Las clases de socket, Socket y ServerSocket, que le permiten abrir conexiones estándar de socket a liosts, y leer y escribir de esas conexiones.

Apertura de conexiones con Web

Para recuperar archivos de Web vav. i

w"^ aya a los métodos y Jas ciases.

En vez de pedirle al navegador que sólo cargue el contenido de un archivo, sería mejor sacar proveería-del contenido de ese archivo para usarlo en su applel. Si el archivo que desea abrir eslá guardado en Web y se le puede accesar a través de las formas más comunes ilc URL

(htlp. F-TP y más), su programa Java puede usar la clase URL para obtenerlo. Por la/.ones de seguridad, los applels sólo se pueden conectar al mismo dosis del que

provienen originalmente. Esto significa que s¡ ha guardado sus applels en un sistema llumadn

www. pref ect. com, la única máquina con la que su applet puede abrir una conexión será con

ese mismo host. y con el mismo nombre, así que tenga mucho cuidado con los "alias". Si el archivo que quiere recuperar el applet está en el mismo sistema, la forma más fácil de obte nerlo es mediante las conexiones URL.

Esta restricción de seguridad cambiará su forma de escribir y probar applels que cargan

archivos a través de sus URLs. Puesto que usted no ha manejado conexiones de red. le ha

::;:™::;:r *> - ««> ■- * - * -


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<windowEvent e) /

26: 27:

hace más complejo.

System.exit(e);

28:

Este proceso es muy confuso, por eso es útil seguir los pasos a través de un programa que lo

• #

l

29: 30:

¡molemente El siguiente es un ejemplo'de una aplicación que utiliza la técnica de los cuatro pasos para ahrir una conexión con un sitio Web y leer un documento IITML. dundo el docu

32:

mento esté totalmente cargado, se desplegará en un área de texto.

33:

frane.addWindowListener(l); "

31:

frame. pack(-);

frame.setVisible(true);

34:

El listado 18.1 nos muestra el código; la figura 18.1 nos da e. resultado de la lectura del

if (frame.runner == nuil) {

35:

frame.runner = new Thread(frame,;

36:

archivo.

frame.runner.start()i

37: 38: 39:

Figura 18.1 La aplicación

40:

.TUlE-Ti.cH youh.«J»v» i .7 ir 21 D WÍTITlE

Ge t File.

EOOY 60C0L0R--»f FFFf f UNfe'

41:

«UN«"-»«MI00¡r

publie void run()

42:

43:

.HJAUON*RtOKTWO 6S

BufferedReader data;'

44:

w,01H=11! HEKWfcJM B0R0E1M «UOM.M-IMCK f

String line;

45:

StringBuffer buf = new StringBufferf)j

46: 47:

Listado 18.1. Texto completo de getfile.java.

conn = this.page.openConnectionf)-

48:

conn.connect();

49: 1 : 2 :

import import

java.awt.*; java.awt.event.*;

:

import

java.net.*;

52:

import

java.io.*;

53:

3 4

5 6

Thread

8

URL

9

12

page;

58:

try

18:

catch (IOException e)

59:

14

17:

box.setText(buf.toString());

57:

);

publie GetFile() { super("Get File"); add(box);

16:

büf.appendfline + "\n");

56:

TextArea box = new TextArea("Gettmg text ...

13 15

box.setText("Reading data ')• while ((line = d.ta.re.dLine())'!= nuil, {

55:

runner;

»)-

in = new InputStreamReaderfconn.getlñputStreamM )• data = new BufferedReader(in) r "iream(j),

SU:

10 11

box.setTextC'Connection opened

50: 51:

i publie class GetFile extends Frame implements Runnable {

7

{

URLConnection coj^n = nuil; InputStreamReader in;

}

60:

{

System.out.println(»IO Error:" + e.getMessage());

61:

62:

}

{ page

=

new

"URL(-http://www.prefect.com/java21/index.html

catch (MalformedURLException e) { System.out.println("Bad URL: "

);

+ page);

19: 26: 21:

22:

publie static void main(String[) arguments) {

e venZas d V "ecib 7 T ^

y recibir entradas de usuario.

l proce-


Día 18

1466

El método constructor GetFile(), de las líneas 11-20, establece el objelo URL y el área de lextoen que se ílesplegará el documento. El URL en este ejemplo es http://www.pre-

Sockets

;

Puralasaplicacioncsdeconectividaddcredmisill.il.

fect.com/java2f1/ index.html, el cual constituye la página principal del sitio Web de l;i

versión en inglés lie este libro. También podría ser cualquier otra página Web que usted

URLConnection (por ejemplo Mra n,m

quC °frecon lu* cl;lscs URL V

-d más oCnerale }P J;lv, Z°£2° r ° Para ap'ÍCaCÍOnes"* conectividad de * ,S técnicas de ¿^Z^^¿£™"«*« ~ un, abstrae

conozca, expcrimfnte con otras si así lo desea. El trabajo tiene lugar dentro del método run() (líneas 40-61). Primero, se inician los tres objetos necesarios para llegar a los datos del documento, URLConnection,

InputStreamReader y BufferedReader. Además, se crean dos objetos para guardar los

Nota

datos cuando lleguen: un String y un StringBuffer.

bajar con datagramas conulta1 * aParW°- S¡ t¡ene int6réS en tra documentación de Java para el paquete

Las líneas 47 y 48 abren una conexión URL, la cual es necesaria para obtener un flujo de

j ava. net.

entrada desde esa conexión.

La línea 50 utiliza el método de conexión URL getlnputStreamf). para crear un nuevo lec tor de.flujos de entrada.

La linca 51 aprovecha ese lector para crear un nuevo lector de flujos de entrada almacenados rn hiilVr: un nbjclo Buíierccinender llamado (lata.

Una vez que tenga este lector de entrada almacenada en búfer, puede usar su método

."">

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.<?rr.println(" Exception:

'

state = WAITFORCLIENT;

break;

+ e);

e.printSt3CkTrace();

return outStr;

}

El método run() analiza primero las preguntas y respuestas llamando a initQnA(). En un

momento aprenderá más sobre el método initOnAf). A continuación se pasa a un celo infinito «hile, que espera la conexión de un cliente. Cuando un diente se conecta, se crean los Huios 1/0 apropiados y se maneja la comunicación por medio del método processinput (). A

método run

llevar ,a informacón hasta e,

continuación aprenderá acerca de processlnput (). Éste procesa constantemente las respuestas

de! cliente y hace nuevas preguntas hasta que el cliente decide no recibir más preguntas Esto se hace evidente porque el servidor envía la cadena -Bye. V Entonces, el ««todo run() limpia los flujos y el socket del cliente.

El método processinput () mantiene el estado del servidor y maneja la lógica de todo el piuceso pregunta/respuesta. El código fuente para processinput es el siguiente: String processInput(String inStr)

{

String outStr = nuil; switch

(state)

{

case WAITFORCLIENT: //

hace una

pregunta

outStr = questions[num]; state = WAITFORANSWER; break;

case WAITFORANSWER: // verifica la respuesta if (inStr.equalsIgnoreCase(answers(num]))

outStr = -Triar s correct! want another? (y/n) else

;

"se

prtguma!,.

re,p,,enas

a

,.neai


Día 18

de su respuesta en la línea siguiente, la cual, a su vez, está seguida por la siguiente pregunta.

index++;

He aquí una lista del archivo QnA.txt: start

What caused the craters on the moon? meteorites i How far away f.s the moon (in miles)?

239000

f

93

í

How far away S.s the sun

i

catch (FileNotFoundException e, {

;

(in millions of miles)?

=

:

Is the Earth a perfect sphere?

quesUon

catch (IOException e) {

no

Wliat is the internal temperature of the Earth

?)S;em-err-P

(in degrees F)?

9000

error

trying

return false

El méiodo initQnA() maneja el trabajo de leer las preguntas y respuestas del archivo de texto, y su almacenamiento en arreglos de cadenas separados, como se muestra a conti

return true-

nuación: prívale

try

boolean

initQnA()

{

{ File

inFile = new File( "ClnA. txt"); FilelnputStream inStream = new FilelnputStream(inFile);

#

byte[)

»- *-

ha(1¡1

„,„,„

data = new byte[ (int)inFile. length() ]■;

*. .—

l|os;ir ;i|

lijBj

M

^

// lee las preguntas y respuestas en un arreglo de bytes

#

if

(inStream.read(data) <= 0) { System.err.println("Error: couldn't

read questions

and

arguments)

answers");

serven, start M-

return false;

{

Tr«iaServer() ;

}

// ve cuántos pares de preguntas/respuestas hay for

(int

i = 0; if

i < data.length; (data[i)

==

numQuestions++;

numQuestions /= 2; questions = new String[numQuestions]; answers

=

^^

i++)

(byte)' \n' )

new String[numQuestions¡;

Escriba 1 :

2: 3:

// coloca las preguntas y respuestas en arreglos de cadenas int

start

boolean

for

= 0,

Índex = 0;

6:

i++)

if

if

(isQ)

{

questionsjindex] = new Stringfdata, start, i • start • D. isQ = false;

7:

8: 9: 18: 11:

}

12:

else {

13:

answers(índex) = new String(data, start, i - start -1); isQ =

true;

import java.útil.Randoro;

5:

isO = true;

(int i = 0; i < data.length; (data[i) == (byte)'\n'J {

4:

import java.io.*; import java.net.*;

pnvate StringfJ answers;

prívate ServerSocket serverSocket•

P^vate int numQuestions-

Prívate int nUm = e¡

'

•'

\\


Día 18

476

.Comunicacióna través de Internet

Listado 18.2 continuación 15: 16: 17: 18:

19:

20:

24: 25:'

65:

{

caten (IOException e) { System.err.println("Exception:

31: 32:

70:

couldn't créate sockef);

72:

73:

37:

38: 39: 40: 41:

44: 45:

46: 47:

52:

53:

56:

57: 58:

59:

if (outLine.equals("Bye "))

78:

break;

79:

public void run()

80:

{

81:

Socket clientSocket = nuil;

82:

// inicia los arreglos de preguntas y respuestas if

(linitQnAO)

{

System.err.println("Error:

couldn't initialize questions

and answers");

// limpia todo

83:

os.close();

84:

is.close();

85:

clientSocket.closef)•

86: 87:

return;

catch (Exception e) {

88:

Systeni.err.println("Exception-

89:

// busca clientes y hace preguntas de la trivia while (true) { // espera un cliente

if try

94:

95:

{

clientSocket = serverSocket.accept();

catch (IOException e) { Systei».err.println("Exception:

couldn't connect to

sockef);

97:

try {

W * File inFile = new FileCQnA.txt");

99: 100: 101:

en un arre9i°de bytes

102:

} // ejecuta el procesamiento de pregunta/respuesta { InputStreawReader

96:

private boolean initQnAÍ) i

98:

System.exit(i);

try

91: 93:

(serverSocket == nuil)

client

e-printStackTrace();

90:

92:

return;

54:

55:

os.fiush();

77:

server.start();

50:

51 :

os.println(outLine)-

76:

TriviaServer server = new TriviaServer();

48: 49:

outLine = processInput(inLine);

75:

public static void main(String[] arguments) {

42:

43:

if (inLine.length() > 0) {

74:

34:

36:

?' Salida a la entrada del usuario «ring ínune = is.readUne()

71:

System.exit(i);

33r 35:

'

OS.flush();

69:

28: 30:

os.println(outLine);

68:

27: 29:

e1"8 " la S°liCÍtud e processlnput(null)-

66: 67:

...");

}

¿6:

String outUne;

64:

serverSocket = new ServerSocket(PORTNUM); System.out.println("TriviaServer up and running

= "ew PrintWriter(new

BufferedOUtputStream(clientSocket.8etOutPutStrea«1(J,1

63:

public TriviaSorver() { super("TriviaServer"); try

Buffl Í,

62:

private Random rand = new Random();

22: 23:

60:

61:

private lnt state = WAITFORCLIENT;

21:

477

isr

=

new

InputStreanReader(clientSocket.getlnputStreain());

103:

104: 105:

return false;

#


I 470

't

Dla 18

471

1. Conectarse con el servidor.

}

2.

Esperar una pregunta.

3.

Desplegar la pregunta y aceptar una respuesta.

4.

Enviar la respuesta al servidor.

5.

caten (IOException e) { System.err.Drintin/«c

?r^Un( Exception: couldn't créate- socket-",;

i

Esperar una contestación del servidor.

6.

Desplegar lafconlestación y pedirle al usuario que confirme si desea otra pregunta.

7.

Enviar la respuesta del usuario.

•■ r()

—- :::

publie void run() {

8. Volver al pa|o 2, en caso necesario.

Socket clientsocket = nuil;

„„

Triylltm.r

B

^'

Implementación del servidor Trivia respuestas

F.l corazón del ejemplo Trivia csiá en el servidor. El programa del servidor Trivia se llama TriviaServer. Las variables de instancia definidas en la clase TriviaServer son: private

static final

int

private

static final

int WAITFORCLIENT =

PORTNUM =

1234; 0;

private

static final

int WAITFORANSWER =

1;

private

static final int WAITFORCONFIRM = 2;

private StringM questions; private

String[]

"""■>

answers;

private ServerSocket

.,,

espera a un cliente

if (serverSocket == nuil)

serverSocket;

private

int numQuestions;

prívate

int

num = 0;

prívate

int

state = WAITFORCLIENT;

try

>

private Random rand = new Random();

return-

ClÍentSock« = serverSocket.accept,,;

catch (IOException e) {

Todas las variables WAITFORCLIENT, WAITFORANSWER y WAITFORCONFIRM son constantes

kW oslado i|iie definen los diferentes estados del servidor; en un momento m.i.s \cr.i oslas constantes en acción. Las variables de pregunta y respuesta son arreglos de cadenas que se

socket");

SySt—

connecr

System.exit(i);

ulili/an para guardar las presuntas y sus respuestas correspondientes. La variable de instancia

serverSocket mantiene la conexión con el socket del servidor. Para guardar el número lolal de preguntas se utiliza numQuestions, en tamo que num es el número de las preguntas

íV

^ P—-nto de PregUnta/resPuesta

hechas. L;¡ variable state contiene el estado actual del servidor, como está detmido por las lies constanles de estado (WAITFORCLIENT, WAITFORANSWER y WAITFORCONFIRM). Finalmente, la variable rand se utiliza para escoger preguntas al azar.

L:l constructor TriviaServer no hace mucho, excepto crear un ServerSocket en vez de un DatagramSocket. Vcrifíquclo: puulic

TriviaServer()

{

super("TriviaServer");

try

{ serverSocket

= new ServerSocket(PORTNUM);

System.out.println("TriviaServer

up

and

running

...");

entrada del

usuari0

.ív.!í,i.\;-;'¡P


Día 18

|478

Listado 18.2 continuación 106: 107:

149:

109: 110:

111: 112: 113:

151:

for (int i = 0; i < data.len'gth; i++) if

108:

(data[i]

==

153:

numQuestions++;

:

// coloca las preguntas y respuestas en arreglos de

115:

int start = 0,

116:

boolean

117:

if

118:

i < data.length;

if

120:

(byte)'\n')

(isQ) { questions[index]

i

-

start

-

i++)

{

163:

else

166:

124:

i

-

start

125:

isQ

126:

index++;

=

-

131 : 132:

170:

true;

start = i + 1;

174:

(FileNotFoundException e)

{

System.err.println("Exception:

136:

catch

(lOException e)

{

System.err.printlnC'Exception:

return

144:

String processlnput(String inStr)

147:

148:

Implementación del cliente Trivia

{

String outStr = nuil;

método dennido en

145:

146:

1/0 error trying to read

de los eventos de clie_n,e se llama

true;

141:

143:

}

^'^ "mo una aplicación de ,a Uní

comandos. Ta, ve

139:

142:

178:

return false;

138: 140:

177:

return false;

questions"); 137:

break;

} return outStr;

176:

couldn't find the question

"Bye."j

state = WAITFORCLIENT;

175:

catch

{

outStr =

172:

173:

134:

135:

else

171: i

file"); 133:

169:

1);

129: 130:

outStr = questionsínuml; State = WAITFORANSWER;

168:

start,

127: 128:

:zt¿Z,;,r

167:

{

= new String(data,

' '

165:

1);

answers[index]

(.y/nr;

case WAITFORCONFIRM•

164:

start,

122:

123:

break;

162:

isQ = false;

121:

state = WAITFORCONFIRM;

161:

= new String(data,

Want anotner?

". Want another? (y/n)"-

160:

true;

(data[i] ==

119:

159:

índex = 0;

(int i = 0;

üstrequ"r

158:

cadenas

for

// verifica la respuesta

156: 157:

114:

'

case WAITFORANSWER:

154:

155:

answers = new String[numQuestions];

isQ =

break;

152:

(byte)'\n')

numQuestions /= 2; questions = new String[numQuestions];

//

outStr = questionstnumj; state = WAITFORANSWER-

150:

// ve cuántos pares de preguntas/respuestas hay

switch

(state)

{

case WAITFOHCLIENT: //

hace

una

pregunta

■ncluveene, Ido 8

""" h"C "^ '-" '»

r

^

;isc Trivia m

de.

""d ^^ T:""b'¿» **y un «,1o


Día 18

480

481

Listado 18.3. Texto completo de thivia.java.

47:

System.out.println(-ciienf " + ,tPl.

46: 1:

import

java.io.*;

49:

2:

import

java.net.*;

50:

5: 6: 7:

8:

public class Trivia {

prívate static final int PORTNUM =

public static void roain(String[]

52:

1234;

arguments)

{

InputStreamReader isr = nuil;

57:

58:

11:

PrintWriter out = nuil;

59:

12:

String

60:

13:

in

=

nuil;

address;

14:

// verifica la dirección del host en los argumentos de Ja //

línea de comandos

15:

if

(arguments.length != 1) { System.out.println("Usage:

16:

21: 22:

// try

24:

27: 29:

3e:

PORTNUM);

new lnputStreamReader(socket.getInputStream());

caten {lOException e) { System.err.println("Exception:

31:

socket " + e.getMessageO);

32:

System.exit(i);

couldn't

créate

stream

35:

// procesa la entrada del usuario y las respuestas del servidor

36:

try

{

37:

StringBuffer str = new StringBuffer(128);

38:

String inStr;

39:

int

40:

41: 42: 43: 44:

45: 46:

?f

«o. iDe ahí e, argumenl0 ¿

lgún can.

c;

while ((inStr = in.readLine()) System.out.println("Server: if

!= nuil) "

{

+ inStr);

(inStr.equals("Bye.")) break;

while ((c = System.in.read()) str.append((char)c);

En algunos sistema operativos puede oroh

correr el servidor Trivia

el nomore de dorninio

33: 34:

T ? "'" aplk"M'>án de J:'Vi' y n0 VÍ"° C' üPP'e'; "° híl>' U"

in = new BufferedReader(isr); out = new PrintWriter(socket.getOutputStream(),true);

26:

28:

socket = new Socket(address, isr =

25:

del cliente, tiene que codificar 3

^ coñudos. S¡ í cod a

inicializa el socket y los flujos {

« el ^— Ce ,fmM

«rvidor predeterminado, por lo que uZ e ñ

address = arguments[0];

23:

^£1^

^ applct, no basta conectarse de nuevo con el s

else

20:

«y.t....rr.prlBtln(.I/0 error; -+ e.tostring()).

}

* con»™,»

18: 19:

61:

catch (lOException e) {

}

java Trivia <address>");

return;

17:

in.close(); socket.cióse();

55:

BufferedReader

9:

out.close();

56:

10:

9 m

// limpia todo

53:

54:

Socket socket = nuil;

''

str.setLength(e);

51:

3: 4:

out.println(str.tostringo)';

out.flush();

!=

'\n')

L

!

hadend°

:-

>á


Día 18

1482

Comuna.,<¡ú,, .,

Hoy hemos aprendido a utilizar URLs y conexiones URL, jumo con flujos de entrada para

Trivia en acción Al igual i|iic en fortune, el servidor Trivia debe estar en ejecución par;i que el cliente pueda trabajar, fara iniciar todo, primero debe ejecutar el servidor por medio del intérprete de

Java, listo se hale desde una línea de comandos como ésta:

sacar información desde Web y meterla en sus programas.

También aprendió a escribir programas cliente-servidor en Java y la forma en que un para

ma scmdor se sitúa en un puerto de Internet, esperando un cliente que haga contacto con*¿I.

java TriviaServer

El cliente Trivia también se ejecuta desde una línea de comandos, pero debe especificar la dirección de un servidor como único argumento. El siguiente es un ejemplo de cómo ejecutar el cliente Trivia y conectarse al servidor localhost: java Trivia

"localhost"

httP=//www. blah.com/cgi-bin/myscript7f oo=Ubar=2&narae=Laura

"127.0.6.1"

Después de ejecuiar el cliente Trivia y responder algunas preguntas, el resultado que debe ver es similar :t éste:

Server: What is the internal temperature of the Earth (in degreér» F)?

Client:

Wrong,

Client:

y

Client:

93

Client:

y

Server:

Server:

the correct answer is 9800. Want anolher?

(y/n)

the correct answer is no. Want another?

What is the internal temperature of the Earth

(y/n) (in degrees

F)? Client:

9008

Client:

n

Server:

Bye.

Server: That's correct! Want another?

para imitar un formulario, obtener la entrada del usuario y construir un nuevo obje.o

URL con los datos incluidos al final: después, sólo pase ese URL al nave-ador por m«Jio de getAppletContext(). showDocument () y éste enviará los restados del

I' ¿Cómo puedo hacer envíos de formularios con POST?

K Tiene que imitar lo que hace luí navegador para enviar formularios por medio de POST.

Is the Earth a perfect sphere?

Server: Wrong,

Puesto que la información está codificada en el URL. puede escribir un applet de Java

formulario. Es todo loque necesita para formularios simples.

meteorites

Server:

Los formularios HTML se pueden enviar de dos maneras: mediante la solicitud GET o

POST. Si usa GET, la información se codificará en el URL, algo así como:

El comando es el siguiente:

■5AUJJA

I* ¿Cómo puedo imitar el envío de .... formulario HTML cu un :,,»,>leí di- Java? R En realidad, los áppiets dificultan esto. La mejor manera (y la más fácil) es utilizar la notación GET para hacer que el navegado,-envíe la información del formulario.

También puede tratar de ejecutarlo con la dilección 1P que representa el pueno "localhost".

java Trivia

Preguntas y respuestas

Abra un sockel en el servidor y envíe los dalos, lo cual se ve como lo siguiente, (l-l fór malo exacto está determinado por el protocolo HTTP; eslo sólo es un subcon.junlo.)

POST /cgi-bin/mailto.cgi HTTP/1.0

Contení•type: application/x■www-form•uriencoded

Content-lengtn: 36 (y/n)

Resumen La.concctividad de redes tiene muchos que usted puede aprovechar en sus propias aplica ciones. (Juizá mi se ha dado cuenta, pero el proyecto GetFile l'ue un navegador Web rudi

mentario. Capturó una página de texto de Web y la desplegó en un programa de Java. Desde luego que la colocación de HTML es lo que convirtió un cúmulo de diquelas en una pagina Web real. Sun escribió todo un navegador Web en Java: Hoüava.

{sus datos codificados van aquí}

Si lo hizo bien, el servidor le dará el formulario CG1. Después, su applel se encargará de manejar ese resullado en forma adecuada. Note que si la salida es HTML, todavía no hay una forma de pasarla «I navegado, que ojéeme su applel. lista posibilidad podría darse en ediciones fuluras de Java. Sin embargo, si le devuelven un URL. uMed puede redneccionar el navegador hacia ese IIRI..


Semana

Día

19

¥$■

JavaBeans y otras características avanzadas ÍTJZkTJT T quen rápid0 Java-esnuevafácilversión semirsedelab¡er^uajeL la gran cam.dad de clases ofrece como Sun. Cada

consto características avanzadas como JavaBeans, JavaDatubase Cornee i vi,y y

procesamiento de imágenes 2D.

unnecm iiy y

Por fortuna, para estar en posibilidad de crear programas útiles no tiene que domi

nar todas las panes de la biblioteca estándar de clases de Java. Puede eníocar 7

atencón en los paquetes y clases necesarios en su área de interés, y ampI¡ar sus

conocíamos hacia nuevas áreas conforme las vaya necesitando.

Hoy le presentaremos algunas de las características avanzadas que se ofrecen en hs

■ñas recentes ediciones de Java, incluyendo l,s siguientes: •

Jiiviillriins.

• JDBC: Conectividad para Bases de Dalos de Java. • RMI: Invocación a Métodos Remotos. • Seguridad.

m


Dí.i 1!)

487

En general, el objetivo de hoy es familiarizarlo con el tema como un primer paso hacia el uso de estas clases. fin embargo, también tendrá la oportunidad de trabajar con transferencia de

""<>""> * <lcsnrro,,o c' et 's e m

datos1 y comunifición entre un applct y el navegador.

'ii

" "'" dc"m"lado™' *«»™ seleccionad

JavaBeans

Una tendencia creciente eivelxampo del desarrollo de software es la idea de componentes reutiliwihles: elementos de un pmgrama que se pueden utilizar con más de tui paquele de soltware. Término Nuevo

Un componente de software es una pieza aislada en una estructura separada, láeil-

::.Trr

nij-nu- ivulilizahle.

Si desarrolla partes de un programa de forma que sean independientes, sería posible ensam

>■ ■

«■

<■

blar esos componentes en programas con un desarrollo mucho más eficiente, lista idea de volver a utilizar software cuidadosamente empaquetado se lomó prestada, hasta cierto punto,

de la ide i de las líneas de ensamble tan popular en Eslados Unidos durante la Revolución Industrial, mucho ames deia era moderna de la computación. La idea, tal como se aplica al software es fabricar componentes pequeños y reuliüzables una sola vez. y volverlos a usar

tantas vtecs como sea posible, agilizando así todo el proceso de desarrollo.

-:~,

Quizá la mayor dificultad a la que se ha enfrentado el software de componentes, es la gran

variedad de microprocesadores y sistemas operativos que se utilizan en nuestros días. Ha habido u ui diversidad razonable de intentos en el software de componentes, pero siempre han estado li Hitados a un sistema operativo específico. Las arquitecturas de componentes VBX y OCX de Microsoft, han tenido mucho éxito en el mundo Intel de las PCs, pero no han hecho mucho |or cerrar la brecha con los demás tipos de sistemas operativos.

El objetivo de JavaBeans

- Na a.np.in.d de huJJ^u^ Z " Tf■K"V° "^ * ^ C°n<K<á" sc a<l:ll>ion¡' ™" l;l -" /áciles de usa c ^ ,^TT" ^ V™ ""^ ^" otra cosa. ■»qim^lur¡, que- laclue su consuucción es con que se construyen y u.iliz.n if

; r; ;is;idos-cn

Rededor 'an>bién tiene el efec

. Eslo

j

Nota

La tecnología Microsoft ActiveX, basada en su tecnología OCX, apunta hacia la idea de proporcionar una tecnología de componentes de usos múltiples, compatible con un amplio rango de plataformas. Sin embargo, considerando

sus applcs de j!na

la dependencia de ActiveX del código Windows de 32 bits, todavía está por plataforma.

leimuajc |iarticular de programación, o para un enlomo particular ile desarrollo. Así como la dependencia de las plataformas debilita a los componentes en el momento de su ejecución, limitar: u desarrollo a un lenguaje particular de programación o entorno de desarrollo lambicn los debilita al final del proceso. A los creadores de software les agradaría estar en posibilidad de decidir por sí mismos cuál es el lenguaje más apropiado para una tarca en

— específicas

vl«cXi "" n!?ÍO r'"1S° ll° bcnefit'ilis '^¡''"^ aplicables a c ensiR.is un, imponamcs de Java, aunque poco mencióna

verse la forma en que Microsoft resolverá el tema de la dependencia de

Algunas tecnologías de componentes también sufren por haber sido desarrolladas en un

''"■■■■

le clases, lo cual pcrmile la inleracción integrar en

lado un sistema en el que los objelos se >nar sus ornees o iiisloria de desarrollo. Es!e mecanismo

necesario en cualquier arquitectura TZ^™^^ *'^ * "" ^'l°

s S!™,™ir■' r^;"rs"eictia de ia ^^^ * *«, es ,a ,,,,. ' \''P'""' '' ie "" nbJe|0 para guardar y recuperar su csiado

interno. En JavaBe-mt i> •ns.

pers.stenca se maneja en fürlna automá|¡c;, po,. ,)lct(j() ^ ^.^


Día 19

1488

Jf^Beansyotras características avanzadas

489 |

nio de señalización existente en Java. La señalización es el proceso de guardar o recuperar información a través de un protocolo estándar. En forma alternativa, y cada vez que sea nece

sario, los programadores pueden desarrollar soluciones persistentes personalizadas.

Aunque éste no es un elemento central de la arquitectura de JavaBeans, también proporciona soporte para computación distribuida. Los programadores de componentes de JavaBeans

tienen la opción de seleccionar el enfoque de computación distribuida que se ajuste mejor a sus necesidades. JavaBeans ofrece una solución en su tecnología RMI (Invocación Remota <le Métodos), aunque los desairo!ladores de JavaBeans no están atados de ninguna forma a esta solución. Otras opciones incluyen CORBA (Arquitectura Común Intermediaria para Solicitud de Objetos) y DCOM (Modelo de Objetos Componentes Distribuido). Je Mii/rosiill. entre otras.

lin JavaBeans la computación distribuida se lia resumido limpiamente para mantener las cusas

de JavaBeans que rea.icen algúnI Z2n ^T^ """^

nenes. De esta manera. JavaBe su ,•Z^ f"" " ^^ ^

-^invisibies-todo eii° d™° * —-r::rJ;lva Mta

Término Nuevo

botones y menús, esto le PLce á neme es simP,ememe un PZgma «r visible. Un buen ejemplo esTncZn

de üempo a intervalos espejeos Est0 c

componentes de JavaBeans.

La arquitectura de JavaBeans incluye soporte para especificar propiedades en tiempo de diseño y mecanismos de edición, para facilitar la edición visual de sus componentes. El resul tado es que los programadores están en posibilidad de utilizar herramientas visuales para ensamblar y modificar los componentes de JavaBeans en forma Huida, muy a la manera en que las herramientas visuales de las PCs trabajan con componentes tomo los controles VBX

^

*' AWT C°m°

"°

"***" *

X2e ^

siten soporte distribuido. La meta final en el diseño de JavaBeans tiene que ver con los lemas de tiempo de diseño y la forma en que los programadores construyen aplicaciones utilizando

ue no tenga una sa,,da vis,

desarro.,0 de componen^, ~ ^££™^

ajustadas, sin dejar de ofrecer una amplia gama de opciones a los programadores que nece

sus propias interfaces y proporcionan ln ■ n ,Jd

Parama, Más aún. pu.d! í ■ " , ' "**""

"Pi-eión sin tener qL escribí, J £ Z

- * -,bi,,dad y

#

IBCUente ** W c™?°C' reqUÍSÍ'° ^ecír«° *

°' el «* «*» —tos

«- «o™, de

componentes muestran -, .ener que

¿££

t

La API de JavaBeans

u OCX. De esta forma, los programadores especifican cómo se van a utilizar y manipular los componentes en un entorno de desarrollo.

Cómo se relacionan JavaBeans y Java

"da la funcionalidad

estándar de clases de Java

conjunto de AP,,

™ üsta de los

Aunque la naturaleza orientada a objetos de Java proporciona los medios para que los objetos trabajen en conjunto, hay reglas o estándares que gobiernan la forma en que se conduce esta interacción. Estos tipos de reglas son necesarios para obtener soluciones robustas para los componentes de software, y están disponibles a través de JavaBeans.

JavaBeans especifica un amplio conjunto de mecanismos para la interacción entre los objetos, junio con acciones comunes de soporte necesarias para la mayoría de los objetos, como la persistencia y el manejo de eventos.

• Combinación de in.erfaces gráficas de usuario • Persistencia * Manejo de eventos

* Introspección

' Soporte para herramientas de construcción de aplicaciones

JavaUeans proporciona el marco de trabajo que hace posible la comunicación del compo

nente. Aún más importante es el hecho de que los componentes de JavaBeans se puedan

manipular con facilidad a través de un conjunto estándar de propiedades bien definidas. JavaBeans une la potencia de los applets de Java totalmente desarrollados, con la solidez y

forma de pequeñas APls dentro de la API de Zu^n^^ ^''^ ** ÍmPtemenla

reusabilidad de los componentes del AWT de Java, como los botones.

#


Día 19

1490

JavaBeans y otrascaracteri.tir,. avanzadas ■»v,

Las APIs de combinación de interfaz de usuario proporcionan los medios para que un compo

nente una sus elementos con los de un contenedor. La mayoría de los contenedores tienen menús y barras de herramientas que necesitan desplegar cualquier característica especial

Las-especincaciones de Jav¡lBeans están dispon.bfes en el sitio Web * Java: \

http://www.sun.com

proporcionada por él componente. Las APls de combinación de imerfaz permiten que los componentes acrecen características al menú y a la barra de herramientas del documento del contenedor. Taijibién definen el mecanismo que facilita el diseño de la interlaz entre los

componentes y sus|contenedores. Las APls de persistencia especifican el mecanismo por el cual se pueden guardar y recuperó

Trucos con applets TTérmino Nuevo

navegador Web que indica (entre otns infó ^ °S la |wnc llcl sección ,e enseñará a logra " 2 , ""™""T""0 " "ud hi'*""'«"° ™* —,do. ,,,

los componentes dáitro del contexto de un documento contenedor. En forma predeterminada, los componentes heredan el mecanismo de señalización automática proporcionado por Java.

c

Basándose en las necesidades específicas de sus componentes, los programadores están en

10 LtcU0 > olus "•■'•■"'^s-populares ele applcls.

El método showstatus()

libertad de diseñar soluciones de persistencia más elaboradas.

ElmétodoshowStatuso delaclase

Las APIs de manejo de eventos especifican una arquitectura que define la forma en que interactúan los componentes entre sí. El AWT de Java incluye un poderoso modelo para manejar eventos, el cual sirve de base para las APIs que manejan los eventos de los componentes,

Este método puede ser llamado con una instrucción como ,a sigu.ente-

listas APls son muy importantes para darle a los componentes la libertad tic interaciuar entre ellos de manera consistente.

SetApPletCOntext(,.sncwStatus,-CliCk appIet window to

Las APls de introspección definen las técnicas por las cuales los componentes hacen disponible su estructura interna al momento del diseño. Estas APls tienen la funcionalidad necesaria para permitir que las herramientas de desarrollo le pregunten a un componente por

su estado interno, incluyendo las interfaces, métodos y variables de los miembros de que consta el componente. Las APIs están divididas en dos secciones diferentes basadas en el

Información del applet

nivel en que se utilizan. Por ejemplo, las APls de introspección de bajo nivel le permiten a las herramientas de desarrollo el acceso directo a las paites internas del componente, la cual es

una función que usted no querría en manos de los usuarios. Esto le lleva a las APIs de nivel

:M 1

proporciona, i

superior. Éstas utilizan a las APIs de nivel inferior para determinar qué panes del componente

ción.

se han de exportar para ser modificadas por el usuario, de modo que aunque las herramienta*de desarrollo utilicen ambas APIs. sólo utilizarán las APIs de nivel superior cuando propor cionen información del componente al usuario.

Las APls de soporte de herramientas de construcción de aplicaciones, proporcional) los ele mentos necesarios para editar y manejar los componentes al momento del diseño. Al construir

una aplicación, las herramientas de desarrollo visual utilizan estas APIs para proporcionar un medio visual para el diseño y edición de los componentes. La sección de un componente con

capacidades visuales de edición, está diseñada para estar separada físicamente del compo nente, listo se debe a que los componentes autónomos de tiempo de ejecución pueden ser lo más compacto posible. En un enlomo puro de tiempo de ejecución, los componentes se trans

fieren sólo con el componente de tiempo de ejecución necesario. Los programadores que

quieran utilizar las facilidades de tiempo de diseño del componente, pueden adquirir con facilidad la porción de tiempo de diseño del componente.

publie String getAppietInfo() {

^

return "GetRaven Copyright 1998 Laura Lemay";

Creación de vínculos dentro de los applets

Puesto que los apple.s se ejecutan dentro de los n¡,««adows Web •

la capacidad de ese navegador para cargnr nuevas ^™ W*£v, T

para decirle a, navegador que cargue una páahu n et UnTd

i .,

'

,

"

,

T" mW:in'S"U>

r::rería ::r crear—----- ^:;t:~;:l


1492

Día 19,

'

4931

Creará una nueva instancia de la clase UfiL para vincularla a una página nueva, aunque aquí es mucho más fácil trabajar con esa instancia que en el proyecto de ayer. Para crear un nuevo objeto URL, utilice uno de estos cuatro distintos constructores:

Figura 19.1

El applet B'ittonLink.

BMS

• URL(String) crea un objeto URL desde una dirección completa de Web, tal como: ;

http://www.prefect.com/java21 oftp://ftp.netscape.com.

:

• URL(URL,

String) crea un objeto URL con una dirección base proporcionada por el

URL especificado y una ruta relativa dada por String. Utilice getDocumentBase()

!

para el URL de la página que contiene su applet, o getCodeBase () para el URL del archivo de clase de su applet. La ruta relativa se añadirá a la dirección base. • URL {String, String, int, String) crea un nuevo objeto URL, con un protocolo (como http, o ftp), el nombre de host (como www. pref ect. com o ftp. netcom. cora),

dores. Cuando lo compHe con la herrín 9° ""* amp'¡° de aviso de desaprobación. he"ai™"'* Javac d.i JDK, .2. r ecibirá

número de puerto (80 para http) y un nombre de archivo o de ruta. •. URL (String, String, String) es igual al constructor anterior menos el número de

un

puerto.

Al utilizar el constructor URL (String), tendrá que tratar con objetos

MalformedURLException. Podría usar un bloque try.. .caten como se muestra a conti nuación:

try { theURL = new URL("http://www.mcp.com ); } catch (MalformedURLException e) { System.out.println("Bad URL: " + theURL);

}

Una vez obtenido un objeto URL, todo lo que tiene que hacer es pasarlo al navegador, con lo que el navegador cargará esa dirección: getAppletContextO .showDocument (theURL);

El navegador que contiene el applet de Java con este código, cargará y desplegará el docu

4:

5:

6: 7: 8:

publie volt) init() {

"http://www. prefect.com/java2r)

b«Li$t[2J- new BookmarkCJavaSoff nttp://java.sun.com");

mento en ese URL.

El listado 19.1 contiene dos clases: ButtonLink y una clase de ayuda llamada Bookmark. El applet ButtonLink despliega tres botones que representan posiciones importantes en Web;

los botones se nuestran en la figura 19.1. Haciendo clic en los botones, se carga el documen to de las posiciones a las que se refieren los botones.

publie boolean action(Event .»*, Ofject arg, if (evt.target instanceof Button) / linkTof (String)arg );

return true;

else return false;

I ■

t


ft

Día 19

1494

Listado 19.1 continuación 28:

29: 30:

}

Comunicación entre applets

{

Habrá veces en que desee tener una páein. HTMl

tiene que hacer es repetir varias veces I

void|linkTo(String ñame) { IJRL theURL = nuil;

■31: 32:

33:

■|6r

(int

i

if (ñame.equals(bmList[i].ñame))

I

34:

if

36:

(theURL

f

37:

i = 0;

i¡< bmList.length;

i++)

{.

'■■•*.* de su ap¿ ,,".,,

"

C°" Va

S aPP'C'S- '^ CSI°' 'üd° il)

theURL = bmList[i].url;

I

35:

495

applei

!= nuil)

getAppletContext().showDocument(theURL);

38:

39: 40: 41:

class

Bookmark

42:

String

43;

URL

rr~

{

ñame;

dores y entornos * TJlT™* "° ^'^ S69Ún los diversos

url;

44:

45:

Bookmark(String ñame,

46:

this.name

47:

try

48: 49:

50:

=

String theURL)

{

ñame;

{

this.url = new URL(theURL); }

catch

(MalformedURLException

e)

System.out.println("Bad URL:

{

"

+ theURL);

51: 52:

53:

Este upplet se puede probar con e! siguiente HTML: <APPLET CODE="ButtonLink.class"

HEIGHT=120 WIDTH=240>

</APPLET>

Hay dos clases que constituyen a este applet: la primera, ButtonLink, implementa el applet

un ciclo for que se parece a

actual, la segunda, Bookmark, es una clase que representa un marcador. Los marcadores tienen dos parles: un nombre y un URL.

Este applet en particular crea tres instancias de marcadores (h'neas S-13) y las guarda en un arreglo de marcadores. El applet se puede modificar fácilmente para que acepte marcador como parámetros de un archivo HTML. Para cada marcador, se crea un botón cuya etiqueta es el valor del nombre del marcador.

Al presionar los botones se llama al método linkTo(). Éste, tal como se define en las linea 30-38, extrae del evento el nombre del botón, lo utiliza para ver el URL del objeto Bkai y le dice al navegador que cargue el URL nombrado por ese marcador.

Enumeration en tumo Nol < , de la clase llZt'a ** "f" 1C otro appie.) n cel co T aP'

apple, ;..'a clase MyAppletSubclass). "" "*' ""* ^ ¡p (e (en Le esle ca cas°.

conQCCCSO una«-de ios ;l cada e'cmento díl

n—«ion es una instancia e de su


Dia 19

¡496

a un método en un applet específico, es. un poco más compücado.Para hacer es.o

nombre a sus app.ets y luego refiérase a ello, por » nombre dentro de. cuerpo de.

pegarlo entre campos y áreas de lexiol Pd«

datos de un componente a otro

código de ese applet.

^ * pudieran tr;"ltifa

Para darle nombre a un applet, utilice el atributo^AME para <APPLET> en su archivo HTML:

#

<p>This applet sends information:

<APPLET COOE-'MyÁpplet.class" WIOTH-iee HEIGHT-15Í NAME="sender"> </APPLET>

<p>This applet receives information from the sender: <APPLET CODE="MyApplet.Class" WIDTH=100 HEIGHT=150

:

!

Creación de objetos transferidles

NAME="receiver ">

</APPLET>

Para referirse a otro applet en la misma página, use el método getApplet () del contexto del apoto con el nombre de ese applet. Esto le da una referencia para el applet de ese nombre. Entonces se podrá referir a ese applet como si fuera otro objeto: llamar a métodos, establecer sus variables de instancia y así sucesivamente. He aquí un cód;go que hace eso: // saca provecho del applet receptor

Applet receiver = (MyAppletSubclass) getAppletContext().getApplet("receiver'); // le dice que se actualice a si mismo receiver.update(text,

valué);

En csic ejemplo, usted utiliza el niélodo getApplet () pan, obicncr una referencia del appici denominado "receiver". Observe que el objeto devueho por getApplet () es una mstancia de la clase genérica Applet; probablemente tendrá que convenir ese objeto en una instancia

de su subclase. Una vez dada .a referencia a. apple, nombrado, puede llamar métodos en ese

applet como si fuera otro objeto en su propio entorno. Aquí, por ejemplo, s, ambos applets tienen un método update(), puede decirle al receptor que se actualice a si Husmo por mecho de la información que tiene el applet actual.

Si le pone nombre a sus applets y se refiere a ellos por medio de los métodos descritos en esta sección, permitirá que sus applets se comuniquen y permanezcan en sincronía entre ellos, proporcionando un comportamiento uniforme entre todos los applets de su pagina.

Cortar, copiar y pegar

En |, versión I. I de Java, se agregó el soporte para las operaciones de cortar, copiar y pega,

entre los componentes de una interfaz de usuario del AWT y otros programas que se ejecu.en en la misma plataforma, aunque no se hayan implementado en Java.

Con anterioridad, en el AWT sólo podía copiar y pegar datos entre componentes que tenían

CZ funcionalidad incluida en sus plataformas nativas (por ejemplo, se podía cop.ar texto y

íat Flavo Da Piavor

«»u»»«»rded«o,que represen, una Case de

^ "" ^"^"^ ^"^"^ «bor «bor ".egiblc".egiblc- EEl objeo ? ^ '*'* ^ resultante .endrd un Upo MIME de .pplic.tion/,-,.v.

,.v.,.ri.Uz..


1498

.

• DataFlavor{String,

Día 19

String) crea un sabor de datos que representa un tipo MIME,

i::!:^n::iivii:si"ei"b^-p-^u,i,iZarsu1Pmf"° P?nWes ¡"«".o para copiar y

en el que el primer argumento es el tipo MIME y el Segundo es la cadena "legible" para

g

puede mili, ,

pegar entre los componentes en un apple[.

el usuario. La clase que representa este sabor será InfcutStream.

Cualquier com

Con ese objetó de sabor de datos, y para negociar la forma en que se transferirá la informa

ue desee milb-,

i

ción, puede pjegunlai por sus valores o comparar los lipos MIMI: con oíros objetos tic salior.

Los sabores dé dalos son utilizados por los objelos transferibles, los cuales se definen por medio

de la interfaz transf erable. Un objeto iransfcrible deberá incluir l:i información que se va a transferir y \ai instancias de cada sabor que represente a ese objeto. Para que su objeio se pueda

negociar y transferir, también liene que implementar los métodos getTransf erDataFlavors(),

„,„,„,

"7 71"—'- ~-

■ Sr"" ™ * - *»

isDataFlavoTSupported(), y getTransferData(). (Para obtener más detalles, consulte la

¡nterfaz Transf erable.) Por medio deios objetos DataFlavor y la ¡nterfaz Transf erable, la clase StringSelection

del portapapelex).

inipleinenla üji objeio simple iransfcrible para transmitir cadenas de texto. Si su interés principal

es copiar texto, StringSelection es un lugar excelente para comenzar (y, de hecho, quizá es el único objeto iransfcrible que necesita).

Observe que los objelos transferibles se usan para encapsular datos y para describir su lonnalo; no hacen nada en ninguno de los extremos para formaiear esa información. Esa es respoTV sabiüdad de su programa, al utilizar el ponapapeles (Clipboard) para obtener dalos de una

El portapapeles

^nsferable que lamb.en puede implcncniar al dueño

„.,„

'■ ^:

Cuando tenga un objeto transferible, utilice un ponapapeles para transferirlo enire componentes y desde Java a la plataforma nativa. Java 2 proporciona un mecanismo de ponapapeles de uso

fácil que le permite colocar dalos en el ponapapeles y recuperarlos del mismo. Puede utilizar el

: .„

3 4

,;

fuente.

«„:„.,„

'■""""" '"*""""- *"■"

' *"«■

™r

„,, „,„„-,„ ,,„ ,,f,

ponapapeles estándar del sistema para mover información hacia, y desde, oíros programas que

se ejecuten en la misma plataforma nativa, o bien utilice sus propias instancias del ponapapeles

""t

para crear ponapapeles especiales o conjuntos múltiples de ponapapeles especializados. I:n Java los.portapapeles están representados por la clase Clipboard. la cual también es

parte del paquete java .awt .datatransf er. Puede acceder al Clipboard estándar del sis

tema a través de los métodos getToolkit () y getSystemClipBoard () (getToolkit () le da una forma de tener acceso a varias caracierísieas del sistema nativo), como en el ejemplo siguiente:

stH. el código para es.e ejemplo:

Clipboard clip = getToolkit().getSystemClipboard()

Una observación importante en relación con el portapapeles del sistema, es que los applels no

tienen aceefso al sisiema por razones de seguridad (podría haber información confidencial en ese portapapeles). Esio evita que los applets puedan copiar y pegar cualquier cosa en, o desde.

Figura 19.2

El applcí CopyPaste.

;kl() ly- »<


Día 19

500

J««Beans y otras características

t

Listado T9.2. Texto completo de copvpaste.java. import

2:

import java.awt.event.*;

3: 4:

5: 6:

import

50:

java.awt.*;

52: 53:

java.awt.datatransfer.*;

54:

55:

public class CopyPaste extends Frame implements ActionListener, ClipboardOwner { Button

9:

TextField tfCopy,

10:

11: 12:

copy,

58:

paste;

59:

tfPaste;

60:

63: 64:

{

System.exit(O);

16:

test.addWindowListener(l);

20:

test.setSize(200,

21:

test.showf);

it (e.getSourcef) == COpy)

70:

150);

docopy();

71:

else if (e.getsourceo == paste)

72:

doPaste();

73:

23:

CopyPaste()

74:

{

super("Copy and Paste"); clip = getToolkit().getSystemClipboard();

25:

26: 27:

FlowLayout fio = new FlowLayout();

28:

setLayout(flo);

29: 30:

copy = new Button("Copy From");

31:

tfCopy = new TextField(25);

32:

paste =

33:

tfPaste = new TextField(25);

new Button("Paste To");

35:

copy.addActionListener(this);

36:

paste.addActionListener(this);

37:

paste.setEnabled(false);

add(copy);

46:

add(tfCopy);

41:

add(paste);

42:

■ add(tfPasté);

76:

contents)

77: 78:

*

próximos dos días,

¡ indica que es.a clase implementará la ir

ani un

44:

47: 48: 49:

void

doCopy()

{

if (tfCopy.getText()

* ^"^ M USUaria Duranle los ^ ""«*"* ^ d-™"-do 'as aP,,

\\ !t ÍnrrÓn,ímPOrt ha" d«»»»^ * í»q««e J.v...«.dltatr.n,f.r.

43:

46:

{

}

Las insirucciones específicas para copiar y pegar son:

38:

39:

75:

cacioncs de Swino

34:

45:

j.

public void «ctionP.rfor.ed(ActionEvent e)

69:

22: 24:

#.toStrlng(

66: 68:

};

19:

+

65: 67:

17:

18:

Paste-setEnabled(false)} catch (Exception e) { } SyStem.out.println(-Error

62:

{

CopyPaste test = new CopyPastef); WindowListener 1 = new WindowAdapter() { public void windowClosing(WindowEvent e)

15:

.setText(txt)-

61:

public static void main(String[] argunejits)

14:

{

56:

Clipboard clip;

13:

void doPaste()

57:

7:

8:

paste.setEnabled(true);

51:

1:

avanzadas

!= nuil)

{

String txt = tfCopy.getText();

StringSelection trans = new StringSelection(txt); clip.setContents(trans,

this);

T

ei Cl b°'Ón C°^ Fr-- * "«na .11 mé-o-

en el campo de texto de Copy From, el texto se saca del


Día .19

1502

campo en la línea 47, se utiliza para crear ua,nuevo objeto transferible en la línea 48 y se coloca en el ponapapeles en la línea 49. Después, se activa el botón Paste To.

JavaBeans y otras características avanzadas

La arquitectura de la RMl

Líneas 54-66 Cuando se hace clic en el botón Paste To, se llama al método doPaste () . Pura verificar el contenido del ponapapeles. se tnili/a el objelo Transf erable. Si noesta" vacío, se recupera la información (lineas 58 y 5V) y se

coloca en el campo de texto Paste To (linca 60), Una vez hecho esto. Paste To queda desactivado.

Líneas 75-77

,

.

.

Debido a que la clase implemenia la inierl'az ClipboardOwner, se

requiere de un método Iost0wnership(). Sin embargo, aquí no se ha hecho nada re ferente a cambios de propietario, por lo tamo el método está vacío.

Invocación a Métodos Remotos La RMJ (Invocación a Métodos Remotos) se utiliza para crear aplicaciones de Java que pueden comunicarse con otras aplicaciones de Java en una red. Para ser más específicos, la RMl permile que una aplicación llame a métodos de otra aplicación testas aplicaciones

podrían ejecutarse en diversos entornos de Java o en sistemas difercmes) y pasar objetos de ida y vuella en una conexión de red. Puesto i|tie los mecanismos y protocolos por Ion que

usted se comunica entre objetos está definido y estandarizado en la RMl. ésta es un mecanis

paÍ s de oLr ^ J0S ~S C°" el fi" * P- objetos completos o Zlos 12121" ? ^ "i"""3ocurrir ° ^ durante VUlOr''"'laC01"° ^o™ jar los errores de la red que pudieran operación remota. acciónales para mane de estas capas para llegar a su dest.no (consulte la fio,,,,, ,«;..-,,. E|| a,l|u|;lJ ,,.„, |a.s ^^ Figura 19.3 Las capas de la RMl.

CI ion lo

Capa de relerencia

tener que saber de antemano qué protocolo hablar, o cómo hablarlo.

Capa de transporte

Otra forma de comunicación entre objetos es la RPC (Llamadas a Procedimientos Remotos), en la cual usted puede llamar a métodos o ejecu tar procedimientos de otros programas en una conexión de red. En tanto que la RPC y la RMl tienen muchas cosas en común, la diferencia más impor tante es que la RPC sólo envía llamadas a procedimientos, con argumentos

pasados o descritos de modo que se puedan reconstruir en cualquiera de los extremos. La RMl pasa objetos enteros de ¡da y vuelta en la Red, y por lo tamo, incorpora mejor un modelo de objetos distribuidos completamente orientado a objetos.

Aunque el concepto de la RMl pudiera presentar visiones de objetos repartidos por todo el mundo comunicándose alegremente entre sí, en realidad se utiliza en situaciones más tradi cionales cliente/servidor. Una sola aplicación de servidor recibe conexiones y solicitudes de un cieno número de clientes. La RMl sólo es el mecanismo de comunicación entre el cliente y el servidor.

Aplicación

Capa de stubs

mo más sofisticado para comunicarse entre objetos de Java distribuidos, que una simple conexión de socket. Usted le puede hablar a olio programa de Java, por medio de la RMl. sin

Nota

Servidor

Aplicación

Capa de esqueletos

Capa (Jo rclc-ruicia

remota

remola

Red

Capa de transpone

• Las capas de "stubs" y de "esqueletos" en el cliente y el servidor, resp.civameme bilis capas se comportan como objetos sustitutos en cada lado, ochando la "lejanía" de la llamada del método a las clases reales de implememación Por ejemplo en su apl.cacón Chente usted puede llamarmélodos remotos de la misma forma que lo hace

k:H(M

con los locales: el objeto siub es un sustituto local del objeto remoto.

• La capa de referencia remota, que maneja el empaquetamiento de una llamada de méto do, as, como sus parámetros y valores dcvuellos para su transpone cu la red. • La capa de transpone, que es la conexión real a la red de un sistema a otro.

Estas tres capas de la RMl permiten el control o .a imp.ementación independiente de cada

con o t„ )os objelos W y coneSq"que (ralan °S PCmiiten ;' 'aS d!'SeS dd ClÍC"le y el *"*<* como ruma |ocu|cs y m¡l.z;ii cxociaincnic f;is n comportarse ,sm;fc;i|.;ic_ .en ,.cas del lenguaje de Java para accesar a esos objetos. La capa.de referencia remota separa el procesamiento de los objetos remotos en su propia capa, la cual se puede optimizar o volver a tmplememar, independientemente de las aplicaciones que dependen de ella Por últi mo, la capa de transpone de red se utiliza en forma independiente de las otras dos de modo ¡

o i ■


Día 19

504

que usted puede usar distintos tipos de conexión de sockets para la RMI (TCP, UDP o TCP con algún otro protocolo, como el SSL). Cuando una aplicación clienle hace una llamada a un método reinólo. l;i llamada se pasa ni siub y de ahí a la capa de referencia, la cual empaqueta los argumentos en caso necesario y los pasa

al servidor por medio de la capa de transporte; una vez en el servidor, la capa de referencia desempaca los argumentos y los pasa al esqueleto y de ahí a la iinplementación del servidor.

servidor,

^^^

»«* implememara los métodos deTto^re

lado del

"■«ñKior de bridad pan, ese servid, rn

* ^^ CrCará e inSlalará u"

el administradora

í "^ ""**

'-gan conexiones y Halda, no a

I^ T

Luego, los valores devueltos para la llamada al método emprenden el viaje de regreso hacia el

"* ClÍn"CT «

lado del cliente.

Término Nuevo

Puesto que los objetos se deben convertir en algo que se pueda pasar por la red, la característica de empacar y pasar argumentos de método es uno de los aspec

tos más interesantes de la RMI. Esta conversión se denomina señalización. Mientras un

«r« .1 servido, „ ,„„,, „,„,„„„

objeto se pueda señalizar, la RMI lo puede utilizar como un parámetro de método o un valor devuelto. Los objetos susceptibles de señalización incluyen todos los tipos primitivos de Java, objetos remotos de Java y cualquier otro objeto qi'e ¡mplemente la inierfaz Serializeable

(la cual incluye muchas de las clases del JDK 1.2 estándar, como iodos los componentes del AWT).

Los objetos remotos de Java, utilizados como parámetros de método o valores desuellos, se

pasan por referencia tal como lo harían en forma local. Sin embargo, todos los demás objeios son copiados. Tome nota de que este comportamiento influirá en la forma en que escriba sus programa: cuando éstos utilicen llamadas a métodos remotos; por ejemplo, usted no puede pasar un aTeslo como un argumento a un método remoto, hacer que el objeto remoto cambie

ese arregle y esperar que el cambio se refleje sobre la copia local. Ésta no es la forma en que se compouan los objetos locales, en donde todos los objetos se pasan como referencias.

Creac'ón de ap!lr?ciones RMI Para crea, una aplicación que utilice RMI, debe usar las clases e interfaces definidas rior los paquetes ¡ava.rmi, entre los cuales se incluyen los siguientes: •

java.activation

Para activar los objetos remolos.

java.rmi.server

Para las clases del lado del servidor.

• ja* a. rtni. registry

Contiene las clases para localizar y registrar los servidores RMI

en 'in sistema local.

• j a' a. rmi. dgc

Para recolectar la basura de los objetos distribuidos.

En sí el piquete java.rmi contiene las interfaces, clases y excepciones RMI generales.

Para imp ementar una aplicación cliente-servidor, basada en la RMI, primero debe definir

una inier az que contenga todos los métodos que soporte su objeto remoto. Todos los método-

de esa inierfaz deben incluir una cláusula throws RemoteException, la cual manejará los problem; s potenciales de la red; esto podría impedir la comunicación entre el clienle y el servidor.

cas para desarrollar bases ée^^Z,^^ *"" ^ ™ «»".««*•« a l«s ,ce,,i-

medio de JDBC, no difiere mucho de laTntaccio

•as herramientas tradicionales Esto debe" d7aT

C°" """ ^ de da'°S SQL PW

""" "" * dat0S SQL P" ™dio

-cía en bases de datos, la cn^^'^

JDBC cuenta con el respaldo de los líderes de I, in

Ce hcamien-as de desarro.lo J^Z^


Día 19

506

La API de JDBC incluye clases para las construcciones comunes de bases de datos SQL,

incluyendo conexiones, instrucciones SQL y conjuntos de resultados. Los programas Java que

uliMzan JDBC tienen la capacidad de usar el modelo de programación SQL para emilir instrucciones SQL y procesar los datos resultantes. La API de JDBC depende en gran parle de un administrador de controladores que soporte la conexión de múltiples consoladores a

diferentes bases de datos. Los controladores de bases de datos JDBC se pueden escribir lotalmente en Java o implementar a través de métodos nativos para unir las aplicaciones de Java con las bibliotecas de acceso a la base de dalos.

JDBC también incluye un puenle entre JDBC y ODBC, la imertaz común de Microsoft para acecsar a las bases de dalos SQL. El puente JD13C-ODI5C permite que los controlados JDBC se usen como controladores ODBC. Las clases JDBC son parle de Java 2 como el paquee j ava. sql c incluyen clases para mane

jar coniroladores, establecer conexiones con las bases de datos, construir consullas SQL y procesar los resultados.

El sitio Web de Sun contiene una amplia información y especificaciones de JDBC.

JavaBeans y otras características avanzadas

Preguntas y respuestas 1'

showStatus(,

¡nfor

csi.iuo ¡i mis lecidrcs?

"Mr,, el estado ele su iipp|c, cree un, c,¡,|llL,:i (lc ,s,,do cn c( lnis|n() ...formado,, actualizada que neccsi.c prcsenl.-.r

|c| C()n |a

*n «, ...i .^in, «vi, u.Hto,,,-

rn.res de NullPomterException. ¿Qu6 .si^.ific, esto"

TT??

t se des.ruven con

p"leLs- " la )<>'"" - M« Sun, y ,a

-Smo Ím I' ^TVeeUd°r ' d'CC"(|UC ddK ^ ruiicíüllürSl" w"ba^;i1 '=" ' "- en W "llplCmC"1:l M*H o si L inílcJnudo

U>n ., co-reca, depende de ese navegador. L,s .crsione, de Netscape e /nternet Lxplorer an.enores., 3.0 t.cnen problemas extraños con ,a emumeacón enlre apple.s

Resumen Cuando se publicó la versión I de Java, en 1995, el lenguaje se adaptaba más a la progra mación de applets que al diseño kilal de la aplicación.

Eso ya no sucede con Java 2.. porque ahora el lenguaje ofrece un soporte sólido para las características como diseño de componentes para software, invocación a métodos remolos, coneclividad con bases de dalos y señalización de objetos.

El material que hemos cubierto hoy es un trampolín para mayores exploraciones de los paquetes y clases que ofrecen soporte para estas características. Una vez que domine las bases del lenguaje Java, estará listo para atacar estos temas avanzados en libros, cursos y en su propia exploración de la API de Java.

Durante los próximos dos días se concluirá su introducción al lenguaje Java. Aprenderá a crear ¡nterfaces gráficas de usuario por medio de Swing, la nueva solución de manejo de venlanas que ofrece Java 2, y cómo convertir esas interfaces en aplicaciones funcionales.

I


Semana 3

Día

Diseño de una interfaz de

usuario con Swing al PJ«, ,mp¡ei,1INlar „„, ¡nlerta Je u

Swing ofrece una funcionalidad muy mejorada con rcpeco a


Diseño de una interfaz de usuario con Swing

Swing utiliza la misma infraestructura de clases que el AWT, lo cual hace posi ble combinar los componentes de ambos en la misma interfaz. Sin embargo, en algunos casos los dos tipos de componentes no se comportarán correctamente

Precaución

en un contenedor. Para evitar estos problemas, es mejor usar exclusivamente uno de estos sistemas de manejo de ventanas en un programa.

Todos Jos componentes de Swing son subclases de la clase JComponent.

Estructura de una aplicación

Los beneficios de Swing !:

El primer paso para crear una aplicación simple de Swing es crear una clase que sea una sub clase de JFrame. La clase JFrame es una extensión de Frame, y se puede utilizar de manera

sa con r

similar.

El código que aparece en el listado 20.1 puede ser una estructura para cyalesquier aplica

imerto gráHca de usuano y e

ciones (|iie cree medíanle una ventana principal.

Listado 20.1. Texto completo de framework . java. 1:

2:

e inc,USo Ce! usuario de, programa.

^ ^ ^ ^

3:

Es... característica ofrece e, cambio ñus ^^ ^ MStema ,iaUV0 de operación, conu, p^ma de Java con una interfaz que_

u« ^ui

^dowsoSolan.ounnuevoesu.oun.eodeJa

^ ^ ^^.^ M(¡uiL

A herencia de sus P^decesores, ,u -^^T,^^ co.npa.ibi.i- a

s

iraport java.awt.GridLayout; import java.awt.event.•; import javax.swing.*;

4:

5:

publie class Framework extends JFrame {

6: 7: 8:

publie

Framework()

{

super('Application Title");

9:

10:

// Agregue aquí los componentes

11:

12:

.swing. Para poder uiili^ar una

13: 14:

publie static void main(String[] JFrame

args)

{

frame = new Framework();

15: 16: siguiente:

17:

18:

WindowListener 1 = new WindowAdapter()

{

publie void windowClosing(WindowEvent e) System.exit(0);

19:

frame.addWindowListener(l); frame.pack();

frame.setVisible(true);

{

511


513|

Diseño de una interfaz de usuario con Swing Día'20

El programa del listado 20.2 usa la estructura de ja aplicación y agrega un bolón al panel de

contenido del marco. El bolón se crea desde la clase JButton, la versión Swing de un botón seleccionable. Este programa es similar al proyeelo Slacker del día 11, "Construcción de

m m m

interfaces de usuario sencillas para los applets".

Listado 20.2. Texto completo de swinger.java. 1:

import

java.awt.GridLayout;

2:

import

java.awt.event.*;

3:

import

javax.swing.*;

publie

class Swinger

4:

5:

extends JFrame

{

6: 7: 8: 9:

10:

publie

{

String note = "1 receive a disproportipnate amount of

"joy from being clicked. Please iriteract with me.";

11: 12:

Swinger()

super("Swinger");

JButton

hotButton

=

new JButton(note);

13:

Setvisit>le(.ooleano). S. el

cierne pau, ello.

14:

JPanel pane = new JPanel();

15:

pane.add(hotButton);

16: aniumen,o

fuera f al.e en vez de xrue.

17:

setContentPane(pane);

18: 19: ..

m;lrco se abrirá al tama

20: 21:

gar ant.s c Los componemes se ñenen que ag«&

publie static void main(String[]

args)

{

JFrame frame = new Swinger();

22:

23:

WindowListener

1 = new WindowAdapíer()

{

puDlic void windowClosing(WindowEvent

a-al.

e)

{

System.exit(0);

25: 26: 27:

28:

};

frame.addWindowListener(l);

29: 30:

frame.pack();

31:

frame.setVisible(true) ;

32: 33:

La figura 20.1 muestra la salida de esla aplicación.

Reunió aód(conponente).

.

fe

"Í


Día 20

514

5151

El único material nuevo en el listado 20.2 son las líneas 10-17, en las que tiene lugar lo siguiente:

• Líneas 12 y 13

Se crea un objeto JButton mediante una cadena como su etiqueta,

liste uso es idéntico al de uno de los constructores de la clase Button.

• Líneas 14 y 15 • Línea 17

Se crea un objeto JPanel y se agrega el botón a este panel.

Con el método setContentPane( Contenedor) se hace el panel que será el

panel de contenido del marco.

Una vez que haya establecido el panel de contenido para un marco, utilice métodos como setLayout (AdministradorDeDiseño) y aüó(Coitiponente) en ese panel. Usted no llama a

pane = new JPanel()•

pane.add(button);

setContentPane(pane); Figura 20.2 Un ¡cuno en un JButton.

esos métodos en el marco mismo.

Nota

Esto también es válido para los applets, los cuales se ¡mplementan en Swing a través de la clase JApplet. Tiene que crear un objeto JPanel, agregarle componentes, y hacer que ese panel sea el panel de contenido para el applet. Tome nota de que cualquier applet que cree con Swing y Java 2 no funcionará en navegadores Web que únicamente soporten Java 1.0.2. También tiene que encontrar la forma de que las clases de Swing estén disponibles para el applet; tomará mucho tiempo descargarlas en la página

PUede utilizar Para sus

Web junto con los archivos que conforman el applet.

está en e, archivo unabo™ gii A trabajar con Swing Hny componentes de Swing para cada uno de los componentes del AWT que ha aprendido hasta este punto. En la mayoría de los casos hay un constructor para el componente de S.wing que concuerda con su similar del AWT, de modo que no tiene que aprender nada nuevo para trabajar con los componentes de Swing.

También hay constructores para iimclios de los coni|xmenies que loman un obje to I con como argumento. Un icono es un gráfico pequeño, normalmente en

formato G1F, que se puede utilizar en un botón, etiqueta u otro elemento de la interfaz, como un medio visual para identif.car al componente que representa. Usted ve iconos todo el tiem

Etiquetas h aüneadón de una etiqueta

Swino.Constants: LEFT^S

loma el nombre de archivo o URL de un gráfico, como argumento único. El ejemplo siguiente

carga un icono del archivo unabom.gif y crea un JButton con el icono como su etiqueta. La figura 20.2 nos muestra el resultado.

? clarjLabei-La fum>^ - ™

Algunos de los métodos constructores que puede usar, incluven ,os siguien.es-

ínt) Es una

po en las carpetas de archivo de los sistemas operativos gráficos como Windows 95 y MacOS. La creación de un. Icón se hace de la misma manera que con un objeto Image. El constructor

y el «nilíco de, .cono

j con el

texto, icono yaüneación

Botones

pc:rLr

u

q

combinación de ambos.

es del awt ..„■.,. etiqueía de icono o una


Diseño de una interfaz de usuario con Swing

517

Día 20 ,16

• JCheckBox( Icono)

Una casilla de verificación con la etiqueta de icono especificada.

• JCheckBox (Icono, booleano)

Una casilla de verificación con la diquela de

icono especificada, que se selecciona en caso de que el segundo argumento sea true.

• JCheckBox(Cadena,

ron el icono especificado.

jButton

Icono)

Una casilla de verificación con las etiquetas especifi

cadas de lexlo c icono.

jButton(Cadena,

Icono)

• JChockBox(Cíir/o/)fl, Icono, boolomto)

I ln;i casilla de Vfrilkai-ión con las etique

tas especificadas de lexto e icono, que se selecciona en caso de que el segundo argunienid sea true.

lin Swing, los grupos de casillas de \erilicacion se iiiiplenieiiiun con la clase ButtonGroup. Como ha visto, en un grupo de casillas de verificación sólo se puede seleccionar un compo

nente a la vez. Para agregar un componente al grupo debe crear un objeto ButtonGroup y a-o

L0i

agregarle casillas de verificación con el método add(Componente).

^

-*■ «*<■*■

w Ikaclos.

iw. unc;h

En Swina, los botones de opción se implememan a través de la clase JRadioButton. Los métodos constructores son los mismos que los de la clase JCheckBox.

Bl cambio de nombre de CheckboxGroup a SuttonGroup refleja la ampliación Je la fun cionalidad; ahora ya se pueden agrupar botones y botones de opción. .

Listas de selección Las listas de selección, que se crearon en el AWT por medio de la clase Choice. son algunas de las implementaciones posibles con la clase JComboBox.

Para crear una lista de selección dé los pasos siguientes: !.

El constructor JComboBox () se utiliza sin argumentos.

2. Para agregar eiemenios a la lista, se usa el niciodo addltem( Objeto) de los cuadros combinados.

3. El método setEditable(tiooJeanD). de los cuadros combinados, se usa con el argu

jTextArea(int columnas. JTextArea(Cacíena,

^ de lexlo con

el número especificado de

Este último método convierte el cuadro combinado en una lista de selección: las únicas selec

texto, filas y columnas.

Casmas de verificación v^

mento f alse.

deopc,on

ciones que puede hacer el usuario son los elementos agregados a la lista.

Si el cuadro combinado es edilable, el usuario puede escribir en el campo de texto en lugar de usar la lista de selección y tomar un elemento. Ésia es la razón por la cual los cuadros combi"ñados se llaman así.

Barras de desplazamiento En Swing, las barras de desplazamiento se implememan con la clase JScrollBar. El tuncionamiento es idéntico al de las barras del AWT, y puede utilizar los siguientes métodos

# •


Día 20

I 518

■ JScrollBar(iní)

.

Diseño de una

Es una barra de desplazamiento con la orientación especificada.

29

, jScrollBar(int, int, int, int, int) i Es una barra de desplazamiento con la

30

orientación, valor inicial, tamaño del cuadro ele desplazamiento, valor mínimo y valor

31:

32:

máximo especificados.

33:

35:

SwingConstants.

36: 37:

Un ejemplo: la aplicación SwingCoiorTest

38: 39:

Si recuerda bien, uno de los proyectos del día 14, "Desarrollo de interfaces de usuario avan

41:

42:

sus valores RGB o-HSB.

43:

49:

java.awt.*;

2:

import

java.awt.event.*;

3:

import

javax.swing.*;

4:

5: 6: 7:

8: 9: 18:

11:

12: 13: 14:

15: 16: 17:

18:

JPanel

swatch = new JPanel(); swatch.setBackground(Color.blacK);

RGBcontrols = new SwingColorControls(this, "Green",

"Blue");

HSBcontrols = new SwingColorControls(this, "Brightness");

27:

28:

class SwingColorControls extends JPanel { SwingCoiorTest frame;

JTextField tfieldi, tfield2, tfield3;

SwingColorControls(SwingCoiorTest parent String 11, string 12, String 13) {

frame = parent;

add(tfield2);

62:

add(new JLabel(13, JLabel.RIGHT));

add(tfield3);

63: 64:

"'

65:

"Red", "Hue ,

66:

publie Insets getlnsets() {

67:

return new Insets(10,

68: 69:

10, 0, 0);

}

pane.add(RGBcontrols); pane.add(HSBcontrols); setContentPane(pane);

25:

26:

18) 10).

add(new JLabel(12, JLabel.RIGHT))•

61:

pane.setLayout(new GridLayout(1, 3, 5, 15));

return new Insets(i0, 10,

add(tfleldi);

68:

JPanel pane = new JPanel();

publie Insets getlnsets() {

tfield2 = new JTextField("0") •' tfield3 = new JTextField("0") ■' add(new JLabel(H, JLabel.niGHT)) •

59:

{

super("Color Test");

•Saturation",

24:

56: 57:

58:

publie SwingCoiorTest()

frane.pack();

! frame.setVisible(true);

setLayoutfnew GridLayout(3,2,i0)le),. tfieldi = new JTextFieldf"0")•

55:

swatch;

pane.add(swatch);

23:

53:

publie class SwingCoiorTest extends JFrame { SwingColorControls RGBcontrols, HSBcontrols;

19: 21:

52: 54:

20: 22:

50:

51:

inport

fraine.addWindowListener(l) ;

45: 46: 47:

1:

'

44:

48: Listado 20.3. Texto completo de swinocolortest.java.

System.exit(0);

40:

zadas con el AWT". era el applet ColorTest, el cual permitía seleccionar un color a través de

de eventos.

PübUc void windowClosing(WindowEvent e)

34:

La orientación se indica con las variables de clase HORIZONTAL o VERTICAL de

El siguiente proyecto crea la interfaz gráfica de usuario para este proyecto mediante Swing, y la conviene en una aplicación en vez de un applet. Mañana creará los métodos para manejo

WindowListener 1 = new windo-Ad.pt.rO {

íntenaz son iguales a Jas de sus similares no Swing. publie statie void main(StringI] args) { JFrame fraroe = new SwingCoiorTest();

i-'-l


Día 20

520

Figura 20.3

Cómo establecer la apariencia

La aplicación SwingColorTest.

El programa SwingColorTest utiliza la estructura de la aplicación presentada con anteriori dad, por lo que muchas partes del programa también ya han sido introducidas previamente.

Este programa se compone de tres clases: la clase principa] SwingColorTest, la clase auxi liar privada SwingColorControls y la clase interna definida en las líneas 30-34.

Las clases SwingColorTest y SwingColorControls sobreponen el método getlnsetsf). lo cual permite que estos componentes se inserten desde los márgenes de su contenedor en un

número designado de pixeles. Al igual que muchos otros aspectos de Swing, ¿sie liene el

Apariencia de Windows 95 o Windows NT

mismo soporte que los componentes del AWT.

Apariencia en el sistema Motif X-Window

La clase SwingColorControls es una subclase de JPanel. Esta clase se actualizó para

Metal, la nueva apariencia de Swing de plataforma cruzada

Swing, al convenir los campos de texto y las etiquetas de los componentes del AWT en com ponentes de Swing. No se necesitaron más cambios.

En la clase SwingColorTest, los cambios siguientes actualizaron el código de manejo de ventanas para que trabajen con Swing en vez de con el AWT: •

El programa es una subclase de JFrame.

• El objeto swatch, el cual muestra el color seleccionado, se convierte en un objeto

que representa ,a apanenda Me,a. de plataforma crujía de Java

JPanel en vez de un Canvas. De hecho, no hay objetos Canvas en Swing, por lo que se deben usar paneles en su lugar. • Se crea un objeto JPanel para que sea el panel principa! ele contenido del marco. •

Los componentes swatch,

RGBcontrols y HSBcontrols se añiuien a! pan':! do con

tenido en vez de a la ventana principal del programa.

En muchos casos, se puede implementar una interfaz creada para el AWT utilizando Swing con pocos cambios mayores. Si está conviniendo un applet escrito para Java 1.0.2 en un pro grama de Swing para Java 2, tendrá que ejecutar cambios más importantes en los métodos de manejo de eventos, los cuales comentaremos mañana.

'*'*o ^vuelve lH1objc,o

que representa la apariencia de su sisicma.

Si el método setLookAnoTee., ,> no ?ue¿t e^bleccr la aparca |ün7, un

UnsupportedLookAndFeelException.

"

Para designar Metal como la apariencia en cu,,,u,er

ciones siguientes: try

programa, se debcrán „,,„„ ,„ „

{

UlManager.setLookAndFeel( } caten (Exception e) {

Las nuevas características de Swing Además de los componentes y contenedores que amplían la funcionalidad del AWT. Swing ofrece mi lucrosas características completamente nuevas, incluyendo una apariencia definible, métodos abreviados, información sobre herramientas y cuadros de diálogo estándar.

System.err.printlnccan-t set look and feel: • + ■e res I d

...

t'U''

e)r

SU MMc'":l' 1M|I|(-'C 9etSystemLookAndFeelClassName(). '

'

( s srstemas operativos. Si uiili/.;i

apariencia de Windows 95. l^sZl^ü^^n^ZZ


1522

Día 20

Diseño de unajnterfaz de

usuario con Swing

Métodos abreviados Un método abreviado de teclado, llamado también teclas aceleradoras, es una secuencia de teclado con la que se puede controlar un componente en una inter faz de usuario. Ofrece una forma de utilizar un programa sin el ratón, y forma parte del soporte para la accesibilidad de Swing: nuevas clases que facilitan la ejecución de un progra

* la cadena debe ser la descripción de. ,exto

del componen

ma de Java a invidentes y otras personas con diversas aptitudes.

El ejemplo siente establece la descripción de un objeto JButton-

Cuando se utilizan los métodos abreviados de teclado, simulan la acción del ratón, y la Corma

JButton quit = new JButton("Quit")•

de uso varía según la plataforma en que se utilice. En una computadora que ejecute Windows 95, un método abreviado de teclado se ejecuta manteniendo oprimida la tecla Al! en combi

S

nación con otra tecla.

El método setAccessibleNa-eíC**™, ruilt,OIli| ¡

Los métodos abreviados de teclado se establecen llamando al método setMnemonic (char),

argumento char es la tecla que se debe usar como parte del método abreviado. El ejemplo infoButton =

el nombre de un campo de textoL

new JButton("Information");

infoButton.setMnemonic('i');

JTextField nm = new JTextFieldí)•

sibleConttO

Si presiona Alt+I el componente infoButton será seleccionado.

Información sobre herramientas Otra Corma de hucerque un programa sea más amigable para el usuario, es asociando ¡nlomi:i-

ción sobre herramientas con los componentes de una interfaz. Es probable que ya esté familia rizado con la información sobre herramientas, pues son los textos que aparecen en algunos programas cuando detiene el puntero del ratón durante unos segundos en un componente. La información sobre herramientas describe el propósito del componente. Cuando esté apren diendo a usar un programa por primera vez, la información sobre herramientas es un recurso excefente para su aprendizaje.

c

do para el objeto *^

siguiente crea un objeto JButton y asocia el carácter ' i' con el botón: JButton

,

^^°1 sc pucdc utu¡™ »

en el mismo componente en que se puede utilizar el método abreviado como control. El

Cuadros de diálogo estándar

Proporcionan un nL^n

: rros que se pucden ÍTTE'"S *

cuadro de diálogo bajo ,a apariencia de Meta. Figura 20.4

Un cuadro de diálogo

estándar.

. m amm*.*.mMmtmmmiml,

j

-i.

Para establecer una información sobre herramientas en un componente, llame al método setToolTipText( Cadena) del componente. La cadena debe ser una descripción concisa del propósito del componente.

l¿l ejemplo siguientecrea un componente JScrollBar y se asocia a una información sobre herramientas. JScrollBar

speed = new JScrollBar();

speed.setToolTipText("Move to set aniroation speed-);

El texto de una información sobre herramientas sólo puede tener un renglón de longitud, por lo que no puede utilizar el carácter (' \n') de nueva línea para dividir el texto en varios renglones.

Descripciones y nombres de los componentes Otra forma de hacer más accesible una interfaz, es proporcionando una descripción del texto de un componente de Swing. Esto se logra a través de un proceso de dos pasos:

manejan auiomáticamenie.

Hay cuatro cuadros de diálogo estándar:.

'I(L I


Diseño de una interfaz.de usuario con Swing

Día 20

524

. inputDialog

,. MessageDialog . optionDialog

Es un cuadro de diálogo que le pide una entrada de texto.

. .. ,,

Es un cuadro de diálogo que despliega un mensaje.

...

JOptionPane.ERROR_MESSAGE)■ ^,¡

■.. ,

.

-

'■'

'

'•

La figura 2p.5,mue$tra e] cuadro de diálogo resallante bajo la apariencia de Windows,

Es un cuadro de diálogo que incluye los otros tres tipos de cuadros.

Cada cuadro de diálogo tiene su propio método en la clase JOptionPane.

Figura 20.5

Un cuadro de diálogo

Cuadros de diálogo de confirmación El modo más fácil de crear un cuadro de diálogo Sí/No/Cancelar es con la siguiente llamada a método: showConf irmDialog(Componente, Objeto). El argumento del componente especifica el contenedor que se debe considerar como el ancestro del cuadro de diálogo, y con

esta información se determina en qué pane de la pantalla se debe desplegar la ventana de diálogo. Si úsanos nuil en vez de un contenedor, o si el contenedor no es un objeto Frame.

de confirmación.

Cuadros de diálogo de entrada Un cuadro de diálogo de entrada hace una pregunta y utiliza un campo de texlo para guardar

la respuesta. La figura 20.6 nos muestra un ejemplo con la apariencia de Molif.

el cuadro aparecerá centrado en la pantalla.

El segundo argumemo puede ser una cadena, un componente o un objeto Icón. Si es una

Figura 20.6

cadena, ese texto aparecerá desplegado en el cuadro de diálogo. Si es un componente o un

Un cuadro de diálogo

icono, se desplegará el objeto en lugar de un mensaje de texto.

Este método devuelve uno de tres posibles valores enteros, y cada uno es una variable de

' ': JOptionPane. YES_NO_OPTION,

'.

'■•''■"•' "'!!¿ Cj:I:,-V ..;,,,-. ,f¡.':-....

525i

de entrada.

i

mtsms

.

clase de JOptionPane: YES_0PTI0N, N0_0PTI0N y CANCEL_OPTION.

El siguiente es un ejemplo que utiliza un cuadro de diálogo de confinación con un mensaje de texto y almacena la respuesta en la \ anuble response: int

response;

response = JOptionPane.showConfirmDialog(nuil, "Should I delete all of your irreplaceable personal files );

Otro método ofrece más opciones para el diálogo de confirmación: showConf irmDialog (Componente, Objeto, Cadena, inx, ¿nr). Los dos primeros afu memos son ¡guales a los del método showConfirmDialogt). Los tres últimos argumentos

La forma más fácil de crear un diálogo de entrada es llamando al método showlnput -

Dialog (Componente, Objeto). Los argumentos son el componente ancestro y la cadena,

el componente, o el icono que se va a desplegar en el cuadro.

La llamada al método de diálogo de entrada devuelve una cadena que representa la respuesta del usuario. La instrucción siguiente crea el cuadro de diálogo de emrada que aparece en la

figura 20.ó:

String response = JOptionPane.showInputDi'alog(nuÍl "Enter your ñame:");

'

son:

• Una cadena que se desplegará en la barra de título del cuadro de diálogo. • Un entero que indica qué botones de opción estarán visibles. Debe ser igual a las va-, riablos de clase YES_N0_CANCEL_0PTI0N o YES_N0_0PTI0N.

. Un entero que describe el tipo de cuadro de diálogo, por medio de las siguientes varmblcsilc cbse: EnROR.MESSAGE, INFORMATION.MESSAGE, PLAIN.MESSAGE, QUES-

TI0NJ1ESSAGE o WAñNINGJUESSAGE. Con este argumento se determina qué icono se ha de dibujar junto con el mensaje,

int response = JOptionPane.showConfirmDialog(null,

■Error reading file. Want to try again?", "File

Input

Error",

También puede crear un cuadro de diálogo de entrada con el método ' showInputDialog(Componente, Objeto, Cadena, int). Los dos primeros argumemos

son iguales á los de la llamada abreviada del método, y los dos restantes son los siguientes: • El título que se va a desplegar en la barra de título del cuadro de diálogo.

• Una de las cinco variables de clase que describen e! tipo de cuadro de diálogo:

ERROR_MESSAGE,INFORMATION_MESSAGE, PLAIN_MESSAGE, OUESTION MESSAGE O

WARNING_MESSAGE.

La instrucción siguiente crea un cuadro de diálogo de entrada a través de este método: String response = JOptionPane.showInputDialogínull "What is your ZIP code?",

"Enter ZIP Code",

JOptionPane.QUESTI0N_MESSAGE);

'


Diseño de una interfaz de usuario con Swing

Día 20

• 'El icono que va a desplegar, con las variables de clase ERROR_MESSAGE, INFORMATION MESSAGE, PLAIN_MESSAGE, QUESTION^ESSAGE, WaWnG MESSÁGE ola

literal 0 si no va a utilizar ninguno.

~

• Un objeto Icón, para desplegarlo en lugar de los iconos del argumento anterior. • S. no se utilizan las opciones YES_NO_OPTION y YES NO CANCEL OPTION, un arre glo de objetos que contenga los componentes u otros objetos que representen las

Figura 20.7

opciones en el cuadro de diálogo.

t7/i cuadro de diálogo

• Si no se utilizan las opciones YES_NO_OPTION y YES_NO_CANCEU, el objeto que repre

¡le mensaje.

senta la opción predeterminada.

Los dos últimos argumentos le permiten crear un amplio rango de opciones para el cuadro de diálogo. Usted puede crear un arreglo de botones, de etiquetas, de campos de texto, o bien

wu■ comb.nac.on de varios componentes como un arreglo de obje.os. Estos componcn.es se

desphegan por med.o de. administrador de diseños de flujo, porque denuo del diálogo no hay

lorma de especificar otro administrador.

El ejemplo siguiente crea un cuadro de diálogo de opción que utiliza un arreglo de obje.os JButton

que aparece cu la ilgura 20.7:

para las opc.ones del cuadro y el elemento 0ender[2] como la selección predeterminad* JButton[) gender = new JButton¡3]; gender[0j = new JButton("Male") ; genderp) = new JButton ("Female") •

gender[2] = new JButtonf"None of Your Business")-

int responsa = JOptionPane.showOptionDialog(null,' wiat is your gender?", "Gender",

devuelve un valor.

0,

írsiír •Asteroid Destruction

:

JOptionPane.INFORMATlON MESSAGE nuil,

Alert ,

joptionPane.WARNING.MESSAGE);

Cuadros de diálogo de opción

H, c adro de d.ogo ma-s complejo es e, ^^

comb,na las caractensticas de todos los otrosd,aU, Sepuede

showOptionDialogtComponente, O*je«, Cadena, mt.

gender,

.

•.. gender[2]);

La figura 20.8 nos muestra el cuadro de diálogo resultante con la apariencia de Motif. Figura 20.8 Un cuadro de diálogo de opción.

Objeto).

Los argumento* pan, este mciodo son los siguicn.es: '. El componente ancestro del diálogo.

. El .ex.o. ¡cono o componente que se va a desplegar.

. Una cadena para desplegar en la barra de título.

Un ejemplo: la aplicación inf o El proyecto siguiente nos da la oportunidad de ver una serie de cuadros de diálogo en un pro grama funcional. La aplicación Info utiliza diálogos para obtener información del usuario, la

cual es colocada en los campos de texto de la ventana principal de la aplicación


Día 20

Diseño de una ¡nterfaz de usuario con Swing

Escriba el listado 20.4 y compile el resultado.

47:

pane.add(typeLabel);

48:

pane.add(type);

49:

Listado 20.4. Texto completo de wc java.

50:

setContentPane(pane);

51:

1:

import java.awt.GridLayout;

52:

2:

import

53:

java.awt.event.*;

3: import javax.swing.*;

5^ public class Info extends JFrarae {

l\

7".

¡I 1B

.

.

prívate JLabel titleLabel = new JLabel( Title.

12: 13: 14:

15: 16: 17:

18: 19: 20:

21 : 22: 23: 24:

25:

26: 27:

57:

__

private JLabel typeLabel = new JLabeK Type.

59:

Information

34:

35:

36: 37: 38:

39: 40:

41 : 42: 43: 44: 45:

46:

"look and feel:

"

+ e);

JFrame frame = new lnfo();

63: 64:

WindowListener 1 = new WindowAdapter() { public void windowClosing(WindowEvent e)

65:

p.

{

Systera.exit(O);

67:

-,;

68:

69:

nrres:o:s:íP

frame.addWindowListener(l);

70:

"Enter the site title:");

title = new JTextField(response1, 20);

71:

frarae.pack();

72:

frame.setVisible(true);

73: 74:

}

in8respns:2p "Enter the site address:"); address = ne* jTextField(response2, 20);

La figura 20.9 presenta la ventana principal de esta aplicación con la apariencia del sistema (er. ssta pantalla ¿s w incows). Hay íres campos de ¡exio con valores proporcionados por los

'■

30:

33:

,

66:

{

{

+

62:

SwingConstants.RIGHT);

super("Site

(Exception e)

System.err.println("Couldn't use the systera "

60:

private JTextField type;

public Info()

UIManager.getSystemLoókAndFeelClassNameO);

61:

private JTextField address;

29:

32:

} catch

58:

prlvaíe Slidír^bel - new JLabel("Address: ",

{

UIManager.setLookAndFeel(

56:

,

SwingConstants.RIGHT);

28:

31 :

try

55:

SwingConstants.RIGHT);

11:

public static void maln(Strlng[] arg») {

54:

"What type of site is it? ,

cuadros de diálogo.

Figura 20.9 La ventana principal

"Site Type",

de la aplicación Info.

ñ

JOptionPane.QUESTION_MESSAGE,

nuil,

Mucho de esta aplicación es el código del modelo de texto que se puede utilizar con cualquier

cholees,

choices[e]);

,

type = new jTextField(choices[responSe3], jPanel pane = new JPaneK);

pane.setLayout(new GridLayout(3, 2)), pane.add(titleLsbel); pane.add(tltle);

pane.add(addressLabel): pane.add(address);

aplicación de Swing. Las líneas siguientes se relacionan con los cuadros de diálogo: • Líneas 19-22

Es un diálogo de entrada que se usa para pedir al usuario que escriba

un título de sitio. Éste se utiliza para el constructor del objeto JTextField, el cual pone el título en el campo de texto.

• Líneas 24-27

Es un diálogo similar al anterior, utilizado para pedir una dirección de

sitio que se utilizará en el constructor de otro objeto JTextField.

529 I


Día 20

¡530

• Línea 30

Se crea un arreglo de objetos String llamado choices, con tres elementos

que son valores dados.

Semana 3

¡

• Lincas 3 1-38 Se usa un cuadro de diálogo opcional para pedir el lino do sino, l-.l arreglo choices es el séptimo argumento, el cual establece los lies bolones del diálogo con las cadenas del arreglo: Personal, Commercial y Unknown. El último argumento,

choices[8], designa al primer elemento del arreglo como la selección predeterminada del diálogo. La figura 20.10 muestra este cuadro de diálogo de opción. • Línea 39

Es la respuesta al diálogo de opción; un entero que identifica que el elemento

del arreglo seleccionado está guardado en un componente JTextField llamado type.

Figura 20.10 El cuadro ele diálogo

de opción de upo del sitio.

Resumen

Día

21

Después que varios cientos de miles de prograniadores tuvieron la oportunidad de usar las

primeras versiones de Java, una de las quejas principales se refería al AWT. Aunque permile crear una interfaz funcional, había algunos problemas para hacer que todas las inierfaccs tra bajaran en plataformas diferentes y algunos elementos de una imerfaz gráfica de usuario no estaban soportados por el AWT.

Swing es una respuesta efectiva a todas eslas críticas por medio de un sofisticado sistema de ventanas que se adapta a muchos tipos distintos de programas de Java. Si Je echa una mirada

Manejo de eventos de

usuario con Swing

a la documentación incluida en Swing, encontrará más de treinia componentes distintos.

Mañana llevará a cabo un ejercicio para convertir una interfaz en una aplicación completa.

Preguntas y respuestas P ¿Se puede crear una aplicación sin Swing?

R Desde luego. Swing es sólo una ampliación del AWT, y puede seguir utilizando el AWT para las aplicaciones con Java 2. En vez de usar las lécnicas disponibles para los applets de Java 1.0.2, debe utilizar las técnicas de manejo de eventos, sobre las que hablaremos mañana. Acerca de si debe crear una aplicación sin Swing, ese es otro

punto. No hay comparación entre las posibilidades que ofrece Swing y las del AWT. Con Swing, puede utilizar muchos más componentes y controlarlos de manera más sofisticada.

Anvés de un conjunto de clases llamadas luchadores de e ventos.

£3£i


»ía 21 ■

El evento principal

En el sistema de manejo de eventos que aprendió la semana anterior, los eventos se maneja

Manejo de eventos de usuario con Swing

dase siguiente se declara para que pued eda manejar eventos de acción y de te*t0-

ban ¡i través de un conjunto de métodos que están disponibles en todos los componemos.

Métodos como mouseDown(), keyDown() y action(), se podrían sobreponer en cualquier programa del AWT que quisiera manejar esos eventos.

Puesto que las versiones subsecuentes del lenguaje ofrecen soluciones muy mejoradas para

los eventos, este sistema de manejo de eventos se aplica solamente a Java 1.0.2. Para crear aplicaciones de Swing, utilice el nuevo sistema.

import java.awt.event.*;

Escuchadores de eventos

Cómo establecer los componentes

Dentro del sistema de manejo de eventos de Java 2, si una clase desea responder a un evento de usuario debe implememar la interfaz que maneje los eventos. Estas interfaces se llaman escuthadores de eventos.

Cada escuchador maneja un tipo específico de evento, y una clase puede implementar tamos escuchadores de eventos como sea necesario.

7Zrd P métodos Hr del componente:

He aquí los siguientes escuchadores de eventos disponibles:

• ActionListener

Eventos de acción que se generan cuando un usuario realiza una

acción en un componente, por ejemplo hacer clic en un botón.

. AdjustmentListener

Eventos de ajuste al activar un componente, como el

movimiento de una barra de desplazamiento.

• FocusListener . Eventos de enfoque de teclado que surjen cuando un componente, por ejemplo un campo de texto, gana o pierde el enfoque.

. itemListener

Son eventos de elemento que se dan al cambiar un elemento, como

una casilla de verificación.

• KeyListener

Eventos de teclado que suceden cuando un usuario escribe texto con el

teclado.

. MouseListener

Eventos de ratón generados por clics de un ratón al entrar a (y salir

• addActionListener(, Componentes de JButton, JCheckBox, JCo.boBox, JTextField, y JRadioButton.

• addAdjustmentListenern Componemos de JScrollBar.

• addFociisListenerf) Todos los componentes de Swing.

addltemListenero Componentes de JButton, JCheckBox, JComooBox v

JRadioButton.

addKeyListener() Todos los componentes de Swing.

addMouseListener-0 Todos los componentes de Swing.

addMouseMotioiiListenerO Todos los componentes de Swing.

addWindowListenerí) Todos los componentes de JWindow y jFranm.

de) un área del componente.

. MouseMotionListener

Son eventos de movimiento de ratón que han servido para

llevar un registro de todos los movimientos del ratón en un componente.

'•" windowListener

Eventos de ventana generados al aumentar, disminuir, mover o

cerrar la ventana de la aplicación principal.

Precaución

Hay un error muy fací de cometer en un programa de Java, y éste es modir 9ar'° 3 Un cont^edor. Antes de agregar nente al contenedor, tiene que agregarle los escuchadores de ev-en-

os y maneja, cual

jer otra configuradoa pue

serán ignorados al ejecutar el programa.

El ejemplo siguiente crea un objeto JButton y le

asocia un escuchador de evento de acción:


Día 21

1534

Manejo de eventoide JButton zap = new JButton("Zap");

if (src == quitButton)

zap.addActionListener(this);

quitProgram();

Todos los métodos agregados toman un argumento: el objeto escuchador de evento de esa clase. Por medio de this, usted indica que la clase actual es el escuchador de evento. También puede especificar un objeto diferente, siempre y cuando la clase de! objeto imple-

else if (src == sortRecords)

u!uarin con Swing

:

'■

sortRecords();

mente el escuchador de evento apropiado. el

sortRecords ()

Métodos manejadores de eventos

evento, llamara al método

Cuando usied asocia una interfaz a una clase, la clase debe manejar lodos los eventos con tenidos en la interfaz.

lee,

En el caso de los escuchadores de eventos, cuando tiene lugar el evento de usuario correspon diente, el sistema de ventanas llama a cada método en forma automática. La interfaz ActionListener tiene un solo método. Todas las clases que Actior.Listener publie void actionPerformed(ActionEvent evt)

éiodo de

*e podría usaran

imple-menta deben tener un método con una estructura como la siguiente:

^> t"--'«rar,a,, un

evento de acción:

{

// maneje el evento aquí

voidactionPerformed(ActionEvent evt) Object src = evt.getSource(); if (src mstanceof JTextField)

}

Si en la imerfaz gráfica de usuario de su programa hay un solo componenie con un

calculateScoref);

escuchador de evento para lor eventos de acción, utilice el método actionPerf ormed() para

else if (src instanceof JButton) quitProgram();

responder a un evento generado por ese componente.

Si hay más de un componente con un escuchador de evento de acción, deberá utilizar el méto do para deducir qué componente se usó y actuar en su programa de acuerdo con ello.

1 m"ia

Quizá habrá notado en el método actionPerformedf )que, cuando se llama ni método, se envía un objeto ActionEvent como argumento. Hste objeto se puede utilizar para descubrir los detalles acerca del componenie que generó el evento.

El objeto ActionEvent y todos los otros objetos de evento son parte del paquete java.awt.event.y a su vez son subclases de la clase EventObject.

Cada método de manejo de eventos envía un objeto de evento de alguna clase. Para determi nar qué componente envió el evento, utilice el método del objeto getSource(), como en el ejemplo siguiente:

publie void actionPerforraed(ActionEvent evt) { Object src = evt.getSource();

Escriba 1: 2: 3: 4:

Listado 21.1. Texto completo de changft.t, p . JAVA.

import java.awt.event.*;

import javax.swing.*; import java.awt.*;

5: 6: 7:

8: 9:

}

10:

El objeto devuelto por el método getSource () se puede comparar con los componentes si

11: 12:

usa el operador == . Las instrucciones siguientes se podrían utilizar dentro de! ejemplo

13:

actionPerf ormed() anterior:

14:

2 = new JButton("Gulldenstern'j; publie ChangeTitle() { super("Title Bar");

bi.addActionListener(this); b2.addActionListener(this);

JPanel pane = new JPanelf);


Día 21 "

536

Listado 21.1. continuación 15:

pane.add(b1);

16:

pane.add(b2);

17:

setContentPane(pane);

18:

Trabajo con métodos

19: 28:

public

21:

static void main(String[]

JFrame fraroe

22:

=

args)

{

new ChangeTltle();

■—

23:

Windowlistener 1 =

24:

public

25:

new WindowAdapterf)

{

void windowClosing(WindowEvent

e)

{

System.exit(O);

26: 27:

Eventos de acción

};

28:

frame.addWindowListener(l);

29: 30:

31':

frame.pack();

•JCneckBox, JCoroboBox, jTextFieldo

JRadioButton.

frame.setVisible(true);

32: 33: 34:

public

35:

void actionPerformed(ActiortEvent

36:

Object

37:

if

evt)

{

souree = evt.getSource();

(souree == b1) setTitle("Rosencrantz");

38:

else if

39:

(souree

=-

que genere un evento d act, n no

ese componente.

'

it

e 4UK;ra 't"10™" '"* lentos ele acción de

b2)

setTitle("Guildenstern");

40:

repaint();

41: 42:

43:

vold actionPerformedfActionEvent evt, {

}

Esta aplicación se muestra en la figura 21.1, Figura 21.1 La aplicación ChangeTítle.

,„„,„„„ , su dc,

■«* -

"¡f™« "" »"

En esta aplicación sólo se necesitan 12 líneas para responder a los eventos de acción de esta aplicación: •

l.:i línc:i 1 importa el paquete java.awt.event.

II

• Las líneas 12 y 13 agregan escuchadores de eventos de acción a los dos objetos JButton.

Ürauf i.

• Las líneas 35-42 responden a los eventos de acción derivados de los dos objetos

Jbutton. El método getSource () del objeto evt se utiliza para determinar la fuente

4

\"


.Día 21

Manejo de eventos de usuario con Swinq

Los comandos de acción son excepcíonalmente útiles cuando escribe un pro grama en el que más de un componente debería provocar la misma acc.on.

Nota

import java.awt.event.*;

Un ejemplo de esto seria un programa con un botón Quit y una opción Quit en un menú desplegable. Si en un método de manejo de eventos le da el

i

mismo comando de acción a los dos componentes, los podra manejar con

el mismo código.

el... WellAdJülted extend. JFrarae lrapleraents AdJustBentUstener 6:

■' 7:

Eventos de ajuste

Los cven.os de ajuste se dan cuando se mueve un componente JScrollBar por medio de las flechas de la barra, el cuadro de desplazamiento o haciendo clic en cualqu.er pane de la barra.

11:

adjustmentValueChanged[EventoDeAjuste): Toma la,forma siguiente:

16:

bar.addAd]ustmentListener(this)•

15: 17:

{

1B: ,

..•

19:

}

llame al método getValue () en el objeto AdjustmentEvent. Este método devuelve un

entero que representa el valor de la barra de desplazamiento.

También puede determinar la forma en que el usuario movió la barra de desplazamiento, a través del método AdjustmentEvent del objeto getAdjustmentTyPe(). Esto devuelve uno de cinco valores, cada uno de los cuales es una variable de clase de la clase Adjust.ent:

• UNIT INCREMENT

Es un aumento de 1 en el valor, el cual puede ser causado dando

clics en una flecha de la barra de desplazamiento o usando una tecla de cursor. . UNIT_DECREMENT

. BLOCK_INCREMENT

Es una reducción de 1 en el valor.

Es un aumento mayor al valor, causado al dar clics en la barra de

desplazamiento, en el área entre el cuadro de desplazamiento y la flecha.

. BLOCK_DECREMENT

Es una reducción mayor al valor.

TRACk" Es un cambio en el valor causado por un movimiento del cuadro de desplaza-

21: ■•'■ 22:

El programa que aparece en el listado 21.2, nos muestra el uso de la interfaz Ad ustmentListener. Cada vez que se mueve la barra de desplazamiento, se le agrega al marco una barra de desplazamiento y un campo de texto no editable, y se despliegan mensajes en el campo.

JPanel pane = new JPanel(); . .í pane.setLayout(bordJ;

pane.add(valué, "South",;

pane.addfbar,

"Center");

setContentPane(pane,;

23: 24: 25:

public static void main(String[] args, /

26:

JFrame frame = new WellAdjusted(,;

27: 28:

:

2S: 30:

• WindowListener 1 = new WindowAdapterf) / .,. public void windowCloSing(WindowEvent e) / System.exit(0,;

31:

' X

32: 33:

frame.addWindowListener(l);

34:

35:

frame.pack(,;

36:

frame.setVisible(true,;

37:

38:

' 39: ' •

,.

20: '

Par, ver cuál es el valor actual de JScrollBar, dentro de este melado de manejo de eventos,

mienio.

super("Well Adjusted");

13:

14:

.

public WelUdjusted() {

12:

Sólo hay un método en la interfaz AdjustmentListener:

//

bar -new JSer.lltar(8.i¿,c.n.t.nt.. HORIZONTAL,

9:

10:

Para manejar estos eventos, una clase debe implementar la interfaz Adj ustmentListener.

public void adjustmentValueChanged(AdjustmentEvent evt)

"eW ■Td.rL.yout

valué = new JTextFieldí)■

8:

40:

j

41:

source = evt.getSource();

if (source == bar, {

42:

int newValue = bar.getValue(,■ valué.setText(" + newValue);

43: 44: 45:

repaint();

46: 47:

•'

}

evt,


Día 21

540

Manejo do eventos de usuario con Swing

La figura 21.2 muestra una pantalla de la aplicación. Figura 21.2

' 1 Iw

Im xalitla (/■■ l« i'l'H-

!ul

541

Eventos de elemento elmmo

, Término Nuevo j

cución WellAdjusted.

TÉRiyilNf?,.NUEVO .

m

Usted se preguntará por qué hay un conjunto vacío de comillas en la llamada a setText () en la línea 43 de este programa. Las comillas vacías se denominan

voi^itemStateChangeddtemEvent ^ evt)

una cadena nuil, y están concatenadas al entero newValue para convertir el argumento

en una cadena. Como podrá recordar, si concatena una cadena con un tipo diferente, Java siempre manejará el resultado como una cadena. La cadena nuil es un método abreviado para cuando quiera desplegar algo que todavía no es una cadena.

oa>"6

Eventos de enfoque

t

Los evemos de enfoque suceden cuando cualquier componente gana o pierde la entrada de enfoque en una interfaz gráfica de usuario. El enfoque describe al

o a la ItemEvent.

componente i|i.e cM;í activo para recibir entradas desde el teclado. Si uno de los campos liene el enfoque (en una interfaz de usuario con varios campos de texto editables), lo mostrará por

m #

i

medio de un cursor parpadeando en ese campo.

El enfoque se aplica a todos los componentes que pueden recibir una entrada. En un objeto JButton, el botón con el enfoque aparece rodeado por una línea punteada.

Para manejar un evento de enfoque, deberá implementer la interfaz FocusListener desde una clase. Hay dos métodos en las interfaces focusGained(EventoDeEnfoque) y

Listado 21.3. Texto completo de selectitem.. 1:

2:

3: 4:

íocj£.i.üi.t;E-/eütoDeEn-roque), de «¡e modo toman ¡a forma siguieme: publie void focusGained(FocusEvent evt)

{

b: 6: 7: 8:

}

publie void focusLost(FocusEvent evt)

9:

{

18: 11: 12:

13:

Para determinar cuál es el objeto que ganó o perdió el enfoque, se puede llamar al método getSourceO en el objeto FocusEvent enviado como argumento a Jos métodos focusGainedf) y focusLost().

import java.awt.event.*;

iniport javax.swing.*; import java.awt.*;

14:

15: 16: 17: 18:

bord = new BorderLayoutí)•

JTextField result = new JTextField(27 •

JComboBox pick = new JComboBox(); publie Selectltem() { super("Select ítem");

pick.addltemUstener(this);

pick.addltem("Navigator"); pick.addltein(-lnternet Explorer") • Pick.addItem("Opera"); pick.setEditable(false)•

19: 20: 21: 22:

JPanel pane = new JPanel();

Pane.setLayout(bord); pane.add(result, "South");

ItemLiStener


Día 21

Manejo de eventosdeus^riñ con Swing

543 |

21.3. CONTINUACIÓN

pane.add(pick,

23: 24:

"Center");

siguiente:

setContentPane(pane);

25:

public void KeyPressedtKeyEvent evt) {

26:

27: 28:

;

public statlc vold main(String[] args) { JFrame trame = new Selectltem():

29:

30:

Y ke^, que toman la forma

!

public void keyReleasedíKevEvent evt) {

WindowListener 1 = new WindowAdapter(') {

31:

public void windowClosing(WindowEvent e) {

32:

System.exit(B);

33:

public void keyTypeddCeyEvent

}

34: 35:

evt)

{

frarae.addWindowListener(1);

36:

37:

frame.pack(); trame.setVisible(true);

38: 39: 40:

41:

Eventos de ratón

public void itemStateChanged(ItemEvent evt) { Object source = evt.getSource();

42: 43:

if

44:

45:

(source == pick)

{

Object newPick = evt.getltem{);

result.setText(newPick.toString() + ' is the selection.

46:

Los eventos de ratón se generan por

• Un ratón entrando al área de un componente. • Un ratón saliendo del área de un componente

}

47:

repaint();

4B:

49:

56:

varios tipos diferentes de interacciones del

• Un clic de ratón.

);

}

:

La fi-iirn-2 I 3 muestra osla aplicación con el elcmcnio Opera como la selección acm.,1 cu el cuadro combinado. El mé.odo toString() del objeto se utiliza para recuperar el texto del objeto devuelto por getltem().

Figura 21.3 Im salida de la apli cación Selectltem.

Cada uno toma la misma forma básicade n

Eventos de tecla

uMomm Los ««>"»de Ieda ocurren cuand0 se presiona una tecla en el leclad0' iMP^ Cualquier componente puede generar estos eventos y, para dar soporte a los eventos se tiene que implementar una interfaz KeyListener desde una clase.

public void «ouseReleased(MoüseEvent evt) { }

Los métodos siguientes funcionan para los objetos MouseEve

usuano:


21*

544

• getClickCount () con el ratón.

• getPoint()

Devuelve, como un entero, el número de veces que dio un clic

i

Devuelve, como un objeto Point, las coordenadas x,y dentro del com

ponente en el que dio clics con el ratón. •

getX()

Devuelve la posición x.

• getY()

Devuelve la posición y.

t

windowDeiconified(EventoDeVentana) windowlconifiBú(EventoDeVentana)

Eventos de movimiento del ratón

"indowOpeneú(EventoDeVentana) Todos toman la misma forma del método window0pened( )■ void windowOpenedfWindowEvent evt) <

Los eventos de movimiento del ratón ocurren cada vez que se mueve el ratón en un compo nente. Al igual que con cualquier otro evento de ratón, cualquier componente puede generar

eventos de movimiento del ratón. Para darles soporte, se debe implementar la interfaz MouseMotionListener desde una clase. En la interfaz MouseMotionListener hay dos métodos: mouseDragged(Even:oDeMovi-

mientoDelRatón) y mouseMoved(EventoDeMovimientoDelRatón), y toman la forma siguiente:

public void mouseDragged(MouseEvent evt) //

pa" Un ejemplo: la aplicación SwingColorTest

*

{

•■■

public void mouseMoved(MouseEvent evt)

{

A diferencia de las otras interfaces escuchadoras de eventos que ha manejado hasta este punto, la interfaz MouseMotionListener no tiene su propio tipo de evento. En vez de eso utilizn objetos MouseEvent.

Debido a esto, puede llamar a los mismos métodos getClick (), getPoint (), getx () y getY(), que llamaría para los eventos de ratón.

■■

Eventos de ventana Los evenios de ventana suceden cuando un usuario abre o cierra un objeto de ventana tal

■"■-

como un JFrame o un JWindow. Cualquier componente puede generar estos eventos y se tiene

que implementar una ¡nterfa2 WindowListener, desde una clase, para dar soporte a los eventos.

Hay siete métodos en la interfaz WindowListener:

windowActivated(£venroDeVentana)

class Syvingcolorcontrols extends JPanel

implements ActionListener, FocusListener { P

windowClosed(EventoDeVentana) windowClosing{EventoDeVentana)

después de

"CUChadores de rentos se deben añadir


Día 21 -

546

tfieldi.addFocusListener(this);

■-

Manejo de eventos de usuario con Swing

•-'

.

tfield2.addFocusListener(this); tfield3.addFocusListener(this);

1:

tfieldi.addActionListener(this);

2:

tfield2.addActionListener(this);

3:

tfield3.addActionListener(this);

4:

5:

Por último, agregue todos los métodos definidos en Jas dos interfaces que implemema esta clase: actionPerformed(£Vento0e/4cción),

6:

ÍocuslostiEventoDeEnfoque) y

íocus6aineú(EventoDeEnfoque).

.

7:

!

8:

9:

Los comióles de color se usan para registrar un valor numérico para un color, y esto hace

10:

que el color se dibuje en un panel. También actualiza los otros controles de color para que

"ÍnBí0;:rCOTl "G

publie SwinflColorTest() { super("Color Test");

12: 14:

Intro en un campo de texto, lo cual genera un evento de acción, o saliéndose del campo para

15:

swatch.setBackground(Color.black)•

RCBCSrO1=e:^Cl¿

17: 18:

Las instrucciones siguientes implementan los inétodos actionPerformed() y focusLost()

que se deben agregar a la clase:

JPanel pane = new JPanel()- •

pane.setLayout(new GridLayoutd, 3, 5 15))swatch = new JPanel(); ' '>'

16:

editar otro campo diferente, lo cual genera un evento de enfoque.

19:

Saturation", "Brlghtness")■

28:

publie void actionPerformed(ActionEvent evt)

{

instanceof TextField)

f rame.update(tfiis);

pane.add(swatch);

21:

pane.add(ReBcontrols); pane.add(HSBcontrols);

22:

23: 24:

setContentPane(pane);

25:

publie void focusLost(FocusEvent

evt)

{

26:

frame.update(this);

27: .

28: 29:

Uno de ellos, f ocusGained(), no necesita manejo. Entonces, se debe agregar una definición

36:

de método ..vacío:

31:

publie void focus6ained(FocusEvent evt)

{ }

Los métodos manejadores de eventos agregados a SwingColorControls, llaman a un méto do en su clase madre, update(SwingColorControls).

Este método no contiene ningún comportamiento para el manejo de eventos, sólo actualiza

34: 35: 36:

37: 38: 39: 49:

El listado 21.4 contiene la aplicación, incluyendo las clases SwingColorTest y

.... WindowListener 1 = new WindowAdapter() {

publie void windowClosing(WindowEvent e) System.exit(e);

33:

a la versión creada durante el día 14, "Desarrollo de interfaces de usuario avanzadas con el AWT".

.

publie statlc void main(StrinB[) arB$) { . ; JFrame trame = new SwángColorTest();

32:

la muestra del color y todos los controles para que reflejen un cambio de color. Es idéntico

SwingColorControls.

publie class SwingColorTest extends J

13:

I lay dos formas para que un usuario pueda terminar una nueva elección de color: prcsionaiuli1

(evt.getSourcp()

inport jsvax.swing.*;

11:

rcliejen el cambio de color.

if

iaport java.awt.*;

lmport Java.awt.event.*; .

41: 42: 43:

};

frame.addWindowListener(l); frame.pack{);

frame.setVisible(true); publie Insets getlnsetsf) {

return new Insets(18, le, 10,

ie);

44: 45: 46:

void update(SwingColorControls controlPanel) Color c;


Día 21

548

Listado 21.4. continuación

•■

47:

//

obtiene

48:

//

y

49:

int

los

valores

de

cadena

convierte

en

enteros

valuel

=

de

cadena de

los

campos

de texto

96: ;

Integer.parselnt(controlPanel.tfieldi.getText());

tfield2 = new JTextFieldfO" j •' tfield3 = new JTextFleld("e")■

'99:

50:

int

value2 = Integer.parseInt(controlPanel.tfield2.getText());

100:

int

value3 = Integer.parseInt(controlPanel.tfield3.getText());

101:

tfieldi.addFocüsListener(this)• tfield2.addFocusListener(this); tfield3. addFocüsListener (this )•' tfieldi.addActionListener(thisj■ tfield2.sddActionListener(this)• tfield3.addActlonListener(this)-

102:

52:

if

(controlPanel ==

54:

//

RGB

55:

c =

ha

RGBcontrols)

cambiado,

{

actualiza

new Color(value1,

value2,

103: HSB

104:

value3);

105:

106:

56: 57:

//

58:

floatf]

convierte

los

valores

RGB

en

HSB

addfnew JLabel(H, JLabel.RIGHT))-

107:

HSB - Color.RGBtoHSB(value1,

value2,

value3,

add(tfieldi);

108:

60:

HSB[0]

•=

360;

110:

61:

rfSB[1]

*=

100;

111:

62:

HSE[2]

*=

100;

112:

}

113:

63: restablece los

campos

114:

64:

//

HSB

65:

HSBcontrols.tfieldi.setText(String.valueOf((int)HSB[O]));

115:

66:

HSBcontrols.tfield2.setText(String.valueOf((int)HSB[1)));

116:

67:

HSBcontrols.tfield3.setText(String.valueOf((int)HSB[2])); }

else

70:

//

71 :

c

=

cambiado,

Color.getHSBColor((float)value1

(float)value2 /

72:

100,

/

(float)value3

360,

/

100);

public void actionPerformed(ActionEvent evt) { if (evt.getSource() instanceof JTextField) frame.update(this);

121: 122: 123:

73: //

74:

restablece

los

campos

public void focusLost(Focus£vent evt) i

124:

RGB

frame.update(this);

125:

75:

RGBcontrols.tfieldi.setText(String.valueOf(c.getRed()));

76:

RGBcontrols.tfield2.setText(String.valueOf(c.getGreen()));

126:

77:

RGBcontrols.tfield3.setText(String.valueOf(c.oetBlue())) ;

127: 128:

78:

10, 0, 0);

117:

120:

actualiza RGB

add(tfield3);

return new Insets(10,

119:

{

HSB ha

m

public Insets getlnsets() {

118:

66:

'

addfnew JLabel(12, JLabel.RIGHT))add(tfield2); "' add(new JLabel(13, JLabel.RIGHT))-

109:

(new float[3]));

59:

69:

= new JTextField("0")■

98:

51: 53:

Uy°"t(3,2,10,18) )

97:

}

public void focusGained(FocusEvent evt) { >

79: 80:

//

81:

swatch.setBackground(c);

actualiza

la

muestra

82:

swatch.repaint();

La figura 2!.4 muestra el producto terminado.

83: 84:

Figura 21.4

85:

Im aplicación

86: 87:

class SwingColorControls extends JPanel implements ActionListener,

FocusListener

{

l JJBJ

SwingColorTest.

88: 89:

SwingColorTest frame;

90:

jTextField tfieldi,

tfield2,

Resumen

tfield3;

91 : 92:

93:

SwingColorControls(SwingColorTest

String

11,

String

94:

95:

frame

=

parent;

12,

parent,

String 13)

{

j

Zd° P°r SWi"8 es ™ch° "-s robus.0 y de

para que maneje nuevos tipos de interacciones de usuario.

Por fuera el nuevo sistema también debe tener más sentido, desde el punto de vista de un

programudor. El manejo de eventos se ^reg. .1 programa , través de los mismos pasos:

/^


Día 21

1550

Manejo de eventos de usuario con Swinc, •' Unainterfaz escuchadora de eventos se agrega a la clase que deberá contener los méto dos para el manejo df eventos.

.

;

A cada componente que genere los eventos que ya a manejar se agrega un escuchador de eventos.

• Se agregan los métodos, cada uno con una clase EventObject como el único argumen

to para el melodo. •

Los métodos tic esa clase EventObject, como getSource(). se ulili/an para saher qué

componente generó el evento y qué clase de evento era. Una vez que conozca estos pasos, podrá trabajar con cada una de las distintas interfaces de escuchadores y clases de eventos. También aprenderá acerca de los nuevos escuchadores

de evcnios, conforme se vayan agregando a Swing junto con los nuevos compunenics. Eslo nos lleva al evento principal: la conclusión de nuestro viaje de 21 días a través del lenguaje Java. Ahora que ha tenido la oportunidad de trabajar con la sintaxis y las clases centrales que componen Java, ya está listo para la gran tarea: sus propios programas.

Este libro tiene un sitio oficial en Web: http: //www.prefect.com/java2i.

Ofrece

respuestas a las preguntas más populares de los lectores, y todos los códigos fuente del libro. ¡Felicidades! Ahora que le hemos presentado el lenguaje de programación más extraordinario de la década, está en usted hacer cosas aún más maravillosas con él. Conforme invierta tiempo en sus propios programas, aprendiendo nuevas características y

ampliando las clases de Java en sus propios paquetes, aprenderá otra razón para entender el porqué la tan alta inspiración del nombre del lenguaje.

Java, como su similar con cafeína, puede crear hábilo.

Nota

"No dejen que acabe así. Díganles que dije algo."

—Últimas palabras de Pancho Villa (1877-1923)

Preguntas y respuestas P ¿Se puede poner el comportamiento de manejo de eventos de un programa en su |iro|>¡:i clase, en ve/, de incluirlo con el código <|iiv eren l;i inlorfiíz?

R Sí se puede, y muchos programadores le dirán que es una buena forma de diseñar sus

propios programas. Si separa el diseño de la interfaz y el código de manejo de eventos,

d hÓ £

TT

:la aPJicac*n

cornlf ahernatÍV°-y aísla ^de,ha"comportamiento más fácii ™««* Proyec comportadme, asocado d° se conjunta no resonado


1 Si-

Ap茅ndices A 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


#

Apéndice

A

Resumen del lenguaje Java Esie apéndice contiene un resumen del lenguaje Java, tal u.n.o se describe en csic

libro.

Esto no es un repaso de gramática, ni una visión técnica del lenguaje en si. Es una referencia rápida que podrá utilizar luego de conocer los fundamen tos de cómo funciona el lenguaje. Si necesita una descripción técnica del lenguaje, puede visitar la sección de documentación en el sitio Web de JavaSoften http://java.sun.com/docs. Uno de los documentos que se ofrecen con acceso total, es la especificación oficial del lenguaje Java el cual

incluye una gramática completa.

Los símbolos y palabras clave del lenguaje se muesiran en fuente monoespaciada. Los argumentos y otras partes que se vayan a substituir, cslán en cursivas monoespaciadas.

Las partes opcionales se indican entre corchetes (excepto en la sección de sintaxis

de arreglos). En caso de que haya varias opciones que se excluyan mutuamente, se presentan separadas con símbolos de canalización (¡) como esto:

t publie ¡ prívate ¡ protected ) tipo nombrevariable

\W\


556

Apéndice A

Resumen del lenguaje Java

Palabras reservadas

[ número ).número

Las palabras siguientes están reservadas para el uso del propio lenguaje Java. (Algunas de

número[

ellas están reservadas pero no se usan actualmente.) No debe utilizar estos términos para

número[ d

referirse a clases, métodos o nombres de variables: do

abstráct

import

return

f

1 + ¡

void

¡

instanceof

short

volatile

'carácter'

break

else

int

static

while

"caracteres"

byte.

extends

interface

super

long

switch

catch

finally

native

synchronized

float

criar

new

throw

const

goto

private

throws

continué

if

protected

transient

implemertfs..

default

Las palabras true,

public

try

false y nuil también están reservadas para ser usadas como literales.

Cadena vacía Retroceso Tabulador Avance de línea

Avance de hoja Relorno de carro

\"

ComíJla doble

V

Comilla sencilla

\\

\unúmhexadecimal nuil

true

/*

és'ct

puede //

es

un

Escape Unicode

Booleano (verdadero)

#

Booieano (falso)

m

comentario que

abarcar varias lineas*/

éste es un comentario de una sola linea

/**■éste es un comentario Javadoc */

int ! long , nómbrenle Entero (seieccionar un tipo) double , nortrenrM. FIo,:,me ^.^ ^ » Doolean nombrevariable

número

¡

L]

Qxnúmhexadecimal

m

Declaración de variables cnar nombrevariable

Literales númeroll

Diagonal invenida Nulo

false

Comentarios

Un solo carácter

Cadena de caracteres

\n

\f

package

Con signo

Expolíente

\t

\r

for

,

\b

this

class

Tipo óouble

número[e ¡ E]número

double

final

Tipo float

¡ D]

booleah

case

Tipo double

F)

]número

Caracteres Booleano

Tipo int

nombreclase nombrevariable

t-

Tipo int

tipo nombrevariable, nombrevarxable,

Mlil|. ,

Entero hexadecimal

(dXnúmhexadecimal

Entero hexadecimal

Qsnúmoctal

Entero octal

5571

nombrevariable

Tipos de ciases _

Múltiples variables

m i


Apéndice A

1558

Las opciones siguientes están disponibles sólo para las variables de clase e instancia. arg

Cualquiera'tíe ellas se puede utilizar con una declaración de variable: [

static

[

final

[

) ]

public

declaraciónDeVariable

Consumios

declaraciónDeVariable

¡

prívate

|

protected

Variable de clase

]

Control de acceso

Asignación de variables =

valor

Asignación

variable**

Incremento posterior

++variable

Incremento previo

variable--

Decremento posterior

■-variable

Decrcmento previo

variable

+=

valor

Suma y asigna

variable

•=

valor

Rosla y asigna Multiplica y asigna

variable

*=

valor

variable

1=

valor

arg

arg

arg

<=

arg

>= arg

,

Menor que Mayor que

arg

Menor o igual a

arg == arg

declaraciónDeVariable

variable

<

arg >

Divide y asigna

arB

1=

arg

arg

&&

arg

ar9 ¡! !

ANO Jósia)

arg

OR lógico

arg

arg &

arg

arg

;

arg

arg

-

arg

NOT lógico AND OR

arg «

arg

arg

»

arg

arg

>»

XOR

Desplazamiento a la izquierda Desplazamiento a la derecha

arg

Desplaza a la derecha y rellena con ceros

~ arg

Complánenlo

(tipo) cosa

Conversión mediante casi

variable %= valor

Obtiene el residuo y asigna

variable

&=

AND y asigna

variable

¡

variable

'=

variable

<<=

variable

>>= valor

Desplaza a la derecha y asigna

new clase();

variable

>?>=

Rellena do ceros, desplaza a la derecha y asigna

new clase(arg, arg, arg.

valor

=

valor valor

valor

valor

arg instanceof clase

Instancia de

test ? trueOp : falseOp

Operador ternario (if)

OR y asigna XOR y asigna

Desplaza a la izquierda y asigna

Objetos Crea una nueva inslancia

Nueva instancia con parámetros

new tW(arg, arg, arp.

Operadores

.

ew tipo(arg,

arg

+

arg

Suma

arg

arg

Resta

°t>)eto.variable

arg

*

arg

Multiplicación

objeto.varclase

arg

I

arg

División

Clase.varclase

arg %

arg

Módulo o residuo

objeto.método()

arg,

objeto.métodoiarg, arg, arg.

Crea una nueva instancia de una clase anónima arg.

Crea una nueva inslaucia de una clase anónima

Variable de instancia Variable de clase

Variable de clase

Método de instancia (sin argumentos) ..}

'I í

Mélodo de inslancia

¡f


Apéndice A

560

objeto. classmethodO

Método de clase (sin

'■

break [etiqueta J

argumentos)

objeteKdassmethod(arg, arg, arg...)

continué [ etiqueta ]

Método de clase

label:

Método de clase (sin

Clase.métodoclase()

Etiquetado de ciclo

argumentos)

Método de clase

Ciase.itiétodoclase(arg, arg, arg...)

Definiciones de clases class nombreclase bloque

Arreglos

En esta sección, los corchetes son partes de la creación del arreglo o de las instrucciones de ' acceso. No denotan partes opcionales, como en otras partes de este apéndice. tipo nombrevariableW

Variable de arreglo

tipo[)

Variable de arreglo

new

nombrevariable

Nuevo objeto de arreglo

tipo[númElementos)

new tipo¡] {inicializador)

Nuevo objeto de arreglo anónimo Acceso a un elemento

arreglo/índice]

Longitud de arreglo

arreglo.longitud

A la definición de clase se le puede apegar cuak,uiera de los'• siguientes siguiente modificadores ( final ] class nombreclase bloque

[ abstract ] class nombreclase bloque

ípublie 1 class nombreclase bloque

class nombreclase ( extends Superclase

]

bloque

limplements interfaces] bloque

Ciclos y condicionales prueba

) bloque

if i

prueba ) bloaue

else bloque

switch

( prueba

)

interface nombrelnterfaz Condicional

Iextends otralnterfaz,

Condicional con else

...

switch (sólo con tipos integer o char)

{}

case valorinstrucciones

inicializador;

cambio

) ~bloque

while (

prueba

do bloque

while (prueba)

No instanciablc

m

Accesible desde fuera del paquete

Hereda de una superclase

Implemenla una o más interfaces Definición de interfaz simple

#

m

bloque

m

Definiciones de métodos y constructores void:

default : instrucción (

)

Sin subclases

El método básico luce así, donde tipoDevuelto es un nombre de tipo, un nombre de clase o

case valorinstrucciones

for

Definición de clase simple

opcionales:

class nombreclase

if (

interrupción de ciclo o switcl) Continuación de ciclo

prueba;

Ciclo for

tipoDevuelto nombreUétoóo(¡ bloque

Méiodo básico

tipoDevuelto nombreMétodo

Método con parámetros

(parámetro, parámetro. . . )bloque

) bloque

Ciclo while

Ciclo do

#

Los parámetros de método aparecen así: tipo nombreParámetro

m *


, Apéndice A

562

Resumendel, lenguaje Java

Las variaciones de método pueden incluir cualesquier palabras clave opcionales siguientes: [abstract

]

nombréMéitodo()

[

static';]

.i

[

tipoDevuelto

nombreuétodo() [

final

)

import paquete.nombreclnso Método de clase

tipoDevuelto

nombreMé'ivdoí) bloque ]

import paquete.* Método nativo

package nombrePaquete

Método final

[ public ] interface

bloque

tipoDevuelto

nombreMétoúoO

bloque

I

]

synchronized

Importación

bloque

:

native

Método abstracto

tipoDevuelto

nombrelnterfaz bloque

fabstract ] interface

Método sincronizado

tipoDevuelto nombreMétodo()

nombrelnterfaz bloque

bloque

[• public

¡

private

Control de acceso

¡

protected] tipoDevuelto nombreMétodo()

nombreclase()

Constructor básico

bloque

nombrec. ase(parámetro, parámetiv...)

[

publii

¡

parámetro,

¡

Constructor con parámetros

bloque

private

nombrec. ase()

protected

]

Control de acceso

this

Se refiere al objeto actual

nombreclsse.this

Se refiere a un objeto particular de clase interna

super

Se refiere a la superclase

super.nonbreMétodo(}

Llama a un método de la superclase

this(...

Llama a un constructor de la misma clase

super(.. .)

Llama a un constructor de la superclase

tipo.clfss

Devuelve el objeto de clase para el tipo

|

valor

]

Devuelve un valor

. ,

Importa todas las clases del paquete Las clases en este archivo pertenecen a este paquete

-Inierliiz pública

Inierfa?. abstracta

bloque

caten ( excepción ) bloque [ finally bloque )

try bloque [ caten ( excepción ) bloque ) finally bloque]

Espera un bloqueo sobre el objeto

Instrucciones protegidas ■Se ejecuta si se l:in/.i una excepción Se ejecuta siempre

Igual al anterior (se puede utilizar la opcional caten ¡ finally ahora, pero no ambos)

bloque

En c! cuerpo del método/constructor, utilice estas referencias y métodos:

return

synchponized ( objeto ) bloque try

Los constructores lucen así:

lni|M>rl;i iin.i i-tosi-

específica

Protección •'

bloque

1 flr

h }

í ■■(

!í.'<


Apéndice

B

Recursos de Java en

Internet

Este apéndice contiene una lista de libros, sitios Web, loros de discusión en Internet

y otros recursos que puede utilizar para ampliar su conocimienio de Java.

Sitio Web de este libro

!

Rogers Cadenhead, coautor de este libro, mantiene el sitio oficial del mismo en

Web, en la dirección siguiente:

http://www.prefect.com/3ava2i

Visite este sitio para tener el código fuente de todos los proyectos del libro aclara

ciones, conexiones actualizadas y cualquier otra información al respecto.

M

L


567 1

Recursos de Java en Internet

What's New? Esta área contiene anuncios relacionados con la publicación de actua lizaciones para los productos y eventos como JnvaOne. la consulta semestral para los programadores de Java. También incluye ías publicaciones y la programación de las sesiones de capacitación que se ofrecen.

€E5S

dichos números son necesarios p

Documentaüon

:

Son artículos relacionados con el lenguaje, orientados hacia el publi

co que descubre Java por primera ve/,. Éste es un buen punto para iniciar porque pre

970. ¡7-OÜ85-6

senta temas pensando en los principiantes.

Producís & APIs

Aquí están lodos los productos y documentación que puede copiar de Sun, incluyendo el JDK, documentación sobre el lenguaje y oíros archivos. Applets Ésle es un escaparate para iodos los programas de Java que se ejecutan en Web, incluyendo más de dos docenas que ofrece Sun, y que se pueden adaptar para su

uso en sus propias páginas Web. También tiene conexiones con varios directorios de applels de Internet, incluyendo Developcr.Coin's Camelan en

http://www.gamelan.com y el JARS (Servicio Java de Clasificación de Applels ) en

°034"'

n,lSBN:968-8S0-804-0

http://www.jars. com.

For Developers

Éste es un pumo de partida hacia JDC (Java Developcr Conneclion),

un recurso establecido de soporte oficial de Sun. así como la documentación para el lenguaje Java en formato HTML. Aquí encontrará información de las conferencias sobre el lenguaje, libros oficiales de Java y otros recursos.

Java in the Real Worid

Características y líneas de tiempo sobre las -hislonas exi

tosas" del lenguaje Java en lugares tan diversos como U.S. Postal Service. UCLA Medical Cerner, Ergon lnformatik y la misión Mars Pathfmder.

Webd: los autores.

Business & Licensing

tros para el uso de los productos de Java.

E| sitio de 5un

Support & Services

Tal ce molo aprendió durame el

Un listado de los servicios de soporte técnico, soporte a clientes

y venias.

. Employment

la sig líente dirección: http-.// java.sun.com

Proporciona los lincamientos para obtener licencias y regis

biblioteca de clases de

r

Una lista actualizada de oportunidades de trabajo en ingeniería, escritu

íii

ra técnica, mercadotecnia/ventas y oíros departamentos de Sun.

■ Java Store

Un catálogo de la mercancía oficia! de Java que se puede adquirir a través

. A-Z índex

APIs, productos y los principales conceptos de la tecnología de Java, en

de Web, incluyendo camisas de mezclilla, lazas para café, playeras y gorras de béisbol. orden alfabético. ¿Perdido? También se proporcionan algunos tips para navegar en este

¡ í '■

i: :

I i'

i:

t

í i.


568

Apéndice B

Este sitio se actualiza constantemente con recursos de uso libre para los programadores de Java. Una de las parles que podría aprovechar de inmediato es la página Documentaron en la dirección siguiente: http://java.sun.com/docs/index.html

Otros sitios Web sobre Java

Recursos de Java en Internet

miembros del equipo Gamelan actualizan el sitio diariamente. Camelan también realiza las

mejores presentaciones en su directorio de la página:

http://www.gamelan.com/special/picks.html

Servicio de clasificación de applets de Java

Han, arcesar a otro directorio de clasificación de npplm de Java, dirija su navegador hacia la

Debido a que gran parte del fenómeno Java se ha inspirado en su uso en páginas Web, un gran número de sitios Web están enfocados en Java y su programación.

La página de libros de Java Como una forma de selección entre los cientos de libros publicados sobre Java, se han compi lado varios sitios de revisión que contienen listas de libros nuevos, actualizados y fuera de

edición. .liivu\\'t>ilJ i*s i á i ni irvisln cu Iúilm sohu* el ]l'I)^u;i|i* ,I:ivji y uviitilnj'.i.-i u*!:ti'hUKu!.i, (ii:inlii-tii-

una lista de libros actuales y por editarse. La puede encontrar en la dirección siguiente: http://www.javaworld.com/javaworld/books/jw-books-index.html

L-liiotte Rusty Harold, autora de varios libros descritos en la página Web, presenta otra selec ción de libros relacionados-con JavaT^^io con las revisiones de muchos de esos libros. La lisia de Harold se puede consultar en: http: //sunsite. une. edu/jav,af aqJbooks.html

Directorio Java de Gamelan Puesto que Java es un lenguaje de programación orientado a objetos, es fácil ulili/ar en sus propios programas recursos creados por otros programadores. Antes de iniciar un programa importante de Java, debe explorar en Web en busca de recursos que pudiera utilizar en mi pro grama.

El lugar para iniciar esta búsqueda es Developer.Com's Camelan, el sitio Web que presenta un catálogo de programas, recursos de programación y más información de Java, en la siguiente dirección: http://www.gamelan.com

Gamelan es el directorio mas amplio en su clase dentro de Web, superando incluso a Sun en cuanto a la profundidad de su cobertura. Se ha convertido en el primer lugar de registro de información para los programadores de Java, tan pronto como terminan el programa. Los

569

# ft

http://www.jars.com

El logotipo de la manzana del JARS aparece en los numerosos app.ets que se ofrecen en las paginas Web. El sitio JARS ha sido ampliado iceien.cincme p:iri, incluí, las novedades acerca del lenguaje y los desarrollos relacionados, revisiones de las herramic.as de desarrollo para

-iva, y otra información de utilidad.

JavaWorld

Una de las mejores revistas que han surgido al servicio de la comunidad Je programadores

de Java, y también es la más económica. .MmHWWestá disponible en forma -ratum, en la

siguiente dirección Web:

http://www.javaworld.com

JavaWorld suele publicar artículos .moríales, junto con novedades de desarrollos de Java y

oirás características, las cuales se actualizan cada mes. En el área de artículos de manual, el .

formato umeo de Web ofrece una ventaja sobre las revistas impresas (como Java Uepor,) En

cuanto un articulo va enseñando un concepto particular o tipo de programación, JavaWorld

o/rece un applet de Java que muestra ¡a iección.

Preguntas más frecuentes en Java

Como complemen.o a las listas de FAQs (preguntas más frecuen.es) sobre Java que están disponibles en el sitio Web de Sun Microsystems, los programadores de Java que u,ili/an los grupos de discusión de Internet, han colaborado con sus propias listas de preguntas y respuestas.

Elliot.e Rus.y Harold. patrocinador de la página Web sobre libros de Java, ofrece también lu lisia actualizada de Java FAQ en Ja dirección siguiente:

http://sunsite.unc.edu/javafaq/javafaq.html

Otro recurso similar, la "Unofficial Obscure Java FAQ-, se inició como un esfuerzo para con

testar algunas preguntas menos frecuentes. Se localiza en la dirección siguiente:

http://k2.scl.cwru.edu/-gaunt/java/java-faq.htnii

.J*-?.


Apéndice B

1570

571

Grupos de noticias de Java Uno de los mejores recursos para los programadores de Java, tanto principiantes como experi mentados, es Usenet; la red internacional de grupos de discusión disponible para la mayoría

de Usuarios de Internet. A continuación se describen algunos de los grupos de discusión de Java en Usenet:

Oportunidades de empleo S. está aprendiendo Java como un medio mr, omo un medio mr,

tas relacionadas lid con ese tema en Web C listas C77" '^^ ** **"' "^ de h

cuentan con una sección dedicada •, |,s ,m , ,7 ,

"W™* ^ a"arccen en eMc

'•'••> <>pomini<¡adé.s de Iralxijo .

comp.lang. java.mise Aunque este grupo ha sido designado como el área de dis

cusión y comentario de Java para todos los temas que no pertenecen a ningún otro

P;,ra

grupo, es más utilizado que los demás. Reemplazó a comp. lang. j ava a mediados de 1996. Aquí se puede comentar cualquier tema relacionado con Java.

• comp.lang. java.advocacy Este grupo está dedicado a cualquier comentario sobre Java que inspire debates acalorados o comparativos. Si desea discutir sobre los méritos de Java contra cualquier otro lenguaje, éste es el lugar. También puede ser un buen sitio de consulla para saber si Java es la elección correcta para un proyecto en el que eslé trabajando.

ellj^ésrArarse a!d ÍT"'" T C'

P«irfa «tar como resultadotna eom^i ^"T'' ^"'

«• Java. Para averiguar eáma regis," ^

sección Add , Resource, de Gamehm

' " ^ M"

PtIM"líllnicnlc- d>ríi™ «

'« 'lir«v¡.«, s.gu.e.e. en la

comp.lang. java.announce Este grupo difunde anuncios, publicidad y artículos de ínteres para la comunidad de desabolladores de Java. P.s un grupo moderado, por lo

que lodos los artículos se deben someter a su aprobación antes de difundirlos.

• comp.lang. java.api Lisie grupo está dedicado a la discusión sobre las Al'ls (Intcrfaces de Programación de Aplicaciones) del lenguaje Java, los programas de

toda la biblioteca de clases que viene con el JDK, y otras implemcntaeiones del lenguaje. •

comp.lang. java.prograromer Este grupo contiene preguntas y respuestas rela

-enas de pe

"cspccmc<)

Pero el servicio es gratuito, y hay más de 1000

' " """ "C"° l|"° ^ixl™^-

-• »— ^ Caveto,: £12Ín7Z1TMh C" U'S l|UC P"alC b"Slllxtrnet Nl d

nttp://wv/v/.careerpatfi.com

i I

irección

cionadas con la programación de Java. Esto lo conviene en otro buen lugar que deben frecuentar los nuevos programadores.

• comp.lang. java.security Este grupo de discusión está dedicado a temas de seguri dad relacionados con Java, en particular los que se refieren a la ejecución de los progra mas de Java y cualquier otro contenido susceptible de correr en Web.

comp.lang. java, setup Este grupo proporciona un lugar para presentar problemas de

instalación, relacionados con las herramientas de programación de Java y temas simi lares.

comp. lang. java.tech El más avanzado de los grupos de discusión sobre Java, esle grupo está dedicado a discutir la implementación del lenguaje, lemas relacionados con

su adaptación a las nuevas máquinas, las especificaciones de la JVM (Máquina Virtual de Java) y otros temas similares.

1—


Apéndice

C

Configuración del JDK El JDK, o Kil de Desarrollo de Java, es un conjunto de utilerías de línea de coman dos que sirven para crear, compilar y ejecutar programas de Java. El JDK requiere

el uso ele un indicador de comandos poique usted ejecuta cada uno de los progra mas del JDK escribiendo su nombre junto con cualquiera de los argumentos nece sarios.

Configuración de Windows 95 y Windows NT Los usuarios de Windows 95 y Windows NT pueden configurar el JDK por medio del indicador de comandos del MS-DOS, disponible en Inicio I Programas I MSDOS. tlesde la barra de larcas.

Al utilizar el indicador de comandos del MS-DOS, se abre una ventana en la que puede escribir comandos del MS-DOS para navegar a través de las carpetas de su

sistema. La carpeta de inicio estará en la carpeta \WINDOWS de su disco duro (nor malmente en C: \WINDOWS).


Confiquración riel JDK

575 I

Apéndice

Tome nota de esla carpeta tal como eslá anulada en In Folder. Esla es la cárpela Path del JDK, y la teiidra'<|uc utilizar muy pronio. Un ejem

^ e) cual es p.ne de! JDK. E. argumento.

Esle comando ejecuta el interpre. Esle

a

¿^

^a un intento con este

e comando y ,c despea -

Si

csu'i

utilizan

i

Verifique la instrucción path Para asegurarse que su sistema está buscando los archivos del JDK 1.2 en el lugar correcto,

necesita buscar la configuración PATH en su sistema. Cuando escribe el nombre de un progra

ma en un indicador de comandos de MS-DOS (como java -versión), PATH establece el sitio dónde buscar el programa.

mensaje en respuesta:

Para desplegar la configuración actual de PATH, escriba lo siguieme en el indicador de

-

"-*--

rs¡rt,, o un mensaje de File not

distinto.

5=

comandos:

Entrada

path

Verá una lista de todas las carpetas en que Windows busca programas de MS-DOS; ésios vienen separados por signos de punto y coma. He aquí un ejemplo: PATH=C:\WIND0WS;C:\WIND0WS\C0MMAND;C:\JDK1 .2\BIN

En este listado de PATH, el texto C: \JDK1 .2\BIN se refiere a la carpeta PATH del JDK, que es la carpeta donde el sistema buscará el archivo java. exe. También hay otras dos carpetas ano tadas en PATH, que son C: \WINDOWS y C: \WINDOWS\C0MMAND.

Su configuración de PATH debe incluir una referencia a la carpeta PATH del JDK. (Las letras

*»■

SSi

mayúsculas no son importantes en esta instancia, C: \JDK1.2\BIN es igual que C: \jdk1 .2\bin.)

Si PATH no incluye la carpeta PATH del JDK, necesitará editar su configuración de PATH y agregársela.

Cambie su configuración de path La configuración de PATH sé cambia editando autoexec.bat. que es un archivo de texto

en la carpeta raíz del disco duro de su sistema (normalmente es el disco C). Para cambiar la configuración de PATH en un sistema Windows NT, no tiene que abrir un archivo de texto para editarlo. En vez de eso, seleccione Panel de Control I Configuraciones „ Figura C.1 Resultado de una

búsqueda de java.exe.

(Control Panel I Settings) desde la barra de tareas.

\\

Para cambiar PATH en un sistema Windows 95, debe editar el archivo de texto

autoexec.bat. Haga clic con el botón derecho del ratón en el archivo y seleccione el coman do Edición para abrir autoexec.bat en el Bloc de notas.

El archivo autoexec.bat contendrá mucho malcrial técnico incomprensible para los princi piantes en el sistema MS-DOS.

Busque una línea que comience con el texto PATH=, SET -PATH= o PATH seguido de un espacio en blanco.

[i

■ i—


577 I

Configuración del JDK Apéndice C 576

- Si todavía no ha tratado de compilaron programa de Java para probar el JDK puede usar el archivo HelloDan .java del sitio Web de este l.bro en.

Tip

:

http://www.prefect.com/java2i.

Si al utilizar el compilador de Java en un archivo fuente obtiene el error Class notJ

lo Drimero que debe verificar es si escribió el nombre correctamente respetando las mayuscu

Us y minúLas. Asegúrese de estar en .a carpeta que contiene el archivo ,ueme que ,n«- de compilar y vuelva a verificar el nombre del archivo.

C:\jdk1 .2\bin

Los usuarios de Windows pueden utiliza, el comando din, en un

^¿^

MS-DOS, para hacer una lista de todos los archivos que están en una carpeta. El nombre

»;-;

Lpteo de cada archivo se desp.egara en 1. columna que está mas a la derec:ha * ». h« carpetas, tal como aparece en la figura D.2. Los non.bres abrevados do .os auhn^, que

apLeñ en el lado izquierdo de la lista se deben ignorar, ya que son nombre, que uuhza Windows para manejar los archivos.

Figura C.2 ■ Lista de archivos en

una ventana de es de las carpen,.

cl cu,,or a, final de la l.nca

MS-DOS.

s

Java 1.2.

La la ubicación del archivo para determinar dónde se puede encontrar tools. ] ar.

La mayon'a de los errores CXass not f ound se pueden arreglar mediante la conf.guracón de CLASSPATH para indicar la ubicación de tools .jar.

Cómo reparar los

Una forma de encontrar tools. 3 ar es abrir la carpeta en que insta.ó el JDK (como " 2) Ahí debe haber una subcarpeía llamada lib que cont.ene tools., ar.

el JDK (como se muestra en la figura D.3).

2


Configuración del JDK

Si CLASSPATH no incluye la referencia a la copia de classes.zip del JDK 1.2, necesitará editar la configuración de su CLASSPATH y agregársela.

Cómo cambiar la configuración de su classpath Figura C.3

La configuración de CLASSPATH se debe cambiar editando autoexec. bat. un archivo de icmo

Resultado de uno

ubicado en la cárpela raí?, del disco duro (normalmente es el dispositivo C).

búsqueda de

Para cambiar la configuración de CLASSPATH. en un sistema Wimlows NT. no tiene que abrir

tools-jar.

un archivo de texto para editarlo, sólo seleccione Panel de Control I Configuraciones en la barra de tareas.

Para cambiar CLASSPATH en un sistema Windows «J5, deberá editar el archivo de texto

autoexec.bat. Haga clic con el bolón derecho del ratón en el archivo y seleccione el coman do Editar para abrir autoexec. bat en el Bloc de notas.

\'.\ archivo autoexec.bat contiene mucho malcría! técnico i|in- es incomprensible para los principianles.

Busque un renglón que empiece con el texto CLASSPATH^, SET CLASSPATH= o CLASSPATH seguido de un espacio en blanco.

Problema: no hay una instrucción classpath Si no encuentra una instrucción CLASSPATH, debe agregarle una al archivo autoexec.bat. Desplácese hasla el Tinal del archivo de texto y agregue un renglón en blanco, (in cn:i línea

e nol.i H«-

escriba el texto CLASSPATH= seguido de la carpeta Patrt del JDK. como en el ejemplo

r, ASsPAVH.

siguiente:

CLASSPATH*.¡C:\jdk1.2\lib\tools.jar

Guarde el archivo después de hacer el cambio. Para que este cambio suria electo deberá reiniciar el sistema. Si el archivo tools .jar está en la carpeta que milico en la instrucción

CLASSPATH, podrá compilar programas con éxito.

Problema: no hay una carpeta JDK 1.2 en la instrucción classpath Si encuentra una instrucción CLASSPATH en el archivo autoexec . bat que no contenga refe rencias de la ubicación correcta de tools. jar, busque el texto V)AVA_HOME% en esa línea. Puede ser que encuentre %JAVA_HOME% seguido del texto UibUools. jar, conloen CLASSPATH=SJAVA_HOMES\lÍb\tOOls.jaroCLASSPATH=%JAVA_HOMr:S,\..\lib\

voesiín scp .«dos porp

un

luear

desde el

tools. jar.

Si encuentra %JAVA_HOME%, bórrelo junto con el texto que le sigue hasla el siguiente punto y coma. Reemplace ese lexto con la ubicación correcta de tools .jar. Asegúrese de no borrar ningún punto y coma de los que se utilizan para separar los nombres de las carpetas.


t 581

Configuración del JDK

Apéndice C

unsetenv

CLASSPATH

Para que este cambio sea permanente, debe retirar el comando que estableció CLASSPATH de su archivo .profile, .eshre o .login.

Estos cambios no tendrán efecto hasta que cieñe la sesión actual e inicie oirá, o utilice

CLASSPATH-.;C:\DEV\CHATSERVER\:C:\jdk1.2\lib\tools.]Br

el comando source conelnombre del archivo que cambió. Si alleró de alguna forma el '■rrhivo .login, el comando source será el siguiente: source

-/.login

con éxito ..rogramas de muestra, como HelloDan.

Configuración de UNIX . login ui a línea como la siguiente:

set path= (-/java/bin/ Spath)

ruta de e¡< cución.

.login, :I comando source será el siguiente: source •/.login

Repa! ación de errores Class notfound en otras

ment

] i i r

e al momento de iniciar la sesión ver « se estab,eci6 CLASSPATH,

escriba lo s,gU,en,e en e, indicador de comandos:

PPIW echo SCLASSPATH

™ ec,6 un va,or de CLASSPATH. puede borrar.o escnbiendo e, comando siguiente: blec,

f


Apéndice

D

Uso de un editor de texto con el JDK A diferencia de las herramientas de desarrollo de Java, como Visual Café y el Java

WorkShop de SunSoft, el JDK (Kil de Desarrollo de Java) no incluye un editor de texto que se pueda utili/.ar para crear archivos lueiile.

En este apéndice aprenderá a seleccionar un editor para usarlo con el JDK y a confisurnr su sistema para que trabaje con el editor.

Seleccione un editor de texto Para que un editor o procesador de palabras pueda trabajar con el JDK, debe tener la capacidad de guardar textos sin formato.

Esta característica toma nombres distintos según el editor. Cuando guarde un

documento o establezca sus propiedades, busque una opción de formato como las siguientes:

• Texto simple • Texto ASC11


Uso

de un editor de texto coneUPK_

Apéndice D

guíente error'^nenuio por el compüador del ,

nassFont

not-found

Bs,c error .neluye un si.no de dos pu.os . ^u

archivo fuente de Java. El numero es la hm.a q^

^fc

b0,ón inicio, es un

lcxlo. Sólo puede ma.u.j

de MU^f^. Al,mvo. Z \-\- « « formatos fo d . bmar desde el d£

sdc un M^

^ ^.^

a tas» el mor. E» »n «»« »""" ' ^ " „ „„„, ,„ „„> ta»»d,» ,»« d

*p.m un pro,™». ^;'«:::":,"" "i,-.»-■

-—'- -

á& tcxU)

Cómo crear una

asociación de archivos

en ,

Í Une, Une en que se cnc-cnuav»

sor.

s

S5

d.tando

.

cslá presente

dio en

la carpo,.

„„,,„ i,lc,,rr«a la O K,,a croar -a

(vea la figura E.2).

Figura D.2

Figura D.1

I

declararon.

,;l

vez en texto «mpte > ve mcn,os mcn,os con con que que irab..jo y

MS-DOS, pero "cli "

intype

Crt'íic/tiM í/í un docu mento nuevo de texto

en una curpeiu de Windows 95.

Se cea „

«. *

¡,,,

"


Uso de un editor de texto con el JDK

5871

Apéndice D

Desplácese a través de la lisia Regislered lile lypes hasta que e.icuenuv el ii|)o yue incluya a JAVA en su campo Extensión. El lugar más probable para encontrarlo es bajo un título como Java files o Java programs, pero ese podría no ser el faso en su sistema.

Cuando encuentre el tipo correcto de archivo, necesitará borrar la-asociación existente para

Sucediera algo extraño, debe borrar

a

la asociación ex.stente d. . .va.

Cómo borrar una asociación de archivo »to »p»

haga clic en Yes (SO para confirmar que desea borrarla.

Una vez hecho esto, puede crear una nueva asociación para la extensión de archivo .java.

nueva asociación.

c«¡ón 0,

reemplazarla con una nueva. Seleccione Remove (Quitar) para borrar la asociación actual, y

Cómo crear una nueva asociación Al hacer doble clic en un archivo que no tenga una asociación conocida para su extensión de

„ abt¡rf „„, ven», de Opciones con .,»

archivo, se abre una ventana Open Wilh (Abrir con), que se muestra en la figura U.4. Figura D.4 Asociación de uncí

Figura D.3

extensión de archivo

/^, ficha FU'1 Tyi"'s-

con un programa.

Para crear una asociación de archivo .java, dé los pasos siguientes:

. En el cuadro de texto Description of -java' files (Descripción dr archivos "java") escriba Archivo fuente de Java o algo parecido.

r-rsr

. En el cuadro de lista Choose the program you wanl lo use (Elija el programa que desea utilizar) busque el editor de texto o procesador de palabras que desea utilizar con los

archivos fuente de Java. Si no lo encuentra, seleccione el botón Other (Otros) y busque manualmente el programa. Si esiá utilizando el programa Edit del DOS lo puede encontrar, en la mayoría de los sistemas, en la carpeta \Windows\Command con el nom bre de archivo edit o edit. exe.

- Asegúrese de seleccionar la opción Always use this program lo open ihis file (Utilizar siempre este programa para abrir este archivo).

Al hacer clic en OK para confirmar esta configuración, su editor elegido abrirá el archivo Anything. java y cualquier otro archivo con la extensión .java. ;

I


I 588

Apéndice D

Cómo asociar un icono con un tipo de archivo Después de asociar los archivos .java con el editor seleccionado, en forma predeterminada se

le asigna un icono a todos los archivos . java de su sistema.

Si desea cambiar este icono, seleccione View I Oplions I File Types (Ver I Opciones de cárpela

I Tipos de archivo) desde la barra de menús de una cárpela para ver el cuadro de diálogo File Typcs. Desplácese a través de Registered File Types (Tipos de archivo registrados) para

encontrar el que está asociado con la extensión de archivo JAVA.

Cuando este tipo de archivo esté resaltado, seleccione Edil (Editar) para abrir una ventana

Edil File Type (Editar tipo de archivo), como la que se muestra en la llgura E.5. Figura D.5 La ventana Edil File

Type.

Índice

■ jjc] ■'■■? -Il ' •.-■rgflg^'

í

- ■ ■'.*• .'■

j—r-

wr- -.

h*t7l-:.-

...._ .,

;.r, . i

iiv

|.Acfc»i¿ *;■:;>,' -^-"-"

!l

Símbolos fichiov* '

¿«DtfK* |

//anotación de con.eMh.no.

* (""•IM-Tsaml), 83 * (asterisco), 180, 305

si :'.:i¿¿'V

21), Rrjíficos, 20(1-201, 5.S0-5X1 applei Map2D. 22i-2'')í

I ) (Havi-j), r»7, US I 1 'córcheles), 112

arcos

dibujo, 20Xi 224

A (circunflejo), 83

Seleccione C hange Icón (Cambiar icono) en la ventana Edil File Type y podrá decir un ¡cu

ejemplo. 2O"-211

= (sigilo igual)

relleno, 20y

operador de asignación

dilereme pan desplegar todos los archivos .java.

Si le gusta alguno de los iconos desplegados en la ventana Currem Icón (Icono actual),

operador igual, 105

trazos de dilmjo. 222

operador NOT(.'), 83

coordinai si.siema. 202 i-'l¡p.ses, 223

■ (pimío), 93-M

'unciones co|)iar/peyai. 212

I (t)arra verlical), X3

Crap!uV.s2D. ohjeuis, 21';

+ (signo más),

líneas, 203, 223

operador de concaienación

óvalos, 207

operador de incrememo(++1 XI

''

; (punió y coiiiü), C6

/•-..•/anotación de comentario, /**...*/anotación de comentario, 73 í

463

coordinar espacios. 21')

- («ilion), SI

Lina ve/ cn< onirailo el ¡cono que desea, resállelo y lug;i elie en OK p:ir;i seleccionarlo.

miiesira. 464-4M)

Ü'-'lInpiílSlreumO. mc'todo

220-221

1(15

garán en la 'emana Current Icón.

■IM

deil-ile, aplicación de

patrones de relleno. ■

''perador ücsiuual ('-i

Para ver qué iconos contienen, puede abrir cualquier archivo de iconos, programa de Windows 9.'. o un archivo .OLL. Después de seleccionar un archivo, sus iconos se desple

HiiliereilKeader. objetos,

'olor, 220

' (si8no de exclamación)

Browse (Ext minar) para ver los iconos de los archivos de su sistema.

ci>iicxiiine< de socket, 4(0

«■■•inexiunes cu Web. •I62-1(,3 ""¡os en Internet

airibuu,!. de transforman,',,,

68. 72

martíllelo y I aga ciic en OK para hacer el cambio. Si desea ver oíros iconos, seleccione

al.rir

polígonos agregar punios a. 2(l(>

dibujo. 205. 22-J-225 icciangiilos

dibujo, 203. 223

esquinas redondeadas r0-l-205

patrones de relleno, 204

l'HI.Ciim.i.viMiii. objetos 4(,3

AbstIacl\Vil,rio,vln(,-,O()JkiI i™ AWT acceso

control de. .182-383, .186-387

elementos de arreglo, 114.) ¡5

herencia. 387

métodos de. 387-388,412 Paquetes

predeterminado. 30.S privado. 38-1-385 protegido. 385-386

público. 385. 39X-3yy variables

de clase, 96


índice

1590

índice

de instancia^ 93-94

de naipes

agregar, 299

AccessControlConlext, dase,

creación, 299

610

desplegar, 300

AcccssController, clase, 610

acción, evenlos (le, manejo, 341-343,537.

HdiunO, mílodo argumentos. 341-342

ejemplo, 300-302

ActiveX, 486 »ddActionLislciicr(), método,

argumentos

clases internas. 411

de variables, 142-143

AIJGN (i'liquvla <A1MM.BT>). atribulo, 185 alineación

uddl'oinlO, método, 2116 addSpolO, método, 322

adjuslnieniValueChangedl),

mélodo 538 programa de miiesir.i. 538-54(1

adjusimenlValutChangedO n.cl..d>,, 538 adininislrailores de diseño

aliernali 'as de, 315

249-253 punorama.231-232 parpadeo

ejemplo, 240

panorama, 239

componentes, 292-293

reducción. 240-243

296-298 diseños de cuadrícula. 295-296

diseños de cuadrícula de

bolsa, 302-313

Adjustmentl.istencr, escucha de i-vcnlu, 532

253-256

lécnica de animación.

applets, 185 diseños de bordes,

addUncO. mílodo. 32X

lisiado del código fuente

piular/repintar, 232-233 sonido

diseños de naipe. 299-302

DigiíalClock, ejemplo.

márgenes, 313 paneles, 298-299

AiiHM.-buMiilli.javu, programn,

(ejemplo aritmético sencillo),

236-239 ejecución. 234-236

inicio, 235 paro, 235 vea ¡atnbii'n gráficos

78-7!»

ampersand (&), 83 ampliación de ¡nterfaces,

aplicación ílcTrivía (sockt't

cliente/servidor). 468

BaseFramc 1, 355-356 cerrar, 378

C'opyArrayWhile código fuenie, 129

inain(), mélodo. 129-130 salida. 129

Copyl'asie, 500-501 ChangcTule, 535-537 de compilación

plataformas de Windows, 28-30 sisinnas Solans. 31

definición, 146

anchor, restricción, 310-311

diseñar. 469-470

DoTest. 131

AND, operadores, 83

ejecuiar, 482

EchoArgs, 149

de bord< s, 296-298

Andrecssen, Marc, 14

lisiado del código fuenie,

EvenSleven. 120-121

de cuad1 ícula, 294-296

animación

creación 292

dcíinieit n de, 268

de cuad ícula de bolsa

407-408

de imágenes

479-481 servidor

ere; ción. 304-307

carga, 243

consirucior. 470

deí- rminar proporciones,

dibujo, 245

ejecuiar, 482

muestra del applet

inilQnAO, niéiodo. 474-475

3-17-309 diw ño, 303-304

eje nplo, 311-313 org mi/:ic'U>i) tic

CHiipoucnles. 3O9-. II

Rumore. 246-247 observadores, 246

lisiado del código fuenie.

475-479

HclloDan archivo fuente, 26-28

compilación, 28-31 ejecución, 30-31

independientes del AWT. 364-365 Info, 527-530

recuperación. 243

inainO. móuuio. 475

LabelTeM. 133

rulas rclalivas de aivhivo.

pUKVSvIlipillO, IIKMihK).

mainO. método. 147

QnA.lM, archivo, 474

NamesLoop, 127-128 NumberReader, 124-125

creación, 257-258

run(), método, 471-472

políticas de seguridad, 434-135

ejemplo. 293-294

definición de, 257

variables de insianciu, 470

Flowl.ayouK),

ejemplo de applet

WAITFORANSWER.

PopUpWindow, 354-356 SeeMeihod (ejemplo de

panorama, 302 relleno de celdas, 31? de flujo

constructor, 294

244

doble búfer

Checkers, 258-261

472-473

eslado, 473

ciienie. 479-481

reflexión), 108-109 SumAverage, 150

.

vea laminen applets: lisiados Applel, clase. 177

<AI'I'!.ET> iliqutta (HIM1.I. dO

atribuios

AUGN. 185 C'ODI-:. IN3. ISfi

COüIiUASK. 1.S7 IISHACB, 186 VSPACE. 186 ejemplo, 182-183

applels, 11-13

asociar información con. 491 cargar un servidor Wch. IS4

dase Applel. 177 colores de fondo. 2IK

ColorSwirl, 240-24 I ColorTesi. 366 diseño. 367 inicio, 368

lisiado de código fuenie. manejo de eventos. 371 marcado de HTML. 377 - resultados de actua

lización, 372-374

subpaneles, 369-370 comparado con las aplica ciones, 13, 174. 377

comunicación enire

gelAppletO, mélodo, 496 gelAppleiComexiO, mélodo, 495 gelAppletsO, método, 495 creación. 177-178

listado del código fuenie. 260-261 depurar salida. 197 desplii-pio en panlalla. 1X0

DigiíalClock

presentación. 470

375-377

doble biifer, 259

detención. 179.233

implememación del servidor. 469-479

Checkers. 258

destrucción. 179-180

¡mplemenlación del

116

cíteme

combina , 298-299

ejecución. 482

priniNanicsí), mélodo,

cuadros de diálogo, anexar. 360

definición de. 11

métodos. 545

clase, 116

salida. 116

.,

Irivia clientc/scrviiliir. 4(»x

código fuenie, 115-116 main(), mélodo, 117

comparadas con appleis. 13, 174. 377

definición, 233

546-549

pasar. 148

ejecución, 2(>2

diseños de flujo. 293-294

escuchas de eventos. 545

■ listado del código fuenie.

ArrayTest

clases auxiliares, 147-148

subproeesos

clases,-545 ■

manejo, 148-151

ciclos. 262-264 fórmalos de archivo, 261

SwingOilorTesi. 518-520

eslado, 473 aplicaciones

copiar imágenes, 24X-249

ulcunce

511-512

WAITFORCONFIRM, AIICapsDemo, 457-459

537

uddltcmO, inílodu, 278

caplurur imágenes, 24K

Swing, marco ele irahujo

eslado, 473

compilación, 256

de léxico, 134

534,537

Neko, applel

WAITFORCLIENT,

márgenes, 313,

valor devuelto, 342 evento, 532, 537

'

color de fondo, 25?

definición de, 118

aelioiil'crforimdl), método,

Graphics, 256

especificación, 292-293

definición, 341

AcliunLislencr, escucha de

I i m ilaciones, 257 eliminación de un objeto

ciclo whileí), 237

lisiado del código fuenie, 236-237 p.unn). método. 238

repainu). mélodo. 238 niníj. mélodo. 238

sleepl I, mélodo. 23S

Í!

variables de instancia. 238

Dóminos, 12 cicmplo l'alimliome

aichivo H'I'ML, 182- 1X3

lisiado del cíklig<i Ja\,i. I SO-181

painid. méiihlo. 181

l-'illmore. 246-247 firmas digitales autoridades de certifi cación. 431

cvililicados. A'MI ejemplo. 431-433 navegador específico,

433-434

lormaios de archivado archivos CAU. 190 archivos JAR. I8S-I89

archivos Zip, 189-190

HTML. marcado alineación. I85-IS6 <APPLET>, etiqueta, 182-185 espaciado. 186

<O13JL:CT>, entínela.

187-188 <PARAM>, eiiijueta. 191-192 rompimienios de línea. 185-186

inicio. 178-179. 233 liiniíaciones, 175

¡'


índice

1592

línea de estado, 491.

init(), mélodo, 346

líneas

listado del código fuente, 348

addl.inc(), método. 328

marcado de HTML, 348

inilíl. mélodo, 326

listado del código fuenie,

objetos File, 456

definición de clase, 321

conhol. 2X3

mouseDownQ, mélodo,

iniíO, mélodo, 322

creación, 282

lisiado del código fuente,

ejemplo de, 282-283

323-324 mareado de HTML. 324

mouseDownO, método,

mouseUpO, mélodo, 328

322

paint(), mél(idi). 329

painlQ. método. 323

Pciims, clase. 327

repainu), mélodo. 323

manejo de ovemos

ches de ralón, 31 y-325

teclas. 333

Ar(".Slream(), método, 448 argumentos

manejo, 1-18

SumAveragc, cjcniplo, 150-151

inil(), mélodo, 334

de ba xa de desplazamien-

keyDownf), método, 335

aplicaciones. 148

listado del código fuente,

applels. 191-195

maivado de HTML, 337

ilc ti.- ia iIl- barra du

paintO, método. 335

de' plazamiento, 344 de ic;lado. 331-338

vea también aplicaciones: lislados

cjen pió de applet

Se Back, 345-348

han. leEvemO. mélodo,

versiones Java, 176-177 vinculación. 491 BuuonLink, ejemplo.

31 -1-319. 338-340

492-494

mo\ ¡miemos de ralón.

3:5-331 lipr; de eventos, 318 Map2r , 225-228 mélod s. 178 NewP. lindrome

arihivn HTML. 194-195 «Jigo fuente de Java, ¡93-194 p;iN2i parámetros a

definición. 16 paquete java.awi.dnd

appletviewer, herramienta,

mainO, mélodo. 117 piinlNamest). método. 1 16

vea ¡ambién referencias

accesar, 114-115 cambiar. I 15-117 lipos de dalos, 1 14

iinplenicniación. 112

ejemplo. 2O'--2II

muliidimensionales, 117-118

lelleno. 209

objetos, 113-1 14

archivos

programa de muestra

asociacioner

ArrayTest, clase, 116

borrar. 457

código fuenie, 115-1 16

pru. la. I 83-1 «4

cambiar not íbre. 457

mainO, mélodo, 117

seg ridad. 177

class.dat. 4-2

pnniNamesO, mélodo.

poli cas de seguridad. A? 1-435

Sel lack. 345 aolionO, mélodo. 3-16-347

cliangcCciloiO, método, 347

devolver lai laño. 457 fórmalos

atrapar excepciones, 418

bloques try...caich, 419-421 instrucción finally, 421-422 atribuios de eliminación (.Invn2l>)

color, 220

patrones de relleno. 220-221 trazos de dibujo. 222

"tribuios, de clase, 38-39 atributos (HTMI.j <APPLET>. etiqueta ALIGN, 185

CODE, 60. 183, 187 CODEBASE, 187 HEICHT, 60, 183 HSPACE, 186

ArrayTcst, aplicación

elememos

mélodo ilrawArci). 208

asterisco (♦), 180,395

excepción, 417

arreglos, 5611

dibujo

eventos, 533-534

información con applcls, 491

ArraylmlexOulOfltounds.

apuntadores (C/C++). 100 arcos

componentes con escuchas de

inierfaces. 576

salida. 1 16

611-61

asistentes, JDK Sctup, 23-24 asociación

clases. 577

código fuenie. 115-116

Arc2D.Flo.it. clase 22-1

> :ilores nulos. 192, 195

¡iiTasIrar y colocar

objetos URL. 492

£ :iParameier(), mélodo, • PAKAM>. eliuucla. 191

méindos. 143-145

clase. 116

c cmpUi, 192-195 19!

pasar a:

linkToO. mélodo, 494 visualización. 60-61

558

lichoArgs. ejemplo. M9

de ár:rt de texto, 344

336-337

valores variables, 68, l~i 88

Swing. 5I(>

definición de clase, 334

de er foque. 343-344

306

manejo de evcnios. 344

dc^ión, 341-343

,0, 144-345

resiricciones a componemes

áreas de texto

addSpoiO. mélodo. 322

328

asignación

archivos de ciclos de sonidos:

329-331 maicadu de IITML. 3.11

mouscDragO. método,

¡

262-264

Spots

327-328

'■■>'."

Zip, 190 ¡conos de tipo de archivo, 646

116 salida, 116

CAB. 1-0-191

subíndices. 1 14

JAR, I KM 89

variables, I 12-113

VSPACE. 186 W1DTH.60, 183

<PARAM> etiqueta, 190

audio

fórmalos de archivo. 261 reproducción

ciclos, 262-264 play (), mélodo 262

AWT (Kit de herramientas de manejo abstracto de ventanas)

adminisiradores de diseño aliernalivas, 315 combinar, 298-299 creación, 292

de bordes. 296-298 de cuadrícula, 294-296 de flujo, 293-294 de rejilla de bolsa, 302-313 de tárjela, 299-302

especificación, 292-293 márgenes, 313 panorama, 292

animación

definición. 356

applei Neko. 248-256

ejemplo de Te.MDialog,

cargar imagen. 243

357-360

dibujo de imágenes, 245

modal, 356

doble búfer, 257-261 eliminación de un objeto

objetos de archivo de diálogo, 361

Graphics, 256 observadores de imagen

ventanas de diálogo. 357

diferencias en plaiaformas,

246

268

parpadeo, 239-243

marcos

piniar/rcpiniar, 232-233

crcauóii, 352

recuperación ,lc ¡maten

ilchimuin de. 352

243

dunensionamicnio. 353

resumen, 231-232

ejemplo di. .'JaselTame,

rulas relativas do aichivii.

355-156

2-l-J

IM.'ltiIS

sonidos. 261-264

acii\.ir. 363

subprocesos. 233-239 aplicaciones independiemos

barras Uc menús. 362 .lo-.aoiiv.il. 363

364-365

elemeiitiis do nicmí.s.

clases. 268, 569

.i63-.t(,4

ColorTest. applel. 366 diseño, 367

despliegue, 353 ejemplo de una ventana

375-377

coniiM.iu.il. 354-356

marcado de HTML. 377

mensaje llnsigned Java

ción, 372-374

Applel Window, 353

subpaneles. 369-370

ocultar. 353

componemos

'fu iwiihit'-ti grália»; JPC

agregar a coillonodoios.

269-270

botones, 273 279-2X2

casillas de verificación. 274-277 etiquetas, 271-272 lien/os. 2X7-2SX

lista de selección, 277-279

lisias dcspla/ahlcs. 283-285

cuadros de diálogo agregar a los appletx 3(,(j creación. 357

m

eventos. 361-302

resullados de actualiza

campos de lexio.

1

poor. 3I.S

manejo de evcnios, 371

2S5-2X6

t

u-ntanas. 352

listado del código luenic

áreas de lexio. 282-283

9

ovenlos. 364

inicio, 368

barras de desplazamiento.

t i

B liad ciimniand o error en nom bre de archivo, mensaje, 26

harías de desplazamiento creación, 285-286

ejemplo, 286

manejar valores de. 286 manejo de eventos. 344-345. 538-540

Swing. 517-518

barras de niemís. 362 llaselM-aiiiol, a|>lioaoiiiri, 3SS-3SC,

BasicPermissiun, clase, 610 beans, rea JavaHeans l>ibliolecas de ciases, .18

4


V

Indi»"

1594

bloques, 118-119 definición, 67

try...calch. 419-421 ltoole, (¡corgc, 42

CABBASE (etiqueta

<PARAM>), atributo, 190 cadenas, 76-77 clases

BorderLayouK), mélodo, 297

StringSclection, 498, 576

borrar archivos 457 •

StringTokenizer, 620

botones

de caracteres, 76-77

Cerrar aplicaciones, 378

Certifícale clase, 613

ejemplo, 273

nuil, 540

inlcrfaz, 609

de opción

cambio

creación, 274 Swing, 517

manejo de eventos :le acción, 537

de elcmenios, 541-5-'.'

Swing, 515-516 BR, eliqucla, 185-186 Itreaklterator, clase, 616 ItiifTcrcdliipiifSlrcaniO, mélodo, 445

BulTiTcdOutputStrcamO, método, 446 BufferedKeaderO, método 454

115-117

JComboBox, 517

valores de variable de clase,

lor

ejemplo, 127-128

valores de variable de instancia, 94-95

campos de texto caracteres de ocultamiento, 280

BultonLink, applet de r.ueslra, 492-494 bylcs, lili ros de, 445

bylcs, Hujos de, 438-44 I archivos de entrada creación, 44Ü

lectura. 440-442

archivos de salida creación, 443 escribir en, 443- 44

bytes, tipos de datos, 7i

190-191

CABarc, herramienta 190

métodos, 53 JI-raniL'. 51 I

whilc. 128-130

JLabei, 515

clases, 35-36, 62, 135

ejemplo, 280-281 manejo de eventos

541 -542

Swing, 5)6

cupucidades de Java, panora ma, 1J caracteres de fin de línea, 454-456

JPasswordField, 516

Applet. 177

JRadioButton. 517 JScmlIBar, 517 JTexIArca. 516 JTexiField, 516 l-ine2D.I-loai, 223

Arc2D.Floai, 224

Meihod, 109

abstractas, 392-393

AbstraciColleclion. 618 agregar a paquetes. 39S

atribuios, 38-39, 620

Modilicr, 109

auxiliares, 147-148

MyReci

UullonGroup, 517

CLASSPATH. variable. 397 compilar, 43-44

CardLayoutO, método, 299

conflictos de nombre, 396

cargar

constantes, 137-I3S

imágenes, 243, 24S-249

Countlnstances, 3S9

NamedPoini, 167 Pcr.son, 159

Web, 184

casillas de verificación botones de opción, 274-27 ' creación, 274

definición de, -11

métodos, 42-43 variables de instancia. 41

PriniClass, 163 PrimSubClass, 163

l>rimSubClass2, 164

ServerSocket, 467

devolver estado de, 274

Choicc, 277-279

Socket, 467

ejemplo, 274

definición, 136

manejo de eventos

diseño. 36-38

Socketlmpl, 468 SiringSeleciion. 498

eventos de acción, 53*

Ellipse2D.FIoai, 223

subclases

eventos de elemento,

Error, 416

creación. 55-60

Field, 109

definición. 48. 62

no excluyentes, 274

FileDialog, 361

Swing, 516-517

finales, 392

verificar/no verificar, 274

FontMetrics, 214

claves

privadas, 433 públicas. 433 ileai Uiii( i, iiHJiodii, 212

superclases

definición. 48, 63 indicar, 136

TextDialog. 358-359

lización, 372-374

siihpaiiclf.-. 369-370 siMcnia de color KG,B, 216

ColorSivirl, ¡i|i|)lrl, 240-241 ColorTest, ippltt, 366 diseño. 367

iniciali/ación, 3(>S lisi.jdo del cíkIíl'u fuente CiilorConiiiils. clase .!7d-.t77

ColoiTcsi. clase 375-376

clientes aplicación de Tiivia ejecución, 4X_>

lisiado del i-úilijrn lianic 479-4NI soekels. 4fi7

Clipboard, 498

aplicación de muestra 499-502

ClipboardOwner. imerfa/ 499

operaciones de copiar/pegar 499

closeí), método, 439 closePathO, método, 225

CMYK, sistema de color, 216 CODE (etiqueta <AI>]'lj;i>), atributo, 183, 187

COUKBASE (etiqueta <AITLET>), atribulo, 187 CodeSource, clase, 610

código de bylcs, 18

código de máquina, ](,

códigos de escupe, 75 color

atributo de transformación 220, 2I6-2IK

búsqueda del color actual.218 CMYK. sisiema de color, 216 de fondo. 218

ColorTesi, applei. 366

I

tramado. 216

ruliirrs'<li< IoikIo. 218

clickCount, variable, 324

lisiado del código luenic

MyRect2, 161-162

creación

del JDK), 397

clave de interrupción. 13)

155-i 56

Constructor, 109

cargar applcts a un servidor

Cl.ASSI'ATH (configuración

definición de clase, 155 156-157

class, palabra clave, 136 class.dal, archivo. 442

buildReciQ, mélodo

clases, 180

541-542

CAB (gabinete), archi eros,

valores de índice, 126

creación, 279-280

eventos de elemento,

bullonO, método, 273

diseño, 52

circunflejo (A), 83

304-309

BultonGroup, clase, 517

creación, 50-52

instrucciones vacías. 127

control, 281-282

buildConstraintsO, métod .,

sobrecarga, J56

errores comunes. 127

panorama, 125-126

error, 30-31, 397

JCheckBox, 516

jerarquías

rcsiillaiíiís dt- la actua

Class not fuiínd. mensaje di

Jabberwock example, 45-47

do...\vhile, 130-131

96

vm liimhiri, iiiicrfat-fs

Windows, 352

ventajas, 410

fuentes de eiiquetas, 271

eventos de acción, 537

declinación, 155-156

alcance, 411

JRuiinn. 5I.S

375-377 mam-jti de cvcnitu. 371 marcado de HTML, 377

de instancia, 136-137

nombrar, 411

repetición de, 128-130

listado del código fuente,

de clase, 138

ejemplo, 410

ciclos,

diseña 3fi7

iniciit, 36S

variables

internas, 409-410

dibujar, 207

BufferedWrilerO, método, 456

buildKcctO, mélodo

simple, 54. 401

importar, 5K, 180, 395

inierrupción de, 131-132

elementos de un arreglo,

ejemplo, 275-277

panorama, 48-50

certificados (firmas digitales), 430-431

TcxiFielu. 27'). 574 TJmmable, 4I(> UlManager, 521

múltiple, 54, 401

Unjas. 4.W

de concatenación, 86 cálculo distribuido, 488

herencia

conexiones de socket. 467

creación, 273 etiquetado, 273

i

marcado de HTML, 377

ii

manejo de evenios, 371

resultadas de la actualización í-VIII-SÜCu!,,,!), IIICIikIi, 37-1

liCiUiollSlio. método. 373 updaiel;, mélodo. 372

subpanclcs, 369-370 comando cd, 28

combinar administradores de diseño, 298-299 loincniariiis, 72-73

comparación eiure objelos,

105-106 compoiicnicj,

ActiveX. 4S6

adminisirador de la imcrla/ de usuario, 521 agregar a las aplicaciones,

269-270.512-514 alineación, 292-293 diseños de borde. 296-298 diseños de cuadrícula. 295-296 diseños de cuadricula de bolsa. 302-313

diseños de (lujo. 293-294 diseños de naipes. 299-302 márgenes. 313 paneles, 298-299

sí 'i


índice

596

áreas de icxio

control, 283 creación, 282

ejemplo, 282-283 Swing. 516 asociación con escuchas de evento, 533-534-

barras de desplazamiento

interfaz de usuario/conso

121-122

persistencia, 487

switch

portátil, 487

ejemplos. 123-125

sitio Web, 491

Swiiig. M7-3I8

soporte de computación

distribuida, 488 diseño. 4X8

lienzos. 2S7-2K8

Swing, 515-516

listas de selección

bolones de opción, 274-277, 517 campos de texto caracteres de

(¡cuitamiento, 2X0

ejemplo, 278-279

Swing, conjunto, 517

casillas de ver ficación

creación. 2 74

control, 285

no excluye ites, 274

creación. 283-2S4

516-517 verifiejr/n ■ verificar, 274

creación de di -ieripciones

para, 522

463 sockets

dul lado del cliente, 467 del lado del servidor. 467-46K

implemcntación de la

capa de transpone. 46S Trivia, aplicación. 468

diseño, 469-470

ejecución. 482 implenicnl.tción de

nombrar. 523

cliente, 479-481

restricciones

implemeniación del

fill, 3)0

servidor, 470-479 conexiones en Web, 462-463

creación. . 71

gridheight, 306

ejemplo, 171-272

gridwidth. 306

fuentes, 2 ' I

gridx, 306

Swing, ce ijunto, 5!5

gridy. 306

constantes, 137-138

le.un. 271

weightx. 307

Constructor, clase, 109

weigthy. 307

contenedores

vcniajas. !71

invisibles. 4> ) JavaBcans

API de ii rospección. ■I'H)

API de m inejo de

eventos 490 API de pe sistencia, 490

arquilectu a, 487

sugerencias, 522 ventajas. 486 componentes de software, vea componentes

comunicación entre iipplcls

getApplet(), método, 496 getAppIeiContext(). método, 495 .

getApplets(), méiodo. 495

conflictos de nombres (clases), 396

componentes, agregar.

269-270 definición. 268 continué, palabra clave, 132 conversión

de texto a mayúsculas. 457-459 de tipos primitivos a objeios.

104-105

so|X>rtc para, 496-497

coordínate spuecs, (gráneos), 219

coordínale syslem, (gráficos), 202 copiar/pegar, operaciones Clipboard, 498-499

aplicación de muestra, 499-502

ClipboardOwner. interfaz 499

objetos transferibles cadenas de texto, 498 definición de. 497

sabores de datos, 497-498 soporte para, 496-497

copyArcüO. método, 212

l'o|>.vArray\Vh¡lc, programa 129-13»

corchetes ([ ]), 112

corinr/pcgiir, operaciones Clipboard, 498-499

aplicación de muestra, 499-502

ClipboardOwner, interfaz, 499

objetos transferibles cadenas de texto, 498

Clicckcrs, upplcl, 258

i *

doble búler. 259

eoini(lluiiiM), método, 27V cuadricula de liolsa,

lisiado ik-l entilan fíleme,

260-261

administrador del di.siño de

iluikl.venl), método, 12]

comparado con el admi

ClKiíee. clase, 277-279

nistrador del diseño de cuadrícula; 302 componentes, arreglo de 309-3II

D

creación, 302-303

DalaHawirO, lili'loiln, 497

diseño de muestra. .¡I l-.ii;¡

DalaliipiilSlrenniO, método,

relleno de celdas. 313

DuluOulpiiiStrciiiiK), método,

creación, 305

4-IV

administrador del diseño

dalos, llnjos de

de cuadrícula. 295-29(>

aplicaciones *le muestra

administrador del diseño de cuadrícula de bolsa.

Ueadl'nmes. 451 cieación. 449

diseño. 303-304 na, 307-31)9

relleno de celdas. .113 cuadros combinados eventos

lectura, 449

dalos, sabores de cieaciiin. 497-49S

lifliiiicii'in ik'. 497 declaracíiin arreglos

de acción, 537

arreglos de ¡irrcglns,

de elemento, 541-542 cuadros de diálogo

II7-MS variables, 112-113

anexar a los applets. 360

clases, 136, 561

creación. 357, 523-524

consianies, 137-138

aplicación de ejemplo,

imerfaces, 405-406

527-530

méiudos. 139. 561-562

de confirmación. 524-525

constructores. 562

de entrada. 525

decíase, 145-146

de mensaje, 526

ejemplo, 139

de opción. 52(>-527

listas de paiámciros, 140

definición. 356

lilis, palabra clave. 14 1-142

modales. 356

variables. 67, 557-55S

objetos de diálogo de archivo

de clase, 95

361

de instancia, 136-137

TexiDialog, ejemplo, 357-360 ventanas, 357

changcColorO, método. 347 ChangeTitle, aplicación, 535-537

charAtO. método, 98

t 3

WritePrimcs, 450-451

304-307

proporciones renglón/colum

i

44'*

cuadrículas

updateO, rnélodo, 372 subpanclcs, 369-370 coiivcrtlfO, método, 124

clieckboxO, método, 274

CheckhoxGroup, clase, 275-276

CniíiKlnsiiincrs. clase, .W

373

converlNumQ, método, 125

charWidlhO, método, 214

sabores de dalos. 497-498

RCBtoHSBO, método

UKLConnccíion. objetos.

teclado, 522

anchor, 310-311

374

463

ejemplo, 284-285

etiquetas

gclHSBColorO, método

getInputStream(), método,

métodos abreviados de

definición, 26 i. 486

marcado de HTML. 377 resultados de la actualización

cación, 464-46C

2S4

estado de ci:volución, 274 Swing, coi junto,

464

(Jcll'ilc Süuipk-, apli

agregar a contenedores.

agregar elementos a. 284

ColorTest, ciase, 375-376 manejo de cvcnlos, 371

HitITciedRcadcr, objetos.

listas dcsplazables

ejemplo. 2 4

376-377

finjas

control, 279

ejemplo, 2*0-281 Swing. 51 * >

definición, 462

agregar elementos a, 278

creación, 279-280

listado del código fuente ColorControls. clase,

conexiones Web, 462-463

278

creación, 277-278

diseño del applei. 367 inicio, 368

conectividad de redes

agregar a contenedores.

control. 2X1-282

tipos primitivos, 102 «invertidor KCH a UStí, 366

limitaciones. 123

;

lemas de tiempo de

diquelar, 273

a clases, 103-104 a interfaecs. 104, 405 Ciraphics2D. 219

palabra clave else. 119 operador condicional,

clases, 487

definición de, 497

definición, 101 objetos

ejemplos, 120-12)

mecanismo para descubrir

señalización, 488

ejemplo. 273

conversión por cast

if

lidación de API, 490

manejo de valores de, 286

creación, 273

"I5-' í

definición, 1)9

488-489

creación, 285-286

bolones

.

condicionales, 560-561

comparados con Java,

múltiples, 68

decrcmento, operador de (—), 81

degradados acíclicos, 220 degradados cíclicos, 220 dclelcO, mélodu, 457

dcIcleOiiExiK), método. 457

i

f


índice

|598

599| desarrollo, historia de Java

Digital Clock, applct

ciclo while, 237 j listado del código fuente, '

endoso de Netscape, 14 navegador Hoüava, 14

desborde (asignación de variable), 88 descargar

CABarc, 190

disablc(), método, 363

cambio, 115-117

diseño

JFC, 510

conexiones de sockel,

painlO, mc*lodo, 1SU

JDK, parámetros de configuración ventanas, 353

des(roy(), mélodo, 179

469-470

i

diagonal (/), 72

DialogO, método, 357

1

dibujar

Arc2D.Floai, cía e, 224

drawArcQ. mélo lo. 208

w

t • •

*

encapsulación, 383

Clieckcrs, ejemplo del applcl,

Web, 12

lrawOvalO, mélodo, 2Ü7 IrawPolygonO, mélodo, 205-206

de entrada de archivos,

i'rawRect(), método, 203

440-442

( rawKoundRect(), método,

de salida de archivos, 443-

204

444

< ra»String(), método, 200, 214

escribir a. 439

programa de muesira,

541-542

KeyLisicncr, 542-543 MouseLislener, 543

MouseMoiionLisiener, 544

WindowLisiener, 544 espacio coordenado de usuario 219

espacios de color, 216 estilos

de enlaces (trazos de dibujo) 222

lectura, 438

Reciangle2D. :loat, clase.

enumeración de listas

223

trazos de dit jjo, 222

indlodo. 54 I

filtro, 439, 444-445

drawRcctO, n ctodo, 203

220-221

¡lemSlaleChangedO,

452-456 de datos, 44y-451

rectángulos, 204- .05

color, 220

IlemLisicner

creación, 438

Ellipse2D.FIoai. clase,

cación de airih nos

importación, 533

cerrar. 439

131

drawOval(), mé odo, 207

icxio, 200-201

FocusLisiencr, 532, 540

445-448

do caracteres. -438.

205

533-534

definición de, 531

almacenamicnio en búfer.

irawUnel), método, 2(13

Java2D, 224-! 25

asociar componentes con

ilujo.s

definición, 438

drawPolygon(' mélodo.

538-540

343-344

de hvies, 438-440

polígonos, 206, 22 i

piograitia de inucslra

entrada/salida

ira«Image(), mélodo, 245-246

223

mélodo, 538

losiFocusQ, mélodo,

irawArcO, método, 208

óvalos

adjusünenlValueChanged().

343-344

limitaciones, 257

Dóminos applct, sitio

ActionListcncr, 537

AdjusimcniLisicner

gciFocusO, méiodo.

definición, 257

324-325

cseiieliiis de eventos, 5.12

manejo de eventos

258-261

enlazadas, 408-409

IfhoArgs, aplicación, 149 clitores (lexlo), 26 asociaciones de archivo

borrar, 586-587 creación, 585-587

iconos dé tipo de archivo. 588

Bloc de notas, 584

envío de formas, 483 KOKKxccplion, excepciones, 417

equalsO, método, 105 errores, 435 Error, clase, 416

manejo iradicional de errores,

414-415

,

443-444

enfoque

Une2D.F!oai, c ase, 223

patrones de i ;lleno,

*

cnable(), método, 363

doble búfer

drawLineQ, mét >do, 203

transformación, :s|>eeill-

empleo, oportunidades, 571

DoTest, programa de muestra,

■b

t

dlsposcO, mélcido, 25<> do...while, ciclos, 130-131

imágenes, 245

sistemas coorder idos, 202

^^

Kili|>sr2l>.I'lmil. elusc. 223

dol, notación, 93-94

(ib jé

elsc. palabra clave, 119

espacios coordenadi >. 219 líneas

f

• Ellipsc2D.Float. clase, 223

jerarquías ik' el.'isc. 51-52

creación, 257-258

446-448

de caraclcres, 455-456 de salida de archivos,

drawOvalQ, mélodo, 207

doble clic, eventos de,

arcos, 209-211

con almacenamiento en búfer,

elipses, dibujo

cuadrículas, 303-304

destrucción de applets, 179-180

escribir en flujos, 439

upos de dalos, 114

clases, 36-38

applclviewcr. 60-61

archivo incorrecto, 26 vea también excepciones

elementos en arreglos acceso, 114-115

JDK, 22-23

applcts

634-639

etiquetas (HTML)

de lapa final (traaos de -

dibujo), 222

eti(|iii'l:is

cambiar lexio. 271 ciclos. 132-133 creación, 271

ejemplo, 271-272

eiiqueías de bolón, 273 fuentes, 271

Swing, 515 ventajas, 271

!■ -tí

.

instrucción finally, 421-422

<APPLET>

jerarquía de clase Error, clase. 416

ALIGN, ülribuio, 185

Comando o nombre de

play(), mélodo, 262

dir, comando, 29

despliegue

Class not found, 30-31,

ciclos. 262-264

mélodos, 238

variables de instancia. 238

mensajes

ejecutar archivos de sonido

236-237

proyecto Grcen, 13-14

versiones de Juva, 15

DOS. Edil, 584 selección, 641-643

CODE, atributo, 183,

Excepiion, clase, 417

186

lOException, clase, 417

CODEBASE, ulribulo.

Tlirowable, clase. 416

187

lanzar, 422-427

ejemplo, 1-82-183 H.STACI-. ¡iinb.il... l«, VSl'ACIi, atribulo, 1X6 <BR>, 185-186 <OnJF.CT>. 1X7-188 «■I'AKAM>, I'JI

definición de. 416 e\cc|V¡nnes explícitas. 424 e.uvjvjones implícitas.

424 lemas de herencia

|9J

■l.'.s -I.1»

KvenSlevcn, programa de

Ihi'ous, palabra clave,

prueba, 120-121

423

eventos de ajuste, manejo,

limitaciones, 429

538-540

Mall'nrmedURLHxcepiion,

eventos ele clic, iiumcj»

417

clemenlo, 541-542

ma/)cjaJures afiidatlos,

niMiiscIJowiio. inéioiii)

427-42.S

319-320

panorama. 436

mouseUpO, método, 320

pasar, 424-425

Spois, applet de muesira

tiempo de ejecución. 417

321-324

verificación de consistencia.

eventos de ratón, 3J9, 543-544

bolones múltiples del ratón 337-338

doble clic, 324-325

4IX

exisisO, método, 457 e\|)ii'si<ines

definición. 66. 77

Lines. applei de muesira,

notación de punto, 94

326-331

valores devueltos, 66. 77

métodos

mouscDownO, 319-320 mouseDragO, 325

mouseEnterO, 326

¿i--i'

W'i/ iainbiín operadores

exlends, palabra clave, 136, 407

mouseExiK), 326 mouseMoveO, 325 mouseUpO, 320

Spots, applet de muestra, 321-324 excepciones atrapar, 418

bloques lry...calch, 419-421 creación, 427 t'lláiulil (llili/iiil.is y cii;illiKi no, 42X-429

definición. 414

EOFExcepiion, 417 errores de compilador,

429-430

f oplion (comando de jar). 189 feedjabberwock(), método, 42 Field, clase, 109 filcO, método, 456

File, objeto. 456 l'¡k'))i:ii<>j!<), método. .Vil l''il>l>iuli>K, cluse, .Uil

KilelnpulSti-vamO, método, 440 FiieOutputStreamO, método, 443

FileReaderO, método, 453

explícitas, 424

FileVVrilfrt), método, 455

implícitas. 424

«litro de nujiK, 439, 444-445

lili, restricción, 310

■•; f;


índice

600

archivos de lectura de

nilArcO, método, 208

texto, 453-455

Fillmorc, applcl de muestra, 246-247

de datos

aplicaciones de muestra.

fillOvnK), método, 207

fillPolygonO, método. 205-206

450-451

ni!Rect(), método, 203

creación, 449

flIlRound RectO. método,

leer, 449

establecer, 213-214

gelJnsctsO, método, 313 gellteniO, método, 279

Font, objetos, 213

gelKeyCharO, método, 543

de etiquetas, 271

funciones, ver métodos

«ell.iiliclo, método, 27J

funciones miembro, ver métodos

getMessageO, método, 419 SelParamelerO, método, 192

futuro de Java,16

getl'arcnio, método, 360 gctl'ointí), método, 543

de lectura, 438

204

final,

gelSelt-cledlndexO, método, 279

aplicación de muestra,

clases. 392

class.dat, archivo, 442

palabra clave, 137, 390 variables, 391

finalizeO, método, 168-169 finalizer, métodos, 154. ¡68-169

Tinally, instrucción, 421-422 firmur código, vea firmas digitales firmas (digitales)

readO. método. 440 escribir en, 439 filtrar. 439. 444-445 focusGalncdO, método, 540

FocusListener, escucha de evento, 532

focusI.o.sK), método, 540 l'oldcr slruclure (paquetes), 398

auiortdades iic ccnilicación. 43 1

folders, creítción/lmrrur, 457

certificados, 430

FonK), método, 213

ejemplo, 431-433

FonlMetrics, clase, 214

navegador específico, -133-434

fiir, ciclos, 125-126

panorama, 4M)

final, tipo de datos, 71

ejemplo. 127-128 euores comunes, 127

instrucciones vacías. 127

flujos abrir en Internet BufíeredReader, objeh s.

formas,

dibujo. 208

ejemplo. 209-211

GeiFilc. aplicación de

relleno. 209

muestra. 46-J-466

463 objetos Je conexión 1. RL.

4fi3

cerrar. 439 con almacenamiento en t ifer

líneas, 203 óvalos, 207 polígonos

agregar puntos a, 206 dibujo, 205 rectángulos

creación. 445-446

dibujo. 203

escribir er.. 446-448

esquinas redondeadas.

204-205

lectura. 445

creación. 438 definición, 438

de byies, 43^-440 flujos de entrada de

archivos. 440-442 flujos de salida de archivos, 443-444 de caracteres, 43S. 452

archivos de cscritun de icmo, 455-456

gabinete (CAH), archiveros, 190-191

Gainelan, sitio Web, 32,568-569 generadores de números aleatorios, 91

CcneralPath, clase, 225 geometría, vea formas gclAccessibltContexli), método, 523 íiclActionCoimnandO. método, 537

getAdjustmentTypeO. método, 538 g«*t Ap|ilt'l('oi>le\l( J, método. 491, 495

getAppletlnfoO, método, 491 getAudioClipO, método, 262 getClassí), método, 107

arcos

4(>4

getlnpuiStreamO, mél ido,

get.Selecti-dlndexesO, método

441

métodos, 391

relleno, 204

sistema de coordenadas. 202 formatos de archivado

CAB, 190 JAR, 188-189

Zip, 189-190 FrameworkO, método, 512 fuentes, devolver información acerca

de, 214-215

gel('lickCuiiiití). método. 543 l>elCodeltusv(), métodu, 244 gcfColorí), método. 218

285

gelSelectedltemO, método, 279 getSelectedltcmsO, método, 285

gelSizeQ, método, 212

gclSourceO, método, 534, 537 getStalc'O, método, 274 gelSialeChangeO, método, 541

«elS'vsieniCliplloiirdO, método 49S

nei.SystemUiokAndFeelClass Niinu-O, método, 52

gelTe.vl<),método, 271, 2S1

gelToolkilO, método, 498 getValueO, método. 286 j;el\V¡df|i(), método, 245 «elXO, método, 543 KelVO, método, 543

(íosling, James, 13 Roil-ocusO, método, 343 <• ni líeos animación

app.'ct Neko. 248-256

getCrossl'iatforniLookAndrccl

cardar imágenes, 243

ClassNameO, método, 521

dibujar imágenes, 245 disposición de objetos Graphics, 256 doble búfer, 257-261 observadores de imá

getCurrénIO, método. 277 golDocumcntllaseO, método, 244

getFileí), método, 466 getFilc, aplicación de muestra HufferedReadcr. objeto, 4(>6 GeiFileí), constructor. 466

geiInputSircamO, método, 466

listado del código fuente. 464-465 manejo de error, 466

readl.ineO, método, 466 run(), método, 466 getFontMetrlcsO, método, 214

gelHelglilO, método, 214, 245

gctlISHColort), método, 374 getlnputSlreamO, método, 463

genes, 246

panorama, 231 -232

parpadeo, 239-243

pintar/repintar 232-233 recuperación de imágenes 243

rutas relativas de archivo 244

subprocesos. 233-239 arcos

dibujo, 208, 224 ejemplo. 209-21 ] relleno, 209

atributos de transformación color, 220

patrones de relleno.

220-221 trazos de dibujo, 222 elipses, 223

guión (-), 81

GUIs (Interfaces Gráficas de liMiariiil. 268-269 administradores de diseño

alternativas de, 315

combinación, 298-299

espacios coordenados. 219

creación, 292

funciones copiar/pegar. 212

de bordes, 296-298

Oaphics2D, objetos, 219 GU1, componentes

de cuadrícula. 294-296 de cuadrícula de bolsa,

áreas de le.vio. 282-2X3

barras de desplazamiento 285-286

botones. 273 campos de lexio. 279-2X2

casillas de verificación 274-277

etiquetas. 271-272 lienzos. 287-2XS

listas de selección. 277-27"

listas dcspla/ahles 283-285 ¡conos creación. 514

definición. 514 Pardon My lions! Web site, 515 líneas. 203, 223

Map2D, ejemplo, 22.V22.V óvalos, 207 panorama. J 99-200

polígonos agregar punios a. 206

dibujo. 205. 224-225 rectángulos

dibujo. 203. 223

orillas tedondeaJav 204-205 rellenar. 204

sistema coordenado, 202 texto. 200-201

rea también AWT; Gl'ls

(Jraphics2D, clase, 219 Green, proyecto, 13-14 Cridheighl, orden, 3(16

(>'ridLayoul(), método, 295 gridvtidth, restricción. 306 Cridx, restricción. 3(Wi

gridy. restricción. 306 grupos de noticias, 32, 570

302-313 de Unjo, 293-294

de naipes. 299-302 especificación. 292-293 máigenes, 313 p.moiaiua. 292

aplicaciones independientes del AWT. 3i>4-3o5

f'olor'li'vi. applei de muestra. Mi(, aciuali/.i.-ióii de resolla dos. 172-.Í74 diserto. 367

iniciali/acióii. 368

Iim.uJo del código liiente, 375-177

manejo de esculos, 371 marcad,, de IIJML. 377

stihpaiieles, 369-370 componentes

agregar a contenedores.

2n9-27O

áreas de texto. 282-283

barras de desplazamiento. 285-2X6

botones. 273 campos de texto, 279-282

casillas de verificación. 274-277

etiquetas. 271-272 lienzos, 287-288 listas dcsplazables, 283-2X5

listas de selección, 277-279 cuadros de diálogo agregar a applets. 360

aplicación de muestra. 527-530

confirmar diálogos, 524-525

m


1602

índice

creación, 357, 523-524

menús

activar, 363

de entrada, 525

barras de menús, 362

archivo fuente, 26-28

de mensaje, 526

desactivar, 363

compilación

de opción, 526-527

elementos de, 363-364

modales, 356

eventos, 364 administrador de inlerfaz

diálogo, 361 TextDialog, ejemplo,

plataformas de Windows,

ventanas de diálogo, 357

bolones, 515-516

268 manejo de eventos

elics de ratón. 319-325, 543-544 ChangeTitle. aplicación de muestra. 535-537

<OBJECT>, 187-188

<PARAM>, 191-J 92

sistemas Solaris, 31 herencia

definición de, 48 excepciones. 425-426

casillas de verificación.

jerarquías de clase creación. 50-52

descripciones de componentes, 522

independencia de plataforma temas de desempeño. 19

asociación con tipos de archivos, 588 creación, 5 14

métodos, 53

definición de, 514

Keys. applel, 334 Lines. applel, 320

l'ardon My Icons!, sitio Wcli

sobreponer, 178

de barra de

marco de trabajo de

sencilla, 54. 401

i' . instrucciones

subclases, 55-60

ii'iiUoAd, niéiou1,,, 474.475

ejemplos, 120-121 clse, palabra clave, 119 imágenes

¡nscrlTcxio, inélodo, üt.\

teclado, 522 nombres de componentes,

523

de lista desplazable. 344

paneles de componentes,

de teclado, 331-338.

512-514

542-543

Sugerencias, 522

de ventana, 544-545

SwingColorTesi, apli cación. 518-520

escuchas de eventos.

531-533

ventajas. 510-511

establecer componente,

ventanas

533-534 handleEvcntO, método,

318-319,338-340 métodos. 534-535 mo\ imienios de ratón.

aplicación. 545-549

marcos

BascFrame, ejemplo, 355-356 creación. 352

definición, 352 dimensionar, 353

dibujo, 245

policytool. 435

mapas de bits, 582-5S6

hidel), método, 353

observadores, 246

historia de Java

recuperación, 243

endoso de Nelsca|X.\ 14 Green. proyecto 13-14 Hoüava, navegador, 14

versiones de Java. 15

evenios, 361-362

HSli (tono, matiz, brillante/)

rulas relativas de archivos, 244

ira también gráficos

ImugcObscrver, inlerfaz, 246

iniplcnu'iuiír

interfaces

instalar el JDK

probar la instalación, 25-26 .sistemas Solaris. 24-25 Windows 95, 23-24 Windows NT, 23-24

inslanceof, operador, 84 ]()7 535

instancias, vea objetos instrucciones bloques, 67, 11S-I |y, 419-421

carácter de terminación, 66 ciclos

sistema de color, convertir a,

ejemplo, 408-409

do, 130-131

ventana desplegablc,

366

inlerfaces niiíltiples.

for. 125-128

Window, clase, 352

actuali/.ación de resultados

geiHSBColorU. método.

403-404

inlerfaces sencillas,

374

KGBloHSHO. método.

H handlcDeselccK., método, 344

handleEvenlO, nélodo, 318319, 338-340

handleSelectO, método, HEIGHT, atril .uto (<APPLET> etiqueta), 60

373 updaieO, método. 372

despliegue del applet. 367 inicio, 368

listado del código fuente ColorControls. clase. 376-377

ColorTesi, clase, 375-376 manejo de eventos, 371

402-403

soefcets de capa de transpone 4í>8

valores del índice. I 2(i whilc, 128-130

condicionales. 560-561 definición de. 11 y if, 119-121

implemento palabra clave ">34 402 " '

operador condicional.

impori, iiislruccmn, 395-3'M importación

swiich. 122-125

clases, 58, 180,395

ejemplo. 408-4IW

inlerfaces múltiples. 403-40-1

inlerfaces sencillas, ■lOMtl.i

KiiMiiable 2.14

inlerlaz/fusión de usuario de API (Javal)eansj, 490 Internet K.vpluri-r, 434

inlerriipciones de línea, marcado de HTML, 185-ISn

Infei-rupledExceptinn, excepciones, 41')

introspección API (Javal)eans) 490

introspección, vea reflexión invocación remola de métodos irallMI

invaking, inéhKlo, 96-98

isKdil:il)le(). método, 282 Henil.isliiur, escullía de even tos, 532

ilemSiuleCh¡iii<>i»lo. mélodo, 541

121-122 expresiones. 66. 77

escuchas de eventos. 533

finally, 421-422 importar. 395-396

paquete del AWT, 268

paquete. 3')8

paquetes, 59. 395-396

swiich

resumen del lenguaje Java. 563

>:„ CHIls

ImaecObscrver, 246 implenicniación

Spots, applel de muestra. 322

ocultar, 353

ejemplo, 345-348

tipos de evento. 318

carga, 243, 248-249

keytoul. 432

Hoüava, navegador. 14

SetHack. applel de SuingColorTcsl,

515

jar, I Sí!

despliegue, 353

ejemplo, 354-356

325-331.543-544

CABarc, 190

ilc iisuaiio, 1111 (il)ls

gráficas de usuario.

applcls. 178-179. 2.1.1

panorama. 48-50

de elemento , 541-542

objetos en. 405 creación. 4O5-4IK)

subprocffsos. 235 i'iitíj, método

listas de selección, 517

de enfoque, 343-344, 540

conversión por casting de

inicio iconos

diseño, 52

herramientas

comparadas con clases, 402

"•ifiiili/ücirín de appleis, 17«

de área de texto, 344

métodos abreviados de

i-iimii liptulc vai¡ahlc. 4(14

indcxOfO, método,!)« indicador de comandos, 25 '"'o application, (ejemplo de

múltiple, 54, 401

344-345

inlerfaces, 54-55, 62, 400-401 ampliación, 407-408 ClipboardOwner, 499. 576

ventajas. I (,-17

etiquetas. 515

aplicación, 511-512

¡ni, tipo de dalos, 70

máquina virtual. J7-I8 nivel fuente, 18

de ajuslc, 538-540

desplazamiento,

panorama, 122-123

cuadro de diálogo), 527-5JM

control de acceso. 387

bolones de opción, 517

limitaciones, 123

8J

<APPLET>. 182-186 <UK>. 185-186

30

campos de texto, 516

incremento, operador de (++),

etiquetas

plataformas de Windows.

516-517

de acción, 341-343,537

de Hipertexto)

sislema Solaris. 31

barras de desplazamiento,

517-518

HTML (Lenguaje de Marcado

ejecución

de usuario, 52!

diferencias en plataformas,

subpaneles; 369-370

28-30

áreas de texto. 516

357-360

marcado de HTML, 377

muestra

Swing, 509

objetos de archivos de

i

HelloUan, aplicación de

definición, 356

ejemplos. 12.1-125

Jalibertvuck, ejemplo de clase atributos. 38-41 código fuente, 42-47 compilar. 4.)-44

definición de clase, 41 ejecución. 4-1


indiice

I 604

índice

persistencia, 487 '

métodos, 39-42

portátil, 487

fecdJabberwockO.

mi JDK

Java FAQs, sitio Web, 569 Java.I'luR-in, 19, 176 Java, portátil. código fuente. IX máquina virtual, 17-18 lemas de desempeño. 19 \ enlajas, 16-17

Java21), 218 ,,|>PU-i .le n.m-ra. 225-22X 3,úb, 22-1

espacios coordi lados. 219 Giaphics2D, obelos, 219 lincas, 223 polífonos, 224-225 presentar airthi tos

color, 220

patrones di relleno. 220-221

ibujo, 222

rectángulos.' 23 JavalU-uns

comparada c -n Java.

488-489 definición de

4S7

iniert;¡/ de ii nai io/eonsuli.lación All.4'J0 introspecció i. APIs de, 491)

manejo de i ventos, Al'ls de. -.

sisiemas Solaris, 31 JavaScript, 32

Jchecklíox, clase, 516

JDBC (Conii.cíividad de Java Datábase), 5Ü.S-506

JDK (Kit de Desarrollo de .lava) c<>iii"ii:iiiaaón ile Windows

490

persistencia APIs de, 490 sjiio Wch, 4JI ventajas arquilec ura compacta.

4S7

mecanis nu de descul rimiemo

de cía e, 4S7

dir,29

575-576

configuración UN1X, 58U-5XI

carácter, 83 líneas, dibujo de

teclado, 522

drawLineO, método, 203

Line2D.FIoat, clase, 223

ventajas, 510-511 ii-íj uunbit'ii AWT: gráficos Jfraine, clase, 511

Unes, applet de muestra listado del cóoigo fuente, 329-331

Jlabel, clase, 515

marcado de HTML, 331

JpasswordKield, clase, 516

métodos

addLineO, 328

Jscrollllar, clase, 517-518

inii(), 326

JlriítArea, clase, 516

mouseDownO, 327-328 mouseDragO, 328 inouseUpfJ, 328

kcyl'ressedO, método, 542

keyUeleasedí), método, 543

Keys, applet de muestra. 333 definición de clase. 334

disponibilidad. !5

listado de] código fuer.ie. 336-337

asisiente, 23-24

marcado de HTML, 337

probar la instalación.

métodos

25-26

sistemas Solaris, 24-25 Windows 95, 23-24 Windows NT. 23-24 número de versión, verilicar. 574

initO. 334 keyDownl). 335 painK). 335

kcylmil, utilería 432

kcyTj ped(l, método, 543 kcylipO, método, 332

panorama, 21-22

PATH, 575

JFC (Clases Fundamentales de Java)

arrastrar y colocar, 16 descarga, 510

IinkToO, método, 494 list(), mélodo, 284

clase, 214

listados

adniinistradores de diseño de bordes, 297

de cuadrícula, 295-296 de cuadrícula de bolsa,

311-313 de flujo, 293-294

AllCapsDemo, aplicación, ,

.

ArrayTest, aplicación,

barras de desplazamiento, 286

listas desplazables, 284

«liquelados, 132-133 for, 127-128

instrucciones

if, 120

l.abelTest, programa de

swilch, 124-125 Jabberwock, ejemplo aplicación, 45-46

: ..,

while, 129

ColorSwirl, applet, 240-241

Selectltem, 541

SwingColorTest, 546-549

WellAdjusted, 539 Map, applet

archivo HTML, 201 código fuente de Java, 200,210-211 Map2D, applet

archivo HTML, 227

clase, 42-44

m

código fuente de Java, 226-227 métodos

definición, 140-14] llamar a, 97

.

MyRect, clase, 155-157 MyReei2. clase, 161-162 NamedPuim, clase, 167 Neko, applet, 253-256 NewPalindrome, applet de muestra

archivo HTML, 194-195 código fuente de Java, W2-I94

OBJECT, etiqueta. 188 objetos comparación, 106 creación, 91

l'alindrome, applel de muestra archivo HTML, 182

código fuente de Java, 181

Palindrome, ejemplo de clase código fuente, 59

HelloDan, aplicación, 27

i

ChangcTitie, 535-536

marcado de HTML, 60

lisias de selección, 27S

bloques iry...finally,

aplicaciones

campos de lexio, 2SI

lienzos, 287

355

manejo de eventos,

casillas de verificación, etiquetas, 272

BüseFramel, aplicación,

de audio, 263-264

botones, 273

275

115-116

do...wh¡le, 131

lienzos, 287-288

áreas de lexto, 282-283

276-277

de naipes, 300-301

labeU), método, 271

muestra, 133

GetFile, aplicación. 464-465 GU1, componentes

bolones de opción,

ciclos

Cl-ASSl'ATH. 579

BuíTerDemo, 446-448

WritePrimes, 450-451 Fom.Melrics, ejemplo de

BunonLink, applet, 493-494

configuración

flujos, aplicaciones

ReadSource, 454-455

421-422

JDK, edición de parámetros de

Fillmore, applet, 246

WrileByles, 443

LinkedList, clase, 619

457-459

ejemplo aritmético simple, 78-79

ReadByies, 441

Points, clase, 327

532

236-237

EchoArgs, aplicación, 149

ReadPrimes, 451

lineToO, método, 225 .

Keyl.istencr, escucha de cíenlo,

Checkers, applet, 260-261 DigitalClock, applet,

constructor. 159

paintQ, 329

krvDmvnl), método, 332

Countlnstances, clase, 389

ejemplo de mélodo

JijdioKullon, clase, 517

.lli-\ll"¡i-lil. clase. 5lh

399-400 500-501

panorama, 509

copiar, 22-23 instalación

ColorTest, clase, 375-376

manejo de eventos, 531 -545

576-57S 578-580

, ; ', ...

376-377

CopyPaste, aplicación,

Class nol found. errores,

PATH. instrucción.

■ ,-:

líne^arra (¡) de canalización,

OVWindims NI,

CI.ASSI'ATH, instrucción.

.„-.. , . ■.

definición de, 16 métodos abreviados de

28-30

JcomboBtx, clase, 517

,

ColorTest, applet

i . ColorConirols, clase,

control de acceso a paquete,

573-57?

elipses, 223

trazos de

plataformas de Windows.

.lliullon, clase, 515-516

■cd, 28 ¡ ,.

cuadros de diálogo. 52.V5.iO

computación, 4XX javac

.lavaWorld, sitio Web, 569

Line2D.Float, dase, 223,-

lín*a de comandos (MS-DOS)

línea de estado (applets),

componentes, 512-518

soporte distribuido de

JAR (java archive), nrchivos,

Java Dcvelopnient Kit,

518-520

señalización, 488

showAuributesO, "*3. 47

de- Java Applet). 569 ,

aplicaciones, 511-512.

diseño, 488

main(), 45-47

jar, herramicnla, 188 JARS (Servicio de Monitoreo

de usuario. 521

propiedades de tiempo

42.48

1X8-1H9

Swing, administrador de inicrfaz

6051

pasar por referencia, 143-144 PopUpWindow, aplicación, 354-355 PrimClass, clase, 163 printMeO, método, 165 PrintSubClass, clase, 163 PrinlSubClass2, clase, 164 referencias, 99 reflexión, 108

ScopeTesl, programa, 142-143 SeiBack, applet, 348

Key.s applcl, 336-337

Spots, applet, 323-324

LinkedUs!, aplicación, 408-W9

SumAverage, aplicación, 150

u~.


índice

Swing

;

lnlb. aplicación, 528-529 in:irco de trabajo de la aplicación, 511'

loslFocusO, método, 343

loslOwnershipO, método, 499 llamar a métodos, 96-98, lííO ll«ves({ |). 17. 118

SwingColo.Test. apli cación. 518-519

Swinger, aplicación, 513

TextDialog, clase, 358-359 Trivia. aplicación de.

(.■líenle, 480-481'

servidor. 475-479 variables de instancia definición. 136 prueba/modificación.

94-95

WritePrimes, aplicación, 430 lisias

de selección agregar a conlenedoics.

278

agregar dómenlos a. 27K coiinol. 27')

creación, 277-278

ejemplo, 278-279 desplazables

agregar a coniencdorcs. 284

i

i

i

1

M

i

i

M Macmillan Compuler

278

45-47

charWidlhO, 214

FrameworkO. 512 gciAecessibleCiiniexK). Í23

movimientos de ratón. 544 Lines, applet de muestra.

326-331 325 32íi

immwl-.xiul. méuiiio. .'2o

miiu»eMove(). método. 325

SwingColorTcst applicalion

listado del código fuente, 546-549

métodos, 545

teclado, 331 keyDownO. método. 332 Keys, applet de muesiia.

535-537

538-540

333-337

keyUpO. método. 332 tocias miidiíieadoias.

337-338

teclas predeterminadas,

asociar componentes con.

533-534

332-333

tipos de eventos. 318

definición. 531

manejo de la memoria, 93

FocusLisiener, 532, 540

Map2D, applet, 225-228 mapas dé"bils

códigos de escape. 75

imponación, 533 lieniListener, 541-542 KeyListener, 542-543

definición, 73

MouseListencr, 543

de carácter, 75 ven también conjunt < de

MouseMotionListencr, 544

máquina virtual

408-409

literales, 556-557 booleanas, 74-75 cadenas, 76-77

caracteres Unicodi

WindowListener. 544 eventos

enteras, 73-74

de acción, 537

numéricas, 73-74

de ajusie, 538-540

loi:p(), método, 262

de elemenlos, 541-542

.

535

escuchas de eventos, 545

Adju.NiineiiiLisieiicr.

vinculadas, enumeración de,

charAtO, 98

tipos. 363

clases. 545

creación. 277-278

elemenlos, agregar, 278

creación. 363-364

mouseDownO. niétodii.

AciionLisicner, 537

IbciisGüincdl 1.540 lociisl.osnl. 540

doble clic, 324-325

escuchas de eventos

HowLayouiO, 293-294

l-oni(). 213

manejo de eventos, 531

Cli.ingeTille.java, ejempio.

firmas. 139. 154

convcnNumQ, 125

changeColorO. 347

actionl'crformedl), 534

inanejadoios de excepciones

ColorTest applet, 371

convenliO, 124

barras de, 362

elementos de

MalformcdLKl.Kxccplioii,

321-324

activar, 363

métodos

mciuscEmert). método.

319-320

finalizadores. 154. Iti8-lp9

finnli/c(). lftS-l(i9. I7J

copyAreaí). 212

475 makcRangcO, método, 140-141

clics de ratón, 543-544

público, 385 herencia. 387

coiintlienisO. 279

mouscDragí), método.

anidadas, 427-42X

final, inclndok. 391

definición de, 362

TriviaServer, aplicación,

excepciones, 417

llllRoundRecn). 2(H

protegido. 385-386

desactivar. 363

mstanceof, palabra clave.

firma, 147 Jabberwock.java, ejemplo.

:

privado, 384-385

nienús, 364

566

mainO, método

control, 279 ejemplo, 278-279

nienús

liandleliveiilO. inéuxlo.

gctSourceO, 534

Spots, applet de muestra.

agregar a conienedores,

Insets, clase, 572

544-545

l'ublishing, sitio Web. 277,

control, 285

despiegabies

¡nsclsQ, método, 313

de ventana, 361-362,

JavaBcans. 490

mouseUpO. método, 320

ejemplo, 284-285

margenes

de teclado, 542-543

318-319

agregar elcmcnios a, 284 creación, 283-2R4

de enfoque, 540

6071

clases. 583-586

interfaces, 582-583 panorama, 17-18

soporte para el navegador. 19 marcos

creación, 352 dimensionar, 353

eventos, 364

Melliod, clase, 109

mélodos, 39-4(1, 62, 98-99, 145-146

abstractos, 392-393 actionO

chcckrxuO. 274

gciAciionComniaiidd. í.:"

checkEvcní). 121

geiAdjtisinieniT\pc( i, 53S

Dalal-lavorO. 497

geiA|ipleiCniiicMl I. 491. 495

DalalnputSireanid. 449

gelApplellllIrtl 1.491

DaiaOulputSlreami). 449

¡felAudioCiipi í. 2o2

definición. 561-562

gelC'lasstl. )0n

argumentos. 341-342

ejemplo. 139

definir, 341

listas de parámetros. 141)

üci('odfHaM-( i. 244

lilis, palabra clave. 141-142

•viColoni. 2IS

valor devuelto, 342

aciionPerformedO. 534, 537 ;idclAciioiil.islci>er(). 5.17 addlieiiK). 278

deleteO.-457 dclclr()ul:xii(). -157 dcstrovl I. 179

geiC'lickCounis 1.543

getCrossPlailiirmLoiikAnj

IvcI('I.in»N.iiii>"i1. 521

addLineí), 328

de acceso, 387-388. -112

¡■.Cll'uiicill: '. -17~ geiniKiniK-niHased. 244

addPoiniO, 206

de durada. 58I-5H2

.■idd.SpniO. 322

f¡etl-"ilel I. 4W>

Dialogo. 357

ailjusimeniValucChangedO,

eeil iiiii.McincM'. 214

disableO. 363

geillcighli). 214. 245

disposel). 25(>

gcillSItCnl'irl 1.374

538

ArgStreamO, 448

BorderLayoulQ. 297

drawArcí), 208

gelliipulSueamtl. 4(i3

drawlmageO. 245-246

gi-ilnseisi). 313

BulferedlnpuiSireamO. 445

drawLineO, 203

BufferedOulpiitStreamO, 446

gciltemO. 279

drawOvalU, 207

gelKeyCliarl 1.543

BufleredReaderO, 454

drawPolygonO, 205-2U6

BuffeiedWriierO. 456

gell-alx-li). 273

drawRecK). 203

geiMessagcl 1.419

buildConstraimsO. 304-309

drawRoundRecK). 204

buildRecK), 155-156

getParameierO. 192

drawStringO, 200.214

getParennl. 360 getPoiiiK), 543

buttonO, 273

enahle(). 363

CardLayoutO. 299

equals(), 105

getSelectedlndexO. 279

clearUccK). 212

estáik-o. 3S8-39O

geiSekvtedlnde.vesO. 2S5 geiSclectcdliniKÍ. 279

dosel). 439

e.\isis(). 457

closePathO, 225

feedJabberwockí). 42

geiSeleciedltemsO. 285

constructores, 92, 153, 158

Filel), 456

getS¡/.e(), 212

definir, 562

FilcDialogO. 361

ejemplo, 159

getSourceO. 534. 537

FilelnputStreanH). 440

geiStateO, 274

llamar desde otro

FileOutputSireamO, 443

getS¡aieChange( 1.541

constructor. 160

nombres. 159

FileReader( ).453

getSysiemClipBoardl). 41>S

FilcWriterO. 455

getSysiemLiKikAndFeelCNi^

sobrecargar. 160-162

fillArcl), 208

sobreponer. 166-168

fillOvaK). 207

control de acceso, 382-387 predeterminado, 383

Namcl). 521

geiTexiO. 271. 281

ftlIPolygonl). 205-206

gelToolkill). 498

filIRecu), 203

getValucO. 286


índice

índic

608

eventos de clic, 319-320

gelWidthO, 245

eventos de doble clic,

gciXO, 543

324-325

gelY(), 544

Lines. applet, 327

güiKocusQ, 343

Spnls. applcl. 322

r,iidl.ayiu.i(). 295 handleDesclecK), 344

mouseDragO, 325 mouscDraggcdl), 544

liamlloEveniO. 318-319,

mouseEiitcrO. 326

338-341)

niousclixiil). 326.

Ji.tmIIi-Si-kvH). 3-l-t

mouseMove(), 325

liidcl). 353

mouscMovcdO. 544

indcxOfO. 98

inouseReleascdí). 543

iñiiO

muuseUpO, 320

Keys, upptci. 334

..-'

niovcTiif). 225

l.ines, appici. 326

-.- sobreponer. 178 ' ■

Spots, ¡ippici di: muestra,

322

newPramel). 352

inscnTexH). 283

newLinefj. 456

iuselsO- 313

ncxiDoubleí), 92

isEditableí), 282

oneíoZcrol), 144

itcmStalcChangcdO. 541

packO. 353, 512

JHiiiiimK), 5Id

pjintO, 57-58, 178-180,

JComboBoxO, 517

232-233

JCheckBoxO. 516

Kcys. applel. 335

Jl.abelo. 515 J.SerollBarO. 518

Lino, applet, 329 para lair/ür excepciones,

JTcMAreaO, 516

422-427

JTcxtRcIdO- 516

cucsi iones de herencia,

kcyDowní). 332

425-426

kcyIVssedU. Í43

definición. 416

keyReleaseiÜ.I. 54 3

explícitas. 424

kcylyívill). 54 3

íabclí), 271

nekoSleepO, 252

ucwAudioClipO. 262

milOnAO. 474-475

--keyU|H.¡. 332

nekoRunO, 250 nekoScraicl.O, 252

iinplíciias, 424

throws. palabra clave,

.

423

JincToO. 225

parselnK), 146

linkToi). 494

passing. arruinemos pata,

■ ÜMO. 284

143-145

loop*). 262

playl). 262

■.losil;ocus(>. 34 3

PUS T. 483

losiOwncrshipií. 4'W

primLnO, 79 primMcO, 165

llamar, 96-98

mainf)

luma. M7 Jahhcrwock.javn, ejemplo. 45-47

TriviaScrver. aplicación. 475

prinlNamest). 116

processlnpuu), 472-473 read(). 438

readFioalO. 449 readLine(), 454, 466

readStreamO. 448

makeRangeO. 140-141

readUnsignedByict 1,449

nikdirí). 457

readUnsignedShonO, 449

motiscOnwní)

sobrecargados

renameToO. 457

creación, 154-158

movcToO, método, 225

replaccTexlO. 283

definición. 153-154

MS-DOS

requesiI-iicusO. 335

ventajas, 154

ivslupi-0. 315

cd, 28

sobreposición de. 53, 154,

rcM¿e(). 353

ilir. 29

165-166

appleis subprocesadas,

235

TriviaServer. aplicación.

stand, I7'J, 233

applel Neka. 248-256

caiga. 248-24')

cargar imagen. 243

conjunto. 248

dibujar/icilüuijar, 232-23.1 doble búl'er. 257-261

siTollbarO. 285

subslringO, 98

climinaciiín de objetos

sclecU 1.279

testUlockO. 118

523

imágenes

sialic, 388-390

M.ipO, 179, 233

sel AcccssiblcDcscripi iiiní).

culiii de lomlo. 253 compilación, 256

animación

siringWidihO, 214

471-472

lexiAieaO, 282

imágenes de dibujo, 245 observadores de imagen,

253-256

técnica de animación. 249-253

iii-kiiKiinO. método, 250

toUppcrCascO. 98

sci.AciionCommanJl i. 537

updateO, 240-243, 372

panorama. 213-232

iicknSltT|i0, método, 252

seiUackgioundO. 218

upilaieO. 240-243

parpadeo, 239-243

Nclscapr Navigator, 434

sctCilorl 1.217. 220

URLí 1.492

rccupciaciñil Je imagen.

NelM-ape Signing liiol. 434

selConslrainlst). 3n6

valueOI'O, 98

seiC'oiiieiuPaneO. 512

uindo»Closed(). 545

sctCuricntl). 277

u'iiuInu'Clitsmgí), 544

setEehoCharO. 516

windowOpenedO, 544

seil-.clioC'liaracicrl i. 2SD

writeO, 439, 455

setlldiiablct). 282

writelnK), 452

ciclos, 262-264

archivo HTML. 194-195

seiFonU), 213-214, 271

wriieStreainO, 448

ejecutar, 262

código fucnle de java.

sctl:orcgrnund(). 2lí>

Microsoft, sitio Web, 190

seülelpMenud. 363

minúscula, convenir a

sell.alíelo. 273

mayúscula, 457-459

sciLit.víiuK 1.292. 2'^

mkdirí). método, 457

M'il.iiiikA.ul¡:celíl. 521

ni.idale.s. cuadros de diálogo,

sciMciuiUaro. 362 seiMiiemonieO. 522

243 rutas relati\ a> de archivos. 244 subprocesos. 233-239

sonido

mullitareas. 233

diálogo modificadores, vea palalinis

sciSlringl). 271 sciSirokcl ¡.222

.Modifivr, clase, 1(19

M-iTcxin. 281. 54(1

mouseí)ra|;í), método, 325

selTiHil ri|ilexH). 522

nHiuscDrH^jícdO, método, 544

setValueO, 286

inmiMjICnlcrO, método, 326

seiVisihleO. 512

mouscExitO, método, 32ft

shiiNvl). 300, 353

MuuscLislencr, escucha de

showAttnbutesO, 43 showConfirmDialoai), 524

evento, 532

MuuseMotionl.istener, escucha

showInpinDialogO, 525

df evento, 532

showMessagcDialogO. 526

mouseMovt'O, método, 325

sliowOpiionDialoiriJ. 526

mouscMovcdO, método, 544

showSialusl 1.491

miiuscKi'leasi'dO, método,

size(). 212

543

i

X

iirul.iiü-O. método, 456 imu-slra

¡92-IV4

nevtDoulilfU, método, 92 coiiiponenies de Swing, 523 paquetes. 397-398 variables. 69-70 NO'I. opi-radnr, 83

notación exponencial, 74

listado del código fuente,

NT

MvUeet2, clase. 161-162

aplicaciones de Java

compilación, 28-30

ejecución, 30 configuración del JDK. 23-24,631-633

N

Class not found errors

NamedPoint, clase. 1ÍI7

NaniesUlop, programa de muestra, 127-128 naveRadores

firmas específicas de navegador, 433-434

HutJava. 14 Java Plug-in. 176

'é

nombrar

definición de clase, 155 156-157

cla\e

i

NeivPalindronif, appli-l de

declai ación. 155-156 sobrecarga, 156

i

ne» liami'l I, método, 352

buiidkecií), método

ven también cuadro de

seiSuucU. 274

ne«.\ud¡oClipl). método, 262

MvKect. clase

356

seil'ainK). 220

mkiiScralcliO, niétodu, 252

fórmalos de archivos, 261 vt'a ¡amblen gráficos; GUls

■■■#

uviilirai'in. 2-18

selAcccssililcNaincl), 523

246

m

lisiado del código fuente,

Graphics, 256

texií-'ieldO, 279

;'

l'alindronies, sitio Web, 61 Ni'kn, applel

multimedia

ventajas, 165

nuil)

t

Neil/Kred's (ü^antic l.ist of

in.licadoi de couiaiuins, 25

sitper, palahra clave,

RGUloHSBO. 373

navegador, 19 Navigator, 4.34

comandos

162-164

rcium lypes, 139

Plug-in, mejoramiento de

mouscUpO, método, 320

repaimO, 232-233

609 1

634-636

Cl.ASSPATH. instrucción. 636-638

PATH. instrucción. 633-634 nuil, cadenas, 540 nuil, palabra clave, 113, 127 Nulll'ointerF.xceplion, errores

de. 417, 507

4 m

# m


í.iív

índice

Numberlteader, programa de muestra, 124-125

número pseudo aleatorio, generación, 91 números

de pumo fluíame, 71, 74 hexadecimales, 74 negativos, representar como

lácrales, 74

ocíala*. 74

ventanas, 353

onetoZeroO, método, 144 operadores

asignación, 79-80 comparación. 82

concatenación (+), 86 condicional, 121-122

decrcmento (—), 81 desigualdad (!=). 105 igualdad (==), 105 incremento (++), 81

instanceof, 84, 107 lógicos, 83-84

O

matemáticos, 77-79

<ÓnjECT> etiqueta (HTML), TS7-188

new, 85

creación de objetos. 90-92 instanciación de arreglos,

objetos

arreglos, 113-114

113

cadenas de lexio, 498

NOT, 83

comparar. 105-106

OR. 83

conversión por ca.sling

precedencia, 84-85

a clases, 103-KM

.i interfaces, 104,405 convenir a tipo-, primitivos. 104-105 creación

administradores de

memoria, 93

ternario, 121-122 oportunidades de empleo (Jiivu), 571

orden de precedencia

(operadores), 84-85 organización, vea alineación óvalos, dibujar

argumentos, 90-91

dmwOvaK). mélodií, 207

cotislfucloics, 92

U!!ipic2D.I-loal, clase, 223

nuevo operador, 90-92

determinar la clase de. 107 File, 456

V

Font. 213

Genc-nill'ath. 225 ' Graphics2D, 219 Random, 91-92 referencias, 99-100

. sabores de datos, 497-498 ;

transferihlcs

cadenas de texto, 498 definición de, 497 sabores de datos, 497- ¡98 URL, 492 vea inmbién clases ocultar

caracteres en campos de texto, 280

pack(), método, 353, 512 package, instrucción, 398 paintO, método, 57-58, 178-180,

cadenas de texto, 498

público, 399-400

definición de. 497

estructura de la carpeta, 398

publie, 56, 385

nombre, 397-398

super. 165-160

Ihis. 141-142, 160.235 ihrows. 423 palabras reservadas, 556 wu iiimhicn palabras clave Palindrume, applel de muestra

<1'ARAM> etiqueta (HTML), 191-192 parámetros, pasar a applvts ejemplo, 192-195 <PARAM> etiqueta, 191 vi'it inmbién argumentos

l'ardon My Icons!, sitio Web,

prueba, 183-184 Palíndromo, ejemplo de clase clases importadas. 5S cóJigo fuente, 59

515 puro

MlhjllOCCMlS, J.Í5

ejemplo, 240 panorama, 239

maivaclo de HTML. 0(1-01

reducción

paintO, método, 57-5S paneles

309-370

márgenes. 313

relación con Java)

grupos tic noticias, 570 JAK.S. 569

agregar puntos a. -lid

.

dilmjaj

laxa I-'AI.K 5(i') l.ivaSnll. 'mi(i ios

drawPolygoiK J. méloüo. 21 í5

J.iv.iWVirIJ. 5(i9

Java2D, 224-225

Macmillan C"iiiii|)uter

I'opUpWindoH, aplicación, 354-356

prinlMeO, método. 165 printNamesO, método. 116

Piíhlivliiiig. 566 vinas Web

CaiiH-l.ui. 5(.K 56')

aciiiM.s ilc empico, 571 rcdimt-usionaniK'iilo de marcos.

353

lU-liTcnccs'k'st.java, :i|>licación,

l'iinlSubClass. clase, 163

a aplicaciones. 148

l'rinlSuhClussa, clase, 164

lefeivncias, 99-IIMI

claves. 597-601

aapplcis. 191-195

pri<iridad (operadores), 84-85

relli-xión, 107-1119

cuniiol de acceso

a métodos. 143-145

processlnpullI, mélodn, 472-473

paquetes

predeterminado, 398

excepciones. 424-425 I'ATI1. configuración

(parámetros del JDK)

pnieh:i

instalación del JDK. 25-20

rt'llfiiii, 3M

punió (.), 93-94

ceñidura de la cárpela.

cambiar, 575

punto y coma (;), 66

nombres, 397-398 definición, 62

óvalos, 207 polígonos. 2W5-2O6

referencia

rectángulos, 203-204

break, 131

nombres de clase. 394

peer, 315

class, 136 continué, 132

nombres de paquetes,

pegar, operaciones de,

395

vea también clases; ¡merfaees ventajas, 393-394

paquetes personalizados

ciases, agregar. 398

Clipboard, 498-499 aplicación de muestra, 499-502

ClipboardOwner, ¡merfaz, 499

relleno de una celda, 313 renombrar archivos, 457

desplegar. 575

panorama, 55, 393

rellenos de degradado, 220

relíameTo(), método, 457

corrección de errores, 576 patrones de relleno

java lang.rericvl. paquete. I(W rt-tiiirianihi iidi>s. 132

agregar. 576

398

eieiuplo. IOS

applcls. IN3-IX-J

clases, 398

Chvner, inieiiaz. 612

implements, 234,402

recursos de Internet (en

polígonos

parselntO. método, 146

Unes, applet, 329

final, 137,390

relleno. 2(W

recursos de carrera, 571

policytool, utilería, 435

pasar

arcos, 208-209

extends. 136,407

playO, método, 262 l'lug-in, 19, 176

printLiU), método, 79

Java2D. 220-221

else. 119

de, 11

updaien. 240-243

interfaces, 597

abstrae!, 392

plataforma cruzada, cuestiones

l'rmlClass, clase. 163

importación, 59, 395-396

palabras clave

223

esquinas redondeadas. 204-205

277

I'OST, mélodo, 4H3

Keys, applet, 335

232-233

Kcctangle2D.FIoal, clase,

sobreponer el método

argumentos

dibujar

Personal llookshell. programa,

doble Inífcr, 257-261

C'nloi fot. applcl Uc niucNlia.

Kectangle2Ü.FIuat, clase, 223 rt-clán|>ulos

drawRccK), método, 203

parpadeo (animación)

definición de clase, 56-57

449

Redante.Float, clase, 223

l'erson, clase, 159

applcts. 179. 2.13

compilación, 59

creación, 29S

permisos, 431

f*eatlUiLsigiiL'il.Sliori()t mélodo,

persistencia, 487

valores nuil. 192, 197

I iswdo del código Java. 180-181 paintO, método, 181

sabores de dalos. 497-498 soporte para. 496-497

gelParamelerO mélodo, 192

archivo HTML'182-1X3. IXX

creación

definición de. 35. 62

predeterminado, 398

protected. 385

slatic, 95. 138,388

objetos tianslciihlcs

control de acceso

mili, 113 priivate, 384-385

público. 399-400

ClicckboxGroup, 275-276

"

iiisianccof, 535

611

Q-R QnA.txt. archivo (aplicación TriviaServcr), 47.1 Random, clase, 91-92

read(), método, 43X ivadl'loalO. iiióIimIii, 44'> readLineO, mélodo. 454. 466

UeadPrimes, aplicación, 451 readStreamO, método. 448 readUnsignedlIyleO. inéloilo. 449

repaintO, mélodo, 232-233

rrplatxTcxiO, método, 283 requeslKocusO, método, 335 iTshapcO, mélodo, 315 resizeO, mélodo, 353 restricciones

anchor. 310-311 asignación a componenics.

304-31(6

nn. 3io

gridlicighl. 306 gridwidlh. 306 eridx. 306

¡m -


índice

I 612

gridy, 306

navegador específico. 433-434

weighlx, 307

weighiy, 307 RGBlollSBO. método, 373 KMI (Invocación Ucmolu de

Métodos) aplicaciones, 504-505 arquiteciura, 503-504

si-lKdioClinraclcr(). método. 2S0

grupos de noticias, 570

setFontO, método, 213-214, 271

polílicas. 434-435

sclForegroundO. método, 218

selecto, método, 279

selIlelpMcuuO, método, 363

semejante, 315

sctLabelO, método, 273

sensibilidad a mayúsculas y

setLayoutO, método, 292, 298

minúsculas, en Java, 69

panorama,502

separadores (menús), 364

selMenuBarf), método, 362

señalización (RMI), 488, 504

sctMnemonicO, método, 522

silio Web, 505

ServerSocket, clase, 467

sctl'aintO. método, 220

servidores (aplicación de

selStateO, método, 274

UI'C (Llamadas de

Trivia)

constructor, 470

MtStrokeO, método, 222 sc(Text(), mélodo, 281,540

applcts con subprocesos. 235

inilQnAO. método. 474-475

sclToolTipTextO, método, 522

TriviaServcr, aplicación,

listado del código fuenie,

selValucO, método, 286

471-472

475-479

Rminahle, ¡Hierra/., 234

inainO. método. 475

rulas relativas de archivo,

processlnpui(). método,

472-473

244

QnA.txl, archivo, 474

470 sabores (dalos), 497-498 salida, vea entrada/salida salir

aplicaciones, 378

ciclos, 131-132 ScopeTesl, programa, 142-143 SCKi)IX_A1I.SOJ.UTF.. evento,

SCROLI-_UNE_UOWN, evento, 345 .SCI«H.l._l.lNi:_L¡l', evento,

345

SCKOLL_PAGK_DO\VN, evento, 345

SCROU.J'AGK.UI', evento, 345

scrollliarl), mélodo, 285 SceMclhod, aplicación (ejemplo de reflexión), 109 seguridad applcts. 175-177 firmas digitales

autoridades de cenifi-

cación, 431 certificados. 430

ejemplo. 431-433

WAITFORANSWER. estado.

473

WA1TFORCLIENT, estado. 473

WA1TFORCONF1RM, estado, 473 selAccessibleDcscriplionO,

método, 523 sel AccessibleN¡imc(), método,

libros relacionados con Java. 568

Macmillan Coinpuicr i'ublislnng, 277. 5o5

Microsol'i, 190

Neil/Fred's Giganlic List of Palindromes, 61

Netscape Signing Tool, 434 l'ardoii My Icous!, 515 recursos de empleo. 571

L'mcode Consonium, 7b sizt-0. método, 212

524

skelelon, capa (RMI), S03 Sockel, clase, 467

Snckctlmpl, clase, 468

526

sotkets

shnwOplionDialogO, método, 526

aplicaciiin de Trivia, I6X

sho«Status(), método, 491

diseño, 469-470

Signing Tool (Netscape), 434

ejecución, 4S2

signo de exclamación (¡), 83

implcnicnlación de

signo igual (=)

Selliack, applet de muestra.

'

obrador de asignación, 68, 72

lisiado del código l'uenle, 348

del lado del servidor, 467

implcnicnlación de la capa de

operador de incremento (++).

transpone, 468

changeColorO. 347 inii(), 346

setí)ackgroundO> método, 2)8 sc-tColorÜ method, 217, 220

setConstraintsO, método, 306 setContentPane(), método, 512 setCurrenK), método, 277 sctEclioCharO, método, 516

solución de problemas

simplicity of Java, 20

Class not íound errors

sistema de color UGH (rojo,

plataformas UNiX, 580-581

verde, azul), 216

sistema numérico base-8, 74

actionO. 346-347

sistemas Solaris aplicaciones de Java, compi-

lar/ejecuiar, 31 instalación del JDK, 24-25 sistemas SPAKC, ¡nslalación

del JDK, 24-25 sitios Web Code Signing. página de recurso, 434

slulic, méloil<i, .I.SS-39K

stalic, |)alabra clave, 95, 138, MiH stalic, variables, 95, 388-390 stop(), mélodo, 233

sobreponer, 179

MrinxWidtlifj, mélodo, 214

Strouslrup, Djarne, 13 subclases, 50 creación, 55-60

definición, 48. 62

subíndices (arreglos), 114 subprocesos definición. 233 inicio. 235 paro, 235

programas de animación, 233-234

DiejIaK'loik. ejemplo. 23d-2 V)

iiMpicniL-maciün.

del lado del clienie, 467

operador de concatenación

métodos

sobrcposicirin. 1 79

senador. 470-479

signo más í-f- }.

sistema numérico base-J6, 74

starlO, método, 233

implemento-ion dei

operador de igualdad. IU5

marcado de HTML, 348

rcpaiiiK). .123

Star7, sistema operativo, 13

cliente, 479-481

81

537

345

JDI3C, 506

( + ). 86

523 scíActionCominaiidO, método,

inil(), 322

mou.scDownO. 322 painlO, 323

JDK, 22

showAIlributesO. método, 43

slHm'McssageDialogO, método,

aildSpoK). 322

JavaWorld, 569

sliouConllrmDialogO, método,

variables de instancia.

niélodos

Java FAQs, 569

slinwO. método, 300, 353

showInputDialogO, método, 525

marcado de HTML, 324

JARS. 569

sctV'isibleO, método. 512

runO, método, 471-472

323-324

Java 1.2 documentaron, 73

setStringO, método, 271

ejecutar, 482

I'roccdimicnlo Reino,o i, 51)2 runO, método

listado del código Tueme.

Gamclan. 32, 568-569

sclLookAndFcelO, método, 521

señalización, 504 Rmiregistry, programa, SOS

documenlación de Java 1.2, 73 Dóminos, applet, 12

setliditableO, método, 282

plataformas Windows, 576-578

!

í

manejo tradicional de errores, 414-415 i (i; itttnhit'n errores sonido

formatos de archivo. 261 reproducción

ciclos, 262-264

play(), método, 262

Spots, applel de muestra definición de clase. 321

234-23f>

substringO, método, 98

Sugerencias, (información sobre herramientas) 522

Suida» erage, aplicación. 150 super, palabra clave, 165-166 .superclases

definición de. 4S, 63 indicación. ¡36

Swing

# i barras de desplazamiento, 517-518

botones, 515-516

bolones de opción. 517 campos de texto. 516

casillas de verificación. 516-517

creación de descripciones

é é t i

para. 522 diquelas. 515

lisias de selección. 517 nombrar. 523 l'.iu.ii.un.i. 511-515

i

I

Sugerencias, 522 cuadros de diálogo aplicación ile muestra.

527-53(1

cic.-iciiin, 521-524

de confirmación. 524-525 de entrada. 525

de mensaje, 526 de opción. 526-527

definición de. 16 mancjiídc eventos, 531

ClMiigeTüle java. ejemplo. 5Í5-537

I I I 1 I 1

csiiKha de eventos.

531-533 CNi.rbleccr componente, 533-534 ,1c acción. 537

de ajuste. 53h-54U de elemento. 541-542 de enfoque. 540

de ratón. 543-544 de teclado. 542-543 ilc vemana. 544-545 insianceof. palabra clave. 535 método. 534

I

I ) J

I

métodos abreviados de tecla do. 522

administrador de inierl'a/ de usti.ii ¡o. 521 aplu-aciones

niarctj de trabajo, 511-512 componentes

agregar a las aplicaciones. 512-514 ■ áreas de texio. 516

panorama. 509

wniajas. 51(1-511 SwitigC'olorTcsl, aplicación de

muestra, 518-520 clases. 545 escuchas de eventos, 545

listado del código fuente. 546-549 mélodos. 545

v #


índice

614

índice

convertir a objetos,

104-105 TCP (Protocolo de Control de Transmisión), sockcís

aplicación de Trivia

diseño, 469-470 ejecución. 482

toUpperCaseO, método, 98 tramado 216 lr_\...calch, hlui|iies

:

finally, cláusula. 421-422

del cliente, 479-481

u

(■siálico, 388-390

del lado del servidor, 467

Unicodc. cunjunlu de caracteres, 69 códigos de escape. 75

transpone, 468

Unicode Cunsonium, sitio

teclado

Weh. 76

manejo de eventos, 331.

UNIX, JDK, riinnciiración.

Kcys. applei, muestra.

580-581

Unolllciül Obscurc Java FAQ. sitio WVIi, 569

333-337

keyUpO, método. 332

ui><t:ile(), método, 24(1-243, 372

ledas modificadoras.

URI-0, método, 492 UKL, objelos, 492

337-33S teclas predeterminadas,

L'scnct, pimpos de milicias, 32, 570 utilerías, vea herramienlas

332-333 métodos abreviados, 522

TeslField. clase, 27!> convenir a mayúsculas,

457-459 dibujo, 200-201

Thawlc Ccrlificalioi , 431 Ibis, palabra clave,

41-142,

16(1, 235

Thruwable, clase, 4 6 tipos de datos, 7(1-7 ,JI0 hooleanus, 42 conversión por c: st, 101-102

convenir a objei -s.

KM-105 tipos primitivos, 7C -71, 110 conversión por i jst.

101-102

^Jvi

instancia, 39. 62, 67 acceso a valores, 93-94 cambio de valores, 94-95

definición. 136-137 valores iniciales, 69 locales, 67 declaración. 6X val.>ies, o1.)

mimbrar, 69-7U

tipo de inierJa/., 40-1 tipos de clases. 71 lipos de dalos 70-71

booleanos. 42

KM-105

valoeOK), niélodo, 98

ventanas

variables de instancia advertencia Je Unsipnca j.iv.i

alcance. 118

Applei Window, 353

alcance de léxico, 134

desplegar. 353

ScopcTcsi. pruprania

ejemplo de venuna despk1-

142-143

diquelas de, 271

incremento. SU-81

variables de objeto, rea

variables

texto

globales. 67

V

levlDialon, clase, 35f:-359 IcxtlieldO, método, 279

linkTnO, méiodo, 494 UKI..objcios, -192

visualización, rea despliegue

gable. 356

asignación, 6S. 72. 558

evenios de, 3o 1-362

clase. 39. <>2. 67

manejar evenios de,

definición, 95 valores de acceso, 96

544-545 marcos

valores de cambio, 96

creación, 352

valores iniciales, 69

definición. 352

CLASSPATH, 397

dimensionjr. 353

constante

ejemplo de

declaración. 137-138 definición, 137

control de acceso,' 382-387 predeterminado. 383

privado, 384-3S5 protegido, 385-386

w

finales, 391

convenir j objelos.

leslilloekO, método. 118

iextAreaO, método, 282

492-494

112-113 '

desborde. 8S

del lado del clicnle, 467

keyDownO. méloJo. 332

BuiíonLink, ejemplo.

variables de arreglos.

variables múltiples. 68

\

definición de, 67

UIMana¡>er, clase. 521

542-543

appleis. 491

declaración. í>7. 557-55S

decrcmento, 80-81

del servidor, 470-479

implemcnlación de la capa de

Vinculación

101-102

ejemplo, 419-421

implemcntación del lado implementación del lado

público, 3S5 conversión por casi,

Baser>.mic.355-35íi

acuitamiento. 353 Window, clase. 352 v erilícación de consistencia (excepciones!, 418 Vt'riSign, 431

WArn-OKANSWKR, estado

weighly, restricción, 307 WIDTII, atriliulu (<AP1'I.KT>

vveiglilx, restricción, 3(17

d.M-íi.tí,

l'ATH, inslrucción,

WINDOW i:XI'().Si:, ivinl.i, .V,2

virili'O. inri.ido. 439, 455

WINI)OW_M()\'KI), evento, 362

Wrilel'riiius, aplicación.

»indo»ClosedO, método, 544

'.>iiid(ivv()|)ened(I. mélodo.

184

636-638

errores Class ñor found,

l'venío, 362

(TriviaServerl, 473 W.AITFORCONI'IKM, oslado \Veb, publicación (|c iipjjlils,

CLASSPATH. insimcción

WINI)O\V_I)KSTROY, evinió,

YVAITKOKCI.IIiNT.iMado

(TriviaServer), 473

23-24.631-633

Window, clase, 352 ■

»¡iidovvClosiii);(),mélodo, 544 Windoul.i.siener, escucha de

(l'riviaServcr), 47J

configuración del JDK,

eliíjiiela). 60

WINDOW l< (INII \, ,,,„!„, _\¡,<

(i.t I 611 vvi iú-fiiM I ihi'IIiimI, 452

450-451

urilcSl reamo, inélodo, 448

i-vrnli», 532 5-14

Windows 95/Windovvs NT aplicaciones de Java compilar. 2S-3I)

ejccuiar. 30

615|

x-z XOií, operador, H.í /ip, archiveros, l*>0


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.