Si necesitas un código de programación en específico, escríbeme al formulario de contacto.

BUSCA TU CÓDIGO


BUSCA MÁS CÓDIGOS DE PROGRAMACIÓN AQUÍ:

Código JAVA: Cargar JComboBox con registros de una base de datos parte II


Código JAVA anterior:

Código JAVA: Cambiar de un JPanel a otro con botón siguiente y atrás

-------------------------------------------------------------------------------------------

Este post está orientado a la aplicación e implementación de un bloque de código JAVA, que nos permitirá mostrar en un ComboBox los registros almacenados en varias tablas de una base de datoslo cual, nos ayudará a tener formularios más dinámicos, ya que, en este caso, componentes como los JComboBox mostrarán información actualizada a medida que alimentemos nuestra base de datos.

Introducción 

Para la realización de nuestro ejemplo, estaremos utilizando tres paquetes y de esta manera organizar las distintas clases que utilizaremos,  La distribución de las clases quedaría de la siguiente manera.

  • combobox-anidados (Nombre del proyecto)
    • SourcePackages
      • comboboxanidados (Primer paquete)
        • Principal.java
      • controlador (Segundo paquete)
        • controlador.java
      • modelo (Tercer paquete)
        • ciudad.java
        • departamentos.java
        • estados.java
        • metodos.java
        • pais.java
        • pool.java
    • TestPackages
      • <DefaultPackage>
    • Libraries (Librerías requeridas)
      • commons-dcp-1.0.jar
      • commons-pool-1.6.jar
      • JDK 1.8 (Default)
    • Test Libraries


    La Base De Datos estará compuesta por lo siguiente: 

    4 tablas, estas serán la tabla países, esta tendrá dos campos; uno de tipo entero (id_pais) esta será la clave primaria, otro campo de tipo varchar (paises) donde se almacenara el nombre de cada país.

    La tabla estados estará compuesta por tres campos; dos campos tipo entero (id_estado, id_pais), uno de estos será la llave primaria (id_estado) y otro será la llave foránea (id_pais), tendrá un campo tipo varchar donde se almacenara los nombres de los respectivos estados. La tabla estado tendrá una relación de uno a muchos con la tabla países.

    Seguimos con la tabla departamentos la cual posee 4 campos, 3 de tipo entero(id_dep, id_pais, id_estado) dos de estos campos son llave foránea(id_pais, id_estado) y uno llave primaria(id_dep) igualmente posee un campo tipo varchar(departamento).


    Por ultimo tenemos la tabla ciudad, esta posee 3 campos; dos tipo entero uno es llave primaria(id_ciudad) y el otro es la llave foránea( id_departamento) igualmente posee un campo de tipo varchar(ciudad).

    NOTA: Las tablas que poseen claves foráneas tienen una relación de uno a muchos

    Te recomiendo que visites los siguientes POST para ampliar conocimientos relacionado al tema que trataremos:
    Curso de JAVA: Cómo hacer un Pool de Conexiones? 

    Curso de JAVA: Cómo llenar JComboBox con Base de Datos 
    ¿Deseas descargar este ejemplo completo? AQUI!!!




    Clase Principal JFrame: comboboxanidados/Principal.java
    package  comboboxanidados;
    import  controlador.controlador;
    import  java.awt.Color;    
    
    public class Principal extends javax.swing.JFrame {
        
         // Creamos un objeto de la clase controlador
         controlador controlador;
    
         //Creamos el método constructor de la clase     
    
    
         public Principal() {
    
                  initComponents();
    
                  this.setLocationRelativeTo(null);
                  this.setBackground(Color.yellow);
    
                  cb_estado.setVisible(false);
                  label_estado.setVisible(false);
    
                  controlador = new  controlador(this);
          }
    
        
        public static void main(String args[]) {
    
                  java.awt.EventQueue.invokeLater(new Runnable() {
    
                       @Override
    
                       public void run() {
    
                            new Principal().setVisible(true);
    
                       }
    
                  });
    
    
          }
    
      }
      

    Clase Controlador: controlador/controlador.java
    package controlador;
    
    import comboboxanidados.Principal;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import javax.swing.DefaultComboBoxModel;
    import modelo.ciudad;
    import modelo.departamentos;
    import modelo.estados;
    import modelo.metodos;
    import modelo.pais;
    
    public class controlador implements ActionListener{
    
    
    
       // creamos un objeto de la clase Principal y un objeto de la clase métodos  
        Principal vista;
        metodos metodosDB = new metodos();
        
        // creamos 4 objetos de tipo Arraylist los cuales lleva como parámetro las clases pais, estados, departamentos y ciudad respectivamente 
        ArrayList<pais> paises;
        ArrayList<estados> estados;
        ArrayList<departamentos> departamentos;
        ArrayList<ciudad> ciudad;
    
        // creamos un método para agregar los eventos  
        public final void events(){
        
            vista.cb_pais.addActionListener(this);
            vista.cb_estado.addActionListener(this);
            vista.cb_dep.addActionListener(this);        
            
        } 
    
    // método constructor
      public controlador(Principal vista){
        
            this.vista=vista;
            events();
            
           
            mostrarPais();
            mostrarDepartamentos("",paises.get(0).getID());
            mostrarCiudad("", paises.get(0).getID(), departamentos.get(0).getIddep());
        
        }
    
    
      // obtenemos y agregamos al combobox paises todos los datos obtenidos de la tabla país de la base de datos
        
      public final void mostrarPais(){
            
            // agregamos al arraylist los países obtenidos de la DB
    
            paises=metodosDB.listarPaises();
            
            String array[]=new String[paises.size()];
            
            for (int i = 0; i <array.length; i++) {
                
                array[i]=paises.get(i).getPais();
                
            }
            
            DefaultComboBoxModel model = new DefaultComboBoxModel(array);
            
            vista.cb_pais.setModel(model);
            
        }
    
    
        public void mostrarEstados(String idPais){
        
            estados = metodosDB.listarEstados(idPais);
            
            String arr[] = new String[estados.size()];
            for(int i=0; i<estados.size(); i++){
                arr[i]=estados.get(i).getEstados();
            }
            DefaultComboBoxModel model = new DefaultComboBoxModel(arr);
            vista.cb_estado.setModel(model);            
            
        }
    
    
    
        public final void mostrarDepartamentos(String idEst, String idPais){
        
            departamentos = metodosDB.listarDepartamentos(idPais, idEst);
            
            String arr[] = new String[departamentos.size()];
            for(int i=0; i<departamentos.size(); i++){
                arr[i]=departamentos.get(i).getDepartamentos();
            }
            DefaultComboBoxModel model = new DefaultComboBoxModel(arr);
            vista.cb_dep.setModel(model);        
            
        
        }  
      
    
        public final  void mostrarCiudad(String idEst, String idPais, String idDepartamento){
            
            ciudad = metodosDB.listarCiudad(idEst, idPais, idDepartamento);
            
            String arr[] =  new String[ciudad.size()];
            for(int i=0; i<ciudad.size(); i++){
                arr[i]=ciudad.get(i).getCiudad();
            }
            
            DefaultComboBoxModel model = new DefaultComboBoxModel(arr);
            vista.cb_ciudad.setModel(model); 
                    
        }  
    
      
    
        public String getIdPais(ArrayList<pais> pais, String busqueda){
        
            String id;
            
            int i=0;
            
            while(!pais.get(i).getPais().equals(busqueda)){
                i++;
            }
            
            id=pais.get(i).getID();
            
            return id;
        
        }
    
        
      
    
        public String getIdDepartamento(ArrayList<departamentos> departamentos, String busqueda){
        
            String id;
                     
            int i=0;
            
            while(!departamentos.get(i).getDepartamentos().equals(busqueda)){
                i++;
            }
            
            id=departamentos.get(i).getIddep();
            
            return id;
        
        }
        
      
    
        public String getIdEstado(ArrayList<estados> estados, String busqueda){
        
            String id;
            
            int i=0;
            
            while(!estados.get(i).getEstados().equals(busqueda)){
                i++;
            }
            
            id=estados.get(i).getIdest();
            
            return id;
        } 
    
        @Override
    
        public void actionPerformed(ActionEvent e) {
    
            Object evt = e.getSource();
            
            if(vista.cb_pais.equals(evt)){
            
                if(!vista.cb_pais.getSelectedItem().toString().equals("Estados Unidos")){
                    
                    vista.cb_estado.setVisible(false);
                    vista.label_estado.setVisible(false);
    
                    String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
                    mostrarDepartamentos("", idPais);
                    
                    String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
                    mostrarCiudad("", idPais, idDep);
                    
                }else{
                
                    vista.cb_estado.setVisible(true);
                    vista.label_estado.setVisible(true);            
                    
                    String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
                    mostrarEstados(idPais);
    
                    String idEst = getIdEstado(estados, vista.cb_estado.getItemAt(0));
                    mostrarDepartamentos(idEst, idPais);
    
                    String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
                    mostrarCiudad(idEst, idPais, idDep);                
                    
                    
                }
                
            
            }else if(vista.cb_estado.equals(evt)){
            
                String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
    
                String idEst = getIdEstado(estados, vista.cb_estado.getSelectedItem().toString());
                mostrarDepartamentos(idEst, idPais);
    
                String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
                mostrarCiudad(idEst, idPais, idDep);
                
            }else if(vista.cb_dep.equals(evt)){
            
                if(vista.cb_estado.isVisible()){
                
                    String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
                    String idEst = getIdEstado(estados, vista.cb_estado.getSelectedItem().toString());
                    String idDep = getIdDepartamento(departamentos, vista.cb_dep.getSelectedItem().toString());
                    mostrarCiudad(idEst, idPais, idDep);
                
                }else{
                    
                    String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
                    String idDep = getIdDepartamento(departamentos, vista.cb_dep.getSelectedItem().toString());
                    mostrarCiudad("", idPais, idDep);
                
                }     
                   
            }      
    
        }
        
    }
    
    
    
    
      

    Clase Ciudad: modelo/ciudad.java
    package modelo;
    
    public class ciudad {
        
        String ciudad;
        String idciudad;
    
    
        
          public ciudad() {
            ciudad="";
            idciudad="";
        }
        
    
        
          public String getCiudad() {
            return ciudad;
        }
    
        
        public void setCiudad(String ciudad) {
            this.ciudad = ciudad;
        }
    
        public String getIdciudad() {
            return idciudad;
        }
    
        public void setIdciudad(String idciudad) {
            this.idciudad = idciudad;
        }
        
    }
    
    
      

    Clase departamentos: modelo/departamentos.java
    package modelo;
    
    public class departamentos {
    
        String departamentos;;
        String iddep;;
    
        
          public departamentos() {
            departamentos="";
            iddep="";
        }
        
    
        
          public String getDepartamentos() {
            return departamentos;
        }
    
        
        public void setDepartamentos(String departamentos) {
            this.departamentos = departamentos;
        }
    
        
          public String getIddep() {
            return iddep;
        }
    
        
          public void setIddep(String idciudad) {
            this.iddep = iddep;
        }
        
    }
    
    
      

    Clase estados: modelo/estados.java
    package modelo;
    
    public class estados {
    
        String estados;;
        String idest;;
    
        
          public estados() {
            estados="";
            idest="";
        }
        
    
        
          public String getEstados() {
            return estados;
        }
    
        
        public void setEstados(String estados) {
            this.estados = estados;
        }
    
        
          public String getIdest() {
            return idest;
        }
    
        
          public void setIdest(String idest) {
            this.idest = idest;
        }
        
    }
    
    
      

    Clase pais: modelo/pais.java
    package modelo;
    
    public class pais {
    
        String pais;;
        String ID;;
    
        
          public pais() {
            pais="";
            ID="";
        }
        
    
        
          public String getPais() {
            return pais;
        }
    
        
        public void setPais(String pais) {
            this.pais = pais;
        }
    
        
          public String getID() {
            return ID;
        }
    
        
          public void setID(String ID) {
            this.ID = ID;
        }
        
    }
    
    
      

    Clase metodos: modelo/metodos.java
    package modelo;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import javax.swing.JOptionPane;
    
    public class metodos {
    
        pool conectar;
    
    
        public metodos() {
            conectar = new pool();
        }
    
    
    
        public ArrayList<pais> listarPaises(){
        
            Connection connect = null;
            PreparedStatement pst;
            ResultSet rs;
            pais pais;
            ArrayList list = new ArrayList();
            
            
            try {
            
                connect = conectar.dataSource.getConnection();
                
                if(connect!=null){
                
                    String sql = "SELECT id_pais, pais FROM paises WHERE 1 ORDER BY  pais ASC";
                    
                    pst = connect.prepareStatement(sql);
                    pst.executeQuery();
                    rs = pst.getResultSet();
                    
                    while(rs.next()){
                    
                        pais = new pais();
                        
                        pais.setID(rs.getString("id_pais"));
                        pais.setPais(rs.getString("pais"));
                    
                        list.add(pais);
                    
                    }
                    
                
                }
                
            
            } catch (SQLException e) {
            
                JOptionPane.showMessageDialog(null, "Error "+e, "ERR", JOptionPane.ERROR_MESSAGE);        
            
            }finally{
            
                try{
                    connect.close();
                }catch(SQLException ex){
                    System.out.println("error "+ex);
                }
            
            }
            
            return list;
            
        }
        
       
        
        public ArrayList<estados> listarEstados(String idPais){
        
            Connection connect = null;
            PreparedStatement pst;
            ResultSet rs;
            estados estados;
            ArrayList list = new ArrayList();        
        
        
            try {
                
                connect = conectar.dataSource.getConnection();
                
                if(connect!=null){
                
                    String sql = "SELECT id_estado, estado FROM estados INNER JOIN paises on(estados.id_pais=paises.id_pais) "
                               + "WHERE paises.id_pais=? ORDER BY estado ASC";
    
                    pst = connect.prepareStatement(sql);
    
                    pst.setString(1, idPais);
                    
                    pst.executeQuery();
                    rs = pst.getResultSet();
                    
                    while(rs.next()){
                        
                        estados  = new estados();
    
                        estados.setIdest(rs.getString("id_estado"));
                        estados.setEstados(rs.getString("estado"));
                        
                        list.add(estados);
    
                    }
                    
                    
                
                }
                
                
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Error "+e, "ERR", JOptionPane.ERROR_MESSAGE);        
            }finally{
            
                try{
                    connect.close();
                }catch(SQLException ex){
                    System.out.println("error "+ex);
                }
            
            }
            
            return list;
    
        }
        
        
        
        public ArrayList<departamentos> listarDepartamentos(String idPais, String idEstado){
        
            Connection connect=null;
            PreparedStatement pst;
            ResultSet rs;
            departamentos departamentos;
            ArrayList list = new ArrayList();  
            
        
            try {
                
                connect = this.conectar.dataSource.getConnection();
            
                if(connect!=null){
                
                    if(!idEstado.equals("")){
                    
                        String sql = "SELECT departamentos.id_dep, departamentos.departamento "
                                    + "FROM departamentos INNER JOIN estados ON (estados.id_estado=departamentos.id_estado) INNER JOIN paises ON (paises.id_pais=estados.id_pais) "
                                    + "WHERE  estados.id_estado=? AND paises.id_pais=?";
                    
                        pst = connect.prepareStatement(sql);
                        
                        pst.setString(1, idEstado);
                        pst.setString(2, idPais);
                    
                    }else{
                    
                        String sql =  "SELECT departamentos.id_dep, departamentos.departamento "
                                    + "FROM departamentos INNER JOIN paises ON (paises.id_pais=departamentos.id_pais) "
                                    + "WHERE  paises.id_pais=?";
    
                        pst = connect.prepareStatement(sql);
                        
                        pst.setString(1, idPais);
                    
                        
                    }
                    
                    pst.executeQuery();
                    rs = pst.getResultSet();
    
                    while(rs.next()){
                        
                        departamentos = new departamentos();
                        
                        departamentos.setIddep(rs.getString("id_dep"));
                        departamentos.setDepartamentos(rs.getString("departamento"));
                        
                        list.add(departamentos);                    
                        
    
                    }
                    
                    
                    
                
                }
                
            } catch (SQLException e) {
                
                JOptionPane.showMessageDialog(null, "Error "+e, "ERR", JOptionPane.ERROR_MESSAGE);        
            
            }finally{
            
                try{
                  connect.close();
                }catch(SQLException ex){
                    System.out.println("error "+ex);
                }
            
            }
            
            return list;
                
            
        }
            
    
        public ArrayList<ciudad> listarCiudad(String idEst, String idPais, String idDep){
        
            Connection connect=null;
            PreparedStatement pst;
            ResultSet rs;
            ciudad ciudades;
            ArrayList list = new ArrayList();          
        
        
            try {
            
                connect = conectar.dataSource.getConnection();
    
                if(connect!=null){
                    
                    if(!idEst.equals("")){
                        
                        String sql = "SELECT ciudad "
                               + "FROM ciudad inner JOIN departamentos ON(departamentos.id_dep=ciudad.id_departamento) INNER JOIN estados ON (estados.id_estado=departamentos.id_estado) INNER JOIN paises ON (paises.id_pais=estados.id_pais)"
                               + "WHERE paises.id_pais=? And estados.id_estado=? And departamentos.id_dep=?";
                        
                        pst = connect.prepareStatement(sql);
                   
                        pst.setString(1, idPais);
                        pst.setString(2,idEst);
                        pst.setString(3, idDep);
                        
                        
                    }else{
                        
                        String sql = "SELECT ciudad "
                                + "FROM ciudad  "
                                + "INNER JOIN departamentos on (departamentos.id_dep=ciudad.id_departamento) INNER JOIN paises ON (paises.id_pais=departamentos.id_pais) "
                                + " WHERE ciudad.id_departamento=? And paises.id_pais=? ORDER BY ciudad ASC";
    
                        pst = connect.prepareStatement(sql);
                   
                        pst.setString(1, idDep);
                        pst.setString(2,idPais);
                        
                        
                    }
                    
                    pst.executeQuery();
                    rs = pst.getResultSet();                
                    
                    while(rs.next()){
                        
                        ciudades  = new ciudad();
    
                        ciudades.setCiudad(rs.getString("ciudad"));
                        
                        list.add(ciudades);
    
                    }
    
                    
                    
                    
                
                }
                
                
            
            
            } catch (Exception e) {
            
                 JOptionPane.showMessageDialog(null, "Error "+e, "ERR", JOptionPane.ERROR_MESSAGE);        
            
            }finally{
            
                try{
                    connect.close();
                }catch(SQLException ex){
                    System.out.println("error "+ex);
                }
            
            }
            
        
            return list;
                    
        
        }
            
            
            
        
        }    
        
      

    Clase pool: modelo/pool.java
    
    package modelo;
    
    import javax.sql.DataSource;
    import org.apache.commons.dbcp.BasicDataSource; 
    
    public class pool {
        
        public DataSource dataSource;
        
        public String db = "db_pais1";
        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;
    
        }
    
        
    
        
    }
    
    


    1. Comenzaremos con lo básico. Para este ejemplo crearemos cuatro clases que harán referencia a las 4 tablas que tenemos en la base de datos, estas clases son: país.java, estados.java, departamentos.java, ciudad.java. Estas clases pertenecen al paquete modelo y las utilizaremos para guardar la información que obtengamos de la Base De Datos. Procederemos a explicar el código de las clases.
    estas tienen una estructura similar, básicamente lo que se hace  es inicializar las variables y crear lo métodos GET y SET que nos permitirán obtener y mostrar lo valores que obtendremos, tomaremos como ejemplo general la clase pais.java.

    Clase Pais.java:

    * Comenzamos creando dos variables de tipo String, estarán ubicadas después de las llaves de apertura de nuestra clase. Una la hemos llamado pais y la otra ID, haciendo referencia a los campos que tenemos en nuestra tabla país (Ubicada en la base de datos).
        
        String pais;;
        String ID;
    
    * Lo siguiente que haremos será crear el método constructor de nuestra clase(pais.java), una vez creado dicho método procedemos a inicializar la variables pais e ID
        
       public pais() {
            pais="";
            ID="";
        }
    
    * El siguiente paso será crear los métodos GET Y SET, todos serán de acceso public con el fin de acceder a estos métodos desde otras clases, más adelante podremos apreciar el funcionamiento de estos métodos.
        public String getPais() {
            return pais;
        }
        
        public void setPais(String pais) {
            this.pais = pais;
        }
    
          public String getID() {
            return ID;
        }
    
          public void setID(String ID) {
            this.ID = ID;
        }
    
    
    * Las clases estados.java, departamentos.java y ciudad.java tendrán la misma estructura lo que cambiaran serán los nombres de las variables.

    2. Seguimos en el paquete modelo, lo siguiente que haremos será crear una clase que nos permitirá consultar la información que deseamos de la base de datos a esta clase le hemos llamado métodos, Miremos la estructura de esta.



    Creamos un objeto de la clase pool, este nos permitirá establecer una conexión con la base de datos, igualmente inicializamos el objeto en el método constructor.
      pool conectar;
    
      public metodos() {
         conectar = new pool();
      }
      
    
    
    3. Lo siguiente que haremos será crear una función, que nos permita obtener el listado de países alojados en la base de datos, específicamente en la tabla países, revisemos detalladamente cada línea.



    *La función comienza con el modificador de acceso de tipo public, recordemos que esto lo hacemos para poder llamar a la función desde otras clases. Seguido del tipo en este caso la función será de tipo ArrayList y este será de tipo <pais>, la función la llamaremos listarPaises
      
        public ArrayList<pais> listarPaises(){
    
    
    *Iniciamos creando un objeto de tipo Connection al cual llamaremos connect, este nos permitirá administrar la conexión que obtengamos de la base de datos
    Lo siguiente será crear un objeto de tipo PreparedStatement, este nos servirá para cargar la sentencia SQL que utilizaremos. Igualmente creamos un objeto de tipo ResultSet el cual nos servirá para obtener los resultados que obtendremos de la consulta SQL
    Creamos un objeto de tipo pais para guardar los resultados obtenidos y por ultimo creamos un objeto de tipo ArrayList para agregar todos los resultados obtenidos.
      
       Connection connect=null;
       PreparedStatement pst;
       ResultSet rs;
       pais pais;
       ArrayList list = new ArrayList();  
    
    
    
    NOTA: Debemos importar las siguientes librerias para evitar errores
    
    package modelo;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import javax.swing.JOptionPane;
    
    

    *Lo siguiente que haremos será crear un bloque de tipo try{} catch(){} finally{}, recordemos que en la sección del try ira todo el código que deseamos ejecutar, en la parte del catch se mostrara un mensaje dependiendo si surge algún error en la ejecución del código de la sección del try y por último la sección del finally ejecutaremos un código para cerrar la conexión con la base de datos.
      
    
       try {
           
                        
       } catch (SQLException e) {
            
           JOptionPane.showMessageDialog(null, "Error "+e, "ERR", JOptionPane.ERROR_MESSAGE);        
            
       }finally{
            
          try{
             connect.close();
          }catch(SQLException ex){
              System.out.println("error "+ex);
          }
            
       }
    
    
    
    
    *En la sección del try{}, comenzamos escribiendo la línea de código que nos permitirá establecer una conexión con la base de datos, haciendo uso del objeto tipo Connection(connect), y luego del signo igual "=" procederemos a usar el objeto "pool", con el cual tendremos acceso al objeto y/o variable de tipo "DataSource" de la Clase Pool que creamos en un artículo anterior, aplicándole posteriormente el método ".getConnection()"; con esto, estaremos estableciendo la conexión con la base de datos:.
     
    
      connect = conectar.dataSource.getConnection();
    
    
    *Lo siguiente que haremos será verificar si la conexión a la base de datos ha sido exitosa, esto lo verificamos con un condicional.
     
      if(connect!=null){
    

    *Dentro de las llaves de apertura y cierre del condicional, escribimos las siguientes líneas de código:
    Comenzamos creando una variable de tipo String(sql), la cual contendrá la sentencia SQL que utilizaremos para obtener el listado de países alojados en la base de datos (ver explicación de la estructura de sentencias SQL para consultar información de una base de datos), luego cargamos la sentencia haciendo uso del objeto PreparedStatement(pst) una cargada la sentencia aplicamos el método executeQuery() luego obtenemos el resultado de la consulta haciendo uso del objeto ResultSet(rs), aplicamos el método getResultSet().

      String sql = "SELECT id_pais, pais FROM paises WHERE 1 ORDER BY  pais ASC";
      
      pst = connect.prepareStatement(sql);
      pst.executeQuery();
      rs = pst.getResultSet();
    
    
    *Por ultimo creamos un ciclo while
    Comenzamos inicializando el objeto tipo pais (pais = new pais()), haremos uso de los métodos SET pertenecientes a la clase pais(setID, setPais) y de esta manera obtener los resultados obtenidos de la consulta SQL, para obtener estos valores hacemos uso de la función getString entre paracentesis() iría el nombre del campo en este caso seria "id_pais" y "pais" pertenecientes a la tabla paises de nuestra Base de Datos. 
    Terminado el proceso anterior agregamos al ArrayList (list), el objeto "pais" 
    Una vez terminado el ciclo escribimos la palabra clave return seguido del objeto ArrayList(list).


    while(rs.next()){
                    
      pais = new pais();
                      
      pais.setID(rs.getString("id_pais"));
      pais.setPais(rs.getString("pais"));
                    
      list.add(pais);
                    
    }
    
    return list;
    
    
    4. Una vez creado el método listarPaises, crearemos un método que nos permitirá obtener los estados de determinado país, llevara la misma estructura del método anterior, solamente tendrá algunos cambios.


    *La función será de tipo ArrayList y a diferencia del anterior este será de tipo <estados>, seguido del nombre de la función (listarEstados), esta llevara como parámetro una variable de tipo String la cual hará referencia al id que identifica a un determinado país en la base de datos


     public ArrayList<estados> listarEstados(String idPais){
    

    *Para obtener los estados pertenecientes a un país haremos uso de la siguiente sentencia.
    La cual tendrá la palabra clave INNER JOIN, y de esta manera poder comparar valores semejantes en varias tablas de la base de datos, en este caso estamos evaluando los valores semejantes entre la tabla estados y la tabla países, esto se da porque la tabla estados posee una clave foránea que relaciona a estas dos (tabla países y  
    tabla estados)


      String sql = "SELECT id_estado, estado FROM estados INNER JOIN paises on(estados.id_pais=paises.id_pais) "
                               + "WHERE paises.id_pais=? ORDER BY estado ASC";
    
      pst = connect.prepareStatement(sql);
      pst.setString(1, idPais);
    
    
    
    5. Lo siguiente que haremos será crear un método que nos permita obtener todos los departamentos de un determinado país, este método tendrá ciertas diferencias a los otros. Debemos verificar primero que todo, si el país seleccionado posee estados. si este los posee se hará un determinado proceso y sino realizaremos otro proceso.



    *La estructura de la función será la siguiente.
    Tipo ArrayList y esta a su vez será de tipo <departamentos>, la llamaremos listarDepartamentos y llevara dos parámetros, ambos serán de tipo String; uno hará referencia al id que identifica a un determinado país en la base de datos, y el otro hará referencia al id perteneciente a un determinado estado.

     
      public ArrayList<departamentos> listarDepartamentos(String idPais, String idEstado){
    

    *Lo siguiente que haremos será verificar si el país seleccionado posee estados, esto lo hacemos a través de un condicional.
    Para este ejemplo el único país almacenado en la base de datos que posee estados es el país de los estados unidos.
                
      if(!idEstado.equals("")){
                    
          String sql = "SELECT departamentos.id_dep, departamentos.departamento "
                       + "FROM departamentos INNER JOIN estados ON (estados.id_estado=departamentos.id_estado) INNER JOIN paises ON (paises.id_pais=estados.id_pais) "
                       + "WHERE  estados.id_estado=? AND paises.id_pais=?";
                    
          pst = connect.prepareStatement(sql);
                        
          pst.setString(1, idEstado);
          pst.setString(2, idPais);
                    
       }else{
                    
          String sql =  "SELECT departamentos.id_dep, departamentos.departamento "
                         + "FROM departamentos INNER JOIN paises ON (paises.id_pais=departamentos.id_pais) "
                         + "WHERE  paises.id_pais=?";
    
          pst = connect.prepareStatement(sql);
                        
          pst.setString(1, idPais);
                    
                        
       }
    
    
    6.
    Para finalizar con la clase métodos perteneciente al paquete modelo, creamos un método que nos permita obtener las ciudades perteneciente a un departamento en el cual tendremos que tener en cuenta el país y el estado, esto si el país posee estados, para esto haremos uso de tres parámetros todos de tipo String, el método tiene una estructura similar a los anteriores creados.
     
      public ArrayList<ciudad> listarCiudad(String idEst, String idPais, String idDep){
    
    
    Verificamos de manera similar al método anterior si el país posee estados (if(!idEst.equals(""))), la estructura de la consulta SQL cambiara dependiendo la sección del condicional. 

    En la parte del if, obtenemos el listado de las ciudades pertenecientes a un departamento, igualmente verificamos el estado y el país para optimizar la búsqueda y tener un resultado eficiente. Por otra parte en la sección del else omitimos el estado y solo tenemos en cuenta el departamento y país seleccionado.



       if(!idEst.equals("")){
                        
            String sql = "SELECT ciudad "
                          + "FROM ciudad inner JOIN departamentos ON(departamentos.id_dep=ciudad.id_departamento) INNER JOIN estados ON (estados.id_estado=departamentos.id_estado) INNER JOIN paises ON (paises.id_pais=estados.id_pais)"
                         + "WHERE paises.id_pais=? And estados.id_estado=? And departamentos.id_dep=?";
                        
            pst = connect.prepareStatement(sql);
                   
            pst.setString(1, idPais);
            pst.setString(2,idEst);
            pst.setString(3, idDep);
                        
                        
        }else{
                        
             String sql = "SELECT ciudad "
                           + "FROM ciudad  "
                           + "INNER JOIN departamentos on (departamentos.id_dep=ciudad.id_departamento) INNER JOIN paises ON (paises.id_pais=departamentos.id_pais) "
                          + " WHERE ciudad.id_departamento=? And paises.id_pais=? ORDER BY ciudad ASC";
    
             pst = connect.prepareStatement(sql);
                   
             pst.setString(1, idDep);
             pst.setString(2,idPais);
                        
                        
         }
    
    

    7. Finalizamos con la creación de las clases del paquete modelo (estados.java, departamento.java, país.java, métodos.java y pool.java). 
    El siguiente paso será trabajar en el paquete controlador, para esto creamos una clase a la cual hemos llamado controlador.java. Esta clase jugara un papel importante en la realización de nuestro ejemplo, usaremos esta clase como puente de comunicación entre las clases del paquete modelo y la clase principal (JFrame).

    *Iniciamos importando las siguientes librerías para el correcto funcionamiento de nuestro código
    import comboboxanidados.Principal;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import javax.swing.DefaultComboBoxModel;
    import modelo.ciudad;
    import modelo.departamentos;
    import modelo.estados;
    import modelo.metodos;
    import modelo.pais;
    
    
    *Una vez importadas las librerías a nuestra clase, debemos agregar el evento ActionListener. Para implementar esta interfaz a nuestra clase, haremos uso de la palabra clave implements seguido de la clase ActionListener. De esta manera la clase se implementara esta interfaz y sus métodos (ActionPerformed).

    *Lo siguiente que haremos será crear un objeto de tipo Principal al que hemos llamado vista, recordemos que esta es la clase principal (JFrame) está contiene la ventana principal con los JComboBox, de esta manera podremos acceder a los componentes de esta clase siempre y cuando al invocar un método o componente de esta, usemos el objeto que hemos creado (vista).

    *Creamos un objeto de tipo métodos, al cual llamaremos metodosDB. Recordemos que esta clase pertenece al paquete modelo y esta posee los métodos donde realizamos las respectivas consultas a la Base De Datos.

    *Creamos cuatro objetos de tipo ArrayList(paises, estados, departamentos, ciudad) estos a su vez serán de tipo <país>, <estados>, <departamentos> y <ciudad>. En estos se almacenaran los resultados obtenidos de la consulta a la Base De Datos.

    public class controlador implements ActionListener{
      
        Principal vista;
        metodos metodosDB = new metodos();
        
        ArrayList<pais> paises;
        ArrayList<estados> estados;
        ArrayList<departamentos> departamentos;
        ArrayList<ciudad> ciudad;
    
    
    

    8. Seguimos trabajando con la clase controlador.java, lo siguiente que haremos será crear un método en el cual, asignaremos los eventos a los JComboBox haciendo uso del método addActionListener. 
    Solo agregamos eventos a tres JComboBox(cb_pais, cb_estado, cb_dep), omitimos el JComboBox que visualizara el listado de ciudades, porque al seleccionar un ítem de este JComboBox no es necesario realizar ningún proceso a diferencia de los otros(JComboBox).

    Hacemos uso del objeto vista seguido de nuestro componente(JComboBox ) "cb_pais" llamamos el método addActionListener.


        public final void events(){
        
            vista.cb_pais.addActionListener(this);
            vista.cb_estado.addActionListener(this);
            vista.cb_dep.addActionListener(this);        
            
        }

    9. Lo siguiente que haremos será crear un método que nos permita obtener el listado de países alojados en la Base De Datos y mostrarlos en el JComboBox(cb_pais).




    * Iniciamos creando un método tipo void, lo llamaremos mostrarPais(). 
    Seguido de esto llamamos el método listarpaises() que hemos creado con anterioridad en la clase métodos perteneciente al paquete modelo, el resultado que obtengamos de esta función lo asignamos al ArrayList tipo <país> que hemos creado (paises).
     
    
       public final void mostrarPais(){       
            // agregamos al arraylist los países obtenidos de la DB
    
            paises=metodosDB.listarPaises();
    


    * La información que se almacena en el ArrayList(paises) es: 
    el ID que identifica a cada país en la Base de Datos y el nombre del país, Creamos un vector tipo String y de esta manera asignar la información que contenga el ArrayList.

    Para realizar el proceso de asignación, creamos un ciclo for dentro del ciclo obtendremos todos los nombres de los países que el ArrayList(paises) contenga, para esto haremos uso del método getPais(), y asi asegurarnos de obtener solo los nombres de cada país.
        
            
    
            String array[]=new String[paises.size()];
            
            for (int i = 0; i <array.length; i++) {
                
                array[i]=paises.get(i).getPais();
                
            }

    * Una vez terminado el proceso de asignación, creamos un objeto de tipo DefaultComboBoxModel llevara como parámetro un vector (el creado con anterioridad), una vez instanciada la clase agregamos el objeto DefaultComboBoxModel(model) al JComboBox(cb_pais).



            DefaultComboBoxModel model = new DefaultComboBoxModel(array);
            
            vista.cb_pais.setModel(model);
    10. Los métodos que veremos a continuación son similares al anterior. El cambio significativo en estos, son los parámetros. Estos métodos son:


    *Este llevara un parámetro de tipo String que será el ID que identifica a un determinado país en la Base de Datos, este es uno de los cambios respecto al método anterior igualmente se utilizara el ArrayList de tipo <estados>  y el JComboBox al cual le agregamos información será a cb_estado.
         
    
        public void mostrarEstados(String idPais){
        
            estados = metodosDB.listarEstados(idPais);
            
            String arr[] = new String[estados.size()];
            for(int i=0; i<estados.size(); i++){
                arr[i]=estados.get(i).getEstados();
            }
            DefaultComboBoxModel model = new DefaultComboBoxModel(arr);
            vista.cb_estado.setModel(model);            
            
        }

    *Similar al método anterior este llevara dos parámetros de tipo String, igualmente realizamos los cambios en el ArrayList, este sera de tipo <departamentos>, también realizamos el cambio al JCombobox(cb_dep
        
    
        public final void mostrarDepartamentos(String idEst, String idPais){
        
            departamentos = metodosDB.listarDepartamentos(idPais, idEst);
            
            String arr[] = new String[departamentos.size()];
            for(int i=0; i<departamentos.size(); i++){
                arr[i]=departamentos.get(i).getDepartamentos();
            }
            DefaultComboBoxModel model = new DefaultComboBoxModel(arr);
            vista.cb_dep.setModel(model);        
            
        
        }

    *En el caso del método  mostrarCiudad llevara tres parámetros de tipo String, realizamos los mismos cambios que en los métodos anteriores.
        
    
        public final  void mostrarCiudad(String idEst, String idPais, String idDepartamento){
            
            ciudad = metodosDB.listarCiudad(idEst, idPais, idDepartamento);
            
            String arr[] =  new String[ciudad.size()];
            for(int i=0; i<ciudad.size(); i++){
                arr[i]=ciudad.get(i).getCiudad();
            }
            
            DefaultComboBoxModel model = new DefaultComboBoxModel(arr);
            vista.cb_ciudad.setModel(model); 
                    
    
    }

    11. El siguiente paso será crear tres métodos, estos nos permitirán obtener el ID del país, estado y departamentos. Se activaran cuando seleccionemos un ITEM del JComboBox(cb_pais, cb_estado, cb_departamentos) Iniciamos creando el método con el cual obtendremos el ID que identifica a cada país.



    * Creamos una función de tipo String, la cual llamaremos getIdPais llevara dos parámetros; uno será de tipo ArrayList y este a su vez será de tipo <país>, igualmente tendremos un parámetro de tipo String llamado búsqueda, este hará referencia al nombre del país al cual deseamos obtener el ID.
    Dentro de las llaves de apertura y cierre de nuestra función, creamos dos variables una será de tipo String(id) en esta almacenaremos el resultado obtenido, luego creamos una variable tipo int(i), esta controlara el ciclo while que estaremos creando.
        
    
        public String getIdPais(ArrayList<pais> pais, String busqueda){
        
            String id;
            
            int i=0;
    
    * Creamos un ciclo while el cual se ejecutara mientras la variable búsqueda sea diferente al valor almacenado en el ArrayList(pais), dependiendo el índice(i) para esto la variable i ira aumentando de uno en uno hasta que se cumpla la condición.
    Una vez terminado el ciclo asignamos a la variable id el valor que se encuentra en el ArrayList dependiendo el indice(i), después hacemos uso de la palabra clave return seguido de la variable id. 
            
       while(!pais.get(i).getPais().equals(busqueda)){
                i++;
       }
            
       id=pais.get(i).getID();
           
       return id;
    

    * La función getIdEstado y getIdDepartamento tienen una estructura similar a la función creada recientemente (getIdPais). Solamente debemos cambiar el parámetro ArrayList, en el caso de la función getIdEstado será, ArrayList <estados> y la función getIdDepartamento será, ArrayList <departamentos>.
        
    
        public String getIdDepartamento(ArrayList<departamentos> departamentos, String busqueda){
        
            String id;
                     
            int i=0;
            
            while(!departamentos.get(i).getDepartamentos().equals(busqueda)){
                i++;
            }
            
            id=departamentos.get(i).getIddep();
            
            return id;
        
        }
        
      
    
        public String getIdEstado(ArrayList<estados> estados, String busqueda){
        
            String id;
            
            int i=0;
            
            while(!estados.get(i).getEstados().equals(busqueda)){
                i++;
            }
            
            id=estados.get(i).getIdest();
            
            return id;
        } 

    12. Lo siguiente que haremos será crear el método constructor de la clase (controlador.java), Nuestro método tendrá un parámetro el cual hace referencia a la clase principal(JFrame), llamamos el método events() que contiene los eventos asignados al JComboBox.
    Llamamos los métodos mostrarPais, mostrarDepartamentos y mostrarCiudad. De esta manera agregar los datos obtenidos de la Base De Datos a los respectivos JComboBox.
      
      public controlador(Principal vista){
        
            this.vista=vista;
            events();
            
           
            mostrarPais();
            mostrarDepartamentos("",paises.get(0).getID());
            mostrarCiudad("", paises.get(0).getID(), departamentos.get(0).getIddep());
        
        }

    13. Por ultimo crearemos una serie de condicionales que nos permitirán controlar los eventos en la ejecución del programa, para esto nos posicionamos en la llaves de apertura y cierre del método actionPerformed.





    *Verificamos si el evento que se ha activado es el perteneciente al JComboBox cb_pais, este se activara al seleccionar un Ítem del JComboBox.
            if(vista.cb_pais.equals(evt)){
    
    * Dentro del condicional, creamos otro en el cual verificamos si el valor del Ítem seleccionado es diferente de Estados Unidos.
    Estudiaremos la sección del if, Iniciamos con dos lineas de código:
            vista.cb_estado.setVisible(false);
            vista.label_estado.setVisible(false);
    Recordemos que estamos trabajando con cuatro JComboBox, el combobox cb_estado solo se hará visible cuando el país seleccionado sea Estados Unidos, mientras no se de esta condición los ocultaremos con el método setVisible(false).

    *El siguiente paso es obtener el id del país seleccionado. llamamos  la función creada con anterioridad getIdPais(), le pasaremos como parámetro el ArrayList  paises, y el Ítem del país seleccionado, haciendo uso del método getSelectedItem(), el resultado obtenido de la función lo asignamos a la variable idPais.
         String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
    

    *Una vez obtenido el Id del país, llamamos el método mostrarDepartamentos, llevara dos parámetros; uno ira vació("") debido a que en esta sección del condicional el país seleccionado no posee estados, el segundo parámetro sera la variable idPais que identifica a este en la Base de Datos.
          mostrarDepartamentos("", idPais);
    *Haremos el mismo proceso para obtener el Id del departamento (idDep), cambiamos los parámetros, este llevara el ArrayList departamentos y seleccionamos el primer Ítem del JComboBox cb_dep haciendo uso de la función getItemAt(). 
    Llamamos el método mostrarCiudad() y de esta manera poder visualizar todas las ciudades pertenecientes a ese departamento, llevara 3 parámetros; el primero ira vació(""), el segundo sera el idPais que hace referencia al Id que identifica a ese país en la Base de Datos y por ultimo seria el idDep.
          String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
          mostrarCiudad("", idPais, idDep);

    *Las lineas de código pertenecientes a la sección del condicional if quedaría de la siguiente manera.


          if(!vista.cb_pais.getSelectedItem().toString().equals("Estados Unidos")){
                    
            vista.cb_estado.setVisible(false);
            vista.label_estado.setVisible(false);
    
            String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
            mostrarDepartamentos("", idPais);
                    
            String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
            mostrarCiudad("", idPais, idDep);
                    
          }
    
    
    *En la sección del sino (else), sera similar al anterior la diferencia esta en que trabajaremos con el método getIdEstado y haremos visible el JComboBox cb_estado, las lineas de código quedaran dela siguiente manera.
    
         else{
    
        
            vista.cb_estado.setVisible(true);
            vista.label_estado.setVisible(true);            
                    
            String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
            mostrarEstados(idPais);
    
            String idEst = getIdEstado(estados, vista.cb_estado.getItemAt(0));
            mostrarDepartamentos(idEst, idPais);
    
            String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
            mostrarCiudad(idEst, idPais, idDep);                
                    
                    
          }
             
    
    

    14. Lo siguiente que haremos sera crear el segundo condicional, este se activa cuando seleccionamos un Ítem del JComboBox cb_estado.



    Comenzamos con la siguiente linea de código. 
         else if(vista.cb_estado.equals(evt)){
    

    *Dentro de las llaves de apertura y cierre del condicional, agregamos las siguientes líneas de código. Muy similares a las anteriores.
         String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
    
         String idEst = getIdEstado(estados, vista.cb_estado.getSelectedItem().toString());
         mostrarDepartamentos(idEst, idPais);
    
         String idDep = getIdDepartamento(departamentos, vista.cb_dep.getItemAt(0));
         mostrarCiudad(idEst, idPais, idDep);
    
    
    

    15.  Creamos otro condicional, el cual se activara cuando seleccionemos un Ítem del JComboBox cb_departamentos. Las líneas de código serán muy similares a las anteriores explicadas, quedarían distribuidas de la siguiente manera.
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    else if(vista.cb_dep.equals(evt)){
            
        if(vista.cb_estado.isVisible()){
                
           String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
           String idEst = getIdEstado(estados, vista.cb_estado.getSelectedItem().toString());
           String idDep = getIdDepartamento(departamentos, vista.cb_dep.getSelectedItem().toString());
           mostrarCiudad(idEst, idPais, idDep);
                
        }else{
                    
            String idPais = getIdPais(paises, vista.cb_pais.getSelectedItem().toString());
            String idDep = getIdDepartamento(departamentos, vista.cb_dep.getSelectedItem().toString());
            mostrarCiudad("", idPais, idDep);
                
        }
    
    
    }

    16.  Para finalizar vamos a la clase Principal.java, y Creamos un objeto de la clase
    controlador.java (controlador), en el método constructor inicializamos el objeto(controlador) que hemos creado y de esta manera finalizaríamos nuestro ejemplo.
        
     controlador controlador;
         //Creamos el método constructor de la clase     
         public Principal() {
                  controlador = new  controlador(this);
          }
    


    17.  Capturas finales.











    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ¿Quieres aprender más de JAVA?
    Si deseas saber cómo cargar un ComboBox con registros de una base de datos, pero de forma netamente gráfica usando NetBeans IDE, o ver otros temas muy interesantes, no te olvides de revisar los tips de JAVA y seguir el Curso: Cómo lo hago en JAVA? 
    Accede a todos los fragmentos de código que hemos publicado en este lenguaje hasta el momento, dando clic en el siguiente enlace: Ver listado de códigos JAVA.
    Suscríbete a nuestro blog, vía Email o RSS; además puedes seguirnos a través de nuestras redes sociales como: FacebookTwitter, y Google+.
    ¿Conoces una forma más óptima de realizar el anterior procedimiento?, no dudes en compartir tu conocimiento con todos nuestros amigos de la web.
    Si te fue de gran ayuda esta información, no olvides compartirla con tus amigos y en las redes sociales.
    Si tienes dudas o sugerencias al respecto, abajo puedes dejarnos tus comentarios.
    Bendiciones...





    Comparte este código


    No hay comentarios.:

    Publicar un comentario