Foros del Web » Programación para mayores de 30 ;) » Java »

Hacer una barra de progreso con SwingWorker

Estas en el tema de Hacer una barra de progreso con SwingWorker en el foro de Java en Foros del Web. Hola. Veréis, estoy haciendo el proyecto de fin de carrera (el código en principio esta terminado) y estoy mejorando un poco mi interfaz de usuario. ...
  #1 (permalink)  
Antiguo 17/12/2010, 13:15
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 4 meses
Puntos: 1
Hacer una barra de progreso con SwingWorker

Hola.
Veréis, estoy haciendo el proyecto de fin de carrera (el código en principio esta terminado) y estoy mejorando un poco mi interfaz de usuario. El caso es que mi programa implementa un algoritmo genético para la evaluación de puntos geográficos para colocar una nueva tienda de una categoría. Vamos, que dependiendo del numero de datos de entrada y la configuracion del genetico (que es entrada de usuario) puede tardar hasta una hora en completar los calculos.
Pues bien, ya que tarda tanto, habia pensado en poner en mi interfaz una barra de progreso determinada (de las que muestran un %). Yo creia que no podia ser dificil pero nada mas lejos de la realidad (al menos para mi).
Se que hay que usar la clase SwingerWorker para ejecutar el proceso en background y sobreescribir los metodos doInBackGround(), publish(), done(), etc, pero tengo muchas dudas.
Os pego un trozo del Algoritmo genetico para que quede un poco mas claro:
Código JAVA:
Ver original
  1. public ArrayList<Lugar> calcularGenetico(int numMejoresSoluciones, int maxIteraciones, int tamPoblacion, int tamDescendencia) throws SQLException {
  2.         ArrayList<Lugar> puntosVisitados = new ArrayList<Lugar>();
  3.         ArrayList<Lugar> poblacionActual = new ArrayList<Lugar>();
  4.         int iteraciones = 0;
  5.         ComparaSatisfaccion comparador = new ComparaSatisfaccion();
  6.         poblacionActual = anadirPoblacionInicial(tamPoblacion);
  7.         while (iteraciones < maxIteraciones) {
  8.             for (Lugar lugar : poblacionActual) {
  9.                 lugar = fitness(lugar);
  10.                 puntosVisitados.add(lugar);
  11.             }
  12.             Collections.sort(poblacionActual, comparador);
  13.             for (int x = 0; x < tamDescendencia; x++) {
  14.                 poblacionActual.set(x, tenerDescendencia(poblacionActual.get(x)));
  15.             }
  16.             for (int y = tamDescendencia; y < poblacionActual.size(); y++) {
  17.                 poblacionActual.set(y, mutar());
  18.             }
  19.             iteraciones++;
  20.             System.out.println("Iteracion "+iteraciones+"de "+maxIteraciones);
  21.         }
  22.         Collections.sort(puntosVisitados, comparador);
  23.         return puntosVisitados;
  24.     }

Tengo otra clase que es a la que accede la GUI, en esa creo un nuevo AlgoritmoGenetico y llamo a algoritmoGenetico.calcularGenetico().
Por lo que he entendido de SwingWorker:
- Tener una clase intermedia entre la GUI y el genetico (que es lo que quiero monitorear) podria impedirme hacer lo que quiero.
- calcularGenetico() iria en doInBackGround().
- publish() deberia devolverme el numero de iteraciones actual.

Resumen: Me gustaria una barra de progreso en la GUI que me diga como va el genetico, basandose en el numero de iteraciones. Estoy bastante perdido, cualquier ejemplo sencillo de uso de SwingWorker o idea de como adecuarlo a mi problema me ayudaria mucho.

Un saludo y gracias por vuestro tiempo.
Ignacio

Última edición por iplazlac; 17/12/2010 a las 13:23
  #2 (permalink)  
Antiguo 17/12/2010, 15:48
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Hacer una barra de progreso con SwingWorker

Aquí tienes un ejemplo http://chuwiki.chuidiang.org/index.p...on_SwingWorker
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 17/12/2010, 17:09
 
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 chuidiang.
Todavía no me he puesto a ello pero quería agradecerte desde ya tu ayuda. Es con mucho el tutorial más claro que me he encontrado sobre el tema.
Mañana te cuento como me ha ido.
Un saludo
  #4 (permalink)  
Antiguo 18/12/2010, 12:40
 
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
  #5 (permalink)  
Antiguo 21/12/2010, 06:39
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 4 meses
Puntos: 1
Respuesta: Hacer una barra de progreso con SwingWorker

Bueno, al final he logrado que funcione, os comento.
Si pongo algo mas en un action de un botón que
Código JAVA:
Ver original
  1. algoritmoGenetico.execute();
se bloquea y ni muestra la barra ni hace nada. Poniendo solamente esa sentencia funciona perfectamente pero claro, no queda bien, es un botón extra para nada, la verdad es que no se por que no funciona si pongo algo mas, por ejemplo:
Código JAVA:
Ver original
  1. jProgressBar1.setVisible(true);
  2. algoritmoGenetico.execute();
  3. resultado=algoritmoGenetico.get();
no muestra la barra, ejecuta bien y devuelve bien, pero la interfaz se queda congelada hasta que termina.
En fin, si no consigo otra solución lo pondré de la primera manera, aunque quede un poco peor (me obliga a instanciar, guardar el resultado, ect en otro botón).
Un saludo

Etiquetas: barra, progreso
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:52.