InicioInfoBarra de pogreso al cargar una tabla en Java

Barra de pogreso al cargar una tabla en Java

Info3/19/2011
Recuerdo que con esto estuve renegando bastante...

Todos los programas que realicen alguna acción, la cual necesite algún tiempo considerable para finalizar, deberían indicarle al usuario cuanto tiempo falta, o bien mostrar el progreso que se esta teniendo.

Normalmente esto se realiza con una barra de progreso (en Java JProgressBar).

Imaginemos que tenemos una aplicación la cual carga algún tipo de datos en una tabla, y esta tiene un tiempo considerable para cargarse, porque son muchos los datos o bien porque la obtención de estos datos es costosa, y queremos que mientras se carguen estos datos se muestre una barra de progreso para que el usuario tenga conocimiento del avance que esta teniendo el programa en realizar dicha tarea.

Esta acción en java necesita de un Thread, es decir necesita realizarse concurrentemente (en forma paralela) a las acciones que se están llevando a cabo, de lo contrario no se puede procesar secuencialmente un programa mientras se actualiza la interface gráfica del mismo (mientras que nuestro programa continua su normal funcionamiento también se actualicen los gráficos del mismo, en este caso la barra de progreso).

Acabo de desarollar una pequeña aplicación java que realiza esto para que puedan tener mas conocimiento de como se debe realizar. la misma cuenta con JTable, JProgressBar, para que se pueda actualizar una barra de progreso mientras se carga la tabla, y también vamos a ver como mostrar el porcentaje, para otro día les debo el tiempo faltante de alguna acción.

Les dejo el Código JAVA, con la explicación del funcionamiento en el mismo código:


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

/**
*
* @author OctiCoCo
*/
public class jprogress extends Thread implements ActionListener{

private JProgressBar barra = new JProgressBar();
private JFrame ventana = new JFrame("Ejemplo de JProgressBarr";
private JButton iniciar = new JButton("Iniciar";
private JLabel accion = new JLabel("Aguardando interacción del usuario";
private JLabel porcentaje = new JLabel("000%";
private JTable tabla = new JTable();
private JScrollPane scrollPane = new JScrollPane(tabla);
private DefaultTableModel dtm;
private final int cantidad = 100;

public jprogress(){
ventana.setLayout(null);
setActionListeners(this);
//comenzamos dando los tamaños a los elementos y los ubicamos en la ventana
ventana.setSize(450, 420);
scrollPane.setBounds(20, 60, 400, 200); //UTILIZAMOS EL SCROLL Y NO LA TABLA para poder mostrar los titulos de la tabla y las barras de scroll
barra.setBounds(20, 350, 400, 20);
iniciar.setBounds(270, 20, 150, 30);
accion.setBounds(20, 20, 250, 20);
porcentaje.setBounds(20, 300, 400, 20);
porcentaje.setHorizontalAlignment(porcentaje.CENTER);
//ahora ubicamos los elementos en nuestro frame:
ventana.add(accion);
ventana.add(iniciar);
ventana.add(scrollPane);
ventana.add(porcentaje);
ventana.add(barra);
//le damos el maximo valor que puede tomar la barra
barra.setMaximum(cantidad);

//mostramos la ventana y la posicionamos al centro
ventana.setVisible(true);
ventana.setLocationRelativeTo(null); //con esto se centra en la pantalla

//ya tenemos la interface lista, ahora mostremos algun contenido...
//por ejemplo los primeros 100 numeros primos (se usara cantidad como constante del 100).
//y carguemos estos en la tabla

//para facilitar el manejo de la tabla se puede usar un DefaultTableModel se utiliza de la siguiente manera:

String[] titulos = {"indice", "Numero primo encontrado"};//estos seran los titulos de la tabla.
Object[][] datos = {}; //en esta matriz bidimencional cargaremos los datos
dtm = new DefaultTableModel(datos, titulos);
tabla.setModel(dtm);
//ahora esta todos listo para ir cargando los datos en la tabla y a medida que se cargen actualizaremos la barra

}

// Aqui indicamos todos los objetos a los cuales no interece tomar la accion del click
public void setActionListeners(ActionListener lis){
iniciar.addActionListener(lis);
}

//en este metodo vemos a quien se le hizo click y realizamos la accion
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == iniciar){ // verificamos si hizo click en el boton
iniciar.setText("Iniciado";
accion.setText("Obteniendo nº primos";
this.start(); //Esto es lo que ejecuta el thread, es decir lo que hace la concurrencia
//el start() de una clase que extiende threads llama a la funcion run() de esa clase
//por lo cual ahora continuamos con la funcion run()
//en esta se deberan cargar los datos en la tabla y actualizar el valor de la barra
}
}

public void run(){

int indice = 1; //indice contara los numeros primos que vamos encontrando
int i = 1; //sera nuestra variable de recorrido de los numeros
while (indice < cantidad+1){ //mientras no tengamos los 100 nummeros primos
if (esPrimo(i)){
// i es primo por lo cual aumentamos el indice y guardamos los datos en la tabla y aumentamos la barra
Object[] otraFilaDeLaTabla = {indice, i}; //creamos la fila
dtm.addRow(otraFilaDeLaTabla); //y la añadimos a la tabla
barra.setValue(indice); //aumentamos la barra
porcentaje.setText(((indice * 100) / cantidad) + "%";
indice++;
//con las lineas siguiente damos un tiempo para que se vea el funcionamiento de la barra
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(jprogress.class.getName()).log(Level.SEVERE, null, ex);
}
}
i++;
}
//terminamos de encontrar los numero por lo que ponemos la barra en el 100% que seria el ultimo valor de indice;
barra.setValue(indice);
porcentaje.setText("100%";
iniciar.setText("Finalizado";
accion.setText("Se encontraron "+cantidad+" nº primos";
//ventana.dispose(); //cone esto cerrariamos la ventana.
}


/**
* Metodo que retorna true si un numero es primo, false en otro caso (no sea primo)
* @param numero este parametro es por el numero que queremos preguntar si es primo
* @return true si un numero es primo, false caso contrario
*/
public static boolean esPrimo(int numero){
int contador=0;
for(int j=numero; j>=1; j--){
if((numero%j)==0)
contador++;
}
if(contador==2)
return true;
else
return false;
}

//metodo principal (de ejecucion)
public static void main (String[] arg){
//creamos una instancia para poder correr el program
new jprogress();
}

}



Caprutras:

Antes de iniciar:




En Progreso:




Finalizado:




Espero que les guste y sirva.

Saludos a todos
Datos archivados del Taringa! original
0puntos
4,007visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

o
octicoco🇦🇷
Usuario
Puntos0
Posts6
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.