Buenas tardes a todos.
Les agradecería si me pudieran echar una mano.Estoy encallado en un "problemilla" que no consigo solucionar.
Quiero crear una barra de progreso que se vaya actualizando mientras realizo una tarea pesada sobre la bd.
He creado estas dos clases de ejemplo y me encuentro que cuando lanzo la tarea pesada, la barra de progreso no se me actualiza hasta que acaba dicha tarea pesada. He estado mirando por varios sitios y la verdad no me queda muy claro que es lo que hago mal.
En teoria desde el doInBackground(), se realiza la tarea pesada en un hilo diferente al de eventos. Desde doInBackgruond llamo al métido publish(), pasandole un valor. Publish a su vez llama a process() que se ejecuta en el hilo de eventos con lo cual se me deberia actualizar el progreso de la barra pero no me funciona.
¿Por favor, puede alguien decirme que hago mal?
Os paso el código.
Esta clase Principal.java es un JDialog que se llama desde otra clase JFrame, del cual no creo que sea necesario poner el código.
package test;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
public class Principal extends JDialog
{
private JButton btImporta;
public JLabel eti;
public JDialog jdlg = this;
public JLabel etiqueta;
public Principal(JFrame parent, String titulo, boolean modal)
{
super(parent, titulo, modal);
setLayout(new FlowLayout()); // establece el esquema del marco
btImporta = new JButton("Importa");
btImporta.setBounds(10, 10, 10, 10);
btImporta.setActionCommand("importaRegistros");
add(btImporta);
etiqueta = new JLabel("");
add(etiqueta);
TurfviewAcciones turfviewAcciones = new TurfviewAcciones();
btImporta.addActionListener(turfviewAcciones);
}
private class TurfviewAcciones implements ActionListener
{
@Override
public void actionPerformed(ActionEvent event)
{
switch (event.getActionCommand())
{
case "importaRegistros":
JProgressBar barraProgreso = new JProgressBar(0,100);
JDialog dialogoProgreso = new JDialog(jdlg,"Procesando...");
dialogoProgreso.getContentPane().add(barraProgreso );
dialogoProgreso.pack();
dialogoProgreso.setLocationRelativeTo(null);
dialogoProgreso.setVisible(true);
proceso p = new proceso(etiqueta, barraProgreso);
p.execute();
try
{
JOptionPane.showMessageDialog(null, "Final proceso.: "+p.get(), "Info", JOptionPane.INFORMATION_MESSAGE);
}
catch (InterruptedException e)
{
System.err.println(e);
}
catch (ExecutionException e)
{
System.err.println(e);
}
dialogoProgreso.setVisible(false);
break;
}
}
}
}
y la clase Proceso.Java se llama desde la clase Principal.java
package test;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
public class proceso extends SwingWorker<Double, Integer>
{
private final JLabel etiqueta;
private final JProgressBar progreso;
public proceso(JLabel p_eti, JProgressBar p_pb)
{
etiqueta = p_eti;
progreso = p_pb;
}
@Override
@SuppressWarnings("SleepWhileInLoop")
protected Double doInBackground() throws Exception
{
double val = 1.00;
for (int i = 0; i < 100; i++)
{
System.out.println("doInBackground() esta en el hilo "+Thread.currentThread().getName()+" Valor.: "+i);
try
{
Thread.sleep(5);
}
catch(InterruptedException e)
{
System.out.println(e);
}
publish(i);
}
return val;
}
@Override
protected void done()
{
System.out.println("Proceso finalizado!.: "+ Thread.currentThread().getName());
etiqueta.setText("Proceso finalizado!");
}
@Override
protected void process(List<Integer> chunks)
{
System.out.println("process() esta en el hilo "+Thread.currentThread().getName() + " Valor.: "+chunks.get(0) );
progreso.setValue(chunks.get(0));
}
}
Saludos y muchas gracias.