Uso básico de elementos Swing con NetBeans – 26 – Uso de JProgressBar, barra de progreso. Ejemplo 2.

En esta guía veremos el funcionamiento de la barra de progresos “JProgressBar” de uso habitual en ciertos procesos que requieren tiempo de ejecución controlada. Para este segundo ejemplo realizaremos algo un poco más complejo, específicamente aplicaremos una método que calcula números primos. Este método la hemos creado como ejemplo para el curso en modo consola, realizaremos pequeñas modificaciones para ajustarla a este propósito. Para el diseño utilizamos un JFrame, la nombramos “UsoJProgressBar2”. Podemos utilizar “JPanel” para ordenar los elementos de forma independiente. En vista de diseño vemos en uno de los paneles dos campos de texto con sus etiquetas más los botones de comando que servirán para poner en marcha la aplicación. Seguido la barra de progresos. Por último dentro de un panel el “JList” que mostrará los números primos que obtengamos.

Tomar en cuenta los nombres de variable de cada objeto, en el diseño se especifican; es muy importante ya que desde los métodos se utilizan estos nombres para referencia a cada objeto. Se puede cambiar el “Nombre de variable” de cada objeto haciendo clic derecho sobre la misma y clic en “Cambiar nombre de variable…”. (clic sobre la imagen para ampliar)

Lista de importaciones que necesitamos para trabajar con ciertos objetos. Además los métodos llamados desde el constructor del JFrame y variables de clase que necesitamos crear.

Código Java
package com.swing.basic;//tomar en cuenta el paquete del JFrame

import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;

/**
*
* @author Ariel
*/

public class UsoJProgressBar2 extends javax.swing.JFrame {

/**
* Creates new form UsoJProgressBar2
*/

public UsoJProgressBar2() {
initComponents();
setLocationRelativeTo(null);//Centrar formulario
inicio();//Método de inicio
}
private DefaultListModel modelList;//Variable de clase.

Creamos los métodos siguiente en modo fuente, los métodos creados por nosotros las ubicamos al final de la declaración de variables, justo antes de la llave de cierre general. Se agregan comentario para aclarar la función de cada línea de código.

Código Java
    private void inicio(){
//Especificamos algunas propiedades de nuestra lista
//Inicializamos la variable DefaultListModel
modelList = new DefaultListModel();
//Establecemos el modelo, nos permite agregar y eliminar elementos, etc.
lista.setModel(modelList);
//Intervalo de selección
lista.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
lista.setSelectedIndex(0);
lista.setVisibleRowCount(-1);
//Distribución horizontal
lista.setLayoutOrientation(JList.HORIZONTAL_WRAP);
//Limpiamos los campos de texto
desde.setText(null);
hasta.setText(null);
//Indicamos el valor que muestra JProgressBar al iniciar el programa
jpb.setValue(0);
}

private void iniciar(){
//Creamos un Thread para mejorar el ejemplo
final Thread t;
//Inicializamos
t = new Thread(new Runnable() {
//Implementamos el método run()
@Override
public void run() {
//Permite mostrar el valor del progreso
jpb.setStringPainted(true);
//Comprobamos que no esten vacíos los campos de texto
if(!desde.getText().isEmpty() && !hasta.getText().isEmpty()){
//Utilizamos try... por si falla la coversión numérica
try {
int d = Integer.parseInt(desde.getText());
int h = Integer.parseInt(hasta.getText());
//Verificamos que los datos numéricos sean mayor que cero-0
if(d > 0 && h > 0){
//Verificamos que h sea mayor que d
if(h > d){
//Establecemos el valor mínimo y máximo de nuestro barra de progreso
//Esta permitirá mostra el valor correcto del progreso
jpb.setMinimum(d);
jpb.setMaximum(h);
//Con un for iremos comprobando si el valor de i es primo
for (int i = d; i <= h; i++) {
//i será el valor de la barra de progreso en cada momento, esta se ira incrementando
jpb.setValue(i);
//Comprobamos que el valor sea primo por cada ciclo
if(!esPrimo(i)){
modelList.addElement(i);
}
//Hacemos una interrupción de 100 milisegundos
//Se puede disminuir o aumentar según se desee
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}

} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Datos no numéricos" + e);
}
}
}
});
//Se ejecuta el Thread
t.start();
}
//Este método vimos su funcionamiento en modo consola
//La función recibe un entero como argumento para calcular si es primo
private boolean esPrimo(int n){
//inicializamos una variable boolean
boolean b = false;
//Los números negativos no entran como primos, el 1-uno tampoco
if(n <= 0 || n == 1){
b = true;
}
//El 2,3,5 son primos conocidos por tanto las obviamos
else if(n != 2 && n != 3 && n != 5){
//Con un for recorremos los números intermedios en 1 y n
//Comprobamos que el módulo con alguno de ellos de 0-cero
for (int i = 2; i < n; i++) {
//Si b es true, demuestra que n no es primo y salimos del bucle
if(b){
break;
}
b = (n%i == 0);
}
}
//2,3 y 5 son los primeros primos conocidos
else{
b = false;
}
return b;
}

Para los botones utilizamos el evento “ActionPerformed”. Si hay dudas sobre como agregar “Eventos” a objetos, en las primeras guías de la serie vimos con detalle ese punto.

Código Java
    private void iniciarActionPerformed(java.awt.event.ActionEvent evt) {                                        
iniciar();
}

private void limpiarActionPerformed(java.awt.event.ActionEvent evt) {
inicio();
}

En este punto ya podremos ejecutar nuestro formulario y comprobar su funcionalidad. (Por si hay alguna duda en el proceso, debemos hacer clic derecho sobre nuestro archivo fuente y presionar “ejecutar archivo” ya que nuestro proyecto no tiene una clase principal definida)

5 comentarios :

  1. String path="cmd /c start F:/SQL/producto_pysoa/clientes/999_version_estandar/construccion/version_71/instalador/instalador_71/dddd.cmd";
    Runtime rn=Runtime.getRuntime();
    Process pr=rn.exec(path);

    este es mi proceso , todo esta en dentro de un metodo como puedo obtener el minino y el maximo para asignar los valores a la barra?

    ResponderEliminar
  2. No estoy familiarizado con el proceso que realizas, el mínimo supondo que será 1, la cuestión es el máximo, que sería la cantidad de elementos. Si puedes recurrir a alguna función que te de la cantidad e elementos a procesar, sería la solución rápida. Saludos.

    ResponderEliminar
  3. Mm solo es un proceso que abre el simbolo del sistema y ejecuta un archivo cmd en la ruta F:/SQL/producto_pysoa/clientes/999_version_estandar/construccion/version_71/instalador/instalador_71/dddd.cmd"
    el máximo debe es 100 para que la barra recorra de 1 a 100 verdad? el problema es encontrar la manera de asignara esos valores a la ejecución del metodo.
    Estare muy agradecido si me puede ayudar a encontrar la solución, de dicho requisito ya que es algo que falta para culminar un proyecto de grado.

    ResponderEliminar
    Respuestas
    1. El máximo puede ser cualquier cantidad, si hay 2000 archivos, el mímimo será 1 y el máximo 2000. Si es una aplicción java con el ejemplo de arriba podrás implementar a tu aplicición, solo tendrás que ajustarla a tu necesidad. Lo normal sería que hicieras un método con dos parámetros (minimo, maximo), el cual se ejecuta dentro del proceso que mencionas. Disculpa que no pueda ayudar más, saludos.

      Eliminar
    2. Muchas gracias, me es de gran ayuda dicha información.

      Eliminar