java - bootstrap - ¿Cómo usar JProgressBar?
progress bar for javascript (3)
Leería el archivo de texto en un bucle en un hilo de trabajo dedicado, no en el hilo de envío de eventos (EDT). Si conozco la cantidad total de palabras para leer, entonces puedo calcular el porcentaje completado en cada iteración del ciclo y actualizar la barra de progreso en consecuencia.
Código de muestra
El siguiente código pone la barra de progreso en modo indeterminado durante el preprocesamiento y el posprocesamiento, mostrando una animación que indica que se está produciendo un trabajo. El modo Determinado se usa cuando se lee iterativamente desde el archivo de entrada.
// INITIALIZATION ON EDT
// JProgressBar progress = new JProgressBar();
// progress.setStringPainted(true);
// PREPROCESSING
// update progress bar (indeterminate mode)
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
progress.setIndeterminate(true);
progress.setString("Preprocessing...");
}
});
// perform preprocessing (open input file, determine total number of words, etc)
// PROCESSING
// update progress bar (switch to determinate mode)
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
progress.setIndeterminate(false);
}
});
int count = 0;
while (true)
{
// read a word from the input file; exit loop if EOF
// compute soundex representation
// add entry to map (hash table)
// compute percentage completed
count++;
final int percent = count * 100 / total;
// update progress bar on the EDT
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
progress.setString("Processing " + percent + "%");
progress.setValue(percent);
}
});
}
// POSTPROCESSING
// update progress bar (switch to indeterminate mode)
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
progress.setIndeterminate(true);
progress.setString("Postprocessing...");
}
});
// perform postprocessing (close input file, etc)
// DONE!
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
progress.setIndeterminate(false);
progress.setString("Done!");
progress.setValue(100);
}
});
Sugerencias
- Considere escribir un método de conveniencia para actualizar la barra de progreso en el EDT, a fin de reducir el desorden en su código (
SwingUtilities.invokeLater... public void run()...
)
Necesito cargar un montón de palabras (aproximadamente 70,000) de un archivo de texto, agregarlo a una tabla hash (usando soundex como clave) y ordenar los valores. Mientras hago todo esto, quiero mostrar una barra de progreso usando JProgressBar. Artículos como este y este , solo dan un ejemplo no real (un ciclo while). ¿Alguien puede sugerirme cómo debo proceder? ¿Cómo puedo obtener un número de la condición anterior para establecer el valor de la barra de progreso? También parece que hay diferentes maneras de hacerlo, utilizando hilo, temporizador, etc. ¿Cuál podría ser el mejor método para la situación anterior?
Utilice SwingWorker: http://java.sun.com/docs/books/tutorial/uiswing/concurrency/interim.html
Obtenga el tamaño del archivo y cuente los bytes procesados en cada iteración. De esta forma, no tiene que recorrer el archivo dos veces.