How to: Como llenar un JComboBox con una BD

Buenas noches de nuevo!, me esta gustando esto de agregar tutoriales jaja espero a alguien les sirva, pero en fin lo que ahora voy a enseñarles es como llenar un JComboBox con datos de una base de datos!. Seguiremos usando la base de datos Sakila!, por si no la tienes la puedes bajar desde aqui, jaj bueno no, de aqui y si no sabes instalarla pues amm eemm, baja esto mySQLGUITOOLS, y con el query browser ejecuta los scripts de la base de datos!, no quiero entrar en detalle por que no vengo a explicar eso 😛 googlea hermano! en fin comencemos.

Este sera el simple diseño que usaremos, solo un JComboBox:

En el tutorial anterior, explico como conectarnos a mySQL, asi que si no lo han visto es tiempo de que lo vean antes de seguir  PostMySQL entren ya que no mencionare como conectarse a mySQL desde Java, en fin como ya sabemos como conectarnos a mySQL, lo que haremos aqui es hacer una consulta a nuestra base de datos Sakila, a la tabla actores, consultaremos el nombre y apellido y los mostraremos todos en este JComboBox que mostre arriba. Comencemos con la configuracion del JComboBox, si lo han usado antes sabemos que puede recibir cualquier objeto hasta objetos definidos por nosotros, asi que haremos una clase Actor ( que sera nuestro bean) con 2 propiedades, que seran nombre y apellido, y le ponemos un set y un get a cada propiedad ( han hecho un bean alguna vez?) pues vamos a hacerlo.

(NOTA!: Aqui el nombre de la clase hay que cambiarselo por “Actores”, ya que sin darme cuenta lo he cambiado en metodos posteriores)

Hay esta, tenemos nuestro bean y asi lo deben hacer ustedes!, pero ahora viene algo que agregar a esta clase, tenemos que sobreescribir el metodo toString(), ese metodo lo usara el JComboBox para convertir el objeto a una cadena y mostrarlo, entonces lo sobreescribimos para que actue a nuestra manera:

Lo que hara es mostrarnos las propiedades de nuestro bean.

Ahora lo que sigue es lo mas interesante, la coleccion ArrayList nos ayudara para juntar los datos de la consulta y agregarlos al JComboBox, ArrayList puede ser Object (cualquier tipo de dato que queramos), entonces guardara objetos tipo Actor. Creamos este metodo llamado “obtenerLista”, este lo creamos en la clase donde hicimos nuestra GUI (olvidemos la clase Actor por un rato).

(Jajaja la consulta esta mal, chequenla XD )

EDITO: Recuerden que  conjuntoResultados e instruccion las vimos en el post anterior.

Ya que esta un poco reborujado, lo explicare muy detallado: public ArrayList<Actores> obtenerLista(), estamos indicando que el metodo nos retornara un objeto tipo Actores pero en un ArrayList, dentro del try esta la consulta y la guardamos en un ArrayList que es el que nos devolvera, recuerden que ArrayList la definimos para que solo reciba objetos tipo Actor. Entonces hacemos la consulta como en el post pasado, sabemos que el metodo .next() de conjuntoResultados checa si hubo algun resultado de la consulta y nos lleva a la primera hilera, para asi obtener los datos columna por columna, en fin en el do while lo que estamos haciendo es crear un objeto tipo Actor, y en el constructor metemos como parametro los resultados de la consulta, de la columna 1 ( nombre ) y de la columna 2 (apellido) y luego info ( nuestro ArrayList de actores) le agregamos el objeto tipo actor, y cuando ya hizo todo ese proceso con todas las hileras que obtuvimos de la consulta, se sale del do while y nos devuelve nuestro ArrayList.

Ok ya tenemos nuestro metodo que obtiene toda la informacion de la consulta y la guarda en un ArrayList, ahora lo que haremos es agregarla al JComboBox, para eso haremos un metodo que se llame cargarComboBox y sera de la siguiente manera:

