Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/12/2010, 12:40
iplazlac
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 4 meses
Puntos: 1
Respuesta: Hacer una barra de progreso con SwingWorker

Hola de nuevo.
Ya lo tengo programado siguiendo tus ejemplos pero no se muy bien por qué la barra no se mueve. He entendido el funcionamiento de doInBackground(), publish(), y process(), envio la barra desde la GUI al genetico mediante constructor (tambien lo he intentado mediante setBarra()).
Lo que más me quema es que yo creo la barra como invisible, la hago visible justo antes de genetico.execute() como explicas pero no se ve (el codigo llega ahi perfectamente), es como si la interfaz no se actualizase.
- Si la creo y la hago invisible no la veo nunca.
- Si la creo y la hago visible desde el principio no se actualiza.
Dejo los trozos de codigo que tienen que ver con el tema.

En el algoritmo genético:
Código JAVA:
Ver original
  1. //Clase
  2. public class AlgoritmoGenetico2 extends SwingWorker<ArrayList<Lugar>, Integer> {
  3.  
  4.   //Atributo de tipo JProgressBar
  5.   private JProgressBar progreso;
  6.  
  7.   //Contructor
  8.       public AlgoritmoGenetico2(String categoria, int rango, MatrizAtraccion matriz, int tamPoblacion, int tamDescendencia, int maxIteraciones, JProgressBar barra) {
  9.         this.categoria = categoria;
  10.         this.rango = rango;
  11.         this.matriz = matriz;
  12.         this.tamPoblacion = tamPoblacion;
  13.         this.tamDescendencia = tamDescendencia;
  14.         this.maxIteraciones = maxIteraciones;
  15.         progreso=barra;
  16.     }
  17.  
  18.   //doInBackground
  19.       @Override
  20.     protected ArrayList<Lugar> doInBackground() throws SQLException {
  21.         ArrayList<Lugar> puntosVisitados = new ArrayList<Lugar>();                      //Array de puntos visitados
  22.         ArrayList<Lugar> poblacionActual = new ArrayList<Lugar>();                      //Array de poblacion actual
  23.         int iteraciones = 0;
  24.         ComparaSatisfaccion comparador = new ComparaSatisfaccion();                     //Comparador de satisfacciones
  25.         poblacionActual = anadirPoblacionInicial(tamPoblacion);                         //Añadimos la primera poblacion
  26.         while (iteraciones < maxIteraciones) {                                          //Mientras no hayamos hecho todas la iteraciones
  27.             for (Lugar lugar : poblacionActual) {                                       //Recorremos lugares de la poblacion
  28.                 lugar = fitness(lugar);                                                 //Evaluamos lugar
  29.                 puntosVisitados.add(lugar);                                             //Añadimos a visitados
  30.             }
  31.             Collections.sort(poblacionActual, comparador);                              //Ordenamos la poblacion por valor
  32.             for (int x = 0; x < tamDescendencia; x++) {                                 //Los mejores
  33.                 poblacionActual.set(x, tenerDescendencia(poblacionActual.get(x)));      //tienen descendencia
  34.             }
  35.             for (int y = tamDescendencia; y < poblacionActual.size(); y++) {            //Los peores
  36.                 poblacionActual.set(y, mutar());                                        //mutan
  37.             }
  38.             iteraciones++;                                                              //iteraciones++
  39.             publish(iteraciones);                                                       //Publicamos iteraciones
  40.             System.out.println("Iteracion " + iteraciones + " de " + maxIteraciones);
  41.         }
  42.         Collections.sort(puntosVisitados, comparador);                                  //Ordenamos puntos visitados
  43.         return puntosVisitados;
  44.     }
  45.  
  46.   //process()
  47.     @Override
  48.     protected void process(List<Integer> publicados) {
  49.         int tantoPorCiento=(publicados.get(0)*100)/maxIteraciones;
  50.         progreso.setValue(tantoPorCiento);
  51.     }
  52. }

En el main (interfaz):
Código JAVA:
Ver original
  1. //Definicion de la barra
  2. jProgressBar1 = new javax.swing.JProgressBar(0,100);
  3.  
  4. //... más adelante
  5. AlgoritmoGenetico2 algoritmoGenetico = new AlgoritmoGenetico2(categoria, rango, matriz, tamPoblacion, descendencia, iteraciones,jProgressBar1);
  6. jProgressBar1.setVisible(true);
  7. algoritmoGenetico.execute();
  8. ArrayList<Lugar> resultados = algoritmoGenetico.get();
  9. jProgressBar1.setVisible(false);

Ahí está. No se si me falta algo o he hecho algo mal a la hora de pasar la barra al genetico, etc.
Por cierto, todo lo demas funciona correctamente, execute() funciona y algoritmoGenetico.get() me devuelve perfectamente la salida.
Un saludo y gracias.

Última edición por iplazlac; 18/12/2010 a las 12:54