Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Colaboración con falla en aplicación con swingworker y progressbar

Cordial saludo, he implementado una aplicación en la cual pretendo que el proceso de configuración de un equipo y una barra de progreso sean simultáneos, hice lo sugerido en un post anterior, usar swingworker, colocar la tarea larga dentro de un DoInBackground, pero las tareas no se ejecutan simultáneamente, primero se hace la tarea y luego aparece la barra de progreso, no se que estaré haciendo mal. El código es el siguiente:


//Clase heredada de swingworker
class Task extends javax.swing.SwingWorker<Void,Void>{
public Void doInBackground(){

int progreso = 0;
Random random = new Random();
setProgress(0);
jTextArea1.setText("");
//ConfigurarDatosGenericos();

try
{
// Open a client socket connection
Socket clientSocket = new Socket("192.168.0.1", 23);
System.out.println("Client1: " + clientSocket);

// User defined Method

//configurarDatosGenericos(clientSocket);

try
{
// Acquire the input and output streams
String[] leeDatos = new LeeDatos().getDatos();
DataOutputStream outbound = new DataOutputStream(
clientSocket.getOutputStream() );
BufferedReader inbound = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()) );
//outbound.writeBytes("Administrator");
//outbound.writeBytes("\n");
outbound.writeBytes("14125665");
outbound.writeBytes("\r");
System.out.println("Ingresando clave");
try { Thread.sleep ( 2000) ; } catch ( InterruptedException ie) { }
outbound.writeBytes("set wan node proveedor");
outbound.writeBytes("\r");
try { Thread.sleep ( 2000) ; } catch ( InterruptedException ie) { }
outbound.writeBytes("set wan node proveedor");
outbound.writeBytes("\r");
System.out.println("Iniciando configuración datos");
try { Thread.sleep ( 1000) ; } catch ( InterruptedException ie) { }
outbound.writeBytes("set wan ppp username "+leeDatos[6]);
outbound.writeBytes("\r");
System.out.println("Configurando nombre de usuario");
try { Thread.sleep ( 1000) ; } catch ( InterruptedException ie) { }
outbound.writeBytes("set wan ppp password "+leeDatos[7]);
outbound.writeBytes("\r");
System.out.println("Configurando contraseña");
try { Thread.sleep ( 2000) ; } catch ( InterruptedException ie) { }
outbound.writeBytes("set wan save");
outbound.writeBytes("\r");
System.out.println("Guardando datos");
try { Thread.sleep (2000) ; } catch ( InterruptedException ie) { }
outbound.writeBytes("set wan save");
outbound.writeBytes("\r");
System.out.println("Guardando datos 2");


outbound.close();
inbound.close();
clientSocket.close();

}

catch (IOException ioe)
{
System.out.println("IOException: " + ioe);
}

}
catch (UnknownHostException uhe)
{
System.out.println("UnknownHostException: " + uhe);
}
catch (IOException ioe)
{
System.err.println("IOException: " + ioe);
}

while(progreso < 100){
try{
Thread.sleep(random.nextInt(1000));
}
catch(InterruptedException ex){
}
progreso += (Integer)random.nextInt(10);
setProgress(Math.min(progreso,100));
jTextArea1.append(String.format("%d%% complete.", progreso) + "\n");
}





JOptionPane.showMessageDialog(null, "El módem ha sido configurado.", "Configuración Finalizada", JOptionPane.INFORMATION_MESSAGE);
jButton4.setEnabled(true);


return null;
}
}


//Botón que da la instrucción de ejecutar la acción

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
jProgressBar1.setStringPainted(true);
task = new Task();
task.addPropertyChangeListener(new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent e){
if("progress".equals(e.getPropertyName())){
jButton4.setEnabled(false);
int progreso = (Integer)e.getNewValue();
jProgressBar1.setValue(progreso);
}
}
});
task.execute();
}


Agradezco cualquier colaboración para este caso.

septiembre 16, 2014 | Unregistered Commenterleo

Creo que te contesté yo. :-) El error que cometes es obvio: la propiedad progress de la clase SwingWorker se tiene que ir actualizando a medida que vas realizando el trabajo en fondo, no cuando lo has acabado. Ese bucle que pones al final:


while(progreso < 100){
try{
Thread.sleep(random.nextInt(1000));
}
catch(InterruptedException ex){
}
progreso += (Integer)random.nextInt(10);
setProgress(Math.min(progreso,100));
jTextArea1.append(String.format("%d%% complete.", progreso) + "\n");
}

sobra, debes ir insertando llamadas a setProgress() a medida que vas escribiendo en el puerto con sentencias como, por ejemplo:


outbound.writeBytes("set wan ppp username "+leeDatos[6]);
setProgress(getProgress() + 10); // No insertar más de 10 como ésta

Y otra cosa: jamás actualices objetos Swing dentro de doInBackground(). Para eso está el método process() si se trata de resultados intermedios, o simplemente el listener que implementas al final de tu código de ejemplo si sólo quieres actualizar el progressbar.

septiembre 18, 2014 | Registered Commenterrickiees