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»
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
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:
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.
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
Actualizado 04/01/2026
Proyecto Netbeans 7.2 utilizado para este post en este LINK POBRE
En este videotutorial se vera la creación de Interfaces Gráficas de Usuario (GUI) utilizando MatLab GUIDE herramienta vi[...]
El control de paginación de JavaFX (Pagination) se usa para navegar a través de varias paginas de contenido divididas en[...]
En este post veremos como enviar solicitudes GET y POST a un API RestFul desde un dispositivo con android. Nuestra apli[...]
En esta oportunidad construiremos una aplicación android que nos permitirá consumir un servicio web utilizando la libre[...]
Acierta los colores o Adivina los colores es un sencillo juego que consiste en que dado 6 colores «rojo», «verde», «salm[...]
¿Qué es una página 404? Una página 404 es la pagina que ve un visitante cuando se produce un error HTTP 404 o Not Found,[...]