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//Clase
public class AlgoritmoGenetico2 extends SwingWorker<ArrayList<Lugar>, Integer> {
//Atributo de tipo JProgressBar
//Contructor
public AlgoritmoGenetico2
(String categoria,
int rango, MatrizAtraccion matriz,
int tamPoblacion,
int tamDescendencia,
int maxIteraciones,
JProgressBar barra
) { this.categoria = categoria;
this.rango = rango;
this.matriz = matriz;
this.tamPoblacion = tamPoblacion;
this.tamDescendencia = tamDescendencia;
this.maxIteraciones = maxIteraciones;
progreso=barra;
}
//doInBackground
@Override
protected ArrayList
<Lugar
> doInBackground
() throws SQLException { ArrayList<Lugar> puntosVisitados = new ArrayList<Lugar>(); //Array de puntos visitados
ArrayList<Lugar> poblacionActual = new ArrayList<Lugar>(); //Array de poblacion actual
int iteraciones = 0;
ComparaSatisfaccion comparador = new ComparaSatisfaccion(); //Comparador de satisfacciones
poblacionActual = anadirPoblacionInicial(tamPoblacion); //Añadimos la primera poblacion
while (iteraciones < maxIteraciones) { //Mientras no hayamos hecho todas la iteraciones
for (Lugar lugar : poblacionActual) { //Recorremos lugares de la poblacion
lugar = fitness(lugar); //Evaluamos lugar
puntosVisitados.add(lugar); //Añadimos a visitados
}
Collections.
sort(poblacionActual, comparador
); //Ordenamos la poblacion por valor for (int x = 0; x < tamDescendencia; x++) { //Los mejores
poblacionActual.set(x, tenerDescendencia(poblacionActual.get(x))); //tienen descendencia
}
for (int y = tamDescendencia; y < poblacionActual.size(); y++) { //Los peores
poblacionActual.set(y, mutar()); //mutan
}
iteraciones++; //iteraciones++
publish(iteraciones); //Publicamos iteraciones
System.
out.
println("Iteracion " + iteraciones
+ " de " + maxIteraciones
); }
Collections.
sort(puntosVisitados, comparador
); //Ordenamos puntos visitados return puntosVisitados;
}
//process()
@Override
protected void process(List<Integer> publicados) {
int tantoPorCiento=(publicados.get(0)*100)/maxIteraciones;
progreso.setValue(tantoPorCiento);
}
}
En el main (interfaz):
Código JAVA:
Ver original//Definicion de la barra
//... más adelante
AlgoritmoGenetico2 algoritmoGenetico = new AlgoritmoGenetico2(categoria, rango, matriz, tamPoblacion, descendencia, iteraciones,jProgressBar1);
jProgressBar1.setVisible(true);
algoritmoGenetico.execute();
ArrayList<Lugar> resultados = algoritmoGenetico.get();
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.