viernes, 14 de noviembre de 2008

Agenda Personal con MySQL y Java

Buenas noches, hace mucho tiempo, no publicaba una entrada en el blog, espero me disculpen, pero he retomado los estudios de postgrado y entre esto y el trabajo me traen al trote, jeje; pero no mas disculpas y a lo que vinimos.

La intención del trabajo es cubrir las tareas comunes a las que se enfrenta un desarrollador al momento de programar un aplicativo hecho en java con conexión a una base de datos en MySQL; para este ejercicio vamos a crear una base de datos que se llamara agenda y nos permitirá guardar la información relevante a:
  • Contactos.
  • Citas


En java programaremos un aplicativo que nos permitirá ínter-actuar con la información de la base de datos agenda.

Creando la base de datos:



Para la creación de la base de datos nos conectamos a MySQL de la siguiente manera: desde un interprete de comandos tecleamos cualquiera de las diferentes formas de conectarse con el servidor de bases de datos.

shell > mysql -h host -u root base_de_datos -p




Después de conectarnos al servidor, creamos la base de datos:

create database agenda;


Abrimos la base de datos para su uso:

use agenda;


Creamos la tabla de contactos:

CREATE TABLE contactos (
con_id int(11) NOT NULL auto_increment,
con_nombre varchar(30) NOT NULL,
con_apellido varchar(30) NOT NULL,
con_telefono_domicilio varchar(15) NOT NULL,
con_telefono_oficina varchar(15) NOT NULL,
con_celular varchar(20) NOT NULL,
con_correo varchar(150) NOT NULL,
con_direccion_residencia varchar(150) NOT NULL,
con_direccion_trabajo varchar(150) NOT NULL,
PRIMARY KEY (`con_id`)
) ENGINE=InnoDB;

Creamos la tabla de citas:

CREATE TABLE citas (
`cit_id` int(11) NOT NULL auto_increment,
`con_id` int(11) NOT NULL,
`cit_fecha` date NOT NULL,
`cit_hora` time NOT NULL,
`cit_lugar` varchar(150) NOT NULL,
`cit_asunto` varchar(150) NOT NULL,
PRIMARY KEY (`cit_id`),
KEY `FK_CITA_CONTACTO` (`con_id`),
CONSTRAINT `FK_CITA_CONTACTO` FOREIGN KEY (`con_id`) REFERENCES `contactos` (`con_id`)
) ENGINE=InnoDB;

Vale la pena destacar que se ha creado en la tabla citas una llave foránea con la tabla contactos usando el campo con_id para cuidar la integridad referencial de la información.

Creando el aplicativo:



Cuando deseamos hacer un aplicativo en java con conexión a MySQL tenemos que descargar el conector correspondiente para que nuestras clases puedan acceder al server de MySQL y a la base de datos de nuestro aplicativo; para este fin descargarnos desde www.mysql.com el JDBC Driver for MySQL (Connector/J) y extraemos el archivo mysql-connector-java-5.x.x-bin.jar que sera el que nos permitirá hacer la conexión.

Luego de descargar el driver nos vamos al proyecto y se lo agregamos a las librerías del mismo, para esto hacemos click derecho con el ratón sobre el nombre del proyecto y seleccionamos “properties”, con esto nos aparece la siguiente ventana:



Seleccionamos la opción de “libraries” y el botón de “Add JAR/Folder” buscamos el lugar donde extrajimos el .jar y hacemos click en el botón “Aceptar”.



Ya que nuestro proyecto tiene la capacidad de conexión con MySQL creamos nuestra clase encargada de generar esta conexión, esta clase y las otras clases de acceso a datos irán en un paquete de datos, para nuestro caso será “co.edu.udistrital.pryagenda.datos”. El código de la clase quedaría como sigue:


package co.edu.udistrital.pryagenda.datos;

import java.sql.*;

public class DBConexion {
static String bd = "agenda";
static String login = "root";
static String password = "mysql20073";
static String url = "jdbc:mysql://localhost/"+bd;

Connection conexion = null;

public DBConexion() {
try{
Class.forName("com.mysql.jdbc.Driver");
conexion = DriverManager.getConnection(url,login,password);

if (conexion!=null){
System.out.println("Conexión a base de datos "+bd+" OK");
}
}catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}
}

public Connection getConexion(){
return conexion;
}

public void desconectar(){
conexion = null;
}

}


Otra clase que usaremos sera una clase que me permita ínter-actuar con la tabla de contactos, es decir seleccionar los contactos para mostrarlos en pantalla, agregar un contacto, modificar o eliminar un registro, la clase quedará de la siguiente forma:


package co.edu.udistrital.pryagenda.datos;

import java.sql.*;
import co.edu.udistrital.pryagenda.logica.*;

public class DBContactos {
DBConexion cn;

public DBContactos() {
cn = new DBConexion();
}

public Contacto getContactoById(int id){
Contacto c = new Contacto();
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"SELECT con_id, " +
" con_nombre, " +
" con_apellido, " +
" con_telefono_domicilio, " +
" con_telefono_oficina," +
" con_celular, " +
" con_correo, " +
" con_direccion_residencia," +
" con_direccion_trabajo " +
" FROM contactos " +
" WHERE con_id = ? ");
pstm.setInt(1, id);

ResultSet res = pstm.executeQuery();
if(res.next()){
c.setId(res.getInt("con_id"));
c.setNombre(res.getString("con_nombre"));
c.setApellido(res.getString("con_apellido"));
c.setTelefonoDomicilio(res.getString("con_telefono_domicilio"));
c.setTelefonoOficina(res.getString("con_telefono_oficina"));
c.setCelular(res.getString("con_celular"));
c.setCorreo(res.getString("con_correo"));
c.setDireccionResidencia(res.getString("con_direccion_residencia"));
c.setDireccionTrabajo(res.getString("con_direccion_trabajo"));
}
res.close();

}catch(SQLException e){
System.out.println(e);
}
return c;
}

/** trae todos los registros de la tabla contactos */
public Contacto[] getContactos(){
int registros = 0;

try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"SELECT count(1) as cont" +
" FROM contactos ");

ResultSet res = pstm.executeQuery();

res.next();
registros = res.getInt("cont");
res.close();


}catch(SQLException e){
System.out.println(e);
}
Contacto[] data = new Contacto[registros];
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"SELECT con_id, " +
" con_nombre, " +
" con_apellido, " +
" con_telefono_domicilio, " +
" con_telefono_oficina," +
" con_celular, " +
" con_correo, " +
" con_direccion_residencia," +
" con_direccion_trabajo " +
" FROM contactos " +
" ORDER BY con_nombre, con_apellido ");

ResultSet res = pstm.executeQuery();
int i = 0;
while(res.next()){
data[i] = new Contacto();
data[i].setId(res.getInt("con_id"));
data[i].setNombre(res.getString("con_nombre"));
data[i].setApellido(res.getString("con_apellido"));
data[i].setTelefonoDomicilio(res.getString("con_telefono_domicilio"));
data[i].setTelefonoOficina(res.getString("con_telefono_oficina"));
data[i].setCelular(res.getString("con_celular"));
data[i].setCorreo(res.getString("con_correo"));
data[i].setDireccionResidencia(res.getString("con_direccion_residencia"));
data[i].setDireccionTrabajo(res.getString(
"con_direccion_trabajo"));
i++;
}
res.close();

}catch(SQLException e){
System.out.println(e);
}
return data;
}

public int insertarContacto(Contacto c){
int cont_usuario = -1;
int resultado = 0;//no hubo errores de validacion
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"select count(1) as cont " +
" from contactos " +
" where con_correo = ? ");
pstm.setString(1, c.getCorreo());

