Você está na página 1de 5

Actualizar JComboBox al cambiar valor de otro JComboBox

27 abril, 2013
Cuando se trabaja con base de datos, estos datos son dinmicos, cambian con el tiempo y es necesario que
esos cambios se reflejen en la aplicacin cuando el usuario interacta con los controles. Uno de esos
controles son los JComboBox.
El problema que resolveremos en este post, es la actualizacin de valores en un J ComboBox que
llamaremos HI J O cuando se cambia /elige un nuevo item en otro J ComboBox llamado PADRE

Necesitamos
- Microsoft Access
- IDE Netbeans 7.x
- Java
Tiempo: 20 minutos
Nivel: Intermedio
Cuando se utiliza JComboBox, el modo ms fcil de interactuar con los valores de este, es utilizando
un DefaultComboBoxModel asignado al JCombo, esto porque los cambios que realicemos en este model
se vern automticamente reflejados en el JCombo.
Teniendo esto en cuenta, resolver el cambio de items de un jcombo segn 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 aplicacin, 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 LI STENER 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 parmetro de bsqueda 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 continuacin.
El proyecto, que se llama Example2J Combo tiene la siguiente estructura:

Una clase Access.java y un JFrame llamado interfaz.java
No se hacen uso de libreras 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 mtodos 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 {

//contrasea 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 conexin
conn = DriverManager.getConnection(url);
if ( conn!=null ){ //si la conexion tuvo exito
System.out.println("Conexin 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 cdigo, 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 cdigo 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 aade 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

Proyecto Netbeans 7.2 utilizado para este post en este LIN

Você também pode gostar