Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Animación de JProgressBar con hilos

Animación de JProgressBar con hilos

Autor jc mouse viernes, noviembre 30, 2012

Si nuestra aplicación tiene que llevar a cabo un cierto trabajo que no sabemos cuanto durará y que a la vez consume muchos recursos, tenemos dos problemas, ¿como le hacemos saber al usuario que tiene que esperar un tiempo sin hacer nada? y segundo, ¿como evitamos que nuestra aplicación se cuelgue mientras el trabajo aún no termina?. Para esos problemas tenemos una solución, utilizar el componente swing jProgressBar (barra de progreso) combinado con Thread (hilos) . La implementación no es ta difícil como suena pero que mejor que con un ejemplo, manos a la obra.

1. Partimos de un proyecto en netbeans que estará compuesto de la siguiente forma:

PROJECT NB7

Un JFrame llamado «interfaz.java«, en esa interfaz tenemos un jbutton, un jProgressBar y dos jTextField. Los nombres de cada objeto están en rojo.

El objeto TimeJob nos indicará el tiempo en segundos que durara un cierto proceso en paralelo y el objeto SpeedBar se refiere a la velocidad de la animación del Jprogressbar.

Tenemos ademas tres clases, la clase JcSampleBar, la clase Job.javajcThread.java. explicamos el contenido y código más abajo,

2.  La clase JcSampleBar es nuestro main encargado de lanzar la aplicación, el código es:

public class JcSampleBar {

    public static void main(String[] args) {
        new interfaz().setVisible(true);
    }

}

3. Simularemos un trabajo «XYZ» en la clase Job.java la cual implementa Runnable para hacer uso de hilos. Este proceso «XYZ» se ejecutara cada cierto tiempo. En la práctica, este proceso puede ser una consulta a la base de datos, conexión a un servidor web, eliminación de archivos, etc. todos estos ejemplos, tienen algo en común, no sabemos cuanto tiempo duraran, controlaremos eso utilizando una variable statica «band» que inicial izaremos en FALSE, eso quiere decir que aún el proceso no a terminado, desde luego, cuando el proceso finalice, la variable cambiara a TRUE, el static es para poder utilizar esta variable desde otra clase, la clase jcThread que veremos más adelante.

public class Job implements Runnable{

    public static boolean band=false;    
    private int tiempo = 5;

    /**
 * Constructor de clase
 */
    public Job( int tiempo ){
        this.tiempo = tiempo;
    }

    @Override
    public void run() {
        band=false;
        for (int i=1; i <= this.tiempo ; i++){
            System.out.println("Haciendo algo divertido... -> " + i + " segundo transcurrido.");
            try{Thread.sleep( 1000 );}
            catch (InterruptedException e){
                System.err.println( e.getMessage() );
            }
        }
        band=true;
    }

}

3. La clase jcThread.java, es la encargada de animar el JProgressBar también implementa la clase Runnable para el manejo de hilos. En el método RUN implementaremos un ciclo WHILE para animar la barra de progreso la cual estará controlado por la variable BAND de la clase Job.java, cuando el trabajo en paralelo finalice, el ciclo se romperá dando fin a la animación del progressbar .

import javax.swing.JProgressBar;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class jcThread implements Runnable{

    private JProgressBar jProgressBar;
    private int i = 1;
    private int value = 50;//retardo en milisegundos

    /**
 * Constructor de clase
 */
    public jcThread( JProgressBar jProgressBar , int value )
    {
        this.jProgressBar = jProgressBar;
        this.value = value;
    }

    @Override
    public void run() {
        i=1;        
        //mientra el trabajo en paralelo no finalice el jProgressBar continuara su animacion una y otra vez
        while( !Job.band )
        {
            //si llega al limite 100 comienza otra vez desde 1, sino incrementa i en +1
            i = (i > 100) ? 1 : i+1;
            jProgressBar.setValue(i);
            jProgressBar.repaint();  
            //retardo en milisegundos
            try{Thread.sleep( this.value );}            
            catch (InterruptedException e){ System.err.println( e.getMessage() ); }            
            //si el trabajo en paralelo a terminado
            if( Job.band )
            {
                jProgressBar.setValue(100);
                System.out.println("Trabajo finalizado...");
                break;//rompe ciclo 
            }            
        }
    }

}

4. Finalmente la clase interfaz.java donde implementaremos ambos hilos en el evento ActionPerformed del jbutton,

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        //trabajo cualquiera
        new Thread(new Job( Integer.valueOf(TimeJob.getText()))).start();
        // animacion de jProgressBar
        new Thread(new jcThread( this.jProgressBar1 , Integer.valueOf(SpeedBar.getText()) ) ).start();
    }

Ejecutando ahora tendremos como resultado:

end project

a diferentes valores de las variables de TimeJob y SpeedBar podremos comprender mejor como funciona :=D

Eso es todo 🙂 bájate el proyecto en netbeans 7.2 AQUI

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Contraseñas con emojis en java

Contraseñas con emojis en java

Semanas atrás leí un articulo en el que se pensaba implementar los emojis como contraseñas en los dispositivos con andro...

Control de versiones con GIT y Netbeans

Control de versiones con GIT y Netbeans

Control de versiones: Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los eleme...

Búsqueda binaria (Binary Search)

