Problema: Se necesita cargar los datos de una base de datos hacia un JTree, la base de datos es de un país que tiene departamentos y los departamentos tienen provincias y las provincias, municipios, al hacer clic en un nodo, debe desplegar sus nodos hijos. Al realizar clic en un nodo, se debe desarrollar una acción.
Base de datos:
--
-- Base de datos: 'dbbolivia'
--
--
-- Estructura de tabla para la tabla 'departamento'
--
CREATE TABLE departamento (
dep_id int(2) NOT NULL,
dep_nombre varchar(32) NOT NULL,
PRIMARY KEY (dep_id)
);
--
-- Estructura de tabla para la tabla 'provincia'
--
CREATE TABLE provincia (
prov_id int(2) NOT NULL auto_increment,
prov_nombre varchar(32) NOT NULL,
dep_id varchar(32) NOT NULL,
PRIMARY KEY (prov_id)
);
--
-- Estructura de tabla para la tabla 'municipio'
--
CREATE TABLE municipio (
mun_id int(2) NOT NULL auto_increment,
mun_nombre varchar(32) NOT NULL,
prov_id int(2) NOT NULL,
PRIMARY KEY (mun_id)
);
Solución.
¿Qué necesitamos?
Crear la base de datos y agregar algunos datos
1. Crear una proyecto netbeans, agregar un JFrame
(interfaz.java) y agregar los siguientes controles:
2. Agregar también una clase (
nombre:database.java) para inter actuar con la base de datos MySQL. el código de la clase es:
import java.sql.*;
/**
* @web http://www.jc-mouse.net
* @author Mouse
*/
public class database {
/* DATOS PARA LA CONEXION */
private String bd = "dbbolivia";
private String login = "";//USUARIO
private String password = "";//CONTRASEÑA
private String url = "jdbc:mysql://localhost/"+bd;
private Connection conn = null;
//___________________________________________________________________________________ Soy una barra separadora :)
public database(){
try{
//obtenemos el driver de para mysql
Class.forName("com.mysql.jdbc.Driver");
//obtenemos la conexión
conn = DriverManager.getConnection(url,login,password);
if (conn!=null){
System.out.println("OK base de datos "+bd+" listo");
}
}catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}
}
//___________________________________________________________________________________ Soy una barra separadora :)
public Connection getConnection()
{
return this.conn;
}
//___________________________________________________________________________________ Soy una barra separadora :)
/* METODO PARA REALIZAR UNA CONSULTA A LA BASE DE DATOS
* INPUT:
* table => nombre de la tabla donde se realizara la consulta, puede utilizarse tambien INNER JOIN
* fields => String con los nombres de los campos a devolver Ej.: campo1,campo2campo_n
* where => condicion para la consulta
* OUTPUT: un object[][] con los datos resultantes, sino retorna NULL
*/
public Object [][] select(String table, String fields, String where){
int registros = 0;
String colname[] = fields.split(",");
//Consultas SQL
String q ="SELECT " + fields + " FROM " + table;
String q2 = "SELECT count(*) as total FROM " + table;
if(where!=null)
{
q+= " WHERE " + where;
q2+= " WHERE " + where;
}
//obtenemos la cantidad de registros existentes en la tabla
try{
PreparedStatement pstm = conn.prepareStatement(q2);
ResultSet res = pstm.executeQuery();
res.next();
registros = res.getInt("total");
res.close();
}catch(SQLException e){
System.out.println(e);
}
//se crea una matriz con tantas filas y columnas que necesite
Object[][] data = new String[registros][fields.split(",").length];
//realizamos la consulta sql y llenamos los datos en la matriz "Object"
try{
PreparedStatement pstm = conn.prepareStatement(q);
ResultSet res = pstm.executeQuery();
int i = 0;
while(res.next()){
for(int j=0; j<=fields.split(",").length-1;j++){
data[i][j] = res.getString( colname[j].trim() );
}
i++; }
res.close();
}catch(SQLException e){
System.out.println(e);
}
return data;
}
//___________________________________________________________________________________ Soy una barra separadora :)
}
Esta clase se conecta a la base de datos, también cuenta con una clase para realizar una consulta
3. Clase interfaz.java
- Las librerias que se utilizan son:
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
- Crear una instancia a la clase database.java:
private database db = new database();
- Implementar la clase database, así como el código para llenar el JTree en el constructor de la clase interfaz.java:
public interfaz() {
initComponents();
this.setTitle("JTree - http://www.jc-mouse.net/");
//se crea la raiz
DefaultMutableTreeNode pais = new DefaultMutableTreeNode("Bolivia");
DefaultMutableTreeNode departamento;
DefaultMutableTreeNode provincia;
DefaultMutableTreeNode municipio;
//se obtienen los departamentos
Object[][] data_dep = db.select("departamento", " dep_id, dep_nombre", null);
if( data_dep.length > 0)
{
for(int i=0; i < data_dep.length; i++)
{
//se crea hojas departamentos
departamento = new DefaultMutableTreeNode(data_dep[i][1]);
pais.add(departamento);
//se obtiene las provincias
Object[][] data_prov = db.select("provincia", "prov_id,prov_nombre" , " dep_id='" + data_dep[i][0].toString()+"' ");
if( data_prov.length > 0)
{
for(int j=0; j< data_prov.length; j++)
{
provincia = new DefaultMutableTreeNode(data_prov[j][1]);
departamento.add(provincia);
//se obtienen los municipios
Object[][] data_mun = db.select("municipio", "mun_id,mun_nombre" , " prov_id='" + data_dep[j][0].toString()+"' ");
if( data_mun.length > 0)
{
for(int k=0; k< data_mun.length; k++)
{
municipio = new DefaultMutableTreeNode(data_mun[k][1]);
provincia.add(municipio);
}
}
}
}
}
}
DefaultTreeModel modelo = new DefaultTreeModel(pais);
this.jTree1.setModel(modelo);
jTree1.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
// Se obtiene el Path seleccionado
TreePath path = e.getPath();
Object [] nodos = path.getPath();
String txt= jTextArea1.getText() + "Path seleccionado: ";
for (Object nodo: nodos)
txt+=nodo.toString() + " | ";
txt+="\n";
// Se obtiene el Nodo seleccionado
DefaultMutableTreeNode NodoSeleccionado = (DefaultMutableTreeNode)nodos[nodos.length-1];
txt+="-> Accion para Nodo Seleccionado [" + NodoSeleccionado.getUserObject().toString() + "]";
txt+="\n";
jTextArea1.setText(txt);
}
});
}
- Explicación: Se crea la raíz país (Bolivia), después se extrae los registros de la tabla departamentos y se añade a la raíz país, se extrae los registros provincias y se añade a su raíz departamento, se repite el proceso para municipios.
- Ejecutar
Descargar proyecto
HERE
continue reading