Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/12/2010, 13:15
iplazlac
 
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