Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Access / Base de Datos / Base de Datos / Java / Java / Proyectos / Actualizar JComboBox al cambiar valor de otro JComboBox

Actualizar JComboBox al cambiar valor de otro JComboBox

Autor jc mouse sábado, abril 27, 2013

Cuando se trabaja con base de datos, estos datos son dinámicos, cambian con el tiempo y es necesario que esos cambios se reflejen en la aplicación cuando el usuario interactúa con los controles.  Uno de esos controles son los JComboBox.

“El problema que resolveremos en este post, es la actualización de valores en un JComboBox que llamaremos HIJO cuando se cambia /elige un nuevo item en otro JComboBox llamado PADRE”

change jcombo

Necesitamos

– Microsoft Access

– IDE Netbeans 7.x

– Java

Tiempo: 20 minutos

Nivel: Intermedio

Cuando se utiliza JComboBox,  el modo más fácil de interactuar con los valores de este, es utilizando un DefaultComboBoxModel asignado al JCombo, esto porque los cambios que realicemos en este model se verán automáticamente reflejados en el JCombo.

Teniendo esto en cuenta, resolver el cambio de items de un jcombo según los valores de otro jcombo, es relativamente sencillo.

Para este ejemplo se hace uso de una base de datos con dos tablas relacionadas, tabla CLASE y tabla ANIMAL

access db

Cuando iniciemos la aplicación, se obtienen los registros de la base de datos (tabla: clase) los cuales son cargados en un DefaultComboBoxModel y estos son asignados al JCombo Padre, haciendo uso del primer ITEM de ese JCombo, se realiza una nueva consulta en busca de los registros relacionados en la tabla ANIMAL y estos a su vez son cargados en otro  DefaultComboBoxModel asignado al JCombo Hijo.

Haciendo uso de un LISTENER asignado al JCombo Padre se estará atento a los cambios producidos en este ( elegir un nuevo item ), cuando este evento se produzca, se volverá a realizar una consulta a la base de datos utilizando como parámetro de búsqueda el nuevo item seleccionado del JCombo Padre y el resultado asignado al JCombo Hijo todo esto, con el uso de DefaultComboBoxModel.

Lo escrito anteriormente, lo pondremos en practica a continuación.

El proyecto, que se llama Example2JCombo tiene la siguiente estructura:

jcombo

Una clase Access.java y un JFrame llamado interfaz.java

No se hacen uso de librerías ajenas, no las necesitamos.

Clase Access.java

Esta clase se encarga de conectarse a la base de datos Access “db.accdb” y de implementar los métodos necesarios para realizar las consultas. La clase cuenta con sus respectivos comentarios 🙂

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.DefaultComboBoxModel;
/**
 * @web http://jc-mouse.net/
 * @author Mouse
 */
public class Access {

   //contraseña a la base de datos si es que tuviera, si no se deja vacio
   private String password = "";
   //nombre de la base de datos Acces con extension *.mdb o *.accdb
   private String dbName = "db.accdb";
   //direccion de la base de datos
   private String bd = System.getProperty("user.dir") + "\\" + dbName + ";PWD=" + password;
   //driver para base de datos Access 2000, 2003, 2007, 2010
   private String url = "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=" + bd;
   Connection conn = null;

