El propósito del applet es el de seleccionar el color y el tamaño de una fuente de texto, para dibujar un texto pulsando el botón izquierdo del ratón sobre la superficie de un canvas. El texto se introduce en un control de edición
Pulsando el botón Borrar se limpia la superficie del canvas.
Se diseña el applet dividiendo las tareas entre la clase que deriva de Applet (el interfaz de usuario) y la clase que deriva de Canvas (la representación gráfica).
En modo diseño (pestaña Design) situar en su parte superior un panel denominado panelControl. Sobre este panel colocar tres paneles (véase la figura)
El primero panelColor contiene un control Label cuyo título es “Colores” y un control Choice (choiceColores) con los nombres de varios colores, por ejemplo, azul, rojo, negro, y verde.
El segundo, panelTamano contiene un Label cuyo título es “Tamaño” y un control Choice (choiceTamano) con los siguientes datos 12, 16, 24, 32.
El tercero panelIntro contiene un control Button (buttonBorrar) cuyo título es “Borrar” y un control TextField (textIntro) con un texto inicial “Escribir aquí”.
Crear un único listener y una única función respuesta para los dos controles tipo Choice. En dicha función respuesta, crear un objeto de tipo Font, usando como fuente “TimesRoman”, estilo negrita, y el tamaño seleccionado en el control choiceTamano.
Crear un objeto de la clase Color dependiendo de nombre del color seleccionado en el control choiceColor.
Usar las funciones getSource() y getItem() de la clase ItemEvent, para conocer sobre cuál de los dos controles del tipo Choice se está actuando y cuál es el elemento (item) que ha sido seleccionado en dicho control.
En esta función respuesta, llamar a la función apropiada de la clase derivada de Canvas para pasarle información acerca del color y de la fuente de texto (el objeto de la clase Font y el objeto de la clase Color) al objeto canvas.
Crear un annonymous adapter para responder a las acciones del usuario sobre el botón titulado Borrar.
En la función respuesta llamar a la función apropiada de la clase derivada de Canvas para limpiar el canvas de los textos dibujados.
Crear un objeto de una clase que se encargue de filtrar los caracteres que se introducen en el control de edición textIntro. De modo, que solamente aparezcan caracteres alfabéticos y no aparezcan los caracteres numéricos
La clase que deriva de Canvas ha de implementar el interface MouseListener para responder a la acción de pulsar el botón izquierdo del ratón.
En la función respuesta a la pulsación del botón izquierdo del ratón, mousePressed, se realizan la siguiente tarea: se dibuja el texto con el color y la fuente de texto seleccionada en la posición en la que se ha pulsado el botón izquierdo del ratón.
La información sobre el texto, el color, la fuente y las coordenadas del punto donde se ha pulsado el botón izquierdo del ratón se guardan en sus respectivos arrays para que se vuelvan a repintar cada vez que se oculta parcialmente o totalmente la superficie del applet. Cada vez que se pulsa el botón izquierdo del ratón, se guarda en arrays, las coordenadas del punto, la fuente de texto, el color empleado, y el texto dibujado.
Redefinir paint para dibujar en el canvas los textos guardados en el array, con los colores, fuentes y tamaños empleados y en la posición original.
Se diseña el applet dividiendo las tareas entre la clase que deriva de Applet (el interfaz de usuario) y la clase que deriva de Canvas (la representación gráfica).
En modo diseño (pestaña Design) situar en su parte inferior un panel denominado panelControl. Sobre este panel colocar dos paneles (véase la figura)
El primero, panelVelocidad contiene un Label cuyo título es “velocidad inicial <100 m/s” y un control TextField (textVelocidad) .
El panelBoton contiene un control Button (buttonTrayectorias) cuyo título es “Trayectorias”.
Cada vez que se introduzca un valor menor o igual que cero o mayor que 100 en el control de edición textVelocidad el control recupera el foco y se seleccionan todos los caracteres de dicho control.
En la función respuesta a la acción de pulsar el botón buttonTrayectorias, se ha de pasar el dato de la velocidad inicial al canvas llamando a la función miembro apropiada.
Datos sobre el tiro parabólico
Ecuación de la trayectoria
![]()
El alcance máximo se obtiene para el ángulo de 45º y es
![]()
La altura máxima se alcanza cuando el ángulo de disparo es de 90º
![]()
A continuación se da una plantilla que sugiere un posible procedimiento de crear la clase derivada de Canvas.
|
public class MyCanvas extends Canvas { //anchura
y altura del canvas int
wAncho, wAlto; //anchura
y altura de un carácter int
cAlto, cAncho; //orígenes int
orgX, orgY; //escalas double
escalaX, escalaY; //Velocidad
inicial double
vInicial; //ángulos
de tiro final int[] angulos={10, 20, 30, 40,
50, 60, 70, 80}; final int NPARTICULAS=angulos.length; //alcances double[]
alcance=new double[NPARTICULAS]; //para
guardar los puntos de la trayectoria Polygon[] pol=new Polygon[NPARTICULAS]; int divisionesX; //divisiones del eje X int divisionesY; //divisiones del eje Y
double dx; //paso boolean bNuevo=false; public MyCanvas() { //crear
el array de objetos Polygon //establecer
el color de fondo } void
origenEscalas(Graphics g){ //ancho
y alto de applet wAncho= wAlto= //dimensiones
de los caracteres cAncho= cAlto= //orígenes orgX= orgY= } void
setNuevo(double velocidad){ //inicializa
el miembro dato vInicial //calcula
el alcance para cada ángulo de tiro //calcula el alcance máximo a 45º
//divisiones cada 50 m, determinar escala horizontal escalaX //calcula la altura máxima a 90º
/divisiones cada 25 m, determinar
escala vertical escalaY //el
paso dx } void
dibujaEjes(Graphics g){ int
x1, y1; //dibuja
el eje Y, las divisiones cada 25 m //dibuja
el eje X las divisiones cada 50 m } double
posicion(int angulo, double x){ //ecuación
de la trayectoria para cada ángulo de tiro } public
void trayectorias(Graphics
g){ //determina las coordenadas de cada punto (pixel) de la trayectoria en el //canvas y las guarda en su
respectivo elemento del array de la clase Polygon
int x1,
y1; for(int i=0;
i<NPARTICULAS; i++){ for(double x=0.0;
x<alcance[i]; x+=dx){ x1=… y1=… pol[i].addPoint(x1, y1);
} } //dibuja
todas las trayectorias //muestra
el ángulo y el valor del alcance en forma de tabla } public
void paint(Graphics g){ origenEscalas(g); dibujaEjes(g); if(bNuevo) trayectorias(g); } } |