Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / SwingWorker con base de datos

SwingWorker con base de datos

Autor jc mouse sábado, octubre 26, 2013

Cuando se realizan aplicaciones en java con base de datos y se llega a un punto donde es necesario realizar una consulta que puede tardar «n» tiempo y si se programa el código de consulta en el mismo hilo EDT (Event Dispatch Thread) que se pintan las ventanas y se escucha los eventos de teclado y ratón, la aplicación se quedara congelada mientras se espera la respuesta a la base de datos, esto ademas de dar un mal aspecto a la aplicación no es para nada correcto según java.

swingworker base de datos

¿Que podemos hacer entonces?

Java recomienda utilizar SwingWorker, esta clase nos permite realizar una tarea que tarda mucho, se ejecuta en paralelo al hilo de eventos y así podemos seguir utilizando la aplicación principal sin que este se congele mientras espera la respuesta a la consulta a la base de datos.

A continuación realizaremos una aplicación para realizar una consulta a una base de datos utilizando la clase SwingWorker, si bien esta clase permite el uso de jprogress, en este ejemplo se  hace uso de un gif animado 🙂

Necesitamos

– IDE Netbeans 6.9 o superior

– Java 6 o superior

– gif animado gif cargando

– MySQL

– Liberia com.mysql.jdbc.Driver

Manos a la obra

1. Crea un nuevo proyecto (nombre: Worker Example) en Netbeans con la siguiente estructura:

swingworker

OJO: añadir también el conector JDBC a la base de datos MySQL

2. Base de Datos. La base de datos que utilizaremos en este ejemplo consta de una sola tabla la cual es:

