Si se va a manejar una clase heredada con comportamiento
de thread, Runnable es la solucion correcta. El presente ejemplo presenta esto
haciendo una clase Runnable Canvas que pinta diferentes colores en el lienzo.
Esta aplicación permite el ingreso desde la linea de comandos del numero de
colores a presentar y el tamaño de la pausa en milisegundos para cambiar los
colores en el lienzo.
ColorBoxes es una
aplicación típica con un constructor que activa el GUI. Éste toma un argumento
de int grid para activar el GridLayout. Luego agrega el numero apropiado de
objetos Cbox para llenar la rejilla, pasando el valor de la pausa a cada uno.
En main() se pueden ver los valores por default de pause y grid, los cuales
pueden cambiarse por aquellos pasados desde la linea de comandos.
Cbox es donde se hace
todo el trabajo. Este es heredado de Canvas e implementa la interface Runnable
de tal manera que que cada Canvas se comporte como un Thread. Recuerda que
cuando implementas Runnable, no estas creando un objeto Thread, solo una clase
que tiene un método run(). Asi, deberás crear explicitamente un objeto Thread y
manejar el objeto Runnable desde el constructor, luego llamar start(). En Cbox
este thread se llama t.
Note que el arreglo colors es una enumeracion de todos
los colores en la clase Color. Este es usado en newColor() para producir
aleatoriamente un color. El color de la celda actual es cColor. paint() es muy
simple – solo pone el color en cColor y llena el lienzo entero con ese color.
En run(), se ve el ciclo infinito que pone el color
cColor a un nuevo color aleatorio y luego llama a repaint() para mostrarlo. Luego
el thread va a sleep() el tiempo especificado en main().
Precisamente porque este diseño es flexible y el
threading esta ligado a cada elemento Canvas, puedes experimentar haciendo
tantos thread como quieras. (En realidad, hay una restricción impuesta por el
número de thread que tu JVM puede manejar confortablemente).
//:
ColorBoxes.java
// Using
the Runnable interface
import
java.awt.*;
import
java.awt.event.*;
class
CBox extends Canvas implements Runnable {
private Thread t;
private int pause;
private static final Color[] colors = {
Color.black, Color.blue, Color.cyan,
Color.darkGray, Color.gray,
Color.green,
Color.lightGray, Color.magenta,
Color.orange, Color.pink, Color.red,
Color.white, Color.yellow
};
private Color cColor = newColor();
private static final Color newColor() {
return colors[
(int)(Math.random() * colors.length)
];
}
public void paint(Graphics g) {
g.setColor(cColor);
Dimension s = getSize();
g.fillRect(0, 0, s.width, s.height);
}
public CBox(int pause) {
this.pause = pause;
t = new Thread(this);
t.start();
}
public void run() {
while(true) {
cColor = newColor();
repaint();
try {
t.sleep(pause);
}
catch(InterruptedException e) {}
}
}
}
public
class ColorBoxes extends Frame {
public ColorBoxes(int pause, int grid) {
setTitle("ColorBoxes");
setLayout(new GridLayout(grid,
grid));
for (int i = 0; i < grid * grid;
i++)
add(new CBox(pause));
addWindowListener(new
WindowAdapter() {
public void
windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
int pause = 50;
int grid = 8;
if(args.length > 0)
pause =
Integer.parseInt(args[0]);
if(args.length > 1)
grid =
Integer.parseInt(args[1]);
Frame f = new ColorBoxes(pause,
grid);
f.setSize(500, 400);
f.setVisible(true);
}
} ///:~
Una vez compilado,
el programa se puede correr con argumentos o sin ellos.
java ColorBoxes ¿ Que es equivalente a java ColorBoxes 50
8
java ColorBoxes 25
16 ¿ La
pausa es de 25 mseg y la rejilla tendra 16 celdas.
No hay comentarios:
Publicar un comentario