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

20 comentarios:

  1. cafremich
    27 de febrero de 2010, 23:11

    Hola Elizabeth, la verdad es que estaba un poco desesperado por encontrar una informacion como la que tu proporcionaste, estoy realmente agradecido y veo que eres una exelente programadora....

    abusando de tu persona...tengo una duda....yo habia programado a dos capas (bueno, es lo que me enseñaron) pero ahora tengo que programar a tres capas...segun lo que me dicen es Boundaries, control y entities...espero me entiendas...esto esta basado o ligado a UML...(creo)...entonces me gustaria saber si me podrias dar una pequeña introduccion a lo que significa el termino de programacion a tres capas...crees que sea posible???

    de antemano muchisimas gracias....muchos saludos

  1. JavaGirl
    28 de febrero de 2010, 12:46

    Por supuesto, en breve te orientare respecto a eso.

  1. cafremich
    17 de abril de 2010, 8:34

    hola como estas...es pero que muy bien...

    tengo una duda...me podrias decir como creaste el archivo sql de la base de datos???

    yo lo he intentado hacer...pero no me saleee...

    s k creo el dump para la base de datos y al momento d importar l archivo e introducir las tablas

    me dice que la base de datos no existe.....

    entonces me acorde que en este ejemplo nos haces el favor de pasarnos la base de datos

    para poder checar el archvo que aportaste.....

    de ante mano muchismas gracias...saludos

  1. lex
    20 de junio de 2010, 7:43

    hola, muchas gracias me sirvio mucho la ayuda que proporcionas en el tutorial... gracias y saludos..

  1. Unknown
    28 de julio de 2010, 23:40

    hola Elizabeth.
    soy noemi, la chika q t escribio por mail. Disculpa las molestias de nuevo es la verdad aun tengo dudas. el codigo q yo vi lo vi la pag de chuwiki y ahi veo q haces la coneccion con la base y guardas la informacion de la base en un vector y esa informacion l vas guardando en un objeto de la clase "ClaseObjetoParaComboBox"
    y la vas añadiendo al item y pues hasta ahi voy bien pero m lanza una excepcion y la cacho asi como tu lo haces pero aun asi m sigue lanzando esa excepcion y es q m dice q no puede catear num decimales muy grandes a enteros y ya intente varias cosas pero la verdad no m sale :( y la verdad nose por q pueda ser.
    m estoy guiando de ese ejemplo de la pag de chuwiki y de echo tambien lo marca el el metodo de cargar combobox.
    otra duda es alo mejor es tonta ,pero que tiene o de donde sacas la clase EjemploDAO donde haces un objeto de ella y usas un metodo de la clase ClaseObjetoParaComboBox, y pues la utilizas para hacer el método de cargarcomboxejemplo.

    bueno esas son como mis inquietudes.

    sale muchas gracias y perdona las molestias...la verdad soy nueva en esto.
    te deseo mucha suerte y grax por la ayuda. :)

  1. JavaGirl
    29 de julio de 2010, 11:18

    Enviame un correo con el screen shoot de tu error y con gusto te ayudare..

  1. camilocallejas
    27 de marzo de 2011, 10:21

    excelente tutorial....me sirvio enormemente.... gracias

  1. Harold Castillo
    16 de octubre de 2011, 20:40

    encontre un error en mi netbeans

    package Controller;
    import Modelo.Datos.CDItem;
    import java.util.List;

    public class CCItem
    {

    public static List listarItem()
    {
    return CDItem.listaItem();
    }
    }

    en el return no entiendo el porque

    haroldjcastillo@gmail.com

  1. jhonymira
    13 de febrero de 2012, 7:06

    hey como se descarga este archivo, fui a la opagina que pusiste y nada, me llamo andres e colombia jhonyandresmira@gmail.com

  1. Enrique Flores
    8 de diciembre de 2013, 10:15

    Gracias por el tutorial, me ha servido de ayuda

  1. Unknown
    24 de enero de 2014, 13:48

    Hola Elizabeth, muy bueno tu ejemplo, lo adapté para hacer una conexión con sqlserver; este tipo de programación no lo hubiera podido haber hecho de no ser por éste tutorial

  1. Yop
    20 de agosto de 2014, 8:51

    Hola Elizabeth

    muy bueno tu post, tengo una duda.

    tengo varios combobox en una ventana, ya se como llenarlos con datos desde una base de datos mysql, mi problema es cuando quiero obtener un solo registro de ese combo pero sin perder el listado, para poder modificar por ejemplo la ubicacion de un proyecto.

    gracias.

  1. Unknown
    1 de mayo de 2015, 14:49

    Hola, muy bueno tu post, tengo nuna pregunta , en el caso de q queramos hacer mas combobox en el mismo formulario, como se sobreescribe el metodo toString, gracias.

  1. jesus amaya
    3 de noviembre de 2015, 5:32

    amigo necesito ayuda con una aplicacion en java de netbeans, debo hacer una aplicacion usando 3 jcombobox para sexo,nacionalidad,estado civil y luego cada resuldado de los jcombobox guardarlos en una base de datos en Mysql

  1. Unknown
    26 de febrero de 2017, 16:52

    Aquí es cuando no termino de entender porque hay hombres machistas la mejor explicación para lo que llevo todo el día buscando la da una mujer muchas gracias Elizabeth. Jesus Parra desde Venezuela

  1. Percy
    27 de mayo de 2018, 20:36

    Muchas gracias, no entendía porque no podía aplicar lo mismo y viendo tu código me di cuenta que por defecto el combobox tiene como parámetro string, ya lo corrige. muchas gracias

  1. Percy
    27 de mayo de 2018, 20:39

    Postdata: ya podre dormir tranquilo >)

  1. Gaby Herrera
    15 de mayo de 2019, 8:06

    Para crear un COMBOBOX en otro IDE por ejemplo JCreator es lo mismo o cambia un poco desde ayer tengo ese problema y ya estoy buscando ayuda

Publicar un comentario