ResultSet res = pstm.executeQuery();
res.next();
cont_usuario = res.getInt("cont");
res.close();


if(cont_usuario==0){
pstm = cn.getConexion().prepareStatement(
"insert into contactos (con_nombre, " +
" con_apellido," +
" con_telefono_domicilio," +
" con_telefono_oficina," +
" con_celular," +
" con_correo," +
" con_direccion_residencia," +
" con_direccion_trabajo) " +
" values(?,?,?,?,?,?,?,?)");
pstm.setString(1, c.getNombre());
pstm.setString(2, c.getApellido());
pstm.setString(3, c.getTelefonoDomicilio());
pstm.setString(4, c.getTelefonoOficina());
pstm.setString(5, c.getCelular());
pstm.setString(6, c.getCorreo());
pstm.setString(7, c.getDireccionResidencia());
pstm.setString(8, c.getDireccionTrabajo());

pstm.executeUpdate();

pstm = cn.getConexion().prepareStatement("select last_insert_id()");
res = pstm.executeQuery();
res.next();
resultado = res.getInt(1);
res.close();
}else{
resultado = -2;//el login ya existe
}
}catch(SQLException e){
System.out.println(e);
}
return resultado;
}

public int actualizarContacto(Contacto c){
int resultado = 0;
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"update contactos " +
" set con_nombre = ?, " +
" con_apellido = ?," +
" con_telefono_domicilio = ?," +
" con_telefono_oficina = ?," +
" con_celular = ?," +
" con_correo = ?," +
" con_direccion_residencia = ?," +
" con_direccion_trabajo = ? " +
" where con_id = ?");
pstm.setString(1, c.getNombre());
pstm.setString(2, c.getApellido());
pstm.setString(3, c.getTelefonoDomicilio());
pstm.setString(4, c.getTelefonoOficina());
pstm.setString(5, c.getCelular());
pstm.setString(6, c.getCorreo());
pstm.setString(7, c.getDireccionResidencia());
pstm.setString(8, c.getDireccionTrabajo());
pstm.setInt(9, c.getId());

resultado = pstm.executeUpdate();

}catch(SQLException e){
System.out.println(e);
}
return resultado;
}

public int borrarContacto(Contacto c){
int resultado = 0;
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"delete from contactos " +
" where con_id = ?");

pstm.setInt(1, c.getId());

resultado = pstm.executeUpdate();

}catch(SQLException e){
System.out.println(e);
}

return resultado;
}

}


Esta clase tiene sus métodos para seleccionar, agregar, actualizar y borra en este mismo orden. Si verificamos estos métodos usan una clase de elementos llamado “Contacto”, esta clase define la estructura de un contacto y debe ser definida en el paquete que maneja la lógica del aplicativo, para nuestro caso “co.edu.udistrital.pryagenda.logica” y que da de la siguiente forma:


package co.edu.udistrital.pryagenda.logica;

public class Contacto {
int id;
String nombre;
String apellido;
String telefonoDomicilio;
String telefonoOficina;
String celular;
String correo;
String direccionResidencia;
String direccionTrabajo;

public Contacto() {
}

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public String getCelular() {
return celular;
}

public void setCelular(String celular) {
this.celular = celular;
}

public String getCorreo() {
return correo;
}

public void setCorreo(String correo) {
this.correo = correo;
}

public String getDireccionResidencia() {
return direccionResidencia;
}

public void setDireccionResidencia(String direccionResidencia) {
this.direccionResidencia = direccionResidencia;
}

public String getDireccionTrabajo() {
return direccionTrabajo;
}

public void setDireccionTrabajo(String direccionTrabajo) {
this.direccionTrabajo = direccionTrabajo;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getTelefonoDomicilio() {
return telefonoDomicilio;
}

public void setTelefonoDomicilio(String telefonoDomicilio) {
this.telefonoDomicilio = telefonoDomicilio;
}

public String getTelefonoOficina() {
return telefonoOficina;
}

public void setTelefonoOficina(String telefonoOficina) {
this.telefonoOficina = telefonoOficina;
}
}


Esta clase sera usada para pasar la información de un contacto a través del paso de mensajes entre los objetos de nuestro aplicativo.

Pero en el paquete de datos también agregaremos la clase que se encargará de manejar la información de la tabla citas, la cual quedara de la siguiente manera:


package co.edu.udistrital.pryagenda.datos;

import java.sql.*;
import co.edu.udistrital.pryagenda.logica.*;

public class DBCitas {
DBConexion cn;

public DBCitas() {
cn = new DBConexion();
}
/** trae una cita por su id*/
public Cita getCitaById(int id){
Cita data = new Cita();
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"SELECT cit_id, " +
" con_id, " +
" cit_lugar, " +
" cit_fecha, " +
" cit_hora," +
" cit_asunto " +
" FROM citas " +
" where cit_id = ? ");

pstm.setInt(1, id);
ResultSet res = pstm.executeQuery();
int i = 0;
DBContactos dbc = new DBContactos();
if(res.next()){
data = new Cita();
data.setId(res.getInt("cit_id"));
data.setContacto(dbc.getContactoById(res.getInt("con_id")));
data.setLugar(res.getString("cit_lugar"));
data.setFecha(res.getString("cit_fecha"));
data.setHora(res.getString("cit_hora"));
data.setAsunto(res.getString("cit_asunto"));
}
res.close();


}catch(SQLException e){
System.out.println(e);
}
return data;
}
/** trae todos los registros de la tabla citas */
public Cita[] getCitas(){
int registros = 0;

try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"SELECT count(1) as cont" +
" FROM citas ");

ResultSet res = pstm.executeQuery();

res.next();
registros = res.getInt("cont");
res.close();


}catch(SQLException e){
System.out.println(e);
}
Cita[] data = new Cita[registros];
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"SELECT cit_id, " +
" con_id, " +
" cit_lugar, " +
" cit_fecha, " +
" cit_hora," +
" cit_asunto " +
" FROM citas " +
" ORDER BY cit_fecha desc, " +
" cit_hora desc ");

ResultSet res = pstm.executeQuery();
int i = 0;
DBContactos dbc = new DBContactos();
while(res.next()){
data[i] = new Cita();
data[i].setId(res.getInt("cit_id"));
data[i].setContacto(dbc.getContactoById(res.getInt("con_id")));
data[i].setLugar(res.getString("cit_lugar"));
data[i].setFecha(res.getString("cit_fecha"));
data[i].setHora(res.getString("cit_hora"));
data[i].setAsunto(res.getString("cit_asunto"));
i++;
}
res.close();


}catch(SQLException e){
System.out.println(e);
}
return data;
}

public int insertarCita(Cita c){
int resultado = 0;//no hubo errores de validacion
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"insert into citas (con_id," +
" cit_lugar," +
" cit_fecha," +
" cit_hora," +
" cit_asunto) " +
" values(?,?,?,?,?)");
pstm.setInt(1, c.getContacto().getId());
pstm.setString(2, c.getLugar());
pstm.setString(3, c.getFecha());
pstm.setString(4, c.getHora());
pstm.setString(5, c.getAsunto());
pstm.executeUpdate();

pstm = cn.getConexion().prepareStatement("select last_insert_id()");
ResultSet res = pstm.executeQuery();
res.next();
resultado = res.getInt(1);
res.close();
}catch(SQLException e){
System.out.println(e);
}
return resultado;
}

