Software Médico

SimpleHC Medium

Un software pensado para toda la comunidad médica


Para solicitar desarrollo de software y/o aplicaciones personalizadas, escríbenos al formulario de contacto





Breaking News





¡BUSCA MÁS CONTENIDO AQUÍ!



▷ 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!!!

JCombobox anidados



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. 



clase que contiene los JCombobox
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".


seleccionamos el JCombobox  y elegimos la opcion properties
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
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 el modificador de acceso a los JCombobox
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


creamos una nueva clase metodos_db.java
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();
creamos un objeto de la clase metodos_db.java
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.


mostramos el resultado obtenido
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".

¿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: FacebookTwitterYouTube 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...

1 comentario:

  1. Hola.
    Cordial 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

    ResponderBorrar