Una tarea ejecut�ndose en un programa puede tardar un poco en completarse. Un programa amigable proporciona alguna indicaci�n al usuario sobre lo que puede tardar la tarea y lo que ya lleva realizado.
El paquete Swing proporciona tres clases para ayudar a crear GUIs que monitoricen y muestren el progreso de tareas de larga duraci�n.
- JProgressBar
- Una barra de progreso que muestra gr�ficamente qu� cantitad total de la tarea se ha terminado. Puedes ver C�mo usar Progress Bars para m�s informaci�n.
- ProgressMonitor
- Un ejemplar de esta clase monitoriza el progreso de una tarea. Si el tiempo enlapsado de la tarea excede un valor especificado en el programa, el monitor trae un di�logo con una descripci�n de la tarea, una nota de estado, una barra de progreso, un bot�n Ok, y un bot�n Cancel. Puedes ver C�mo usar Progress Monitors para m�s detalles.
- ProgressMonitorInputStream
- Un stream de entrada con un monitor de progreso a�adido, que monitoriza la lectura desde el stream. Se utiliza un ejemplar de este stream como cualquier otro stream. Se puede obtener el monitor de progreso del stream llamando a getProgressMonitor y configur�ndolo como se describe en C�mo usar Progress Monitors.
Despu�s de ver una barra de progreso y un monitor de progreso en acci�n, Decidir si utilizar una Barra o un Monitor de Progreso puede ayudarnos a decidir cu�l es el apropiado para nuestra aplicaci�n.
�C�mo usar Progress Bars
Aqu� podemos ver una imagen de una peque�a aplicaci�n que utiliza una barra de progreso para medir el progreso de una tarea que se ejecuta.

Intenta esto:
|
Abajo est� el c�digo de ProgressBarDemo.java que crea y configura la barra de proceso.
...where member variables are delcared... JProgressBar progressBar; ... ...in the constructor for the demo's frame... progressBar = new JProgressBar(0, task.getLengthOfTask()); progressBar.setValue(0); progressBar.setStringPainted(true);
El constructor usado para crear la barra de progreso selecciona los valores m�ximo y m�nimo de la barra. Tambi�n se pueden seleccionar estos valores con los m�todos setMinimum y setMaximum. Los valores m�nimo y m�ximo utilizados en este programa son 0 y la longitud de la tarea, lo que es t�pico de muchos programas y tareas. Sin embarguo, los valores m�ximo y m�nimo de una barra de progreso pueden ser cualquier valor, incluso negativos. El c�digo tambi�n selecciona el valor actual de la barra a 0. Los valores m�nimo, actual, y m�ximo deben relacionarse de esta forma.
minimum <= current <= maximum
Si se intenta seleccionar uno de los valores y el nuevo valor viola la relaci�n, la barra de progreso ajusta uno o m�s de los otros valores de acuerdo a las reglas establecidas por BoundedRangeModel para mantener la relaci�n.
La llamada a setStringPainted hace que la barra de progreso muestre un string de porcentaje dentro de sus l�mites. Por defecto, la cadena indica el porcentaje completo de la barra de progreso. El string de procentaje es el valor devuelto por el m�todo getPercentComplete formateado a porcentaje. Otra alternativa es mostrar un string diferente con setString.
Se arranca la tarea pulsando el bot�n Start. Una vez que la tarea ha comenzado, un temporizador (un ejemplar de la clase Timer) dispara un evento acti�n cada segundo. Aqu� est� el m�todo ActionPerformed del oyente de ation del temporizador.
public void actionPerformed(ActionEvent evt) { progressBar.setValue(task.getCurrent()); taskOutput.append(task.getMessage() + newline); taskOutput.setCaretPosition(taskOutput.getDocument().getLength()); if (task.done()) { Toolkit.getDefaultToolkit().beep(); timer.stop(); startButton.setEnabled(true); progressBar.setValue(progressBar.getMinimum()); } }
La l�nea en negrita obtiene la cantidad de trabajo completada por la tarea y actualiza la barra de progreso con ese valor. Por eso la barra de progreso mide el progreso hecho por la tarea cada segundo, no el tiempo enlapsado. El resto del c�digo actualiza la salida, y si la tarea se ha completado, desactiva el temporizador, y resetea los otros controles.
Como se ha mencionado antes, la tarea de larga duraci�n de este programa se ejecuta en un thread separado. Generalmente, es una buena idea aislar una tarea potencialmente de larga duraci�n en su propio thread para que no bloquee el resto del programa. La tarea de larga duraci�n est� implementada por LongTask.java, que utiliza un SwingWorker para asegurarse de que el thread se ejecuta de forma segura dentro de un programa Swing. Puedes ver Usar la clase SwingWorker en Threads y Swing para m�s informaci�n sobre la clase SwingWorker.
�C�mo usar Progress Monitors
Ahora, reescribamos el ejemplo anterior para utilizar un monitor de progreso en vez de una barra de progreso. Aqu� tenemos una imagen del nuevo programa, ProgressMonitorDemo.java.

