Tengo una aplicación Java que usa un SwingWorker para actualizar una etiqueta y una barra de progreso en la GUI y funciona bien. Sin embargo, me gustaría agregar una función a esta configuración.cómo actualizar GUI desde swingworker que devuelve dos valores diferentes
Mi oscilador trabajador realiza una tarea que tiene longitud n
, y repite esa tarea m
veces. En este momento, mi GUI solo me dice la cantidad de tiempo que la tarea se repitió, pero me gustaría que me diga también en qué extensión de la tarea estamos. Diga n=300
y m=50
, me gustaría algo como:
Task 49 is at 248()
Task has been repeated 48 times
¿Qué debo modificar en mi SwingWorker?
/**
*
* @author digitaldust
*/
public class Model extends SwingWorker<Integer, Integer> {
private HashMap<String, Number> GUIparams;
private int session;
private int ticks;
Model(HashMap<String, Number> KSMParams) {
GUIparams = KSMParams;
session = (Integer)GUIparams.get("experimentsInSession");
ticks = (Integer)GUIparams.get("howManyTicks");
}
/**
* Actual simulation
*/
@Override
protected Integer doInBackground() throws Exception {
int i=0;
while(!isCancelled() && i<session){
i++;
int ii=0;
while(!isCancelled() && ii<ticks){
// this is n, the task length and I'd like to update the GUI with this value
ii++;
}
System.out.println(i);
// this is m, how many time the task has been repeated, and now it is updated in the GUI
publish(i);
setProgress(i);
Thread.sleep(1000);
}
return i;
}
/**
* Invoked when simulation exits
*/
@Override
protected void done() {
if (isCancelled()) {
Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session cancelled by user. Closing Session...");
} else {
// do stuff
Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session ended.");
}
}
}
+1: misma idea que la mía, pero tarde. –
gracias por la pista, solo una cosa menor: ¿cómo recupero ahora el valor de la GUI? Mi código ya no funciona: if ("progress" .equals (evt.getPropertyName())) { progressBar.setValue ((Entero) evt.getNewValue()); showTaskLabel.setText ("Experimento" + (Entero) evt.getNewValue() + "concluido".);} Gracias de nuevo por la ayuda. – user299791
@SimoneGabbriellini Parece que estás escuchando la propiedad 'progress'. Esta propiedad es 'Entero 'y puede usarla para actualizar una barra de progreso como en su comentario. Para tener acceso a los resultados de progreso intermedios, debe anular el método 'process()'. Ver mi edición para un ejemplo. – tenorsax