   /**
 * Constructor de clase
 */
   public Access()
   {
     try{
         //obtenemos el driver para Access 
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");         
         //obtenemos la conexión 
         conn = DriverManager.getConnection(url);
         if ( conn!=null ){ //si la conexion tuvo exito 
           System.out.println("Conexión a base de datos "+bd+". listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
   }

   /**
 * @param sql Instruccion SQL
 * @return ResultSet
 */
   public ResultSet consulta( String sql )
   {
      ResultSet res=null;
      try{
         PreparedStatement pstm = conn.prepareStatement( sql );
         res = pstm.executeQuery();          
      }catch(SQLException e){       
        System.err.println( "Error consulta :" + e.getMessage() );
      }
      return res;
   }

   /**
 * Metodo para obtener los registros de CLASES de animales de la base de datos
 * @return DefaultComboBoxModel
 */
   public DefaultComboBoxModel fases()
    {
        DefaultComboBoxModel  listmodel = new DefaultComboBoxModel ();        

        ResultSet res = this.consulta( " SELECT * FROM clase " );
        try {            
            while( res.next() ){
                listmodel.addElement( res.getString( "nombre" ) );                
             }
            res.close();
        } catch (SQLException ex) {            
            System.err.println( "Error consulta :" + ex.getMessage() );
        }        
        return listmodel;
    }

  /**
 * Metodo para obtener los registros de la tabla ANIMAL
 * @param clase Parametro de busqueda
 * @return DefaultComboBoxModel
 */
   public DefaultComboBoxModel animales( String clase )
   {
       DefaultComboBoxModel  listmodel = new DefaultComboBoxModel ();        

        ResultSet res = this.consulta( " SELECT descripcion " + 
                                       " FROM animal AS a INNER JOIN clase AS c ON c.id = a.idclase " + 
                                       " WHERE nombre = '"+clase+"' " );
        try {            
            while( res.next() ){
                listmodel.addElement( res.getString( "descripcion" ) );                
             }
            res.close();
        } catch (SQLException ex) {            
            System.err.println( "Error consulta :" + ex.getMessage() );
        }        
        return listmodel;
   }

}//--> fin clase

interfaz.java

Este JFrame que corresponde a la interfaz de usuario, consta de dos JComboBox llamado “padre” el primero e “hijo” el segundo.

gui

En este JFrame debemos implementar la clase Access.java , el código,  debe ser escrito en el constructor de la clase, osea:

Original

public class interfaz extends javax.swing.JFrame {

    /**
 * Creates new form interfaz
 */
    public interfaz() {
        initComponents();
    }

   ...

Con el código implementado

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
 * @web http://jc-mouse.net/
 * @author Mouse
 */
public class interfaz extends javax.swing.JFrame {

    //clase access
    private Access access = new Access();    

    /**
 * Creates new form interfaz
 */
    public interfaz() {
        initComponents();
        this.setLocationRelativeTo(null);

        //Se obtiene los registros de tabla CLASE y se asigna al JCombo PADRE
        this.padre.setModel( access.fases() );
        //Se obtiene el valor seleccionado de JCombo PADRE, con el valor obtenido se obtiene los
        //registros dependientes de la tabla ANIMALES
        this.hijo.setModel( access.animales( this.padre.getSelectedItem().toString() ) );

        //Se añade un LISTENER para que a cada cambio del JCombo PADRE
        //se realiza una nueva busqueda en la tabla ANIMALES
        padre.addItemListener( new ItemListener(){

            @Override
            public void itemStateChanged(ItemEvent e) {
                if ( e.getStateChange() == ItemEvent.SELECTED ) 
                {
                    // los nuevos registros son agregados al MODEL del JCombo HIJO
                    Object item = e.getItem();
                    hijo.setModel( access.animales( item.toString() ) );
                }
            }

         });

    }

Ejecuta el programa y listo

change jcombo

Proyecto Netbeans 7.2 utilizado para este post en este LINK 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

Reproduce archivos MP3 desde android

Reproduce archivos MP3 desde android

Reproducir archivos de audio en nuestras aplicaciones android. Necesitamos IDE Eclipse y SDK Android instalado Un archiv...

Crea un “Juego de Memoria” en java

Crea un “Juego de Memoria” en java

En este tutorial crearemos un sencillo juego de memoria en lenguaje java. Necesitamos IDE Netbeans 7.x Editor de imágene...

CORBA en java .:. Ejemplo completo

CORBA en java .:. Ejemplo completo

Common Object Request Broker Architecture (CORBA) es un estándar que permite que diversos componentes de software escrit...

Consultas con parámetros en Access y Java

Consultas con parámetros en Access y Java

Tenemos un archivo de base de datos Access *.MDB y queremos realizar una consulta con parámetros de búsqueda utilizando...

Puzzle en Visual Basic [Código Fuente]

Puzzle en Visual Basic [Código Fuente]

Rompecabezas 3×3 realizado en Visual Basic .NET, lo que se hizo fue una migración de un proyecto hecho en java (pue...

Contar segundos (Problema Resuelto)

Contar segundos (Problema Resuelto)

El problema dice asi: Se desea contar los segundos que se presiona un JButton en un formulario. Solución: Para resolver...

13 comentarios en “Actualizar JComboBox al cambiar valor de otro JComboBox”

  1. Sebastian dice:

    Hola desde hace un mes aprox. estoy viendo tus creaciones y me han ayudado bastante. mcuhas gracias

  2. max dice:

    gracias por el aporte

  3. sergio dice:

    Hola…buenisimo¡¡¡¡…

    estaba tratando de hacerlo con 3 jcombox, o sea, llenar un hijo por medio de 2 padres…no logro como hacerle :S, intente con addItemListener pero nada de nada :S …ayuda please¡¡

    1. Miguel Angel dice:

      Sergio, has encontrado la solución a tu problema? De ser así me la podrias compartir?

      Miguel Angel

  4. Victor dice:

    Amigo me gustaria saber como guardar la ruta de la imagen en una base de datos Xampp ,solo su ruta y poder visualizarla con la misma en java modo mdi (diseno) Espero tu respuesta muy amable

    1. Mouse dice:

      ese depende de como estes programando por ejemplo te creas una clase imagen donde tenga por atributo la ruta y luego la invocas donde la necesites

  5. jesusisimo dice:

    esta buenislmas todas tus ayudas …. eres un locasl brother .. un saludo .

  6. Nery Martinez dice:

    Hola señor Mouse:
    En primer lugar te felicito por tus aportes valiosos, en segundo lugar quiero preguntarte qué debo cambiar en los códigos para que me funcione con netbeans 8.x por que he abierto el proyecto con una version de 7.3 y funciona correctamente pero con el 8.0 no me ha querido ejecutar…
    De nuevo Gracias.

    1. Mouse dice:

      fíjate en propiedades del proyecto cambia al JDK que usa netbeans 8

  7. Miguel Angel dice:

    Al igual que Sergio, he estado tratando de hacerlo con 3 jcombobox dependientes y no lo he podido hacer.
    Combobox1 Dependencia
    Combobox2 Programa
    Combobox3 Subprograma

    Podrias ayudarmen con ello?

  8. betjisi dice:

    COMO LOGRE GUARDAR EL ID DE UN JCOMBOBOX CARGADO DESDE UNA BD

    1. Mouse dice:

      cargas el objeto y lo asignas al model, por ejemplo
      public class tuclase{
      private id=”123″;
      private name=”nombre”;

      }

  9. juan dice:

    Hola, gracias y saludos desde chile.

    Tengo una duda, al implementar tu codigo todo bien, pero al pasar parametro para que me consulte el campo del combobox hijo, el campo “descripcion” no se si esta bien descrito, ya que no me trae datos y me indica que el indice no es valido:

    try {
    while( res.next() ){
    listmodel.addElement( res.getString(“descripcion”) );
    }
    res.close();

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Comparte lo que sabes

Categorias

Últimas entradas

Una Prueba Unitaria, es una forma de comprobar que nuestro código, hace lo que se supone debe hacer; es decir, se asegur...

La prueba del camino básico, es una prueba de “caja blanca” que consiste en verificar el código de nuestros...

Si quieres cambiar el nombre de tus atributos sin tener que reescribir código java por X o Y razón, GSON te permite reno...

Un JList nos permite almacenar objetos en una lista y mostrarlos gráficamente en una serie vertical en el cual el usuari...

Android Bolivia

Bandera en Alto