Guión de la práctica 13 (formato*)

Anuncio
3UiFWLFD
San Sebastián, mayo 1999
3URJUDPDFLyQ-DYD
-DYLHU*DUFtDGH-DOyQÂ -RVp,JQDFLR5RGUtJXH]
$OIRQVR%UD]iOH]Â $OEHUWR/DU]DEDOÂ -HV~V&DOOHMDÂ -RQ*DUFtD
Informática 2: Práctica nº 13
página 1
INDICE
Ejercicio 1:
Ejercicio 2:
Ejercicio 3:
Ejercicio 4:
Ejercicio 5:
Ejercicio 6:
Mensajes desde un applet .................................................................................................................. 1
Mensajes desde un applet 2 ............................................................................................................... 3
Cargar una imagen JPEG en un applet o aplicación.......................................................................... 3
Cargar una imagen JPEG en un applet o aplicación adaptándola al tamaño del panel o ventana ..... 4
Crea la clase Osciloscopio con una imagen estática.......................................................................... 4
Crea la clase Osciloscopio2, incluyendo animación.......................................................................... 5
Antes de comenzar la práctica abre el Windows Explorer y comprueba que se ha creado de modo
automático en tu disco G:\ un directorio llamado Inf2prac13. No deberás moverlo a otro
subdirectorio ni cambiarle de nombre. Por motivos de orden es importante que todos los ejercicios
de esta práctica se creen dentro de este directorio, porque esta semana se recogerá la práctica.
Como recomendación general, mantén abierto el Windows Explorer y comprueba de vez en
cuando que los proyectos de los distintos ejercicios se están guardando correctamente. Hay que
evitar copiar los ejercicios de otra persona, principalmente porque así no se aprende a programar: a
programar sólo se aprende programando.
Puedes utilizar también Windows Explorer para ayudar a Visual J++ 6.0 a crear un proyecto
nuevo a partir de los ficheros del anterior.
Ejercicio 1:
Mensajes desde un applet
Crea un proyecto llamado Ejer1 en el directorio de la práctica.
En este ejercicio se trata de crear un applet que envíe mensajes al usuario y que pueda trabajar
también como aplicación. Por lo demás, lo único que hace es escribir “Hola” en un panel de
300x200 pixels. El fichero HTML se llamará Prueba1.htm y contendrá las siguientes sentencias:
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Mensajes desde un applet</TITLE>
</HEAD>
<BODY>
<H3>Envío de mensajes desde un applet</H3>
<APPLET
code="Mensajes.class"
height="200" width="300">
</APPLET>
</BODY>
</HTML>
Después de crear este fichero se debe crear la clase principal del programa que se llama
Mensajes. El fichero se llamará Mensajes.java y contendrá las siguientes sentencias:
// fichero Mensajes.java
import java.applet.*;
import java.awt.*;
public class Mensajes extends Applet {
// Variable miembro
boolean aplicacion = false;
Informática 2: Práctica nº 13
página 2
public void start() {
//la siguiente sentencia sólo ejecutando como applet
if (aplicacion==false) {
this.getAppletContext().showStatus("Ejecutando el metodo start()");
}
System.out.println("Ejecutando el metodo start()");
}
public void stop() {
//la siguiente sentencia sólo ejecutando como applet
if (aplicacion==false) {
this.getAppletContext().showStatus("Ejecutando el metodo stop()");
}
System.out.println("Ejecutando el metodo stop()");
System.out.flush();
}
public void paint(Graphics g) {
g.setFont(new Font("serif", Font.BOLD, 24));
g.drawString("Hola", 100, 100);
}
// programa principal para ejecutarse como aplicación
public static void main (String[] args) {
Mensajes ms = new Mensajes();
VentanaCerrable vc = new VentanaCerrable("Mensajes");
vc.setSize(300, 200);
vc.setLocation(100, 100);
vc.add(ms, "Center");
vc.show();
ms.aplicacion = true;
ms.init();
ms.start();
}
} // fin de la clase mensajes
Entre los aspectos interesantes de este ejercicio está la posibilidad de ejecutarse como applet y
como aplicación. Para poderse ejecutar como applet la clase Mensajes deriva de Applet; para ser
también una aplicación independiente se ha incluido un método main() que crea un objeto de la
clase VentanaCerrable y un objeto de la clase Mensajes, introduciendo este último en la parte
central del primero. Obsérvese que como las applets no llaman al constructor, en la clase Mensajes
no se ha definido ningún constructor: su papel lo hace el método init(), que debe ser llamado
explícitamente en el método main(), al igual que el método start().
Este ejemplo escribe dos tipos de mensajes: uno a través de la barra de estado (con el método
showStatus()) y otro a través de la salida estándar System.out, que para las aplicaciones es la
consola de MS-DOS y para las applets la JavaConsole de Netscape Navigator o Internet Explorer.
Observa que llamar al método showStatus() de la clase Applet no tiene sentido cuando el
programa se está ejecutando como aplicación. Cuando un mismo programa tiene que funcionar
como applet y aplicación esto puede suceder con bastante frecuencia por distintos motivos. En este
caso lo que hay que hacer es definir en la clase Mensajes una variable miembro tipo boolean que
permita saber si el programa se está ejecutando como applet o como aplicación. Por defecto esta
variable es false, pero si se ejecuta main() se pone a true.
Los ficheros para ejecutar este ejercicio están en el directorio Q:\Infor2\Prac13\Ejer1.
¿Qué sucede al ejecutar este programa como applet? ¿Consigues ver los mensajes en la barra
de estado de Netscape? La impresión es que los mensajes salen pero que sólo están visibles
mientras se ejecutan los métodos start() y stop(), que es un tiempo demasiado corto, pero ¿se
muestra de verdad? Para salir de dudas, resuelve el siguiente ejercicio.
Informática 2: Práctica nº 13
Ejercicio 2:
página 3
Mensajes desde un applet 2
Crea con Visual J++ un proyecto llamado Ejer2 en el directorio de la práctica Inf2prac13. Copia a
este directorio los ficheros Mensajes.java y VentanaCerrable.java resultado del ejercicio anterior.
Cámbiales el nombre por Mensajes2.java y VentanaCerrableApplet.java. El ejecutable modelo de
cómo debe quedar este ejercicio está en el directorio Q:\Infor2\Prac13\Ejer2. Ejecuta este
programa como applet y como aplicación y observa lo que ocurre cuando se cambia de página
(applet) o se cierra la ventana (aplicación).
Este ejercicio tiene dos finalidades:
1. Introducir un tiempo de espera de tres segundos en los métodos start() y stop() de modo
que el mensaje en la barra de estado sea apreciable. Para ello se puede utilizar el método
sleep() de la clase Thread, pero para utilizar este método hay que obtener una referencia
al thread activo con el método currentThread() de la clase Thread, que es un método
static.
2. Además hay que modificar la clase VentanaCerrable (ahora VentanaCerrableApplet) de
modo que antes de abandona la aplicación en el evento WindowClosing llame al método
stop() de la clase Mensajes2. Como dicho método tiene una espera de tres segundos, la
ventana tardará tres segundos en cerrarse.
Ejercicio 3:
Cargar una imagen JPEG en un applet o aplicación
Crea un proyecto llamado Ejer3 en el directorio de la práctica Inf2prac13. Copia a este directorio
los ficheros Imagen1.java, VentanaCerrable.java y PruebaImagen1.htm que se encuentran en
Q:\Infor2\Prac13\Ejer3. Prueba a ejecutar el programa como applet y como aplicación. Como
aplicación se basará en una ventana de 400x300 pixels.
A continuación se muestra el fichero PruebaImagen1.htm, que incluye una llamada al applet:
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Imágenes cargadas en un applet</TITLE>
</HEAD>
<BODY>
<H3>Ejemplo de imágenes cargadas en un applet</H3>
<APPLET code="Imagen1.class" height="200" width="400">
</APPLET>
</BODY>
</HTML>
La clase Imagen1 debe incluir una imagen llamada Barsa.jpg. Para crear una imagen se debe
utilizar el método getImage(). La cosa está en que este método es diferente si se trata de un applet
(el método será Applet.getImage()) o de una aplicación (el método será Toolkit.getImage()).
Después de cargar la imagen es necesario representarla con el método drawImage() de la
clase Graphics, dentro del método paint().
Este programa funciona correctamente como aplicación tanto desde MS-DOS como desde
Visual J++. Como applet funciona correctamente desde appletviewer y desde Internet Explorer
4.0, pero falla desde Netscape Navigator 4.5. El resultado de este ejercicio es una imagen como la
mostrada en la Figura 1.
Informática 2: Práctica nº 13
página 4
Figura 1. Vista parcial de un equipo de fútbol que puede ganar la Liga.
Puede comprobarse que la imagen se representa sólo parcialmente, porque su tamaño es más
grande que el de la ventana.
Ejercicio 4:
Cargar una imagen JPEG en un applet o aplicación adaptándola al
tamaño del panel o ventana
Crea un proyecto llamado Ejer4. Los modelos y el ejecutable de este ejercicio están en el directorio
Q:\Infor2\Prac13\Ejer4. El resultado de este ejercicio se muestra en la Figura 2. En este caso la
ventana tiene un tamaño de 700x300 pixels.
Figura 2. Imagen algo antigua de un equipo que puede ganar la Liga.
Fundamentalmente, en este ejercicio se trata de adaptar la imagen al tamaño de la ventana.
Para ello se puede utilizar el método getScaledInstance() de la clase Image, que permite cambiar el
tamaño de la imagen, conservando o no la proporción entre altura y anchura.
Ejercicio 5:
Crea la clase Osciloscopio con una imagen estática
Crea un nuevo proyecto llamado Ejer5. En este ejercicio se trata una vez más de crear un applet que
pueda ser también ejecutado como aplicación. Se trata simplemente de dibujar una función
sinusoidal en un panel de 400x 300 pixels, según se puede ver en la Figura 3. El applet muestra un
aspecto similar. El fichero que contiene la clase se llamará Osciloscopio.java y el fichero HTML
que llama al applet tendrá por nombre PruebaOscilos.htm. Una vez más hará falta también utilizar
el fichero VentanaCerrable.java.
La función sinusoidal a dibujar responde a la expresión matemática siguiente,
Informática 2: Práctica nº 13
página 5
x(t ) = X sin(ωt + ϕ )
(1)
donde X es la amplitud, ω la frecuencia natural y ϕ el ángulo de desfase. Otras variables que
determinan este problema son las siguientes:
T
es el tiempo total representado (la anchura de la ventana en segundos)
n
número de periodos representados (en la Figura 3, 5 periodos)
d
objeto de la clase Dimension que contiene las dimensiones (anchura y altura) en pixels
del panel en el que se realiza el dibujo.
Figura 3. Pantalla principal de Osciloscopio ejecutado como aplicación.
La relación entre la frecuencia ω y el periodo T/n es la siguiente:
ω=
2πn
T
(2)
Para realizar este dibujo se puede utilizar el método drawLine() de la clase Graphics. La línea
curva se dibuja como una sucesión de pequeños segmentos rectos. Por ejemplo, en la Figura 3 se
han utilizado 20 segmentos por periodo, es decir 100 segmentos en total.
Los ficheros ejecutables de este ejercicio que pueden ser utilizados como modelo se
encuentran en el directorio Q:\Infor2\Prac13\Ejer5. Ejecútalos como aplicación y como applet
observando bien su funcionamiento.
Ejercicio 6:
Crea la clase Osciloscopio2, incluyendo animación
Crea un nuevo proyecto llamado Ejer6. Del ejercicio anterior copia en él los ficheros
Osciloscopio.java, PruebaOscilos.htm y VentanaCerrable.java. Al primero de ellos cámbiale el
nombre por Osciloscopio2.java.
En este ejercicio se trata de modificar el ejercicio anterior para dar animación a los gráficos.
La gráfica de la Figura 3 se modificará cambiando el parámetro ϕ, que aparece en la fórmula (1). Se
deberá generar una nueva imagen cada 100 milisegundos. La diferencia entre dos imágenes
sucesivas será un incremento en el ángulo ϕ de π/24 radianes.
Para realizar este ejercicio se recomienda seguir los siguientes pasos:
1. Hacer que la clase Osciloscopio2 implemente la interface Runnable. Esto hará que el
método run() del thread que se encargará de la animación se pueda definir dentro de la
propia clase Osciloscopio2.
Informática 2: Práctica nº 13
página 6
2. La clase Osciloscopio2 definirá como nueva variable miembro una variable boolean
llamada running que indicará si la animación está corriendo o no. De esta variable
dependerá que el método run() siga ejecutándose o no. Además se definirá una nueva
variable miembro de la clase Thread.
3. El método start() de Osciloscopio2 creará un thread pasando a su constructor la referencia
this, para indicar que es la propia clase Osciloscopio2 la que proporciona el método run().
Después deberá poner la variable miembro running a true y llamar al método start() del
thread.
4. El método stop() deberá poner la variable running a false para que el método run()
concluya y se detenga el thread.
Es relativamente sencillo realizar este ejercicio introduciendo threads y animación. Es un
buen ejemplo de cómo se pueden construir este tipo de aplicaciones.
Los ficheros ejecutables de este ejercicio se encuentran en Q:\Infor2\Prac13\Ejer6.
Ejecútalos como aplicación y como applet observando bien su funcionamiento.
Descargar