Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Animación de JProgressBar con hilos

Animación de JProgressBar con hilos

Por 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

Artículos similares

Crear imagen dinamicamente y agregar a un objeto swing

Si bien se puede hacer uso de archivos de imagen (jpg, png, bmp, etc) en las aplicaciones java, también este te permite[...]

Procedimientos Almacenados: Parámetros OUT

En un post anterior conocimos que es y como funciona un parámetro de entrada IN en procedimientos almacenados y lenguaje[...]

Búsqueda dinámica en JList

Un JList nos permite almacenar objetos en una lista y mostrarlos gráficamente en una serie vertical en el cual el usuari[...]

Cambiar plataforma JDK en Netbeans

Es recomendable tener actualizado la Maquina Virtual Java de nuestro equipo para poder disfrutar de las mejoras que trae[...]

Java Webservices – Servicios Web

Un servicio web (Web Services) es un sistema de software en la web que nos ofrece la posibilidad de realizar una o múlti[...]

Actualizar JComboBox al cambiar valor de otro JComboBox

Cuando se trabaja con base de datos, estos datos son dinámicos, cambian con el tiempo y es necesario que esos cambios se[...]