public int actualizarCita(Cita c){
int resultado = 0;
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"update citas " +
" set con_id = ?, " +
" cit_lugar = ?," +
" cit_fecha = ?," +
" cit_hora = ?," +
" cit_asunto = ? " +
" where cit_id = ?");
pstm.setInt(1, c.getContacto().getId());
pstm.setString(2, c.getLugar());
pstm.setString(3, c.getFecha());
pstm.setString(4, c.getHora());
pstm.setString(5, c.getAsunto());
pstm.setInt(6, c.getId());

resultado = pstm.executeUpdate();

}catch(SQLException e){
System.out.println(e);
}
return resultado;
}

public int borrarCita(Cita c){
int resultado = 0;
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"delete from citas " +
" where cit_id = ?");

pstm.setInt(1, c.getId());

resultado = pstm.executeUpdate();

}catch(SQLException e){
System.out.println(e);
}


return resultado;
}

}

Y así DBCitas puede agregar, editar, eliminar o consultar los registros que tiene la tabla citas de nuestra base de datos y al igual que hacíamos con los contactos para poder pasar un cita por los pasos de mensajes de nuestros objetos, creamos una clase que nos represente la estructura de información de una cita en la clase Cita que quedará de la siguiente manera en el paquete de lógica:


package co.edu.udistrital.pryagenda.logica;