Creamos un ArrayList y  mandamos a llamar nuestro metodo “obtenerLista” que nos devolvera otro ArrayList, pero ya con toda la informacion de la consulta, que chido no =D?, ahora lo que haremos, en el bucle for, lo hacemos hasta el numero de resultados que se guardaron en el Array, osea el tamaño de nuestro array (.size()), creamos un objeto para agregarselos a nuestro JComboBox, lista.get (x), nos devuelve el elemento que esta en la posicion x, y como nos devuelve un tipo Actor, este tiene el metodo get para cada propiedad, usamos cada metodo get, para agregarselos al constructor de Actor, y asi se guarde toda la informacion, posteriormente la agregamos al jComboBox.

Ahora si tenemos todos los metodos necesarios, ahora lo que haremos, en nuestro constructor de nuestra GUI, agregamos esto :

El metodo conectarse, es el mismo que el post anterior, que sirve para iniciar la conexion a mySQL.

Este seria nuestro resultado =D

Espero y les haya servido! ( recuerdan que en el post pasado les dije que hecharan andar su imaginacion con lo que vimos en ese post??, pues yo lo hize y surgio este post =D).

Un saludo!.

EDITO: Hay algo importante que se me ha estado pasando, en el ejemplo anterior y este, se queda un proceso abierto que es la conexion a mySQL, esta debemos cerrarla con el metodo .close() de conection XD, despues explicare como XD

Anuncios

