Esta p�gina ofrece algunos ejemplos de uso de threads relacionados con el API de Swing. Para informaci�n concpetual, puedes ver Threads y Swing.
�Usar el m�todo invokeLater
Podemos llamar al m�todo invokeLater desde cualquier thread para pedir que el thread de despacho de eventos ejecute cierto c�digo. Debemos poner este c�digo en el m�todo run de un objeto Runnable y especificar ese objeto Runnable como el argumento de invokeLater. El m�todo invokeLater retorna inmediatamente, sin esperar a que el thread de despacho de eventos ejecute el c�digo. Aqu� hay un ejemplo de uso de invokeLater>
Runnable doWorkRunnable = new Runnable() {
public void run() { doWork(); }
};
SwingUtilities.invokeLater(doWorkRunnable);
�Usar el m�todo invokeAndWait
El m�todo invokeAndWait es exacatamente igual que invokeLater, excepto en que no retorna hasta que el thread de despacho de eventos haya ejecutado el c�digo especificado. Siempre que sea posible debemos usar invokeLater en vez de invokeAndWait. Si usamos invokeAndWait, debemos asegurarnos de que el thread que llama a invokeAndWait no contiene ning�n bloqueo que otros threads podr�an necesitar mientras ocurra la llamada. Aqu� hay un ejemplo de uso de invokeAndWait.
void showHelloThereDialog() throws Exception {
Runnable showModalDialog = new Runnable() {
public void run() {
JOptionPane.showMessageDialog(myMainFrame,
"Hello There");
}
};
SwingUtilities.invokeAndWait(showModalDialog);
}
De forma similar, un thread que necesite acceso al estado del GUI, como el contenido de un par de campos de texto, podr�a tener el siguiente c�digo.
void printTextField() throws Exception {
final String[] myStrings = new String[2];
Runnable getTextFieldText = new Runnable() {
public void run() {
myStrings[0] = textField0.getText();
myStrings[1] = textField1.getText();
}
};
SwingUtilities.invokeAndWait(getTextFieldText);
System.out.println(myStrings[0] + " " + myStrings[1]);
}
�C�mo Crear Threads
Si podemos evitarlo, no debemos usar threads. Los threads pueden ser dif�ciles de usar, y hacen los programas muy duros de depurar. En general, no son necesarior para el trabajo estricto del GUIm como actualizar las propiedades de un componente.
Sin embargo, algunas veces, los threads son necesarios. Aqu� tenemos algunas situaciones t�picas en las que se usan threads.
- Para realizar tareas que llevan mucho tiempo sin bloquear el thread de despacho de eventos (ejemplos de esto pueden ser los c�lculos intensivos, o las tareas de inicializaci�n).
- Para realizar una operaci�n de forma repetida, normalmente con periodo de tiempo dererminado entre operaciones.
- Para esperar mensajes de clientes.
Podemos usar dos clases para ayudarnos a implementar threads.
- SwingWorker: Crea un thread en segundo plado que ejecuta operaciones que consumen mucho tiempo.
- Timer: Crea un thread que ejecuta alg�n c�digo una o m�s veces, con un retardo especificado por el usuario entre cada ejecuci�n. Para m�s informaci�n sobre los timers, puedes ver C�mo usar Timers.
�Usar la clase SwingWorker
La clase SwingWorker est� implementada en SwingWorker.java, que no est� en la versi�n Swing. SwingWorker hace todo el trabajo sucio de implementar un thread en segundo plano. Aunque muchos programas no necesitan este tipo de threads, son muy �tiles para realizar tareas que consumen mucho tiempo, y pueden aumentar el rendimiento percibido del programa.
Para usar la clase SwingWorker, primero debemos crear una subclase de ella. En la subclase, debemos implementar el m�todo construct para que contenga el c�digo que realiza la operaci�n. cuando ejemplarizemos nuestra subclase de SwingWorker, SwingWorker crea un thread que llama a nuestro m�todo construct. Cuando necesitemos el objeto devuelto por el m�todo construct, llamaremos al m�todo get de SwingWorker. Aqu� tenemos un ejemplo de uso de SwingWorker.
...//in the main method:
final SwingWorker worker = new SwingWorker() {
public Object construct() {
return new ExpensiveDialogComponent();
}
};
...//in an action event handler:
JOptionPane.showMessageDialog
(f, worker.get());
Cuando el m�todo main del programa crea el objeto SwingWorker, inmediatamente se arranca un nuevo thread que ejemplariza ExpensiveDialogComponent. El m�todo main tambi�n construye un GUI que consiste en una ventana con un bot�n.
Cuando el usuario pulsa el bot�n, el programa se bloquea, si es necesario, hasta que se haya crreado ExpensiveDialogComponent. Entonces el programa muestra el dialo modal que contiene ExpensiveDialogComponent. Puedes encontrar el programa completo en PasswordDemo.java. Tambi�n, el programa de ejemplo propocionado en C�mo Monitorizar el Progreso ejecuta una larga tarea en un theead SwingWorker.