public class Cita {
int id;
Contacto contacto;
String lugar;
String fecha;
String hora;
String asunto;

public Cita() {
}

public String getAsunto() {
return asunto;
}

public void setAsunto(String asunto) {
this.asunto = asunto;
}

public Contacto getContacto() {
return contacto;
}

public void setContacto(Contacto contacto) {
this.contacto = contacto;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

public String getHora() {
return hora;
}

public void setHora(String hora) {
this.hora = hora;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getLugar() {
return lugar;
}

public void setLugar(String lugar) {
this.lugar = lugar;
}

}


Antes de pasar a las interfaces de nuestro aplicativo, vale la pena destacar la manera como java ejecuta una consulta o actualización de datos en MySQL, para ello tomemos unos ejemplos de las clases anteriores; veamos el método insertarCita de la clase DBCitas:


public int insertarCita(Cita c){
int resultado = 0;//no hubo errores de validacion
try{
PreparedStatement pstm = cn.getConexion().prepareStatement(
"insert into citas (con_id," +
" cit_lugar," +
" cit_fecha," +
" cit_hora," +
" cit_asunto) " +
" values(?,?,?,?,?)");
pstm.setInt(1, c.getContacto().getId());
pstm.setString(2, c.getLugar());
pstm.setString(3, c.getFecha());
pstm.setString(4, c.getHora());
pstm.setString(5, c.getAsunto());
pstm.executeUpdate();

pstm = cn.getConexion().prepareStatement("select last_insert_id()");
ResultSet res = pstm.executeQuery();
res.next();
resultado = res.getInt(1);
res.close();
}catch(SQLException e){
System.out.println(e);
}
return resultado;
}



Recordemos que todas las ordenes que le demos a MySQL desde java debemos manejarlas dentro de un bloque de try - catch para manejar las excepciones que se puedan producir, para armar la consulta se utilizan las siguientes líneas de código:


PreparedStatement pstm = cn.getConexion().prepareStatement(
"insert into citas (con_id," +
" cit_lugar," +
" cit_fecha," +
" cit_hora," +
" cit_asunto) " +
" values(?,?,?,?,?)");



Donde el PreparedStament nos permite armar la cadena de texto que representa nuestra orden SQL que ejecutaremos, en esta los valores que se vayan a pasar a dicha sentencia se representan por un signo de interrogación cerrando y luego son asignados por las siguientes lineas de código a través de la instancia del PreparedStatement.



pstm.setInt(1, c.getContacto().getId());
pstm.setString(2, c.getLugar());
pstm.setString(3, c.getFecha());
pstm.setString(4, c.getHora());
pstm.setString(5, c.getAsunto());


Luego para ejecutar la sentencia tenemos que tener en cuenta que tipo de sentencia es:
  • Si es una sentencia de consulta:
    ResultSet res = pstm.executeQuery();

    teniendo en cuenta que esta retorna un ResultSet y a través de este podremos usar el resultado de la consulta usando los get correspondientes de acuerdo a los tipos de datos que obtengamos de esta consulta, por ejemplo getInt(nombre o índice del campo) si el campo es de tipo entero o getString( nombre o índice del campo) si el campo es de tipo cadena de caracteres.

    Si es una sentencia de actualización:
    pstm.executeUpdate()
    ;


    Ahora pasemos a la interfaz gráfica de nuestro aplicativo, esta interfaz tendrá un menú que nos permita ver un “Acerca de” y salir del aplicativo, una tabla donde cargaremos los datos de nuestros contactos, unas pestañas donde una la usaremos para la manipulación de cada contacto y otra para las citas, también tendrá botones para “Nuevo Contacto”, “Guardar Contacto”, “Editar Contacto” y “Borrar Contacto” , una pestaña para manejo de las citas y una interfaz donde podremos editar o agregar nuevas citas; la siguientes imágenes son del aplicativo funcionando:









    Nuestra clase que maneja el “Acerca de” es un “JDialog” y quedara así:


    package co.edu.udistrital.pryagenda.gui;

    import java.awt.*;
    import javax.swing.*;

    public class DialogAcerca extends JDialog{
    Container c;
    JLabel labelTitulo,labelImagen;
    JTextArea textAcerca;


    public DialogAcerca(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
    }

    public void initComponents(){
    c = getContentPane();
    c.setLayout(null);
    c.setBackground(new Color(255,255,255));

    labelTitulo = new JLabel("Agenda Personal",SwingConstants.CENTER);
    labelTitulo.setFont(new Font("Arial Black", 1, 20));
    labelTitulo.setBounds(10,10,280,50);
    c.add(labelTitulo);

    labelImagen = new JLabel();
    labelImagen.setIcon(
    new ImageIcon(getClass().getResource(

    "/co/edu/udistrital/pryagenda/gui/escudo_ud.gif")));
    labelImagen.setBounds(2, 2, 50, 80);
    c.add(labelImagen);

    textAcerca = new JTextArea();
    textAcerca.setColumns(50);
    textAcerca.setRows(5);
    textAcerca.setText("Universidad Distrital\n"+
    "Ingeniería Industrial\n"+
    "Programación Orientada a Objetos\n\n"+
    "Ejemplo de acceso a datos");
    textAcerca.setBounds(70,50,220,100);
    textAcerca.setEditable(false);
    c.add(textAcerca);

    pack();
    setSize(300,170);
    }



    Nuestra clase central será un “JFrame” y queda de la siguiente manera:


    package co.edu.udistrital.pryagenda.gui;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    import co.edu.udistrital.pryagenda.datos.*;
    import co.edu.udistrital.pryagenda.logica.*;
    import javax.swing.table.DefaultTableModel;

    public class FormAgenda implements ActionListener{
    JFrame frame;
    JPanel panel;
    JMenuBar menuBar;
    JMenu menu, subMenu;
    JMenuItem menuItem;
    JScrollPane scrollPanel,scrollPanelCitas;
    DefaultTableModel modeloTabla,modeloTablaCitas;
    JTable tablaContactos,tablaCitas;
    JTabbedPane pestana;
    Container panelInformacion,panelCitas;
    JLabel labelId,
    labelNombre,
    labelApellido,
    labelTelefonoDomicilio,
    labelTelefonoOficina,
    labelDireccionDomicilio,
    labelDireccionOficina,
    labelCelular,
    labelCorreo;
    JTextField textId,
    textNombre,
    textApellido,
    textTelefonoDomicilio,
    textTelefonoOficina,
    textDireccionDomicilio,
    textDireccionOficina,
    textCelular,
    textCorreo;

    JButton botonNuevoContacto,
    botonGuardarContacto,
    botonEditarContacto,
    botonBorrarContacto,
    botonNuevaCita,
    botonEditarCita,
    botonBorrarCita;

    DBContactos dbc = new DBContactos();
    DBCitas dbcit =new DBCitas();
    Contacto[] contactos;
    Cita[] citas;
    Contacto contacto;
    Cita cita;

    int estado=0;
    int fila;
    int filaCitas;

    public FormAgenda() {
    initComponents();
    }

    public void initComponents(){
    frame = new JFrame("Agenda de Contactos");

    //creacion del menu
    menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);
    //opciones de app
    menu = new JMenu("Opciones");
    menuBar.add(menu);
    menuItem = new JMenuItem("Acerca de ...");
    menuItem.addActionListener(this);
    menu.add(menuItem);
    menuItem = new JMenuItem("Salir");
    menuItem.addActionListener(this);
    menu.add(menuItem);

    //pestanas
    panelInformacion = new JPanel(null);
    panelInformacion.setLayout(null);
    panelCitas = new JPanel(null);
    panelCitas.setLayout(null);

    pestana = new JTabbedPane();
    pestana.addTab("Información de contacto", panelInformacion);
    pestana.addTab("Citas",panelCitas);

    int y = 5;
    int x = 10;
    int labelAncho = 150;
    int labelAlto = 20;
    int textAncho = 200;
    int textAlto = 20;
    labelId = new JLabel("Id");
    labelId.setBounds(x,y,20,20);
    panelInformacion.add(labelId);

    textId = new JTextField();
    textId.setBounds(x+30,y,50,20);
    panelInformacion.add(textId);

    y+=30;
    labelNombre = new JLabel("Nombre",SwingConstants.RIGHT);
    labelNombre.setBounds(x,y,labelAncho,labelAlto);
    panelInformacion.add(labelNombre);

    textNombre = new JTextField();
    textNombre.setBounds(x+160,y,textAncho,textAlto);
    panelInformacion.add(textNombre);

    labelApellido = new JLabel("Apellido",SwingConstants.RIGHT);
    labelApellido.setBounds(x+350,y,labelAncho,labelAlto);
    panelInformacion.add(labelApellido);

    textApellido = new JTextField();
    textApellido.setBounds(x+510,y,textAncho,textAlto);
    panelInformacion.add(textApellido);

    y+=30;
    labelTelefonoDomicilio = new JLabel("Telefono Domicilio",SwingConstants.RIGHT);
    labelTelefonoDomicilio.setBounds(x,y,labelAncho,labelAlto);
    panelInformacion.add(labelTelefonoDomicilio);

    textTelefonoDomicilio = new JTextField();
    textTelefonoDomicilio.setBounds(x+160,y,textAncho,textAlto);
    panelInformacion.add(textTelefonoDomicilio);

    labelTelefonoOficina = new JLabel("Telefono Oficina",SwingConstants.RIGHT);
    labelTelefonoOficina.setBounds(x+350,y,labelAncho,labelAlto);
    panelInformacion.add(labelTelefonoOficina);

    textTelefonoOficina = new JTextField();
    textTelefonoOficina.setBounds(x+510,y,textAncho,textAlto);
    panelInformacion.add(textTelefonoOficina);

    y+=30;
    labelDireccionDomicilio = new JLabel("Dirreción Domicilio",SwingConstants.RIGHT);
    labelDireccionDomicilio.setBounds(x,y,labelAncho,labelAlto);
    panelInformacion.add(labelDireccionDomicilio);

    textDireccionDomicilio = new JTextField();
    textDireccionDomicilio.setBounds(x+160,y,textAncho,textAlto);
    panelInformacion.add(textDireccionDomicilio);

    labelDireccionOficina = new JLabel("Dirección Oficina",SwingConstants.RIGHT);
    labelDireccionOficina.setBounds(x+350,y,labelAncho,labelAlto);
    panelInformacion.add(labelDireccionOficina);

    textDireccionOficina = new JTextField();
    textDireccionOficina.setBounds(x+510,y,textAncho,textAlto);
    panelInformacion.add(textDireccionOficina);

    y+=30;
    labelCelular = new JLabel("Celular",SwingConstants.RIGHT);
    labelCelular.setBounds(x,y,labelAncho,labelAlto);
    panelInformacion.add(labelCelular);

    textCelular = new JTextField();
    textCelular.setBounds(x+160,y,textAncho,textAlto);
    panelInformacion.add(textCelular);

    labelCorreo = new JLabel("Correo",SwingConstants.RIGHT);
    labelCorreo.setBounds(x+350,y,labelAncho,labelAlto);
    panelInformacion.add(labelCorreo);

    textCorreo = new JTextField();
    textCorreo.setBounds(x+510,y,textAncho,textAlto);
    panelInformacion.add(textCorreo);

    y+=60;
    botonNuevoContacto = new JButton("Nuevo Contacto");
    botonNuevoContacto.setBounds(x,y,labelAncho,50);
    panelInformacion.add(botonNuevoContacto);
    botonNuevoContacto.addActionListener(this);

    botonGuardarContacto = new JButton("Guardar Contacto");
    botonGuardarContacto.setBounds(x+200,y,labelAncho,50);
    panelInformacion.add(botonGuardarContacto);
    botonGuardarContacto.addActionListener(this);

    botonEditarContacto = new JButton("Editar Contacto");
    botonEditarContacto.setBounds(x+400,y,labelAncho,50);
    panelInformacion.add(botonEditarContacto);
    botonEditarContacto.addActionListener(this);

    botonBorrarContacto = new JButton("Borrar Contacto");
    botonBorrarContacto.setBounds(x+600,y,labelAncho,50);
    panelInformacion.add(botonBorrarContacto);
    botonBorrarContacto.addActionListener(this);

    contactos = dbc.getContactos();
    Object[][] data = new Object[contactos.length][5];
    for (int c=0;c<contactos.length;c++){
    data[c][0]=contactos[c].getId();
    data[c][1]=contactos[c].getNombre();
    data[c][2]=contactos[c].getApellido();
    data[c][3]=contactos[c].getCelular();
    data[c][4]=contactos[c].getCorreo();
    }

    String[] columNames = {"id","nombres","apellidos","celular","correo"};

    modeloTabla= new DefaultTableModel(data, columNames);

    tablaContactos = new JTable(modeloTabla);
    tablaContactos.setPreferredScrollableViewportSize(new Dimension(500, 150));

    scrollPanel = new JScrollPane(tablaContactos);

    tablaContactos.addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e){
    fila = tablaContactos.rowAtPoint(e.getPoint());
    int columna = tablaContactos.columnAtPoint(e.getPoint());
    if ((fila > -1) && (columna > -1)){
    contacto = dbc.getContactoById(
    Integer.valueOf((String.valueOf(tablaContactos.getValueAt(fila,0)))));
    textId.setText(String.valueOf(contacto.getId()));
    textNombre.setText(contacto.getNombre());
    textApellido.setText(contacto.getApellido());
    textTelefonoDomicilio.setText(contacto.getTelefonoDomicilio());
    textTelefonoOficina.setText(contacto.getTelefonoOficina());
    textDireccionDomicilio.setText(contacto.getDireccionResidencia());
    textDireccionOficina.setText(contacto.getDireccionTrabajo());
    textCelular.setText(contacto.getCelular());
    textCorreo.setText(contacto.getCorreo());
    estado = 2;
    alterarEstado();
    }
    }
    });