-- 
-- Estructura de tabla para la tabla 'universitario'
-- 
CREATE TABLE universitario (
  id bigint(20) NOT NULL auto_increment,
  cedula varchar(12) NOT NULL,
  nombre varchar(60) default NULL,
  paterno varchar(60) default NULL,
  materno varchar(60) default NULL,
  carrera varchar(100) default NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

-- 
-- Volcar la base de datos para la tabla 'universitario'
-- 

INSERT INTO universitario VALUES (301, '5522478576', 'Libia', 'Katari', 'Reynoso', 'Enfermeria');
INSERT INTO universitario VALUES (302, '6757218827', 'Lizzet', 'Rico', 'Surco', 'Ingenieria Quimica');

3. Clase database.java

La clase para conectarse a MySQL y realizar una consulta es:

01 package com.bolivia.example;
02 import java.sql.Connection;
03 import java.sql.DriverManager;
04 import java.sql.PreparedStatement;
05 import java.sql.ResultSet;
06 import java.sql.SQLException;
07 /**
08  * @web https://www.jc-mouse.net/
09  * @author Mouse
10  */
11 public class database {
12     String bd = "BASE_DE_DATOS";
13     String login = "USUARIO";
14     String password = "CONTRASEÑA";
15     String url = "jdbc:mysql://localhost/"+bd;
16     Connection conn = null;
17   
18    /** Constructor de clase */
19    public database(){
20         this.url = "jdbc:mysql://localhost/"+this.bd;
21        try{
22          //obtenemos el driver de para mysql
23          Class.forName("com.mysql.jdbc.Driver");
24          //obtenemos la conexion
25          conn = DriverManager.getConnection( this.url, this.login , this.password );
26          if (conn!=null){
27             System.out.println("Conexionn base de datos "+this.bd+" listo");
28          }
29       }catch(SQLException e){
30          System.err.println( e.getMessage() );
31       }catch(ClassNotFoundException e){
32          System.err.println( e.getMessage() );
33       }
34    }
35 
36    /**
37  * Metodo que obtiene un registro aleatoriamente
38  * @return String Nombre de universitario
39  */
40     public String getRandRegistro(){
41         String reg="";
42         String q= "SELECT * FROM universitario ORDER BY rand() LIMIT 1";
43         try{
44          PreparedStatement pstm = conn.prepareStatement( q );
45          ResultSet res = pstm.executeQuery();
46         while(res.next()){
47             reg = res.getString( "nombre" ) + " " + res.getString( "paterno" ) + " " + res.getString( "materno" );
48         }
49          res.close();
50       }catch(SQLException e){
51          System.err.println( e.getMessage() );
52       }
53         return reg;
54     }
55     
56 }

Donde:

#12,#13,#14 Debes colocar el nombre de la base de datos , usuario y contraseña

#19 Cuando se crea una nueva instancia de la clase, esta se conecta a la base de datos por medio del constructor de clase

#40 Solo necesitamos de un método que realice la consulta a MySQL y retorne un registro en formato String

4. Clase SwingWorker

Para hacer uso de SwingWorker, debemos extender esta clase dando como resultado una nueva clase donde sobre-escribimos algunos métodos.

01 package com.bolivia.example;
02 import javax.swing.JButton;
03 import javax.swing.JLabel;
04 import javax.swing.JOptionPane;
05 import javax.swing.SwingWorker;
06 /**
07  * @web https://www.jc-mouse.net/
08  * @author Mouse
09  */
10 public class MyWorker extends SwingWorker<Void, Void>{
11 
12     private final JButton boton ;    
13     private final JLabel estado;
14     private database db = new database();
15     private String nombre="";
16             
17     public MyWorker( JButton boton, JLabel estado )
18     {
19         this.boton = boton;        
20         this.estado = estado;
21     }
22     
23     /**
24  * Metodo que realiza la tarea pesada
25  */
26     @Override
27     protected Void doInBackground() throws Exception {
28         estado.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/bolivia/example/wait.gif")));
29         this.estado.setText("Estado: Buscando, por favor espere...");
30         this.boton.setEnabled(false);        
31         nombre = db.getRandRegistro();
32         Thread.sleep(5000);                       
33         return null;
34     }
35 
36     /**
37  * Resultado en pantalla
38  */
39     @Override
40     protected void done(){      
41         estado.setIcon(null);
42         this.boton.setEnabled(true);
43         this.estado.setText("Estado:");
44         JOptionPane.showMessageDialog( null , nombre );
45     }
46     
47 }

#14 Necesitamos una instancia a nuestra clase database.java

#10 Como dijimos más arriba para hacer uso de SwingWorker debemos extender esta clase, ademas SwingWorker maneja dos datos <dato1,dato2> donde dato1 es el resultado del trabajo que realiza la clase, y dato2 sirve para el jprogress, en este post no hacemos uso de ellos por lo que dejamos como <Void,Void>

#17 En el constructor de clase, recibimos como datos un JButton y un JLabel, estos vienen desde la interfaz, más adelante vemos como.

#27 el método doInBackground() es donde debemos colocar la consulta a la base de datos, esta es la tarea que consume mucho tiempo y no sabemos cuanto. Añadimos un SLEEP porque nuestra consulta es sencilla y tarda menos de 1 segundo por lo que para apreciar mejor el efecto añadimos 5 segundos más a la tarea de consulta.

#40 El método done() se ejecuta cuando doInBrackground termina

5. Interfaz de usuario

La interfaz de la aplicación esta formada de la siguiente manera:

gui worker

El código de la clase interfaz.java es:

01 public class interfaz extends javax.swing.JFrame {
02 
03     /** instancia a MyWorker */
04     MyWorker worker;    
05     
06     /**
07  * Creates new form interfaz
08  */
09     public interfaz() {
10         initComponents();
11     }
12 
13     private void botonActionPerformed(java.awt.event.ActionEvent evt) {                                      
14         worker = new MyWorker( boton , estado );
15         worker.execute();        
16     }                                     
17 
18     private void boton2ActionPerformed(java.awt.event.ActionEvent evt) {                                       
19         JOptionPane.showMessageDialog( this , "La curiosidad mato al gato");
20     }     
21 
22     ...

Ejecutamos y

swingworker base de datos

Proyecto completico en este enlace pobre 

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

Impresión de reportes con JasperReport + YAPA

Impresión de reportes con JasperReport + YAPA

En un post anterior [Guardar reporte PDF directamente con Jasperreports] vimos una manera de imprimir reportes directame...

Manipular colecciones de una forma sencilla

Manipular colecciones de una forma sencilla

Java proporciona Collection Framework, que define varias clases e interfaces para representar un grupo de objetos como u...

Leer y Escribir registros en archivo de texto

Leer y Escribir registros en archivo de texto

A veces se necesita utilizar archivos de texto plano como contenedor de registros como si de una base de datos se tratar...

Introducción a Fragment

Introducción a Fragment

Un Fragment representa un comportamiento o una parte de la interfaz de usuario en una Activity. Puedes combinar múltiple...

Agregar JComboBox a un JTable

Agregar JComboBox a un JTable

En este post, crearemos una tabla swing que implemente un control jcombobox en una columna de una tabla, llenaremos con...

Convertir imagenes JPEG a video MOV

Convertir imagenes JPEG a video MOV

Googleando me encontré con una interesante clase java «JpegImagesToMovie» que convierte imágenes JPEG a vídeo MOV de Qui...

4 comentarios en “SwingWorker con base de datos”

  1. michael dice:

    disculpa funciona al hacer el jar del proyecto?

  2. Zaphir dice:

    Continua el tutorial? esta bastante buena, se comparte y se agradece. Saludos!

  3. Jose dice:

    Gracias.. me resulto de gran ayuda tu tutorial, ya que no podia generar los subreportes de antemano muchas gracias.

  4. Gabrielito dice:

    Salu2 amigo podiras subir un video de como lo hiciste asi desde cero y exlicando un poquito lo que haces seria o max.. buena aplicacion eh….Salu2…

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

En este post realizaremos un proyecto en VUE que se conectara a un REST API  y utilizara un servicio del mismo para obte...

En este post realizaremos una aplicación que pueda capturar nuestra voz y convertir en texto Pasar voz a texto con Andro...

Los JavaBeans son clases que encapsulan objetos en un solo objeto (beans). Son fáciles de crear y pueden contener muchos...

Basic 4 Android es un IDE (Entorno de Desarrollo Integrado) para Android basado en Basic (no es Visual Basic, pero se pa...

Herramientas

Generador de Enlaces a Whatsapp