La operaci�n general de este programa es similar al anterior. Se pulsa el bot�n Start para arrancar la misma tarea de larga duraci�n utilizada en el programa anterior. La tarea muestra la salida en el �rea de texto de la parte inferior de la ventana. Sin embargo, este programa utiliza un monitor de progreso en vez de una barra de progreso.
El ejemplo anterior creaba la barra de progreso al arrancar. En contraste, este programa crea el monitor en el m�todo actionPerformed del oyente de action del bot�n Start. Un monitor de progreso no puede utilizarse m�s de una vez, por eso se debe crear uno nuevo cada vez que se arranca una nueva tarea.
Aqu� est� la sentencia que crea el monitor de progreso.
progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this, "Running a Long Task", "", 0, task.getLengthOfTask());
El constructor utilizado en este ejemplo inicializa varios par�metros del monitor de progreso.
- El primer argumento proporciona el componente padre del di�logo desplegado para el monitor de progreso.
- El segundo argumento es un String que describe la naturaleza de la tarea a monitorizar. Este string se mostrar� en el di�logo.
- El tercer argumento es otro String que proporciona una nota de estado cambiable. El ejemplo utiliza una cadena vac�a porque la nota es actualizada peri�dicamente cuando la tarea se ejecuta. Si proporcionamos null para este argumento, la nota se omite del di�logo. El ejemplo actualiza la nota mientras la tarea se esta ejecutando cada vez que el temporizador dispara un evento action (actualiza el valor actual del monitor al mismo tiempo).
progressMonitor.setNote(task.getMessage()); progressMonitor.setProgress(task.getCurrent());
- Los �ltimos dos argumentos proporcionan los valores m�nimo y m�ximo, respectivamente, para la barra de progreso mostrada en el di�logo.
Despu�s el ejemplo crea el monitor de progreso, y lo configura.
progressMonitor.setProgress(0); progressMonitor.setMillisToDecideToPopup(2 * ONE_SECOND);
La primera l�nea selecciona la posici�n actual de la barra de progreso del di�logo. La segunda indica que el monitor deber�a desplegar un di�logo si la tarea se ejecuta durante m�s de dos segundos.
Por el simple echo de que este ejemplo utiliza un monitor de progreso, a�ade una caracter�stica que no estaba presente en la versi�n del programa que utiliza una barra de progreso. El usuario puede cancelar la tarea pulsando el bot�n Cancel del di�logo. Aqu� tenemos el c�digo del ejemplo que chequea si el usuario cancela la tarea o si la tarea sale normalmente.
if (progressMonitor.isCanceled() || task.done()) { progressMonitor.close(); task.stop(); Toolkit.getDefaultToolkit().beep(); timer.stop(); startButton.setEnabled(true); }
Observa que el monitor de progreso no cancela por si mismo la tarea. Proporciona el GUI y el API para permitir que el programa lo haga facilmente.
�Decidir si utilizar una Barra o un Monitor de Progreso
Se utiliza una barra de progreso si.
- Queremos m�s control sobre la configuraci�n de la barra de progreso. Si estamos trabajando directamente con una barra de progreso, podemos hacer que se muestre verticalmente, podemos proporcionar una cadena para que la muestre, podemos registrar oyentes de cambio, y podemos proporcionarle un modelo de datos personalizado.
- Necesitamos mostrar otros controles o elementos GUI junto con la barra de progreso.
- Necesitamos m�s de una barra de progreso. Con algunas tareas, necesitamos monitorizar m�s de un par�metro. Por ejemplo, un programa de instalaci�n podr�a monitoriazar el espacio de disco utilizado adem�s del n�mero de ficheros que ya han sido instalados.
- Necesitamos reutilizar la barra de progreso. Una barra de progreso puede ser re-utilizada; un monitor de progreso no. El monitor de progreso no tiene un m�todo reset, y una vez que millisToDecideToPopup ha expirado el monitor ha terminado su trabajo.
Se utiliza un monitor de progreso si.
- Si queremos mostrar f�cilmente el progreso en un di�logo.
- La tarea a ejecutar es secundaria y el usuario podr�a no estar interesado en el progreso de la tarea. El monitor de progreso proporciona al usuario una forma para hacer desaparecer el di�logo mientras la tarea se ejecuta.
- Nuestra tarea es cancelable. El monitor de progreso proporciona al usuario una forma de cancelar la tarea. Todo lo que tenemos que hacer es llamar al m�todo isCanceled del monitor de progreso para ver si el usuario ha pulsado el bot�n Cancel.
- Nuestra tarea muestra un mensaje corto peri�dicamente mientras se ejecuta. El di�logo del monitor de progreso proporciona el m�todo setNote para que la tarea pueda proporcionar mayor informaci�n sobre lo que est� haciendo. Por ejemplo, una tarea de instalaci�n podr�a informar del nombre de cada fichero instalado.
- La tarea podr�a no tardar mucho tiempo en completarse. Decidimos en que punto una tarea tarda el tiempo suficiente para permitir que el usuario lo sepa. El monitor de progreso no desplegar� el di�logo si el la tarea se completa dentro del tiempo especificado.
Si decidimos utilizar un monitor de progreso y la tarea que estamos monitorizando lee desde un stream de entrada, se utiliza la clase ProgressMonitorInputStream.
�El API de ProgressBar
Las siguientes tablas listan los m�todos y constructores m�s utilizados de JProgressBar. Otros m�todos interesantes est�n definidos por las clases JComponent y Component
El API para monitorizador progresos se divide en estas categor�as.
�Seleccionar u Obtener los Valores/Restricciones de la Barra de Progreso
M�todo | Prop�sito |
---|---|
void setValue(int)
int getValue() |
Selecciona u obtiene el valor actual de la barra de progreso. El valor est� limitado por los valores m�ximo y m�nimo. |
double getPercentComplete() | Obtiene el procentaje terminado por la barra de progreso. |
void setMinimum(int)
int getMinimum() |
Selecciona u obtiene el valor m�nimo de la barra de progreso. |
void setMaximum(int)
int getMaximum() |
Selecciona u obtiene el valor m�ximo de la barra de progreso. |
void setModel(BoundedRangeModel)
BoundedRangeModel getMaximum() |
Selecciona u obtiene el modelo utilizado por la barra de progreso. El modelo establece los valores y restricciones de la barra de progreso. Podemos utilizar este m�todo como alternativa a utilizar los m�todos de selecci�n u obtenci�n individuales listados arriba. |
�Ajuste Fino de la Apariencia de la Barra de Progreso
M�todo | Prop�sito |
---|---|
void setOrientation(int)
int getOrientation() |
Selecciona u obtiene si la barra de progreso es vertical u horizontal. Los valores aceptados son JProgressBar.VERTICAL o JProgressBar.HORIZONTAL. |
void setBorderPainted(boolean)
boolean isBorderPainted() |
Selecciona u obtiene si la barra de progreso tiene borde. |
void setStringPainted(boolean)
boolean isStringPainted() |
Selecciona u obtiene si la barra de progreso meustra el porcentaje. Por defecto, el valor de la cadena de porcentaje es el valor devuelto por getPercentComplete formateado a porcentaje. Podemos cambiar la cadena de porcentaje con setString. |
void setString(String)
String getString() |
Selecciona u obtiene la cadena de porcentaje. |
�Configurar un Monitor de Progreso
M�todo | Prop�sito |
---|---|
ProgressMonitor(Component, Object, String, int, int) | Crea un monitor de progreso e inicializa el padre del di�logo, el string descriptivo, la nota de estado y los valores m�nimo y m�ximo. |
void setMinimum(int)
int getMinimum() |
Selecciona u obtiene el valor m�nimo del monitor de progreso. |
void setMaximum(int)
int getMaximum() |
Selecciona u obtiene el valor m�ximo del monitor de progreso. |
void setProgress(int) | Actualiza el monitor de progreso. |
void setNote(String)
String getNote() |
Selecciona u obtiene la nota de estado. Esta nota se muestra en el di�logo. Para omitirla, se proporciona null como el tercer argumento del constructor del monitor. |
void setMillisToPopup(int)
int getMillisToPopup() |
Selecciona u obtiene el tiempo despu�s del cual el monitor deber�a desplegar el di�logo sin importar el estado de la tarea. |
void setMillisToDecideToPopup(int)
int getMillisToDecideToPopup() |
Selecciona u obtiene el tiempo despu�s del cual el monitor deber�a desplegar el di�logo si la tarea no se ha completado. |
�Terminar el Monitor de Progresos
M�todo | Prop�sito |
---|---|
close() | Cierra el monitor de progreso. Esto oculta el di�logo. |
boolean isCanceled() | Determina si el usuario ha pulsado el bot�n Cancel. |