Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Error de refresco de jProgressbar

Buenas tardes.
Espero que me podais ayudar a solucionar un problemilla que tengo.
Os cuento. Estoy haciendo un programilla desarrollado en Swing para uso personal,
para facilitarme la vida.
Una funcionalidad que quiero que tenga (y tiene funcionando) es la de copiar una
serie de ficheros de una ruta a otra. Esto lo hace perfectamente. El caso es que
quiero implementar dos barras de progreso, una que indica el progreso general de
copiado (5, 6, 7 ficheros) y otra el progreso de copiado de cada fichero.
Estan las barras en un jPanel oculto que se hace visible cuando lanzo el proceso
de copiado.
El problema es que en el proceso de copiado es tan rápido no da tiempo a que se
vea. Si hago que se pulse un boton por cada fichero si que se ve el panel con
las barras, peeeeeeero la segunda barra que indica el proceso de copiado del
fichero no corre o es demasiado rápida para verse.

Aqui os dejo el código (generado con Jigloo en eclipse) con la declaracion del
panel que contiene los JProgressBar.

{
jPanel9 = new JPanel();
GridBagLayout jPanel9Layout = new GridBagLayout();
jPanel7.add(jPanel9, new GridBagConstraints(0, 2, 4, 2, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
jPanel9.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
jPanel9Layout.rowWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.1};
jPanel9Layout.rowHeights = new int[] {20, 20, 20, 22, 7, 20};
jPanel9Layout.columnWeights = new double[] {0.0, 0.1, 0.1, 0.1, 0.1, 0.0};
jPanel9Layout.columnWidths = new int[] {7, 7, 7, 7, 7, 7};
jPanel9.setLayout(jPanel9Layout);
jPanel9.setEnabled(false);
{
totalProgressBar = new JProgressBar();
currentProgressBar = new JProgressBar();
copyLabel = new JLabel();
fromLabel = new JLabel();
toLabel = new JLabel();

totalProgressBar.setStringPainted(true);
totalProgressBar.setFocusable(false);

currentProgressBar.setStringPainted(true);
currentProgressBar.setFocusable(false);

copyLabel.setText("Copiando...");
fromLabel.setText("Desde:");
toLabel.setText("A:");

totalProgressBar.setMinimum(0);
totalProgressBar.setMaximum(100);
currentProgressBar.setMinimum(0);
currentProgressBar.setMaximum(100);

{
jLabel1 = new JLabel();
jPanel9.add(jLabel1, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
jLabel1.setText("Copiando....");
}
{
jLabel2 = new JLabel();
jPanel9.add(jLabel2, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
jLabel2.setText("Desde:");
}
{
jLabel3 = new JLabel();
jPanel9.add(jLabel3, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
jLabel3.setText("A:");
}
{
jPanel9.add(totalProgressBar, new GridBagConstraints(1, 3, 4, 1, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
}
{
jPanel9.add(currentProgressBar, new GridBagConstraints(1, 5, 4, 1, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
}
}
jPanel9.setVisible(false);
}

Aqui os dejo el trozo de código que recorre un Iterador y que llama al proceso de
copiado de cada uno de los ficheros. (copyWithBuffer)


for (Iterator<Fichero> i = aFicheros.iterator(); i.hasNext();){
Fichero oFichero = i.next();
...
...
copyWithBuffer(String ficheroOrigen, String ficheroCopia);
}


Y este es el proceso de copiado de los ficheros. Este se supone que es el encargado
de ir incrementando la segunda barra de progreso (currentProgressBar)

private void copyWithBuffer(String ficheroOriginal,
String ficheroCopia) throws IOException {

currentProgressBar.setMinimum(0);
currentProgressBar.setMaximum(100);

FileInputStream fileInput = new FileInputStream(ficheroOriginal);
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);

// Se abre el fichero donde se hará la copia
FileOutputStream fileOutput = new FileOutputStream(ficheroCopia);
BufferedOutputStream bufferedOutput = new BufferedOutputStream(fileOutput);

long expectedBytes = new File(ficheroOriginal).length();
byte[] buffer = new byte[1024];
int length;
long totalBytesCopied = 0;

while ((length = bufferedInput.read(buffer)) != -1) {
bufferedOutput.write(buffer, 0, length);
totalBytesCopied += length;
int progress = (int) Math.round(((double) totalBytesCopied / (double) expectedBytes) * 100);
currentProgressBar.setString(String.valueOf(progress));
currentProgressBar.setValue(progress);
}
bufferedOutput.flush();

bufferedInput.close();
bufferedOutput.close();
}

Espero que me podais ayudar.
Un saludo.

enero 22, 2014 | Unregistered Commenterfileal_v

Salvo que la clase completa oculte algo que no se ve en el código que has puesto, creo que este artículo te puede explicar mejor que nadie por qué el refresco de Swing no te funciona como esperas. :-)

enero 23, 2014 | Registered Commenterrickiees

Muchas gracias por tu respuesta rickiees.
Leeré atentamente el artículo.

Un saludo

enero 24, 2014 | Unregistered Commenterfileal_v