1.- Los vectores nos permiten hacer arreglos de cualquier tipo de objeto, y referirnos individualmente a cualquier elemento del vector, aunque para utilizarlos (debido a que para java el vector contiene objetos genéricos) tendremos que decirle qué clase de objeto es mediante un "cast". Vamos a ver cómo quedan nuestras clases Ejemplo16 (ex Ejemplo15) y miCanvas:
import java.awt.*;
import java.util.*;
import java.applet.Applet;
public class
Ejemplo16 extends Applet {
public void init() {
................ (esta parte no cambia)................
}
}
class miCanvas extends Canvas {
Vector v = new Vector(); inicializamos con tamaño indeterminado
Java se encarga de manejar la memoria necesaria!
public boolean mouseDown(Event e, int x, int y) {
v.addElement( new Rectangle(x, y, 0, 0) ); nuevo elemento!
repaint();
return false;
}
public boolean mouseDrag(Event e, int x, int y) {
Rectangle r = (Rectangle)v.lastElement(); cast: v son rectángulos
r.resize( x - r.x, y - r.y ); (creé r sólo por claridad)
repaint();
return false;
}
public boolean mouseUp(Event e, int x, int y) {
Rectangle r = (Rectangle)v.lastElement(); cast: v son rectángulos
r.resize( x - r.x, y - r.y ); (creé r sólo por claridad)
repaint();
return false;
}
public void paint(Graphics g) {
int i; contador de rectángulos
Dimension d = size();
g.setColor(Color.red);
g.drawRect(0, 0, d.width-1, d.height-1);
g.setColor(Color.blue);
if (v.size() > 0)
for (i=0; i<v.size(); i++) {
Rectangle box = cortarRect( (Rectangle)v.elementAt( i ), d);
g.drawRect(box.x, box.y, box.width-1, box.height-1);
}
}
........................ (el resto no cambia) ........................
}
Les sugiero utilizar un HTML que reserve espacio suficiente para ver todo el applet, como:
<HTML>
<HEAD>
<TITLE>Ejemplo 16 - Ejemplo con canvas</TITLE>
</HEAD>
<BODY>
<applet code="Ejemplo16.class"
width=300 height=250>
</applet>
</BODY>
</HTML>
Veamos los pasos ahora. En primer lugar creamos una variable (global a la clase) llamada v, de clase Vector, y sin asignarle un tamaño definido:
Vector v = new Vector();
Al crear un nuevo rectángulo agregamos un elemento (objeto) al vector mediante el método add:
v.addElement( new Rectangle(x, y, 0, 0) );
Para acceder a un atributo de un objeto del vector no basta utilizar directamente el vector, como:
v.lastElement().x
(lastElement() nos permite acceder al último elemento agregado al vector). Es necesario aclarar explícitamente que el elemento en cuestión es un rectángulo, ya que el vector puede contener objetos de cualquier tipo. Para eso usamos el
casting:
(Rectangle)v.lastElement().x
En nuestro código original reemplazaríamos por:
(Rectangle)v.lastElement().resize( x - (Rectangle)v.lastElement().x, ......
Pero es más claro si usamos una variable local de clase Rectangle, le asignamos el mismo objeto que acabamos de agregar al vector, y lo usamos en su lugar:
Rectangle r = (Rectangle)v.lastElement();
r.resize( x - r.x, y - r.y );
Finalmente, en el método paint() no podemos asignar el elemento hasta no saber que existe (originalmente el vector estaba vacío!). Así que un if nos permite verificar que el tamaño del vector es mayor que cero (tiene elementos), y un for nos permite dibujarlos uno por uno.
Se puede acceder a todos los elementos, uno por uno, mediante el método elementAt(x), que nos da el x-ésimo elemento del vector. El método size() nos da la cantidad de elementos (el primero es el número 0, y así):
if (v.size() > 0)
for (i=0; i<v.size(); i++) {
Rectangle box = cortarRect( (Rectangle)v.elementAt( i ), d);
g.drawRect(box.x, box.y, box.width-1, box.height-1);
}
Aquí no hemos creado variables intermedias ya que igualmente es claro (eso creo...).