    citas = dbcit.getCitas();
    Object[][] citasData = new Object[citas.length][6];
    for(int i=0;i < citas.length;i++){
    citasData[i][0]=citas[i].getId();
    citasData[i][1]=citas[i].getContacto().getApellido()+" "
    +citas[i].getContacto().getNombre();
    citasData[i][2]=citas[i].getLugar();
    citasData[i][3]=citas[i].getFecha();
    citasData[i][4]=citas[i].getHora();
    citasData[i][5]=citas[i].getAsunto();
    }
    String[] columNamesCitas = {"id","contacto","lugar","fecha","hora","asunto"};
    modeloTablaCitas = new DefaultTableModel(citasData,columNamesCitas);
    tablaCitas = new JTable(modeloTablaCitas);
    tablaCitas.setPreferredScrollableViewportSize(new Dimension(500,150));
    scrollPanelCitas = new JScrollPane(tablaCitas);

    x=15;
    y=10;
    scrollPanelCitas.setBounds(x, y, 750, 150);
    panelCitas.add(scrollPanelCitas);

    y+=180;
    botonNuevaCita = new JButton("Nueva Cita");
    botonNuevaCita.setBounds(x,y,labelAncho,50);
    panelCitas.add(botonNuevaCita);
    botonNuevaCita.addActionListener(this);

    botonEditarCita = new JButton("Editar Cita");
    botonEditarCita.setBounds(x+300,y,labelAncho,50);
    panelCitas.add(botonEditarCita);
    botonEditarCita.addActionListener(this);

    botonBorrarCita = new JButton("Borrar Cita");
    botonBorrarCita.setBounds(x+600,y,labelAncho,50);
    panelCitas.add(botonBorrarCita);
    botonBorrarCita.addActionListener(this);

