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:
r»
%
- ■»
./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
f§
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.
fí
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"
E«
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 '
n°
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
Oí
«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
&>-
x¡
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
wí
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
Oí
-H
Oí
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
t»
¿■í
^
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-
fü
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.
Sí
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
6Ü
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
sí
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>
Uü
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 '—
CÜ
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
tí
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
jí
«
..
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
Sí
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 ^
cí
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