Java - Ayuda con SwingWorker

 
Vista:
sin imagen de perfil

Ayuda con SwingWorker

Publicado por Tupo (1 intervención) el 30/06/2017 16:48:57
Buenas, necesito esto para un trabajo. El apartado dice lo siguiente:
B) GUI con SwingWorker y publish
1. Una vez funcione el código del apartado (A), copia el código en un nuevo proyecto. En
este nuevo proyecto, modifica las clases WorkerGenerator y WorkerSubList para que
los elementos de la lista que crea cada una se vayan publicando en su respectivo panel
de la GUI a medida que se van generando. Ten en cuenta que para que las dos hebras
de clase WorkerSubList tengan acceso a la lista en proceso de creación por la hebra de
clase WorkerGenerator, se tiene que proporcionar un método específico, que además
debe estar correctamente sincronizado.

Os resumo lo que hace WorkerGenerator: genera valores aleatorios entre 0 y 1 (uso Math.random()) y listo, y los imprime en un JTextArea. WorkerSubList tiene dos instancias que coge esos valores generados por el WorkerGenerator, e imprime en un JTextArea según cada valor sea <0.5 ó >=0.5.

El problema que tengo es que antes lo hacía con el método done() y tal, y luego cogía los valores con WorkerGenerator.get(), pero ahora debo coger los valores una vez se generen. Sé que hay que usar los métodos publish() y process(), pero no sé cómo coger los valores a tiempo real del WorkerGenerator en el WorkerSublist.

Aquí les paso mis códigos para que me ayuden y me digan que tengo que poner, por favor. Se lo agradezco mucho si me ayudais cuanto antes:

// WorkerGenerator:

import java.util.List;

import javax.swing.SwingWorker;

public class WorkerGenerator extends SwingWorker<Object, Double> {

private int longitud;
private Panel panel;

public WorkerGenerator(int longitud, Panel panel) {
this.longitud = longitud;
this.panel = panel;
}

@Override
protected List<Double> doInBackground() throws Exception {
// TODO Auto-generated method stub


for (int i = 0; i < longitud; i++) {
double value = Math.random();
publish(value);
}

return null;
}

@Override
protected void process(List<Double> values) {
for (Double value : values) {
panel.modifyArea1(value + "\n");
}
}

}


// WorkerSubList:

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.FutureTask;

import javax.swing.SwingWorker;

public class WorkerSubList extends SwingWorker<Object, Double> {
private Panel panel;
private boolean menor;
private WorkerGenerator wg;

public WorkerSubList(Panel panel, WorkerGenerator wg, boolean menor) {
this.panel = panel;
this.menor = menor; /* Sirve para indicar si corresponde a una instancia u otra (lo que he contado del valor 0.5)*/
this.wg = wg;
}

@Override
protected Object doInBackground() throws Exception {
// TODO Auto-generated method stub

/*while(!wg.isDone());
Iterator<Double> iter = wg.lista.iterator();
while(iter.hasNext()){
iter = wg.lista.iterator();
publish(iter.next());
}*/
/*

Iterator<Double> iter = wg.getList().iterator();
while(!wg.isDone() && iter.hasNext()) {
iter = wg.getList().iterator();
publish(iter.next());
}*/

/* Los comentarios son cosas que he intentado, pero me he dado cuenta de que, aun funcionando, no es lo que me piden. */

return null;
}

@Override
protected void process(List<Double> values) {
for (Double value : values) {
if (menor && value < 0.5) {
panel.modifyArea2(value.toString() + "\n");
} else if (!menor && value >= 0.5) {
panel.modifyArea3(value.toString() + "\n");
}
}
}

}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder