Subscribe to RSS Feed

JComboBox con Objetos proveniente de Base de Datos

26 de febrero de 2010 by JavaGirl

 Hey! hola mis buenos lectores, de nuevo yo aquí bloggeando para ustedes..y en esta sección explicaremos paso a paso un tema bastante interesante y solicitado dentro del ambiente Java Swing y es el uso de JComboBox con Objetos cargados a partir de una base datos que en este tuto sera MySQL.
Veamos..
Requerimientos
- IDE con soporte para Java.(NetBeans,Eclipse,JCreator,JDeveloper,otros)

Previas
Para efectos de comodidad, usare el IDE NetBeans..empezemos!
- Descargar la base de datos DbItem Aquí.
- Creamos un Proyecto con el Nombre MiPrimeroComboConObjetos.
- Nuestro proyecto se rigira bajo el Estandar MVC, por lo tanto crearemos los siguiente paquetes:
        1.Modelo
           1.1 Entidad
           1.2 Datos
        2. View
        3.Controller
** Debe entederse que "Modelo" es un paquete que contiene a los paquetes "Entidad" y "Datos"

- En nuestro paquete Entidad crearemos la clase "CEItem" con la siguiente estructura.
package Modelo.Entidad;
public class CEItem
{
    private int id_Item;
    private String descripcion;
    private double precio;

    public int getId_Item()
    {
        return id_Item;
    }
    public void setId_Item(int id_Item)
    {
        this.id_Item = id_Item;
    }
    public String getDescripcion()
    {
        return descripcion;
    }
    public void setDescripcion(String descripcion)
    {
        this.descripcion = descripcion;
    }
    public double getPrecio()
    {
        return precio;
    }
    public void setPrecio(double precio)
    {
        this.precio = precio;
    }
}
- En el paquete Datos crearemos una clase para poder hacer la conexión a la base de datos MySQL a la que llamaremos Conexion_BD , en este ejemplo nuestra conexión sera vía driver nativo(JDBC) así que recuerda agregar la librería JDBC_MySQL a tu proyecto.Nuestra clase conexión tiene la siguiente estructura.

Ojo: Recuerda configurar correctamente las variables de conexión con respecto al nombre del usuario y el password.
package Modelo.Datos;
import java.sql.Connection;
import java.sql.DriverManager;
public class Conexion_BD
{
  private static String driver = "com.mysql.jdbc.Driver";
  private static String url = "jdbc:mysql://localhost:3306/dbLunagraf";
  public static String user = "root";
  public static String psw = "12345";

  public static Connection obtenerConexion()
    {
        Connection connection=null;
        try
        {
            Class.forName(driver);
            connection = DriverManager.getConnection(url,user,psw);
        }
        catch (Exception e)
        {
          return null;
        }
         return connection;
    }
}
- En el mismo paquete creamos la clase CDItem con la siguiente estructura.
package Modelo.Datos;
import Modelo.Entidad.CEItem;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class CDItem
{
   public List listaItem()
   {
       Connection conexion=null;
       try
       {
        conexion=Conexion_BD.obtenerConexion();
        String sql="Select * from t01_item";
        Statement st=conexion.createStatement();
        ResultSet rs=st.executeQuery(sql);
        List oListItem=new ArrayList();
       while(rs.next())
            {
               CEItem oItem=new CEItem();
               oItem.setId_Item(rs.getInt("idItem"));
               oItem.setDescripcion(rs.getString("descripcion"));
               oItem.setPrecio(rs.getDouble("precio"));
               oListItem.add(oItem);
            }
        return oListItem;
       }
       catch(Exception ex)
       {
           ex.printStackTrace();
           return null;
       }
       finally
       {
            try
            {
            conexion.close();
            }
            catch (SQLException ex)
            {
              ex.printStackTrace();
            }
       }
   }
}
** El tipo de colección a usar depende del programador, puede usar vector o arraylist si así lo requiere.
- En nuestro paquete Controller crearemos la clase CCItem con la siguiente estructura.
package Controller;
import Modelo.Datos.CDItem;
import Modelo.Entidad.CEItem;
import java.util.List;

public class CCItem
{
    public static List listarItem()
    {
         return CDItem.listaItem();
    }
}
- En nuestro paquete View Creamos el JFrame principal con el nombre de "FramePrincipal"  y debe tener el siguiente diseño:

- Pues bien aquí la previa termino.Ahora sí manos a la masa.

Manos a la Masa (Teoría)
-  El método toString() es un método que es llamado por la mayoría de herramientas Swing Control (JTable,JComboBox,JList,etc)  para poder visualizar los items que estas contienen, es decir si un Swing Control contiene items pues a la hora de visualizarse debe visualizar lo que el método toString() del Item devuelva , sea cual sea la naturaleza de nuestro item (int,String,double,char,Variable de Referencia,etc) este siempre contara con el método toString() que por defecto en el caso de las variables primitivas es la cadena de texto que representa el valor de la variable es decir si nuestra variable es un entero (int,1) pues el valor que devuelve su método toString() es "1"  y lo mismo sería para los distintos variables primitivas. En el caso de las variables de referencia el método toString() por defecto esta conformada por un conjunto de características propias de la clase como el tipo de clase que es y otras características que concatenadas devuelven una expresión literal de dicho objeto, pero el método toString()  en el caso de las variables de referencia puede ser sobrescrito(override) y programado de tal forma que devuelva una expresión literal de acuerdo a nuestro criterio, haciendo posible entonces que nuestro objeto incrustado en forma de item en el JComboBox muestre una expresión literal de acuerdo a nuestra conveniencia pero sin perder su condición de objeto.

Manos a la Masa (Practica)
- Entonces basado en nuestra teoría previa sobrescribiremos en nuestra clase CEItem el método toString() haciendo que este devuelva el atributo descripción. Nuestra clase CEItem tendrá un método mas  entonces:


    public String toString()

    {
        return this.descripcion;
    }

Que finalmente se vería así:

package Modelo.Entidad;
public class CEItem
{
    private int id_Item;
    private String descripcion;
    private double precio;
    public int getId_Item()
    {
        return id_Item;
    }
    public void setId_Item(int id_Item)
    {
        this.id_Item = id_Item;
    }
    public String getDescripcion()
    {
        return descripcion;
    }
    public void setDescripcion(String descripcion)
    {
        this.descripcion = descripcion;
    }
    public double getPrecio()
    {
        return precio;
    }
    public void setPrecio(double precio)
    {
        this.precio = precio;
    }
  
    public String toString()
    {
        return this.descripcion;
    }
}

- Ahora a configurar nuestra vista para que cargue nuestro JComboBox con los objetos, para ello crearemos un método en el FramePrincipal llamado "cargarItemsComboBox()" y su implementacion debe ser así:
 private void cargarItemsComboBox()
    {
        List oListaItem=CCItem.listarItem();
        if(oListaItem!=null)
        {
            int size=oListaItem.size();          
            for(int i=0;i
            {
                CbxItem.addItem(oListaItem.get(i));
            }        
        }      
    }
- Disparamos este método con el solo cargar del Frame, en mi caso lo disparare en el constructor del Frame seguido del método initComponents().
  public FramePrincipal()
    {
        initComponents();
        cargarItemsComboBox();
    }
Resultado:


- Para que lo datos que contenga el objeto Item seleccionado del Jcombobox se visualicen automáticamente en las cajas respectivas añadiremos un evento del tipo ActionPerfomed al mismo.
    private void CbxItemActionPerformed(java.awt.event.ActionEvent evt) {
        CEItem oItem=(CEItem)CbxItem.getSelectedItem();      
        if(oItem!=null)
        {
            TxtCodigo.setText(oItem.getId_Item()+"");
            TxtPrecio.setText(oItem.getDescripcion());
        }      
    }
** En este evento estamos recuperando el objeto seleccionado en el JComboBox haciendo uso del casting "(CEItem)" y luego simplemente seteamos los atributos indicados en sus cajas de texto indicada.
Resultado:


- Para el botón imprimir haremos un algoritmo parecido, le agregamos tambien un evento del tipo ActionPerfomed que en su implementacion deba recorrer la lista de los Item del JComboBox castearlos y finalmente visualizarlo en el JTextArea.
    private void BtnImprimirActionPerformed(java.awt.event.ActionEvent evt) {
        int size=CbxItem.getItemCount();
        if(size>0)
        {
            for(int i=0;i
            {
              CEItem oItem=(CEItem)CbxItem.getItemAt(i);                      TxaImpresion.append("Codigo:"+oItem.getId_Item()+"\tDescripcion:"+oItem+"\tPrecio:"+oItem.getPrecio()+"\n");
            }
        }
    }
Resultado:




Listo! Proyecto al 100%. Descarga aquí  el proyecto completo.
Nota Final:
Iré agregando post más interesantes pero deseo saber cual son de ayuda, pueden escribirme a mi correo en gmail emanriquel.java@gmail.com para cualquier consulta o duda, espero sus comentarios en pro de mejorar este tutorial.
Pd: Subire un vídeo hablado sobre este tutorial la próxima semana.


Hasta la Proxima.
Elizabeth Manrique

Continue Reading
20 comentarios