39 comentarios sobre “How to: Como llenar un JComboBox con una BD

  1. he donde estan los trolles?
    jajaja son los buenos alimentalos 😛
    jajaja chido el blog aunke algo confuso xdDD
    sigue asi balu

  2. hahaha
    es una invitacion =O.
    necesitariamos cambiarle el nombre XD emprender una idea de mercadotecnia ponernos en contacto con todos los demas blogs XD ser los mejores y despues ganar dinero por ello 😀 xDDD
    creo k si pero entrando a la escuela XDD pk ahorita le inter funciona cuando le da la gana y eso =(

  3. En una BD es más fácil trabajr con los números que con los nombres o strings, como puedo decirle al combo que cuando yo haga un select en mi BD de Id y Nombre tome cuando seleccione dicho combobox el valor numerico y que para mostrar lo haga mostrando el nombre???

  4. Freddy :En una BD es más fácil trabajr con los números que con los nombres o strings, como puedo decirle al combo que cuando yo haga un select en mi BD de Id y Nombre tome cuando seleccione dicho combobox el valor numerico y que para mostrar lo haga mostrando el nombre???

    ola!! yo pregunto lo mismo que fredy si nos pudieras ayudar con eso en particular estaria muy agradecido y buen post (me pregunto si aun el blog sigue activo)

    1. La verdad no entiendo muy bien su pregunta, quieren que al abrir elJComboBox aparescan los ID, pero al seleccionarlo aparesca el nombre!? si es asi pues comentenlo para averiguar como lograr eso ya que nunca lo he hecho! tengo alguna idea de como hacerlo. Podriamos usar getSelectedItem del JComboBox y hacer un cast con la clase Actores, asi ya tendriamos el objeto seleccionado y podriamos usar el metodo getNombre(). Pero la verdad seria mucho mas facil mostrar el nombre en un Label, pero venga intentare lo que dicen pero ya es un poco tarde!. Saludos!

  5. donde se pone el metodo CargarComboBox??
    yo lo he puesto donde tengo el array y me da este error(utilizo netbeans):
    el simbolo JComboBox1 no se puede encontrar que es el de la ultima fila: JComboBox1.addItem(obj)

    1. El metodo CargarComboBox se utiliza en el constructor en la penultima imagen podemos notar eso!, este post es de seguimiendo del post anterior, o si sabes que estas haciendo bien la conexion a mysql no es necesario ver el post anterior.
      Un Saludo!

  6. Hola a todos cuando colocan public ArrayList obtenerLista () {
    Me marca como error Actores, dices que el método obtener lista se crea en el GUI, pero en que parte del GUI, se poco de java y se supone que Actores es un objeto tiene que declararse antes o algo así.

    Saludos

    1. OH! acabo de detectar un error fatal! gracias Roberto!. La clase yo la declaro con nombre “Actor”, pero en algun otro momento le cambie el nombre a “Actores”, lo que puedes hacer es cambiar de nombre la clase a “Actores”, espero y sea eso!, no me habia fijado!
      Un saludo!

  7. Tengo la misma duda que Freddy y Jose, tengo una tabla categoría la cual se compone de los campos(ID, DESCRIPCIÓN), y quiero que el combobox solo muestre DESCRIPCIÓN no se si el ID se lo podemos enviar al combobox como index o algo así, para después yo poder enviar el ID, a la base de datos, espero y me entiendas.
    SALUDOS.

    1. No se si entiendo lo que quieres hacer, lo que tienes que hacer es una clase que se llame “Categoria” y tendra 2 propiedades: id(int) y descripcion(String).
      Se hace al igual que este post, si este post se estubiera comprendiendo al parecer alguien lo hubiera deducido, tal vez debo de explicarme mas.

      Lo que hace este ComboBox es guardar objetos tipo Actores, y se puede obtener ese “objeto” al seleccionarlo y convertirlo en lo que es, un objeto tipo Actores. Este objeto almacenara su ID,Descripcion y todos los campos que se hayan agregado al crear la clase.
      Al obtener ese objeto simplemente se hace objeto.getId(); y se tendra el ID del objeto seleccionado del ComboBox (seleccionado por su nombre).
      Preparare un post para esto, pero necesito saber si comprendi la situacion

      PD. Disculpa la tardansa, por algunas razones WordPress no me avisa cuando llegan correos!

  8. Una consulta, como puedo hacer esto respetando el modelo de 3 capas? es decir, la clase de negocios que sería actores, es la que debe conectar con la base de datos. Segun lo que entiendo, el metodo obtenerLista() se declara en la capa de usuarios, es decir el formulario.
    Según tengo entendido, esto no respeta el modelo de 3 capas ya que los formularios no deben “tocar” la base de datos directamente NUNCA. El SELECT se deberia hacer desde la clase Actores (clase de Negocios).
    Saludos!

    1. Y tienes toda la razon franco, la manera que lo he hecho no es la correcta, pero por sencilles y objetivos especificos del post asi lo hize (Ademas cuando hize el post no tenia la practica de programacion que ahora tengo ), hace poco he estado haciendo post de ASP.NET y asi como tu dices!, no conosco ese modelo que dices o almenos no con el nombre de 3 capas. Pero lo que yo hago es crear digamos la clase Usuarios, esta tiene atributos (con sus get y set), y ademas se crea otra clase que sera nuestro Data Access Layer, o sea otra clase llamada UsuariosDAL, esta clase es la que realizara las conexiones y consultas, en este caso, el metodo obtenerLista deberia de ir en una clase llamda UsuariosDAL.

      Un saludo y gracias por la observacion!

  9. Muy bueno el ejemplo, sin embargo tengo un problema al obtener los datos de la lista, pues no coloca ninguna dato en el combo box, me los deja nulos, pero sí la cantidad de espacios que debe tener, Quisiera saber a que se debe ésto.

    Muchas Gracias
    Andrés Martíez

    1. Tienes el ejemplo igual a como lo puse? no te marca ningun error? solo te pone los espacios nulos?, intenta hacer la consulta con un manejador de bases de datos para ver si te arroja los tados, pero si te deja espacios en blanco es evidente que la consulta no esta mal, quedaria ver tu codigo en donde setas agregando los datos para ver que este todo en orden!, un saludo y disculpa las demoras al contestar ya que ando cargado de trabajo.

  10. Me podrias pasar, si es que tienes como guardar los datos en la base de datos utilizando el combobox? es decir seleccionar un item para guardarlo en la base de datos, porque no lo puedo hacer andar, desde ya muchas gracias

      1. Que tal chico, agregando un poco a lo que solicitan ( seleccionar un item del combo y que al seleccionarlo aparezca el id de la base de datos), Para esto solo tien modificar un poco la clase de Isaac.

        1. Modificamos el constructor del bean Actor agregando el id del actor(id es la llama primaria de la tabla asumimos que es una String , puede ser un int, de ser int cambiar en el contructor).

        public class Actores {
        private String id;
        private String nombre;
        private String apellido;

        public Actores(String id, String nombre, String apellido) {
        super();
        this.id = id;
        this.nombre = nombre;
        this.apellido = apellido;
        }

        public String getId() {
        return id;
        }

        public void setId(String id) {
        this.id = id;
        }

        public String getNombre() {
        return nombre;
        }

        public void setNombre(String nombre) {
        this.nombre = nombre;
        }

        public String getApellido() {
        return apellido;
        }

        public void setApellido(String apellido) {
        this.apellido = apellido;
        }

        @Override
        public String toString() {
        return nombre+” “+apellido;
        }
        }

        En la consulta seria SELECT id, nombre, apellido FROM actor.

        el metodo obtejerLista

        Actores listatemporal = new actores(ConjuntoResultset.get(1), consultoResultset.get(2), conjultoResultset.get(3) )
        info.add(listaTemporal);

        cambiar por

        info.add( new Actores( conjuntoResultset.getString(1), conjuntoResultset.getString(2), conjuntoResultset.getString(3) ) );

        evitas declarar variables innecesarias

        En el metodo cargarCombobox

        cambia en el for borrar la linea
        Actores obj =……
        No es necesario extraer el objeto y almacenarla en un bean estas haciendo muy ineficiente el trabajo.

        es mejor asi.
        jCombobox.addItem(lista.get(x));

        ahora solo no queda agregar listener al combo.

        Metodo anonimo para captura de evento, si lo deseas lo puedes hacer mediante herencia utilizando implements en tu case base.

        jCombobox.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
        //accion a realizar cuando se detecte la seleccion
        System.out.println(jCombobox.getSelectedItem());
        esto lo pueden poner en un system.out.pritln para verlo en consola
        y veran el id de objeto seleccionado el cual les puede servir para realizar una subconsulta en combobox dependentes o cualquier otra cosa que desea

        ((jCombobox.getComponent(jCombobox.getSelectedIndex()))).getId;

        }
        });

        pido disculpas por el codigo pero estoy en una maquina muy viejita y no puedo probar el codigo pero segun me acuerdo es asi. si tienen duda escribar a mi correo y si desea ayuda me dare mi vuelta por esta blog.

        y Disculpa isaac por tocar mucho tu codigo.

  11. buenas noches, tengo una pregunta , lo que assa esq he seguido todos los pasos de este post y me llena el combo con los datos de mi bd, pero cuando le coloco q me muestre un mensaje cada ves q selecciono un item si me muestra el valor de la base de datos pero asi nomas a simle vista cuando ejecuto mi aplicacion me muestra una cadena como de basura de memoria..
    que puede ser

    porfa espero me puedas colaborar gracias

    1. Has agregado el metodo en la clase actor llamado toString ??? con un @Override? revisa que este ese metodo porque ese es el encargado de mostrar lo que nosotros desiemos y no la “basura” que te sale. Un saludo 🙂

  12. Muchas gracias me sirvio mucho tu publicación, aunque me hizo batallar un poco por que yo utilice public interface BasedeDatos(){

    }
    y despues la implemente en mi clase conexion
    gracias

      1. Estube escribiendote mas arriba, pero viendo un par de videos y unas cosas lo pude hacer andar, gracias de todas formas! Si queres que compartamos información sobre java agrega mi correo nivan.scoles@hotmail.com

  13. Hola, me parece interesante tu post, aunque esta muy confuso y desordenado, estaba buscando la forma como guardar el ID del Item selecciona en google y me encontré con esta pagina, he visto 3 post tuyos y no he aprendido nada xD! no lo tomes a mal pero no tienes madera para enseñar! por otro lado espero sigas mejorando en java, saludos 🙂

  14. Hola isaac el código anda perfecto es increible y no me da problemas al utilizarlo en varios combobox que esten en un mismo frame es la maravilla, muchas gracias, la consulta que te hago, es como podria colocar seleccionado por default uno de esos elementos que cargue de la base de datos, de antemano muchisimas gracias es que el metodo combobox.setSelectedItem(); no me funciona, o no se como emplearlo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s