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

[SOLUCIONADO] SwingWork

Estas en el tema de SwingWork en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/05/2013, 12:21
 
Fecha de Ingreso: abril-2013
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 1
SwingWork

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.
  #2 (permalink)  
Antiguo 08/05/2013, 01:40
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 3 meses
Puntos: 188
Respuesta: SwingWork

No sé, ¿pero la idea de una barra de progreso no sería que el proceso al que se asocia le vaya informando cuando se ha alcanzado un determinado %?

Es decir, el proceso tendría que comunicar cuando se ha alcanzado el 10, 20, 30... definiendo tu esos puntos en torno al codigo del proceso.

Y la barra deberia tener un listener que atendiese a esos cambios.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 08/05/2013, 02:08
 
Fecha de Ingreso: abril-2013
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: SwingWork

Hola Fuzzylog.

Gracias por responder.

No es que lleve mucho tiempo programando en Java así que igual no entiendo muy bien como funciona la clase SwingWorker, pero pensaba que cuando desde el doInBackground(), llamaba a publish() pasándole un valor, éste mismo método llamaba a método process() que se ejecuta en el hilo de eventos (diferente al de la tarea pesada) y recibe una lista de valores "chunks" la cual se utiliza para actualizar el progreso de la barra de ésta forma: progreso.setValue(chunks.get(0));

El ejemplo más sencillo de comprender de SwingWoker, lo obtuve en la web de chuidiang (como muchas otras cosas de gran utilidad en ésta web), pero veo que no he comprendido lo que expone sobre swingworker, pues cuando aplico la idea en mi código no me funciona la barra de progreso.

Saludos.
  #4 (permalink)  
Antiguo 08/05/2013, 02:52
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 3 meses
Puntos: 188
Respuesta: SwingWork

Hombre, chuidiang es un miembro bastante activo de este foro. Así que si se pasa igual te ayuda a solucionar el problema.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 17/05/2013, 02:46
 
Fecha de Ingreso: abril-2013
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: SwingWork

Hola a todos.

Después de varios días dando vueltas a éste tema y sin que nadie responda a mi duda (a parte de Fuzzylog) voy a cerrar éste tema.

Lo que pude encontrar en el código que les pasé en mi primer post, es ésta línea:

JOptionPane.showMessageDialog(null, "Final proceso.: "+p.get(), "Info", JOptionPane.INFORMATION_MESSAGE);

El problema de que la barra no se actualizaba era porque utilizaba el método get para esperar un valor de respuesta. Aunque no entiendo porque en el ejemplo de Chuidiang si funciona y en mi código no. En fin cuando uno no sabe...

En cualquier caso visto el éxito cerraré éste tema.

Saludos y gracias.
  #6 (permalink)  
Antiguo 18/05/2013, 17:31
 
Fecha de Ingreso: abril-2013
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: SwingWork

Gracias por el boto.

Etiquetas: clase, string
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:03.