Según tengo entendido, si inicio otro hilo para realizar algunas acciones, necesitaría SwingUtilities.invokeAndWait
o SwingUtilities.invokeLater
para actualizar la GUI mientras estoy en dicho hilo. Por favor corrígeme si estoy equivocado.Swing Threading de Java
Lo que intento lograr es relativamente sencillo: cuando el usuario hace clic en enviar, quiero (antes de realizar cualquier acción) deshabilitar el botón Enviar, realizar la acción y, al final de la acción, volver a habilitar el botón. Mi método para realizar la acción actualiza la GUI directamente (muestra resultados) cuando recupera los resultados.
Esta acción básicamente consulta un servidor y obtiene algunos resultados.
Lo que tengo hasta ahora es:
boolean isRunning = false;
synchronized handleButtonClick() {
if (isRunning == false) {
button.setEnabled(false);
isRunning = true;
doAction();
}
}
doAction() {
new Thread() {
try {
performAction(); // Concern A
} catch (...) {
displayStackTrace(...); // Concern B
} finally {
SwingUtilities.invokeLater (/* simple Runnable to enable button */);
isRunning = false;
}
}
}
Para ambos de mis preocupaciones anteriores, no tendría que utilizar SwingUtilities.invokeAndWait
ya que ambos van a actualizar la interfaz gráfica de usuario? Todas las actualizaciones GUI giran en torno a la actualización JTextPane
. ¿Debo verificar mi hilo si estoy en EDT y, de ser así, puedo llamar a mi código (independientemente de si actualiza la GUI o no) y NO usar SwingUtilities.invokeAndWait
?
EDIT: Esto es lo que estoy haciendo ahora:
handleButtonClick() {
if (isRunning == true)
return;
disable button;
SwingWorker task = new MyTask();
task.execute();
}
...inside MyTask
doInBackground() {
return performAction();
}
done() {
result = get();
enable button;
isRunning = false;
interpret result (do most of the GUI updates here);
}
Mientras performAction()
hace algunos cambios GUI, he envuelto aquellos en:
if (SwingUtil.isEDT())
doGUIupdate()
else
SwingUtil.invokeLater(new Runnable() {
run() {
doGUIupdate();
}
});
Esperemos que este es un paso en la dirección correcta , por favor coméntenos si cree que hay mejores formas de manejar mi situación.
Uso SwingWorker. http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html –
Tenía la impresión de que SwingWorker debería usarse para algo "largo" mientras que SwingUtilities se usó para algo "rápido" ? – nevets1219
Como SwingUtilities se ejecuta en el subproceso "UI", debería utilizarse para que algo rápido sea práctico; de lo contrario, podría bloquear la interfaz de usuario. Ninguno de los dos se ejecutará en "otro hilo". –