▷ Curso de JAVA: Cómo llenar múltiples JComboBox (JComboBox anidados) con Base de Datos
En este tutorial, veremos la primera parte acerca de la forma en que podremos llenar y/o cargar un JComboBox con información almacenada en una base de datos, es muy común que en nuestras aplicaciones o proyectos que realizamos trabajemos con los JCombobox en ocasiones las opciones o información que este contiene, dependan de otro JCombobox previamente seleccionado, a esto le llamamos JCombobox dependientes o anidados. Un ejemplo muy común donde esto se aplica es; cuando trabajamos en un formulario con el lugar de nacimiento de X personas, generalmente nos pide el país, departamento y ciudad de nacimiento y dependiendo la opción que seleccionemos se irá actualizando la información de este, en este tutorial aprenderemos como implementar los métodos necesarios para obtener el resultado final que deseamos, para esto haremos uso de una base de datos.
Comencemos!!!
Explicación por Videotutorial:
PARTE 1:
PARTE 2:
Explicación por Foto-tutorial:
1. Lo primero que debemos hacer será agregar los componentes necesarios que utilizaremos para el ejercicio, tenemos que crear previamente un nuevo proyecto, hemos creado un paquete al cual hemos llamado "combobox_anidados1", un JFrame llamado "Comboboxparte1.java" (Ver cómo crear un proyecto, un paquete, y un formulario).
El JFrame que creamos contendrá dos JCombobox aquí es donde mostraremos la información que obtengamos de la base de datos, haremos uso de tres JLabel los cuales identificamos como: Ejemplo 1 (titulo), Departamento, Ciudad.
Antes de continuar te recomiendo que visites el siguiente post: Ver cómo llenar JCombobox con Base de datos.
Interfaz de proyecto java |
2. Lo siguiente que haremos será, cambiar el modificador de acceso a nuestros componentes en este caso los JCombobox con los cuales vamos a trabajar.
Recordemos a que le llamamos modificador de acceso; son los que determinan desde que clases podemos acceder a ciertos elementos, en este caso serán los dos JCombobox, en java trabajamos con los siguientes modificadores: public, private, protected. Para este proyecto necesitamos que nuestros JCombobox sean del tipo public por lo tanto lo haremos de la siguiente manera.
Seleccionamos el JCombobox al cual le haremos el cambio y nos posicionaremos en la parte derecha en nuestra ventana de trabajo y elegimos la opción "properties o propiedades".
Seleccionar opción propiedades |
Ahora seleccionaremos en la parte superior la opción "Code", nos mostrara una serie de opciones nos posicionaremos en la opción llamada "Variable Modifiers", de esta manera cambiaremos el modificador de acceso a nuestro componente.
Seleccionamos la opción Variable Modifiers |
Una vez seleccionamos la opción "Variable Modifiers" saldrá en pantalla una ventana con una serie de opciones, elegimos en el menú desplegable identificado como "Access" elegimos la opción "public" de esta manera garantizamos que nuestro componente o objeto sea visible o tengamos acceso a el desde otras clases, igualmente marcamos la casilla "static". lo hacemos de esta forma para que a la hora de acceder desde otras clases a nuestro componente en este caso son los JCombobox, acceder a ellos de una manera directa sin crear una instancia de la clase.
Este proceso lo aplicamos a los dos JCombobox con los cuales vamos a estar trabajando.
Cambiamos los atributos del Objeto |
3. Seguimos trabajando en nuestra clase "Comboboxparte1.java" ahora nos posicionamos del lado de nuestro código y creamos dos objetos de tipo "DefaultComboBoxModel" el modificador de acceso será "public", seguida de la palabra clave "static", creamos estos dos objetos con el fin de administrar la información que obtengamos de la base de datos y así actualizar los datos del JCombobox.
Recordemos que, para no tener errores en nuestro código debemos importar las librerías necesarias.
import javax.swing.DefaultComboBoxModel;
Clase Comboboxparte1.java |
4. Lo siguiente que haremos será, crear una nueva clase a la que llamaremos "pool.java" esta clase nos va a permitir establecer una conexión con la base de datos que trabajaremos.
Te recomiendo que visites el siguiente post donde se explica detalladamente la creación de esta clase y su respectiva configuración.
Cómo hacer un Pool de Conexiones?
Clase pool.java |
Clase pool
package combobox_anidados1; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class pool { public DataSource dataSource; public String db = "ciudades1"; String url = "jdbc:mysql://localhost:3306/"+db+"?useUnicode=true&characterEncoding=utf-8"; public String user = "root"; public String pass = ""; public pool(){ inicializaDataSource(); } private void inicializaDataSource(){ BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUsername(user); basicDataSource.setPassword(pass); basicDataSource.setUrl(url); basicDataSource.setMaxActive(50); dataSource = basicDataSource; } }
5. Lo siguiente que haremos será, crear una nueva clase a la que llamaremos "metodos_db.java" esta clase contendrá los métodos necesarios para realizar la consulta a la base de datos y de esta manera mostrar el resultado obtenido en los JCombobox.
Clase metodos_db.java |
6. Dentro de las llaves de apertura y cierre { } de la clase "metodos_db.java" que hemos creado con anterioridad, creamos un método al cual llamaremos "consultar", este método nos servirá para realizar la consulta de la información que deseamos obtener de la base de datos y posterior a eso agregarlos a los JCombobox respectivamente.
Pegamos el siguiente método en nuestra clase.
Método consultar.
public void consultar(){ // creamos un objeto de la clase pool pool metodospool = new pool(); // creamos un objeto del tipo connection Connection conectar; try{ // inicializamos un coneccion con la base de datos conectar=metodospool.dataSource.getConnection(); PreparedStatement pst; ResultSet rs; String sql; // creamos dos objetos tipo ArrayList de esta forma obtendremos los resultados de la consulta a la DB ArrayList<String>list_departamento = new ArrayList<>(); ArrayList<String>list_ciudad = new ArrayList<>(); boolean condicional=false; int id_dep=0; // verificamos si la conexion a la DB ha sido exitosa if(conectar!=null){ String busquedadep; // verificamos si el combobox cb_departamento tiene informacion if(Comboboxparte1.cb_departamento.getItemCount()>0){ // capturamos la informacion del item que ha sido seleccionado en el combobox busquedadep = Comboboxparte1.cb_departamento.getSelectedItem().toString(); // creamos la sentencia sql sql="SELECT id_dep FROM departamentos where departamento=?"; //preparamos la sentencia sql con sus respectivos parametros de busqueda pst=conectar.prepareStatement(sql); pst.setString(1, busquedadep); // ejecutamos la consulta a la base de datos rs=pst.executeQuery(); // creamos un ciclo para obtener la informacion de la consulta a la DB while(rs.next()){ id_dep=rs.getInt("id_dep"); } }else{ // si el JCombobox no tiene informacion entrara a esta seccion sql="SELECT id_dep, departamento FROM departamentos"; pst=conectar.prepareStatement(sql); rs=pst.executeQuery(); while(rs.next()){ if(condicional==false){ id_dep=rs.getInt("id_dep"); condicional=true; } // agregamos al arraylist cada resultado que obtendremos list_departamento.add(rs.getString("departamento")); } // agregamos al jcombobox la informacion obtenida de la db Comboboxparte1.model_dep = new DefaultComboBoxModel(to_array(list_departamento)); Comboboxparte1.cb_departamento.setModel(Comboboxparte1.model_dep); } // entramos a la segunda seccion donde vamos ha realizar la consulta de las ciudades // teniendo en cuenta la informacion que se ha seleccionado en el primer combobox sql="SELECT ciudad FROM ciudad INNER JOIN departamentos on(departamentos.id_dep=ciudad.id_departamento) WHERE ciudad.id_departamento=? ORDER BY ciudad ASC"; pst=conectar.prepareStatement(sql); pst.setInt(1, id_dep); rs=pst.executeQuery(); while(rs.next()){ list_ciudad.add(rs.getString("ciudad")); } // agregamos al JCombobox el resultado obtenido Comboboxparte1.model_cid = new DefaultComboBoxModel(to_array(list_ciudad)); Comboboxparte1.cb_ciudad.setModel(Comboboxparte1.model_cid); // cerramos la conexion de la DB conectar.close(); }else{ // si la conexion no es exitosa mostraremos un mensaje de error System.out.println("conexion fallida"); } }catch(Exception ex){ System.out.println("error "+ex); } }
7. Deberás copiar y pegar los siguientes “import” de librerías, para que el código funcione:
import java.sql.PreparedStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import javax.swing.DefaultComboBoxModel;
NOTA:
Recuerda pegar dichos import, después de la línea de código que representa el nombre del paquete (ej. package combobox_anidados;) y sobre la línea de código que identifica el nombre de tu Clase (ej. public class metodos_db{...).
8. Seguimos trabajando en la clase "metodos_db.java", lo siguiente que haremos será crear un método el cual nos servirá para convertir los datos que contiene el objeto tipo "ArrayList" lo convertiremos a un objeto de tipo "vector". ¿Con que fin hacemos esto?
Estamos trabajando con un objeto tipo "DefaultComboBoxModel" este tipo de objeto nos sirve para trabajar nuestros JCombobox de una forma dinámica, recordemos que la información que contenga el JCombobox ira cambiando dependiendo los datos que seleccionemos, entonces al crear un objeto de tipo "DefaultComboBoxModel" hacemos uso de un parámetro que es un objeto tipo "vector", por lo tanto debemos hacer esta conversión de la siguiente manera.
Método toArray.
// metodo para convertir un arraylist a vector public String[] to_array(ArrayList<String> list){ String array[]=new String[list.size()]; for(int i=0; i<array.length; i++){ array[i]=list.get(i); } return array; }
9. Una vez terminada la creación de los métodos, la clase quedaría de la siguiente forma.
Clase metodos_db.
package combobox_anidados1; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; /** * * @author jorgeluis */ public class metodos_db { // metodo para convertir un arraylist a vector public String[] to_array(ArrayList<String> list){ String array[]=new String[list.size()]; for(int i=0; i<array.length; i++){ array[i]=list.get(i); } return array; } public void consultar(){ // creamos un objeto de la clase pool pool metodospool = new pool(); // creamos un objeto del tipo connection Connection conectar; try{ // inicializamos un coneccion con la base de datos conectar=metodospool.dataSource.getConnection(); PreparedStatement pst; ResultSet rs; String sql; // creamos dos objetos tipo ArrayList de esta forma obtendremos los resultados de la consulta a la DB ArrayList<String>list_departamento = new ArrayList<>(); ArrayList<String>list_ciudad = new ArrayList<>(); boolean condicional=false; int id_dep=0; // verificamos si la conexion a la DB ha sido exitosa if(conectar!=null){ String busquedadep; // verificamos si el combobox cb_departamento tiene informacion if(Comboboxparte1.cb_departamento.getItemCount()>0){ // capturamos la informacion del item que ha sido seleccionado en el combobox busquedadep = Comboboxparte1.cb_departamento.getSelectedItem().toString(); // creamos la sentencia sql sql="SELECT id_dep FROM departamentos where departamento=?"; //preparamos la sentencia sql con sus respectivos parametros de busqueda pst=conectar.prepareStatement(sql); pst.setString(1, busquedadep); // ejecutamos la consulta a la base de datos rs=pst.executeQuery(); // creamos un ciclo para obtener la informacion de la consulta a la DB while(rs.next()){ id_dep=rs.getInt("id_dep"); } }else{ // si el JCombobox no tiene informacion entrara a esta seccion sql="SELECT id_dep, departamento FROM departamentos"; pst=conectar.prepareStatement(sql); rs=pst.executeQuery(); while(rs.next()){ if(condicional==false){ id_dep=rs.getInt("id_dep"); condicional=true; } // agregamos al arraylist cada resultado que obtendremos list_departamento.add(rs.getString("departamento")); } // agregamos al jcombobox la informacion obtenida de la db Comboboxparte1.model_dep = new DefaultComboBoxModel(to_array(list_departamento)); Comboboxparte1.cb_departamento.setModel(Comboboxparte1.model_dep); } // entramos a la segunda seccion donde vamos ha realizar la consulta de las ciudades // teniendo en cuenta la informacion que se ha seleccionado en el primer combobox sql="SELECT ciudad FROM ciudad INNER JOIN departamentos on(departamentos.id_dep=ciudad.id_departamento) WHERE ciudad.id_departamento=? ORDER BY ciudad ASC"; pst=conectar.prepareStatement(sql); pst.setInt(1, id_dep); rs=pst.executeQuery(); while(rs.next()){ list_ciudad.add(rs.getString("ciudad")); } // agregamos al JCombobox el resultado obtenido Comboboxparte1.model_cid = new DefaultComboBoxModel(to_array(list_ciudad)); Comboboxparte1.cb_ciudad.setModel(Comboboxparte1.model_cid); // cerramos la conexion de la DB conectar.close(); }else{ // si la conexion no es exitosa mostraremos un mensaje de error System.out.println("conexion fallida"); } }catch(Exception ex){ System.out.println("error "+ex); } } }
10. Regresamos a la clase "Comboboxparte1" después de la siguiente línea de código
public class Comboboxparte1.....{
Creamos un objeto de la clase "metodos_db" de esta forma podemos acceder al métodos para realizar la consulta a la base de datos .
metodos_db metodos = new metodos_db();
Instancia de la clase metodos_db.java |
11. En las llaves de apertura y cierre { } del método constructor de la clase "Comboboxparte1".
public Comboboxparte1() {.....
Llamaremos al método "consultar" perteneciente a la clase "metodos_db", este método nos permitirá consultar en la base de datos, la información que deseamos mostrar en los JCombobox. metodos.consultar();
12. Seguido a esto, agregaremos un evento, esto lo hacemos con el fin de que al ser seleccionado, un item del JCombobox es este caso "cb_departamento" se actualice la información del JCombobox que depende del otro "cb_ciudad".
cb_departamento.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
metodos.consultar();
}
});
13. Deberás copiar y pegar los siguientes “import” de librerías, para que el código funcione:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
NOTA:
Recuerda pegar dichos import, después de la línea de código que representa el nombre del paquete (ej. package combobox_anidados;) y sobre la línea de código que identifica el nombre de tu Clase (ej. public class Comboboxparte1{...).
14. El método constructor de nuestra clase (Comboboxparte1) quedaría de la siguiente forma:
Método Constructor.
public Comboboxparte1() { initComponents(); this.setLocationRelativeTo(null); metodos.consultar(); cb_departamento.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { metodos.consultar(); } }); }
15. Al ejecutar nuestro proyecto, mostrará el resultado final en pantalla.
Resultado final aplicación java |
Si tienes alguna otra forma de implementar esta clase no dudes en compartirla, y así poder compartir opiniones sobre el tema.
Si deseas descargar el vídeo, junto con el código fuente del presente tema, sólo debes dirigirte a nuestra Zona de Descargas, y dar clic sobre el icono "Curso de JAVA Parte 21".
Si deseas descargar el vídeo, junto con el código fuente del presente tema, sólo debes dirigirte a nuestra Zona de Descargas, y dar clic sobre el icono "Curso de JAVA Parte 21".
¿Quieres aprender a realizar aún más cosas y personalizar tus programas hechos en el lenguaje de programación JAVA?, si tu respuesta es "Sí", puedes acceder a todos los tips de JAVA que hemos estado publicando en este blog, dando clic aquí.
Suscríbete a nuestro blog, vía Email o RSS; además puedes seguirnos a través de nuestras redes sociales como: Facebook, Twitter, YouTube y Google+.
Si te fue de gran ayuda este material, no olvides compartirlo con tus amigos.
Si tienes dudas o sugerencias al respecto; puedes dejarnos tus comentarios.
Bendiciones...
Hola.
ResponderBorrarCordial saludo.
Exclente sus videos.
Pregunto. si la tabla ciudad tuviera un campo habitantes, y yo quiero mostrar ese dato en un texfield en el mismo formulario; como capturo ese dato y lo envio al texfield.
Gracias