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.
  • miércoles, 20 de agosto de 2008

    Instalación de MySQL

    Para el proceso de instalación de MySQL desde WinXP he preparado el siguiente vídeo



    para hacerlo desde ubuntu bastara hacerlo por apt-get asi:
    $ sudo apt-get install mysql-server

    después les regalo el video sobre ubuntu

    miércoles, 9 de abril de 2008

    Polimorfismo

    • Sobrecarga
    • Sobre-escritura
    • Ligadura dinámica


    La herencia es mucho más potente que simplemente una herramienta de reutilización


    Cuando estamos aprendiendo programación orientada a objetos, nos maravilla la potencia de la herencia y la reutilización de código, en este paper vamos a ver que otras ventajas de la programación orientada a objetos se basan en la herencia.

    El polimorfismo, como su mismo nombre sugiere múltiples formas, se refiere a la posibilidad de acceder a un variado rango de funciones distintas a través del mismo interfaz. O sea, que, en la práctica, un mismo identificador puede tener distintas formas (distintos cuerpos de función, distintos comportamientos) dependiendo, en general, del contexto en el que se halle inserto. El polimorfismo se puede establecer mediante la sobrecarga, sobre-escritura y la ligadura dinámica.

    Sobrecarga.
    El término sobrecarga se refiere al uso del mismo identificador u operador en distintos contextos y con distintos significados.


    Si para cada funcionalidad necesitada fuese necesario escribir un método, el código resultante sería inmanejable, imagínense, por ejemplo que los desarrolladores de java hubiesen creado un método para escribir en pantalla una cadena de texto, otro diferente para escribir un entero, otro para escribir un doble, otro para escribir un carácter, otro para una cadena y un entero y así para todas las combinaciones posibles, seria casi imposible conocer dichos métodos en totalidad; en cambio sabemos que con “System.out.print()” o “System.out.println()” podemos escribir cualquier mensaje en pantalla.

    Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

    La sobrecarga de métodos conduce a que un mismo nombre pueda representar distintos métodos con distinto tipo y número de parámetros, manejados dentro de la misma clase. En el ámbito de la POO, la sobrecarga de métodos se refiere a la posibilidad de tener dos o más métodos con el mismo nombre pero funcionalidad diferente. Es decir, dos o más métodos con el mismo nombre realizan acciones diferentes. El compilados usará una u otra dependiendo de los parámetros usados. Esto también se aplica a los constructores. De hecho, es la aplicación más habitual de la sobrecarga.

    La forma de diferenciar varios métodos sobrecargados es a través de sus parámetros, ya sea por la cantidad, el tipo o el orden de los mismos, veamos un ejemplo:

    public class Articulo {
     private float precio;
     public void setPrecio() {
      precio = 3.50;
     }
     public void setPrecio(float nuevoPrecio) {
      precio = nuevoPrecio;
     }
     public void setPrecio(float costo, int porcentajeGanancia) {
           precio = costo + (costo * porcentajeGanancia);
        }
    }


    Sobre-escritura:
    La sobre-escritura, se aplica a los métodos y esta directamente relacionada a la herencia y se refiere a la re-definición de los métodos de la clase base en las subclases, por ejemplo, en la relación de herencia del ejemplo de las figuras aunque la clase base “Figura” tiene los métodos “calcularArea” y “calcularPerimetro”, las subclases “Circulo”, “Cuadrado”, “Triangulo” y “Rectangulo” redefinen estos métodos ya que el calculo del área y el perímetro de cada uno de ellos es diferente.

    class Figura { 
     protected double area; 
         protected double perimetro; 
         public Figura() { 
           this.area=0; 
             this.perimetro=0; 
         } 
         public double getArea() { 
             return area; 
         } 
         public double getPerimetro() { 
             return perimetro; 
         } 
         public void calcularArea(){} 
         public void calcularPerimetro(){} 
    }
    
    public class Circulo extends Figura { 
         private double radio; 
         public Circulo() { 
             super(); 
         } 
         public double getRadio() { 
             return radio; 
         } 
        public void setRadio(double radio) { 
             this.radio = radio; 
         } 
        public void calcularArea() { 
           this.area = Math.PI*Math.pow(this.radio,2.0); 
         }  
        public void calcularPerimetro() { 
           this.perimetro = 2*Math.PI*this.radio; 
     } 
    }
     


    Ligadura dinámica:
    Gracias a la ligadura dinámica, pueden invocarse operaciones en objetos obviando el tipo actual del éstos hasta el momento de la ejecución del código, es decir que me perite definir elementos como un tipo e instanciarlos como un tipo heredado. Pero cual puede ser la utilidad de este concepto, para que me sirve obviar el tipo de un objeto para luego tomar esta decisión?.

    Gracias a que en java la definición de los tipos de objetos se puede producir por atado posterior (late binding), no nos debe preocupar a que tipo de elemento le paso un mensaje ya que el compilador tomara la decisión de que objeto ejecutará que método de acuerdo a la forma de crear la instancia.

    Este concepto es bastante complejo de entender ya que estamos acostumbrados a definir los elementos de acuerdo a lo que necesitamos, es decir, si requiero un entero lo declaro como entero, para que declararía yo un elemento como un tipo y lo usaría como otro?. No siempre se puede determinar exactamente el tipo de elemento que va a usarse en la ejecución de nuestro programa, para este tipo de casos es cuando es útil aplicar el atado posterior o ligadura dinámica, y se debe tener por lo menos una relación de herencia que por lo menos me permita determinar un tipo base para la declaración, sea cual sea el subtipo que se instancie.

    Veamos un ejemplo que nos aclare un poco este concepto:

    class Mamifero {
      public void mover() {
        System.out.println("Ahora es un mamifero el que se mueve");
      }
    }
    
    class Perro extends Mamifero {
      public void mover() {
        System.out.println("Ahora es un perro el que se mueve");
      }
    }
    
    class Gato extends Mamifero {
      public void mover() {
        System.out.println("Ahora es un gato el que se mueve");
      }
    }
    
    public class Polimorfismo {
      public static void muevete(Mamifero m) {
        m.mover();
      }
      public static void main(String[] args) {
        Gato bisho = new Gato();
        Perro feo = new Perro();
        muevete(bisho);
        muevete(feo);
      }
    }


    Vemos que el método “muevete” llama al método mover de un mamífero y aunque el no sabe con qué clase de mamífero trata, funciona y se llama al método correspondiente al objeto específico que lo llama (es decir, primero un gato y luego un perro). Si no existiera la ligadura dinámica tendríamos que crear un método “muevete” para los mamíferos de tipo “Gato” y otro para los de tipo “Perro”.

    Veamos otro ejemplo donde las instancias se crean de forma aleatoria:

    public abstract class Instrumento {
         public Instrumento() { }
         public abstract void tocar();
         public abstract void tocar(String nota);
     public abstract void afinar();
    }
    
    public class Cuerda extends Instrumento{
     public Cuerda() {}
          public void afinar() {
             System.out.println("Cuerda.afinar()");
         }
     public void tocar() {
             System.out.println("Cuerda.tocar()");
         }
         public void tocar(String nota){
             System.out.println("Cuerda.tocar()"+nota);
         }
    }
    
    public class Percusion extends Instrumento{
         public Percusion() {}
         public void afinar() {
             System.out.println("Percusion.afinar()");
         }
         public void tocar() {
             System.out.println("Percusion.tocar()");
         }
         public void tocar(String nota){
             System.out.println("Percusion.tocar()"+nota);
         }
    }
    
    public class Viento extends Instrumento{
         public Viento() {}
         public void afinar() {
             System.out.println("Viento.afinar()");
         }
         public void tocar() {
             System.out.println("Viento.tocar()");
         }
         public void tocar(String nota){
             System.out.println("Viento.tocar()"+nota);
         }
    }
    
    public class LigaduraDinamica {
        public static void main(String[] args){
            String[] notas = {"Do","Re","Mi","Fa","Sol","La","Si"};
            Instrumento orquesta[] = new Instrumento[10];
    
            for(int i=0;i<10 br="" i="">            orquesta[i]=generarInstrumento(new java.util.Random().nextInt(3));
            }
    
            for(int i=0;i<10 br="" i="">            afinarInstrumento(orquesta[i]);
            }
    
            for(int i=0;i<10 br="" i="">            tocarInstrumento(orquesta[i]);
            }
    
            for(int i=0;i<10 br="" i="">            tocarInstrumento(orquesta[i],notas[i%7]);
            }
        }
        
        public static Instrumento generarInstrumento(int i){
            switch(i){
            default:
            case 0:
                return new Viento();
            case 1:
                return new Percusion();
            case 2:
                return new Cuerda();
            }
        }
        
        public static void afinarInstrumento(Instrumento o){
            o.afinar();
        }
        
        public static void tocarInstrumento(Instrumento o){
            o.tocar();
        }
        
         public static void tocarInstrumento(Instrumento o,String nota){
            o.tocar(nota);
        }
    }
    


    Veamos que el método “generarInstrumento” aleatoriamente me crea las instancias de los diferentes tipos de instrumentos y que nuestro arreglo de elementos del tipo de instrumentos es llenado con diferentes elementos de los cuales no podemos controlar que tipo de instancia es creada, solo sabemos que son objetos basados en “Instrumento”, sin embargo los métodos “tocarInstrumento” y “afinarInstrumento” que reciben como parámetro un Instrumento llaman adecuadamente a los métodos “afinar” o “tocar” según la instancia que reciben.

    sábado, 5 de abril de 2008

    Calculadora en Java

    Hoy traigo un ejemplo sencillo que implementa ejemplo de herencia y composición, la idea es hacer una calculadora que opere en binario, octal, decimal y hexadecimal; ya que no es idea del ejercicio enseñar los sistemas numéricos sino mostrar un ejemplo sencillo en java, la calculadora solo operará en enteros y hará las operaciones básicas: suma, resta, multiplicación y división.


    Para las transformaciones entre los sistemas usaremos los métodos de la clase Integer Integer.parseInt() para convertir de los binario, octal o hexadecimal a decimal e Integer.toBinaryString(), Integer.toOctalString() e Integer.toHexString() para convertir de cada uno de los sistemas a decimal.

    Para implementar la herencia lo haremos de una clase "Sistema" hacia cada uno de los sistemas numéricos representados en el ejemplo y la composición estará implementada en nuestro modelo por una clase "Conversion" que servirá como componente para hacer conversiones entre sistemas, además de los elementos que nos servirán para componer nuestra interfaz gráfica, asi como manejadores para cada uno de los sistemas numéricos.

    Entonces la clase base ne nuestro aplicativo sera la llamada "Sistema" que sera la que se encarga de sumar, restar, multiplicar y dividir en base decimal y cada clase que herede de ella determinará en que base va a trabajar.

    Veamos como quena nuestra clase Sistema:

    abstract public class Sistema {
    protected int numeroA;
    protected int numeroB;
    protected int resultado;
    protected char operacion;
    protected int base;

    public Sistema() {
    this.numeroA = 0;
    this.numeroB = 0;
    this.resultado = 0;
    this.operacion = ' ';
    }

    public void setNumeroA(int n){
    this.numeroA = n;
    }

    public void setNumeroB(int n){
    this.numeroB = n;
    }

    public void setResultado(int n){
    this.resultado = n;
    }

    public void setOperacion(char o){
    this.operacion = o;
    }

    public int getNumeroA(){
    return this.numeroA;
    }

    public int getNumeroB(){
    return this.numeroB;
    }

    public int getResultado(){
    return this.resultado;
    }

    public char getOperacion(){
    return this.operacion;
    }

    public void suma(){
    this.resultado = this.numeroA + this.numeroB;
    }
    public void resta(){
    this.resultado = this.numeroA - this.numeroB;
    }
    public void multiplicacion(){
    this.resultado = this.numeroA * this.numeroB;
    }
    public void division(){
    this.resultado = this.numeroA / this.numeroB;
    }

    public void establecerNumeroA(String a){
    int n = Integer.parseInt(a,base);
    this.setNumeroA(n);
    }
    public void establecerNumeroB(String b){
    int n = Integer.parseInt(b,base);
    this.setNumeroB(n);
    }
    public String retornarNumeroA(){
    String cad="";
    switch(base){
    case 2:
    cad = Integer.toBinaryString(numeroA);
    break;
    case 8:
    cad = Integer.toOctalString(numeroA);
    break;
    case 10:
    cad = String.valueOf(numeroA);
    break;
    case 16:
    cad = Integer.toHexString(numeroA);
    break;
    }
    return cad;

    }
    public String retornarNumeroB(){
    String cad="";
    switch(base){
    case 2:
    cad = Integer.toBinaryString(numeroB);
    break;
    case 8:
    cad = Integer.toOctalString(numeroB);
    break;
    case 10:
    cad = String.valueOf(numeroB);
    break;
    case 16:
    cad = Integer.toHexString(numeroB);
    break;
    }
    return cad;
    }
    public String retornarResultado(){
    String cad="";
    switch(base){
    case 2:
    cad = Integer.toBinaryString(resultado);
    break;
    case 8:
    cad = Integer.toOctalString(resultado);
    break;
    case 10:
    cad = String.valueOf(resultado);
    break;
    case 16:
    cad = Integer.toHexString(resultado);
    break;
    }
    return cad;
    }

    }


    Ahora como queda la clase "Binario" que hereda de "Sistema"

    public class Binario extends Sistema{
    public Binario() {
    this.base=2;
    }
    }


    Ahora como queda la clase "Octal" que hereda de "Sistema"

    public class Octal extends Sistema{
    public Octal() {
    this.base=8;
    }
    }


    Ahora como queda la clase "Decimal" que hereda de "Sistema"

    public class Decimal extends Sistema{
    public Decimal() {
    this.base=10;
    }
    }


    Ahora como queda la clase "Hexadecimal" que hereda de "Sistema"

    public class Hexadecimal extends Sistema{
    public Hexadecimal() {
    this.base=16;
    }
    }


    Ahora como queda la clase "Conversion"

    public class Conversion {

    public Integer fromHexadecimal(String cad){
    return Integer.parseInt(cad,16);
    }

    public Integer fromOctal(String cad){
    return Integer.parseInt(cad,8);
    }

    public Integer fromBinario(String cad){
    return Integer.parseInt(cad,2);
    }

    public String toHexadecimal(int i){
    return Integer.toHexString(i);
    }

    public String toOctal(int i){
    return Integer.toOctalString(i);
    }

    public String toBinario(int i){
    return Integer.toBinaryString(i);
    }

    public String combertirSistema(int actual,int nuevo, String cad){
    String res = "";
    int num=0;
    if(cad.length()>0){
    switch(actual){
    case 2:
    num = fromBinario(cad);
    break;
    case 8:
    num = fromOctal(cad);
    break;
    case 10:
    num = Integer.parseInt(cad,10);
    break;
    case 16:
    num = fromHexadecimal(cad);
    break;
    }
    switch(nuevo){
    case 2:
    res = toBinario(num);
    break;
    case 8:
    res = toOctal(num);
    break;
    case 10:
    res = Integer.toString(num);
    break;
    case 16:
    res = toHexadecimal(num);
    break;
    }
    }
    return res;
    }

    }


    Y ahora como queda la clase "AppCalculadora" que sera la que pone todo junto en una interfaz gráfica que representa la calculadora

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

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

    public class AppCalculadora implements ActionListener{

    private JFrame frame;
    private ButtonGroup btgSistema;
    private JButton[] btnBotones;
    private JRadioButton[] jrbSistemas;
    private JTextField txtResultado;
    private Container cpane;
    int s;
    Sistema d;
    Conversion c;

    public AppCalculadora() {
    initComponents();
    }

    private void initComponents(){
    s=10;
    d = new Decimal();
    c = new Conversion();
    frame = new JFrame("Calculadora de Cuatro Sistemas") ;
    btgSistema = new ButtonGroup();
    btnBotones = new JButton[24];
    jrbSistemas = new JRadioButton[4] ;
    txtResultado = new JTextField(0);

    int cont=0;
    btnBotones[cont++]=new JButton("D");
    btnBotones[cont++]=new JButton("E");
    btnBotones[cont++]=new JButton("F");
    btnBotones[cont++]=new JButton("/");
    btnBotones[cont++]=new JButton("A");
    btnBotones[cont++]=new JButton("B");
    btnBotones[cont++]=new JButton("C");
    btnBotones[cont++]=new JButton("*");
    btnBotones[cont++]=new JButton("7");
    btnBotones[cont++]=new JButton("8");
    btnBotones[cont++]=new JButton("9");
    btnBotones[cont++]=new JButton("-");
    btnBotones[cont++]=new JButton("4");
    btnBotones[cont++]=new JButton("5");
    btnBotones[cont++]=new JButton("6");
    btnBotones[cont++]=new JButton("+");
    btnBotones[cont++]=new JButton("1");
    btnBotones[cont++]=new JButton("2");
    btnBotones[cont++]=new JButton("3");
    btnBotones[cont++]=new JButton("=");
    btnBotones[cont++]=new JButton("0");
    btnBotones[cont++]=new JButton("Acerca de ... ");
    btnBotones[cont++]=new JButton("Cl");
    btnBotones[cont++]=new JButton("CE");

    cont=0;
    jrbSistemas[cont++]=new JRadioButton("BIN");
    jrbSistemas[cont++]=new JRadioButton("OCT");
    jrbSistemas[cont++]=new JRadioButton("DEC");
    jrbSistemas[cont++]=new JRadioButton("HEX");

    for(int i=0;i<jrbSistemas.length;i++){
    btgSistema.add(jrbSistemas[i]);
    }

    cpane = frame.getContentPane();
    cpane.setLayout(null);

    txtResultado.setBounds(10,10,260,30);
    txtResultado.setEditable(false);
    txtResultado.setBackground(Color.white);
    txtResultado.setHorizontalAlignment(JTextField.RIGHT);
    cpane.add(txtResultado);

    int x=10;
    int y=45;
    for(int i=0;i<jrbSistemas.length;i++){
    x=i*70+10;
    jrbSistemas[i].setBounds(x,y,60,20);
    jrbSistemas[i].addActionListener(this);
    cpane.add(jrbSistemas[i]);

    }
    x=10;
    y=35;
    for(int i=0;i<btnBotones.length;i++){
    if(i%4==0){
    x=10;
    y+=35;
    }else{
    x+=70;
    }
    if(i!=20 && i!=21){
    btnBotones[i].setBounds(x,y,50,30);
    }else{
    if(i==20)
    btnBotones[i].setBounds(x,y,120,30);
    if(i==21)
    btnBotones[i].setBounds(10,y+35,260,30);
    }


    btnBotones[i].addActionListener(this);
    cpane.add(btnBotones[i]);
    }

    jrbSistemas[2].setSelected(true);

    elegirSistema(10);

    frame.pack();
    frame.setSize(290,350);
    frame.setResizable(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void elegirSistema(int sistema){

    for(int i=0;i<btnBotones.length;i++){
    if(!btnBotones[i].getText().equals("+")&&
    !btnBotones[i].getText().equals("-")&&
    !btnBotones[i].getText().equals("*")&&
    !btnBotones[i].getText().equals("/")&&
    !btnBotones[i].getText().equals("=")){
    btnBotones[i].setEnabled(false);
    }
    }
    switch(sistema){
    case 2:
    for(int i=0;i<btnBotones.length;i++){
    if(!btnBotones[i].getText().equals("A")&&
    !btnBotones[i].getText().equals("B")&&
    !btnBotones[i].getText().equals("C")&&
    !btnBotones[i].getText().equals("D")&&
    !btnBotones[i].getText().equals("E")&&
    !btnBotones[i].getText().equals("F")&&
    !btnBotones[i].getText().equals("9")&&
    !btnBotones[i].getText().equals("8")&&
    !btnBotones[i].getText().equals("7")&&
    !btnBotones[i].getText().equals("6")&&
    !btnBotones[i].getText().equals("5")&&
    !btnBotones[i].getText().equals("4")&&
    !btnBotones[i].getText().equals("3")&&
    !btnBotones[i].getText().equals("2")){
    btnBotones[i].setEnabled(true);
    }
    }
    break;
    case 8:
    for(int i=0;i<btnBotones.length;i++){
    if(!btnBotones[i].getText().equals("A")&&
    !btnBotones[i].getText().equals("B")&&
    !btnBotones[i].getText().equals("C")&&
    !btnBotones[i].getText().equals("D")&&
    !btnBotones[i].getText().equals("E")&&
    !btnBotones[i].getText().equals("F")&&
    !btnBotones[i].getText().equals("9")&&
    !btnBotones[i].getText().equals("8")){
    btnBotones[i].setEnabled(true);
    }
    }
    break;
    case 10:
    for(int i=0;i<btnBotones.length;i++){
    if(!btnBotones[i].getText().equals("A")&&
    !btnBotones[i].getText().equals("B")&&
    !btnBotones[i].getText().equals("C")&&
    !btnBotones[i].getText().equals("D")&&
    !btnBotones[i].getText().equals("E")&&
    !btnBotones[i].getText().equals("F")){
    btnBotones[i].setEnabled(true);
    }
    }
    break;
    case 16:
    for(int i=0;i<btnBotones.length;i++){
    btnBotones[i].setEnabled(true);
    }
    break;
    }
    txtResultado.setText(c.combertirSistema(s, sistema, txtResultado.getText()));
    s=sistema;
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
    AppCalculadora c = new AppCalculadora();
    }

    public void actionPerformed(ActionEvent e){
    if(e.getActionCommand().equals("Cl")||e.getActionCommand().equals("CE")){
    txtResultado.setText("");
    }
    if(e.getActionCommand().equals("BIN")){
    elegirSistema(2);
    d = new Binario();
    }
    if(e.getActionCommand().equals("OCT")){
    elegirSistema(8);
    d = new Octal();
    }
    if(e.getActionCommand().equals("DEC")){
    elegirSistema(10);
    d = new Decimal();
    }
    if(e.getActionCommand().equals("HEX")){
    elegirSistema(16);
    d = new Hexadecimal();
    }
    if(!e.getActionCommand().equals("+")&&
    !e.getActionCommand().equals("-")&&
    !e.getActionCommand().equals("*")&&
    !e.getActionCommand().equals("/")&&
    !e.getActionCommand().equals("=")&&
    !e.getActionCommand().equals("Acerca de ... ")&&
    !e.getActionCommand().equals("Cl")&&
    !e.getActionCommand().equals("CE")&&
    !e.getActionCommand().equals("BIN")&&
    !e.getActionCommand().equals("OCT")&&
    !e.getActionCommand().equals("DEC")&&
    !e.getActionCommand().equals("HEX")){
    txtResultado.setText(txtResultado.getText()+e.getActionCommand());
    }

    if(e.getActionCommand().equals("+")||
    e.getActionCommand().equals("-")||
    e.getActionCommand().equals("*")||
    e.getActionCommand().equals("/")){
    d.setOperacion(e.getActionCommand().charAt(0));
    switch(s){
    case 2:
    d.establecerNumeroA(txtResultado.getText());
    break;
    case 8:
    d.setNumeroA(c.fromOctal(txtResultado.getText()));
    break;
    case 10:
    d.setNumeroA(Integer.parseInt(txtResultado.getText()));
    break;
    case 16:
    d.setNumeroA(c.fromHexadecimal(txtResultado.getText()));
    break;
    }
    txtResultado.setText("");
    }

    if(e.getActionCommand().equals("=")){
    switch(s){
    case 2:
    d.setNumeroB(c.fromBinario(txtResultado.getText()));
    break;
    case 8:
    d.setNumeroB(c.fromOctal(txtResultado.getText()));
    break;
    case 10:
    d.setNumeroB(Integer.parseInt(txtResultado.getText()));
    break;
    case 16:
    d.setNumeroB(c.fromHexadecimal(txtResultado.getText()));
    break;
    }
    switch(d.getOperacion()){
    case '+':
    d.suma();
    break;
    case '-':
    d.resta();
    break;
    case '*':
    d.multiplicacion();
    break;
    case '/':
    d.division();
    break;
    }
    switch(s){
    case 2:
    txtResultado.setText(c.toBinario(d.getResultado()));
    break;
    case 8:
    txtResultado.setText(c.toOctal(d.getResultado()));
    break;
    case 10:
    txtResultado.setText(String.valueOf(d.getResultado()));
    break;
    case 16:
    txtResultado.setText(c.toHexadecimal(d.getResultado()));
    break;
    }
    }
    if(e.getActionCommand().equals("Acerca de ... ")){
    JOptionPane.showMessageDialog(null, "Calculadora de ejemplo");
    }
    }


    }




    Espero que el ejemplo le sea de utilidad