
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");
}
}
}
}
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


0