Búsqueda binaria (Binary Search)

Un algoritmo de búsqueda binaria se emplea para buscar un valor en particular en un arreglo previamente ordenado. Para i...

Rompecabezas evangelión de Rei Ayanami

Rompecabezas evangelión de Rei Ayanami

Información sobre la serie: Neon Genesis Evangelion (新世紀エヴァンゲリオン, también conocido como «Evangelion») es una serie de an...

Introducción a SQLite

Introducción a SQLite

Android hace uso de la base de datos SQLite para el manejo de registros en las aplicaciones. Según Santa Wikipedia defin...

Crea un Tabbed Activity desde cero

Crea un Tabbed Activity desde cero

Un Tabbed Activity te permite cambiar la vista entre  fragmentos desplazando el dedo  de izquierda a derecha o de derech...

10 comentarios en “Animación de JProgressBar con hilos”

  1. Cristopher dice:

    Seria interesante añadirle un Sprite de imágenes que forman una animacion de carga

    1. Mouse dice:

      yo lo utilizo con imágenes porque la barra no me gusta, no es nada difícil, ya sea con sprites o con un GIF para no hacer mucho trabajo, estamos usando hilos así que la animación del GIF no se congela 😉

  2. Nestor dice:

    Primero que nada le mando un cordial saludos. estuve revisando esta pagina y pude apreciar que tienen rutinas muy interesantes con respecto a la programación de java, pero hoy en día he estado buscando un poco sobre ¿Como Hacer Respaldo de base de datos usando Java y PostgreSQL?
    Me explico: Necesito hacer un respaldo de mi base de datos haciendo uso de una interfaz (Frame) el me permita Exportar e Importar mi base de datos en este Caso PostGreSQL.
    Si sabes algo con respecto a eso de verdad que se lo agradecería mucho que hicieras un tutorial con respecto a eso. sin mas que decir me despido. Excelente Pagina y Felicidades. continua así.

    1. Mouse dice:

      ok tomo nota 🙂

  3. diegodesdecolombia dice:

    En verdad Excelente aporte.
    Muchas Gracias.

  4. Luis dice:

    como cierro un jframe desde una clase estaica el dispose(); no funciona y el .exit(1); tampoco funciona

  5. Gregor dice:

    Hola master Mouse! .Como siempre se agradecen estos trabajos, diré que el código de este ejemplo está casi bien.
    Has fijado los valores tiempo en 5 (en realidad son ms.) y value en 50ms. de modo que al poner otros valores en las cajas de texto el programa toma los valores fijados antes. Compruébalo!
    Debes reemplazar lo siguiente:
    private int tiempo = 5; ———–> private int tiempo;
    Thread.sleep(1000) ————–> Thread.sleep(tiempo)
    private int value = 50; ————>private int value;
    Así ya funciona!
    Si ponemos en la casilla TimeJob 50000 (son 50 seg.) y en speedBar 500 (0.5 seg) la barra hace un sólo recorrido. Cada paso son 0.5 seg y como tiene 100 pasos, 100×0.5= 50 que coincide con el tiempo de trabajo.
    Ahora otro tema, cómo harías para que al pulsar un botón se parase el trabajo en paralelo y al pulsar otro botón se cancelase ese trabajo.
    Gracias y un saludo!

  6. Gleycer Parra dice:

    Como pudiera implementar una barra de progreso como la que explicas mientras se ejecuta un backup a una base de datos en postgres. Te resumo la parte del código en la que llamo al método que realiza el backup.

    if (resp == JFileChooser.APPROVE_OPTION) { //Si el usuario presiona aceptar; se genera el Backup
    retorno = respaldo.generarBackup(backup.getSelectedFile().toString());
    VistaBarraProgreso barraProgreso = new VistaBarraProgreso();

    barraProgreso.setVisible(true);
    if (retorno) {
    JOptionPane.showMessageDialog(null, «Operación de Respaldo con Exito»);

    } else {

    JOptionPane.showMessageDialog(null, «Operación de Respaldo no Exitosa»);

    }
    } else if (resp == JFileChooser.CANCEL_OPTION) {
    JOptionPane.showMessageDialog(null, «Operación de Respaldo Cancelada»);
    retorno = false;
    }

    Quiero implementarlo luego de llamar al método respaldo.generarBackup(backup.getSelectedFile().toString()); que es el que hace el backup en la base de datos.

    Soy novato en programación en Java y no entiendo solo leyendo tu código una forma en la que pueda adaptarlo a mi caso. Muchas gracias

  7. sol dice:

    como hago para ejecutarlo.

  8. Fabian dice:

    Hola tengo una pregunta yo lo que quisiera ver y aprender es en el momento que el Barra de progreso empiese a cargar ya cuando finalise que me mande a otro Jframe a otra ventana si necesidad de poner un boton??? 🙂 :v

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gi...

FFmpeg es una colección de software libre capaz de decodificar, codificar, transcodificar, mux, demux, transmitir, filtr...

The Age of AI o «La era de la Inteligencia Artificial»,  es una serie de 8 documentales de Youtube Original, presentados...

La comunidad 3D Buzz  era una de los lugares donde la gente curiosa de aprender a realizar videojuegos buscaba recursos...

Herramientas

Generador de Enlaces a Whatsapp