    tablaCitas.addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e){
    filaCitas = tablaCitas.rowAtPoint(e.getPoint());
    int columnaCitas = tablaCitas.columnAtPoint(e.getPoint());
    if ((filaCitas > -1) && (columnaCitas > -1)){
    cita = dbcit.getCitaById(
    Integer.parseInt(String.valueOf(tablaCitas.getValueAt(filaCitas,0))));

    estado = 4;
    alterarEstado();
    }
    }
    });

    frame.getContentPane().add(scrollPanel,BorderLayout.NORTH);
    frame.getContentPane().add(pestana,BorderLayout.CENTER);

    frame.pack();
    frame.setSize(800, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    JFrame.setDefaultLookAndFeelDecorated(true);

    frame.setVisible(true);

    alterarEstado();
    }

    public void alterarEstado(){
    switch(this.estado){
    case 0://estado por defecto
    botonNuevoContacto.setEnabled(true);
    botonBorrarContacto.setEnabled(false);
    botonEditarContacto.setEnabled(false);
    botonGuardarContacto.setEnabled(false);

    botonNuevaCita.setEnabled(false);
    botonEditarCita.setEnabled(false);
    botonBorrarCita.setEnabled(false);

    textId.setEditable(false);
    textNombre.setEditable(false);
    textApellido.setEditable(false);
    textTelefonoDomicilio.setEditable(false);
    textTelefonoOficina.setEditable(false);
    textDireccionDomicilio.setEditable(false);
    textDireccionOficina.setEditable(false);
    textCorreo.setEditable(false);
    textCelular.setEditable(false);
    break;
    case 1://estado para un nuevo contacto
    botonNuevoContacto.setEnabled(false);
    botonBorrarContacto.setEnabled(false);
    botonEditarContacto.setEnabled(false);
    botonGuardarContacto.setEnabled(true);

    botonNuevaCita.setEnabled(false);
    botonEditarCita.setEnabled(false);
    botonBorrarCita.setEnabled(false);

    textId.setEditable(false);
    textNombre.setEditable(true);
    textApellido.setEditable(true);
    textTelefonoDomicilio.setEditable(true);
    textTelefonoOficina.setEditable(true);
    textDireccionDomicilio.setEditable(true);
    textDireccionOficina.setEditable(true);
    textCorreo.setEditable(true);
    textCelular.setEditable(true);
    break;
    case 2://estado de carga de un contacto
    botonNuevoContacto.setEnabled(true);
    botonBorrarContacto.setEnabled(true);
    botonEditarContacto.setEnabled(true);
    botonGuardarContacto.setEnabled(false);

    botonNuevaCita.setEnabled(true);
    botonEditarCita.setEnabled(false);
    botonBorrarCita.setEnabled(false);

    textId.setEditable(false);
    textNombre.setEditable(false);
    textApellido.setEditable(false);
    textTelefonoDomicilio.setEditable(false);
    textTelefonoOficina.setEditable(false);
    textDireccionDomicilio.setEditable(false);
    textDireccionOficina.setEditable(false);
    textCorreo.setEditable(false);
    textCelular.setEditable(false);
    break;
    case 3://estado para editar un contacto
    botonNuevoContacto.setEnabled(true);
    botonBorrarContacto.setEnabled(false);
    botonEditarContacto.setEnabled(false);
    botonGuardarContacto.setEnabled(true);

    botonNuevaCita.setEnabled(false);
    botonEditarCita.setEnabled(false);
    botonBorrarCita.setEnabled(false);

    textId.setEditable(false);
    textNombre.setEditable(true);
    textApellido.setEditable(true);
    textTelefonoDomicilio.setEditable(true);
    textTelefonoOficina.setEditable(true);
    textDireccionDomicilio.setEditable(true);
    textDireccionOficina.setEditable(true);
    textCorreo.setEditable(true);
    textCelular.setEditable(true);
    break;
    case 4://estado para editar o borrar una cita
    botonNuevoContacto.setEnabled(true);
    botonBorrarContacto.setEnabled(false);
    botonEditarContacto.setEnabled(false);
    botonGuardarContacto.setEnabled(true);

    botonNuevaCita.setEnabled(false);
    botonEditarCita.setEnabled(true);
    botonBorrarCita.setEnabled(true);

    textId.setEditable(false);
    textNombre.setEditable(false);
    textApellido.setEditable(false);
    textTelefonoDomicilio.setEditable(false);
    textTelefonoOficina.setEditable(false);
    textDireccionDomicilio.setEditable(false);
    textDireccionOficina.setEditable(false);
    textCorreo.setEditable(false);
    textCelular.setEditable(false);
    break;
    }
    }

    public void limpiarCampos(){
    textId.setText("");
    textNombre.setText("");
    textApellido.setText("");
    textTelefonoDomicilio.setText("");
    textTelefonoOficina.setText("");
    textDireccionDomicilio.setText("");
    textDireccionOficina.setText("");
    textCorreo.setText("");
    textCelular.setText("");
    }

    public void actionPerformed(ActionEvent e) {
    String accion = e.getActionCommand();
    System.out.println(accion);
    if(accion.equals("Salir")){
    System.exit(-1);
    }
    if(accion.equals("Acerca de ...")){
    DialogAcerca a = new DialogAcerca(null,false);
    a.setVisible(true);
    }
    if(accion.equals("Nuevo Contacto")){
    limpiarCampos();
    this.estado=1;
    }
    if(accion.equals("Editar Contacto")){
    this.estado=3;
    }
    if(accion.equals("Guardar Contacto")){
    if(this.estado==1){
    Contacto c = new Contacto();
    c.setNombre(textNombre.getText());
    c.setApellido(textApellido.getText());
    c.setTelefonoDomicilio(textTelefonoDomicilio.getText());
    c.setTelefonoOficina(textTelefonoOficina.getText());
    c.setDireccionResidencia(textDireccionDomicilio.getText());
    c.setDireccionTrabajo(textDireccionOficina.getText());
    c.setCorreo(textCorreo.getText());
    c.setCelular(textCelular.getText());

    int r = dbc.insertarContacto(c);
    if(r>0){
    Object[] newRow={r,c.getNombre(),c.getApellido(),c.getCelular(),c.getCorreo()};
    modeloTabla.addRow(newRow);
    JOptionPane.showMessageDialog(null, "Contacto agregado");
    }
    }else if(this.estado==3){
    Contacto c = new Contacto();
    c.setId(Integer.parseInt(textId.getText(),10));
    c.setNombre(textNombre.getText());
    c.setApellido(textApellido.getText());
    c.setTelefonoDomicilio(textTelefonoDomicilio.getText());
    c.setTelefonoOficina(textTelefonoOficina.getText());
    c.setDireccionResidencia(textDireccionDomicilio.getText());
    c.setDireccionTrabajo(textDireccionOficina.getText());
    c.setCorreo(textCorreo.getText());
    c.setCelular(textCelular.getText());

    int r = dbc.actualizarContacto(c);
    if(r>0){
    modeloTabla.setValueAt(c.getNombre(), fila, 1);
    modeloTabla.setValueAt(c.getApellido(), fila, 2);
    modeloTabla.setValueAt(c.getCelular(), fila, 3);
    modeloTabla.setValueAt(c.getCorreo(), fila, 4);
    JOptionPane.showMessageDialog(null, "Contacto actualizado");
    }
    }
    contactos = dbc.getContactos();
    limpiarCampos();
    this.estado=0;
    }
    if(accion.equals("Borrar Contacto")){
    Contacto c = new Contacto();
    c.setId(Integer.parseInt(textId.getText(),10));
    int r = dbc.borrarContacto(c);
    if(r>0){
    modeloTabla.removeRow(fila);
    JOptionPane.showMessageDialog(null, "Contacto borrado");
    limpiarCampos();
    }
    contactos = dbc.getContactos();
    this.estado=0;

    }

    if(accion.equals("Nueva Cita")){
    FormCitas f = new FormCitas(contacto,this);
    }
    if(accion.equals("Editar Cita")){
    FormCitas f = new FormCitas(cita,this);
    }
    if(accion.equals("Borrar Cita")){
    dbcit.borrarCita(cita);
    JOptionPane.showMessageDialog(null, "Cita borrada");
    modeloTablaCitas.removeRow(filaCitas);
    }
    alterarEstado();
    }

    public void limpiarTablaCitas(){
    int contFilas = modeloTablaCitas.getRowCount();
    System.out.println(contFilas);
    for(int i=0;i < contFilas;i++){
    modeloTablaCitas.removeRow(0);
    }
    }

    public void llenarTablaCitas(){
    limpiarTablaCitas();
    citas = dbcit.getCitas();
    for(int i=0;i<citas.length;i++){
    Object[] newRow = {citas[i].getId(),
    citas[i].getContacto().getApellido()+" "+citas[i].getContacto().getNombre(),
    citas[i].getLugar(),
    citas[i].getFecha(),
    citas[i].getHora(),
    citas[i].getAsunto()
    };
    modeloTablaCitas.addRow(newRow);
    }
    }
    }

    Nuestra clase para la edición y creación de citas sera:

    package co.edu.udistrital.pryagenda.gui;

    import co.edu.udistrital.pryagenda.datos.DBCitas;
    import co.edu.udistrital.pryagenda.datos.DBContactos;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    import co.edu.udistrital.pryagenda.logica.*;

    public class FormCitas implements ActionListener {
    FormAgenda padre;
    JFrame frame;
    Container contenedor;

    JLabel labelId,labelContacto,labelLugar,labelAsunto,labelFecha,labelHora;
    JTextField textId,textContacto,textLugar,textAsunto,textFecha,textHora;

    JButton botonAceptar, botonCancelar;

    Cita cita;
    Contacto contacto;
    DBContactos dbc = new DBContactos();
    DBCitas dbcit =new DBCitas();
    String estado;

    public FormCitas(Cita c,FormAgenda f) {
    initComponents(c);
    estado = "edit";
    padre = f;
    }
    public FormCitas(Contacto c,FormAgenda f) {
    initComponents(c);
    estado = "add";
    padre = f;
    }

    public void initComponents(Cita c){
    cita = c;
    frame = new JFrame("Editar citas");
    contenedor = frame.getContentPane();
    contenedor.setLayout(null);

    int x = 10;
    int y = 5;

    int labelAncho = 150;
    int labelAlto = 20;
    int textAncho = 200;
    int textAlto = 20;
    labelId = new JLabel("Id");
    labelId.setBounds(x,y,20,20);
    contenedor.add(labelId);

    textId = new JTextField();
    textId.setBounds(x+30,y,50,20);
    textId.setEditable(false);
    textId.setText(String.valueOf(cita.getId()));
    contenedor.add(textId);

    y+=30;
    labelContacto = new JLabel("Contacto",SwingConstants.RIGHT);
    labelContacto.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelContacto);

    textContacto = new JTextField();
    textContacto.setBounds(x+160,y,textAncho,textAlto);
    textContacto.setText(cita.getContacto().getNombre()+" "+cita.getContacto().getApellido());
    textContacto.setEditable(false);
    contenedor.add(textContacto);

    y+=30;
    labelFecha = new JLabel("Fecha",SwingConstants.RIGHT);
    labelFecha.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelFecha);

    textFecha = new JTextField();
    textFecha.setBounds(x+160,y,textAncho,textAlto);
    textFecha.setText(cita.getFecha());
    contenedor.add(textFecha);

    y+=30;
    labelHora = new JLabel("Hora",SwingConstants.RIGHT);
    labelHora.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelHora);

    textHora = new JTextField();
    textHora.setBounds(x+160,y,textAncho,textAlto);
    textHora.setText(cita.getHora());
    contenedor.add(textHora);

    y+=30;
    labelLugar = new JLabel("Lugar",SwingConstants.RIGHT);
    labelLugar.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelLugar);

    textLugar = new JTextField();
    textLugar.setBounds(x+160,y,textAncho,textAlto);
    textLugar.setText(cita.getLugar());
    contenedor.add(textLugar);

    y+=30;
    labelAsunto = new JLabel("Asunto",SwingConstants.RIGHT);
    labelAsunto.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelAsunto);

    textAsunto = new JTextField();
    textAsunto.setBounds(x+160,y,textAncho,textAlto);
    textAsunto.setText(cita.getAsunto());
    contenedor.add(textAsunto);

    y+=50;
    botonAceptar = new JButton("Aceptar");
    botonAceptar.setBounds(x,y,labelAncho,50);
    contenedor.add(botonAceptar);
    botonAceptar.addActionListener(this);

    botonCancelar = new JButton("Cancelar");
    botonCancelar.setBounds(x+310,y,labelAncho,50);
    contenedor.add(botonCancelar);
    botonCancelar.addActionListener(this);

    frame.pack();
    frame.setBounds(200, 200, 500, 300);
    frame.setResizable(false);
    frame.setVisible(true);
    }

    public void initComponents(Contacto c){
    contacto = c;
    frame = new JFrame("Agregar citas");
    contenedor = frame.getContentPane();
    contenedor.setLayout(null);

    int x = 10;
    int y = 5;

    int labelAncho = 150;
    int labelAlto = 20;
    int textAncho = 200;
    int textAlto = 20;
    labelId = new JLabel("Id");
    labelId.setBounds(x,y,20,20);
    contenedor.add(labelId);

    textId = new JTextField();
    textId.setBounds(x+30,y,50,20);
    textId.setEditable(false);
    contenedor.add(textId);

    y+=30;
    labelContacto = new JLabel("Contacto",SwingConstants.RIGHT);
    labelContacto.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelContacto);

    textContacto = new JTextField();
    textContacto.setBounds(x+160,y,textAncho,textAlto);
    textContacto.setText(contacto.getNombre()+" "+contacto.getApellido());
    textContacto.setEditable(false);
    contenedor.add(textContacto);

    y+=30;
    labelFecha = new JLabel("Fecha",SwingConstants.RIGHT);
    labelFecha.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelFecha);

    textFecha = new JTextField();
    textFecha.setBounds(x+160,y,textAncho,textAlto);
    contenedor.add(textFecha);

    y+=30;
    labelHora = new JLabel("Hora",SwingConstants.RIGHT);
    labelHora.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelHora);

    textHora = new JTextField();
    textHora.setBounds(x+160,y,textAncho,textAlto);
    contenedor.add(textHora);

    y+=30;
    labelLugar = new JLabel("Lugar",SwingConstants.RIGHT);
    labelLugar.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelLugar);

    textLugar = new JTextField();
    textLugar.setBounds(x+160,y,textAncho,textAlto);
    contenedor.add(textLugar);

    y+=30;
    labelAsunto = new JLabel("Asunto",SwingConstants.RIGHT);
    labelAsunto.setBounds(x,y,labelAncho,labelAlto);
    contenedor.add(labelAsunto);

    textAsunto = new JTextField();
    textAsunto.setBounds(x+160,y,textAncho,textAlto);
    contenedor.add(textAsunto);

    y+=50;
    botonAceptar = new JButton("Aceptar");
    botonAceptar.setBounds(x,y,labelAncho,50);
    contenedor.add(botonAceptar);
    botonAceptar.addActionListener(this);

    botonCancelar = new JButton("Cancelar");
    botonCancelar.setBounds(x+310,y,labelAncho,50);
    contenedor.add(botonCancelar);
    botonCancelar.addActionListener(this);

    frame.pack();
    frame.setBounds(200, 200, 500, 300);
    frame.setResizable(false);
    frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
    String accion = e.getActionCommand();
    if(accion.equals("Aceptar")){
    if(estado.equals("add")){
    cita = new Cita();
    cita.setContacto(contacto);
    cita.setFecha(textFecha.getText());
    cita.setHora(textHora.getText());
    cita.setLugar(textLugar.getText());
    cita.setAsunto(textAsunto.getText());

    dbcit.insertarCita(cita);
    JOptionPane.showMessageDialog(null, "Cita Agregada");
    padre.llenarTablaCitas();
    }else{
    cita.setFecha(textFecha.getText());
    cita.setHora(textHora.getText());
    cita.setLugar(textLugar.getText());
    cita.setAsunto(textAsunto.getText());

    dbcit.actualizarCita(cita);
    JOptionPane.showMessageDialog(null, "Cita Actualizada");
    padre.llenarTablaCitas();
    }

    }
    frame.setVisible(false);
    }

    }



    Para la ejecución del aplicativo crearemos una clase “Main” en el paquete “co.edu.udistrital.pryagenda” cuya única función será crear una instancia de la clase “FormAgenda” y queda así:


    package co.edu.udistrital.pryagenda;
    import co.edu.udistrital.pryagenda.gui.*;

    public class Main {

    public static void main(String[] args) {
    FormAgenda f = new FormAgenda();
    }

    }



    ya se que este ejemplo fuen un poco largo para el formato del blog, pero espero los ayude un poco mas.
  • 32 comentarios:

    Almacenes Exito dijo...

    Muy, pero muy buen articulo, muchas gracias, justo lo que necesitaba!

    Anónimo dijo...

    Hola, muchas gracias por el ejemplo, tengo una duda, al ejecutar el ejemplo me aparece el siguiente error:

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    Esteban dijo...

    Hola, gracias por poner el codigo.. me ha servido mucho

    d dijo...

    buen post, buen blog :) ... saludos desde mx

    Alejandro Elias dijo...

    Alejo, te pasaste. He buscado mucho un ejemplo completo que tenga lo que realmente se necesita para poder hacer un mantenedor real en java. Tiene de todo JTable DefultTableModel JDBC si hay otro ejemplo tan bueno omo este en la WEB lo ignoro, pero para mi este es el mejor. Gracias

    alejo dijo...

    Gracias, por los comentarios, estos me alientan a armar buenos ejemplos y seguirlos publicando, siempre estaré agradecido por todas las personas que han leído el blog y han dejado un comentario, muchas gracias

    Anónimo dijo...

    Hola Alejo, Te saluda Cesar Navinta de Peru, ayer 04 feb 2009 buscando en la web encontre tu ejemplo de conexion a mysql del 2007 y hoy lo implemente y corrio OK..ahora estoy por revisar el ejemplo de la agenda...me puse a revisar los comentarios del ejemplo del 2007 y la verdad que eres una persona que conoce el tema y que ademas comparte..yo estoy retomando el tema de programacion..estoy empezando con java..la verdad que tengo algo de conocimiento en programacion..pero lo he dejado de hacer desde hace muchos años(1998)..voy a seguir adelante y retomarlo..porque es algo que me gusta...gracias por todo...bye

    Anónimo dijo...

    Hola Alejo soy Jessica.. mi pregunta es si se pueden hacer triggers anidados en MySQL, o si se pueden realizar en DBDesigner..
    un saludo... bye

    Anónimo dijo...

    Hola Alejo buen día, antes que nada te agradesco tus enseñansas, son geniales, me han ayudado mucho a aprender.
    Ahora, quiero pedirte ayuda, resulta que no me está funcionando la conexión remota.
    En la parte donde se coloca la dir IP

    static String url = "jdbc:mysql://192.168.1.75/"+bd;

    Ya cree al usuario con los privilegios necesarios, ayudandome con el MySQL Administrator; en root agregue el host que deseo que ingrese a la base de datos del servidor y le di privilegios pero me aparece el siguiente error al compilar:

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    Last packet sent to the server was 0 ms ago.
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    Last packet sent to the server was 0 ms ago.
    Exception in thread "main" java.lang.NullPointerException
    at co.edu.udistrital.pryagenda.datos.DBContactos.getContactos(DBContactos.java:55)
    at co.edu.udistrital.pryagenda.gui.FormAgenda.initComponents(FormAgenda.java:193)
    at co.edu.udistrital.pryagenda.gui.FormAgenda"init"(FormAgenda.java:61)
    at co.edu.udistrital.pryagenda.Main.main(Main.java:7)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 1 second)

    ojala me puedas ayuda. Saludos

    AlexOrozco dijo...

    Hola anonimo, el problema que tienes no es otra cosa más que no has configurado el archivo /etc/MySQL/my.cnf para permitir los accesos a cualquier ip.
    Lo que tienes que hacer es lo siguiente:

    Ingresa a el archivo my.cnf
    sudo nano /etc/MySQL/my.cnf
    y modifica la entrada
    bind-addres =127.0.0.1
    cambiala por
    bind-address 0.0.0.0
    o la ip de tu servidor si tienes ip fija.
    Suerte

    Anónimo dijo...

    Muy bueno el tutorial,practico y didactico,lo que se necesita para aprender.Estaria muy bueno que publicaras otros ejemplos.Saludos

    Alex dijo...

    Muy bueno el ejemplo, si un poco largo pero seria bueno si añadieras unos combobox en algunos campos para asi mostrar como se realiza la insercion de datos desde un combobox hacia una base de datos.

    Anónimo dijo...

    parcero... me sirvio mucho...........

    ..

    jhlc dijo...

    buen trabajo alejo
    me puede asesorar con una aplicacion que estoy haciendo con bases de datos relacionales?

    hasta pronto

    alejo dijo...

    jhlc, envíame tu consulta a ver en que te puedo asesorar

    jhlc dijo...

    alejo, gracias por responder... bueno, lo que estoy haciendo ahora es una aplicacion que involucra mysql y java. especificamente debo realizar las operaciones C.R.U.D. (insercion, consulta, modificacion y eliminiacion) de datos desde java a mysql pero estoy desubicado con esto con respecto a como hacer las clases-entidad si la base de datos es relacional (en este momento estoy usando relaciones uno a uno y uno a muchos) y de como poder realizar las clases DAO, digo esto porque me he orientado por algunos ejemplos pero la cuestion es que manejan solo una tabla (no es tan del otro mundo), hay otra duda que tengo y es sobre como insertar datos simultamente en dos o mas tablas relacionales, junto con el resto de las operaciones......este es el meollo del asunto del cual estoy frenado....te agradeceria mucho en lo que me puedas ayudar......hasta pronto y gracias..

    si me puedes permitir algun correo tuyo para enviarte algunas imagenes de que he hecho hasta el momento... mi correo es ing_jhlc@hot****.***

    alejo dijo...

    Si las tablas tienen relaciones, puedes manejar las inserciones dentro de una transacción para garantizar la inserción completa de la información, esto lo puedes hacer programando esto en un proceso almacenado de mysql o desde tus clases java que se encargan de la persistencia, manejando mysql_query("BEGIN");
    para abrir la transacción
    mysql_query("ROLLBACK");
    para devolver la transacción en caso de que algun insert te produzca un error, o
    mysql_query("COMMIT");
    para indicarle a mysql que haga permanentes los queries que le indicaste en la transacción.

    Espero haberte sacado de la duda

    Anónimo dijo...

    despues de algunos dias de googlear creo que este es el primer ejemplo completo respecto a todos los asuntos basicos de MySQL muchas gracias

    Anónimo dijo...

    hola sabes me tira un monton de errores no se si copie en proyectos de otro nombre, o que error tengo , me podrias enviar el archivo asi listo para compilarlo aca? podria ser? disculpa la molestia ,pero quiero probar este ejemplo pero no puedo. GRacias
    saludos
    mi correo es ricardo.ebay2010@gmail.com , espero tu ayuda por favor

    Anónimo dijo...

    me olvide de decir que yo uso el netbeans y windows. no uso linux.
    recuerde que mi correo es
    ricardo.ebay2010@gmail.com

    Nalladeth Pavez dijo...

    mire aqui le dejo el error que me tira cuando ejecuto el main
    run:
    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    Exception in thread "main" java.lang.NullPointerException
    at datos.DBContactos.getContactos(DBContactos.java:54)
    at gui.FormAgenda.initComponents(FormAgenda.java:208)
    at gui.FormAgenda.(FormAgenda.java:76)
    at agenda.Main.main(Main.java:7)
    Java Result: 1

    mi correo es ricardo.ebay2010@gmail.com

    John dijo...

    Gracias amigo, me sirvio un mar.

    Juan Carlos dijo...

    Hola a todos, me gustaria que me ayudaran a realizar la consulta de los registros pero en jsp. Ya puedo, borrar, agregar y modificar registros desde jsp con todo el codigo anterior pero no puedo consultar todos los registros de una tabla, podrian ayudarme, mi tabla es la siguiente.

    marcas(id_marca,nombre,descripcion)

    estoy intentando hacer lo siguiente para consultar pero me marca error

    Clases.DBMarcas DB = new Clases.DBMarcas();
    Clases.Marcas operacion = Clases.Marcas();

    marcas = DB.getMarcas();
    Object[][] data=new Object[marcas.length][3];
    for(int i=0;i<marcas.length;i++)
    {
    data[i][0]=marcas[i].getId_Marca();
    data[i][1]=marcas[i].getNombre();
    data[i][2]=marcas[i].getDescripcion();
    }

    CibeR=BlinD dijo...

    Muy buen articulo, no tengo palabras para agradecer la gran ayuda que has proporcionado, tengo que hacer algo para la practica laboral similar a esto y algunos metodos me faltaban. Me has salvado la vida con esto.

    Lo que si una duda.. tengo un login, como podria hacer para que con el login me inicie el programa?.

    Saludos y nuevamente muchas gracias.

    Contactar: dijo...

    podrias colocar los codigos ???

    se agradeceria

    Contactar: dijo...

    Dejarias los codigos para descargar??

    Contactar: dijo...

    podrias colocar los codigos ???

    se agradeceria

    Anónimo dijo...

    Varied Style Of Cheap Toms ShoesScarlett Johansson[url=http://www.cheaptomsbuy.com]Cheap Toms sale[/url] A popular leather that falls between calfskin and side leather in cost is kidskin which comes from young goats. This type of leather is generally used for better quality womens shoes. A common type of kidskin leather is that which we know as suede which is created by using different chemical and natural treatments.Shoes and footwear are not required only for formal wear but after a long tiring day we all need comfortable and supportive footwear to ease up into relaxing mood. There are many shoe manufacturing companies, which hold specialization is designing and manufacturing of casual footwear keeping in mind the complete comfort of people. Casual footwear that are highly popular among various people include terrasoles and TOMS shoes that are specifically designed keeping in mind the comfort requirement of feet while at home. [url=http://www.onlinetomsoutlet.com]Toms Shoes Outlet[/url] Toms Shoes - Making A Difference One Step At A Time Shenae Grimes [url=http://www.tomsfans.com]Cheap Toms[/url] Internet is flooded with several TOMS shoes coupons. You can get these coupons from several websites which include the official website of the company and several other affiliated websites like Amazon and e- bay. After a few hours of wearing TOMS, they will stretch slightly to conform to your feet. Please try your TOMS on a carpeted surface to keep them as clean as possible until you know they are the correct size. We do not accept returns or size exchanges on shoes that show wear or use.
    Relate Post
    [url=http://pol-mou4.u-education.ru/pol-mou4.u-education.ru/node/496]toms online high quality for you discount outlet[/url]
    [url=http://www.kyusho.com/forum/member.php/7230-TyhodyDot]toms outlet high quality for you discount online[/url]

    Anónimo dijo...

    dating the same person twice http://loveepicentre.com/taketour/ toronto millionaire dating site
    free online interracial dating services [url=http://loveepicentre.com/articles/]dating socializing[/url] free dating facebook
    who is faith evans dating [url=http://loveepicentre.com/taketour/]fl senior dating sites[/url] dating headline [url=http://loveepicentre.com/user/smoothkitty/]smoothkitty[/url] free mature adult online dating

    Anónimo dijo...

    buenas tardes buen aporte...pero como se llevaria a android studio y como limitar la cantidad de cita por dia.por ejemplo diez citas por dia y por turno (mañana o tarde)... en un calendario q el usuario abra la aplicacion y seleccione el dia y este le indique la cantidad de citas disponible en ese dia.

    Anónimo dijo...

    hola te felicito por todo tu conocimiento y mas aun que lo compartas con nosotros los que nos estamos iniciando de nuevo gracias y muy completo te sujiero hacer uno para agenda de consultorio odontologico o algunos apuntes gracias

    Anónimo dijo...

    Hola, Soy estudiante de la Carrera de Computación e Informática y tengo un Proyecto que se trata de algo similar.

    Con una Agenda de Citas trabajado con base de datos, aparte de funciones adicionales.

    Me gustaría brindar el código y el proyecto completo a quien esté interesado.

    Mi correo es nilser_stip@outlook.com

    Saludos, Muchas Gracias.