Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Base de Datos / Componentes / Ejercicios / Java / JTable editable con base de datos

JTable editable con base de datos

Autor jc mouse domingo, mayo 13, 2012

JTable es un componente swing java que nos permite mostrar datos en una tabla de una base de datos, sin embargo a diferencia de otros componentes similares de otros lenguajes de programación (Delphi por ejemplo), java no nos permite gestionar directamente los datos. Es eso lo que haremos hoy, construir un JTable editable, más propiamente, este JTable nos permitirá actualizar datos de una JTable directamente con la base de datos. Enjoy!.

JTable editable

Necesitas:

  • Netbeans 6.9 o superior
  • Servidor MySQL
  • Conector MySQL JDBC
  • Java intermedio
  • 10 minutos de tu valioso tiempo

Por motivos didácticos y de simplicidad, solo se utilizara una tabla  PERSONA con cuatro campos + su llave principal, la tabla es la siguiente:

CREATE TABLE persona (
  p_id int(11) NOT NULL auto_increment,
  p_nombre varchar(32) default 'Nombre',
  p_apellido varchar(32) default 'Apellido',
  p_edad int(2) default '18',
  PRIMARY KEY  (p_id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

INSERT INTO persona VALUES (1, 'Paca', 'Garte', 23);
INSERT INTO persona VALUES (2, 'Ana Lisa', 'Melchoto', 12);
INSERT INTO persona VALUES (3, 'Rosa', 'Melpito', 43);
INSERT INTO persona VALUES (4, 'Monica', 'Galindo', 63);
INSERT INTO persona VALUES (5, 'Lali', 'Cuadora', 21);
INSERT INTO persona VALUES (6, 'Mary', 'Quita', 19);
INSERT INTO persona VALUES (7, 'Flor D.', 'Turra', 26);
INSERT INTO persona VALUES (8, 'ana', 'Tomia', 18);
INSERT INTO persona VALUES (9, 'Evelin', 'Munda', 35);
INSERT INTO persona VALUES (10, 'Roque', 'Joso', 27);
INSERT INTO persona VALUES (11, 'German', 'Teca', 41);

Ok, debes crearla con todo y datos en tu base de datos.

1. Crea un proyecto en netbeans y añade un JFrame, a este añadele un control JTable, no es necesario cambiarle el nombre. Añade el Driver MySQL JDBC al proyecto.

2. Crea dos clases y llamalas database.javaMyTableCellEditor.java, la primera nos permite utilizar la base de datos y la segunda es la encargada de manipular los datos del JTable.

database.java: Esta clase es la encarga de conectarse a la base de datos, ademas tiene dos métodos para obtener una matriz con los registros de la tabla persona y un metodo para actualizar el registro dado su ID (Llave primaria)

import java.sql.*;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class database {
 /* DATOS PARA LA CONEXION */
  private String bd = "";//BASE DE DATOS
  private String login = "root"; //USUARIO
  private String password = ""; //CONTRASEÑA
  private String url = "jdbc:mysql://localhost/"+bd;
  private Connection conn = null;

  /* Constructor de clase: Se conecta a la base de datos
 */
   public database(){
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         if (conn!=null){
            System.out.println("OK base de datos "+bd+" listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
    }

    public Connection getConnection()
    {
        return this.conn;
    }
/* Realiza una consulta a la base de datos, retorna un Object[][] con los
 * datos de la tabla persona
 */
    public Object[][] Select_Persona()
    {
     int registros = 0;
      String consulta = "Select p_id,p_nombre,p_apellido,p_edad FROM persona ";
      String consulta2 = "Select count(*) as total from persona ";
      //obtenemos la cantidad de registros existentes en la tabla
      try{
         PreparedStatement pstm = conn.prepareStatement( consulta2 );
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][4];
    //realizamos la consulta sql y llenamos los datos en la matriz "Object"
      try{
         PreparedStatement pstm = conn.prepareStatement(consulta);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            data[i][0] = res.getString( "p_id" );
            data[i][1] = res.getString( "p_nombre" );
            data[i][2] = res.getString( "p_apellido" );
            data[i][3] = res.getString( "p_edad" );
            i++;
         }
         res.close();
          }catch(SQLException e){
               System.out.println(e);
        }
    return data;
    }

/* Ejecuta la actualizacion de la tabla persona dado los valores de actualizacion
 * y el ID del registro a afectar
 */
    public boolean update(String valores, String id)
    {
        boolean res = false;
        String q = " UPDATE persona SET " + valores + " WHERE p_id= " + id;
        try {
            PreparedStatement pstm = conn.prepareStatement(q);
            pstm.execute();
            pstm.close();
            res=true;
         }catch(SQLException e){
            System.out.println(e);
        }
        return res;
    }

}

 

MyTableCellEditor: Esta clase es la encargada de la magia :), implementa la clase TableCellEditor y la modifica, primero, para recibir en el constructor una instancia de la clase database.java, y el nombre de la columna a la que pertenece la celda, esta clase, lo que hace es, obtener el valor de la celda y almacenarla en una variable, despues, cuando el usuario haga clic sobre la celda y modifique su valor, la clase se encarga de llamar a la función de actualización, si tiene existo cambia los valores en la base de datos, sino, retorna al antiguo valor y muestra un mensaje de alerta. La clase esta comentada así que creo que se entiende.

import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
/**
 * @web https://www.jc-mouse.net
 * @author Mouse
 */
public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor{

    private database db;
    private String OldValue=""; //Valor antiguo de la celda
    private String NewValue=""; //valor nuevo de la celda
    private String NameColum="";//nombre de la columna
    private String ID="";// Llave del registro
    private JComponent component = new JTextField();

    public MyTableCellEditor(database db, String NameColumn)
    {
            this.db = db;
            this.NameColum = NameColumn;
    }

    public Object getCellEditorValue() {
        return ((JTextField)component).getText();
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        OldValue = value.toString();//Toma valor de celda antes de cualquier modificación
        ID = table.getValueAt(row,0).toString();//obtiene el ID unico del registro
        ((JTextField)component).setText(value.toString());//coloca valor de la celda al JTextField
        return component;
    }

    @Override
    public boolean stopCellEditing() {
        NewValue = (String)getCellEditorValue();//Captura nuevo valor de la celda
        //Compara valores, si no son iguales, debe actualizar registro
        if( !NewValue.equals(OldValue))
        {   //Realiza la actualizacion
            if( !db.update( NameColum+"='"+NewValue+"' ", ID ) )
            {   //Si existe algun error al actualizar, escribe viejo valor en la celda
                JOptionPane.showMessageDialog(null,"Error: No se puede actualizar");
                ((JTextField)component).setText(OldValue);
            }
        }
        return super.stopCellEditing();
    }
}

3.  Para terminar, debemos implementar ambas clases en la interfaz.java de la siguiente manera:

– Debemos importar la librería DefaultTableModel.

import javax.swing.table.DefaultTableModel;

– Declaramos las variables db y dtPersona, la primera instancia de clase database.java y la segunda una matriz [][]

private database db = new database();
    private Object[][] dtPersona;

– Agregamos una función privada Actualizar_Tabla(), como su nombre indica obtiene los datos del DataBase colocándoles en un DefaultTableModel y esta al JTable. Observe que obtenemos todos los registros y junto a todos los campos, 4 en total.

     private void Actualizar_Tabla(){
        //actualiza los datos de la tabla realizando una consulta a la base de datos
        String[] columNames = {"Codigo" ,"Nombre","Apellido","Edad"};
        dtPersona = db.Select_Persona();
        // se colocan los datos en la tabla
        DefaultTableModel datos = new DefaultTableModel(dtPersona,columNames);
        jTable1.setModel(datos);
}

– Aquí lo importante, en el constructor de la clase interfaz.java, agregamos el siguiente código, lo que hace, es hacer una llamada a nuestra función Actualizar_Tabla(), despues oculta la primera columna, la que corresponde a la llave primaria «p_id», esto porque no queremos que se pueda editar esa columna, después añade a las restante columnas la clase MyTableCellEditor.

 public interfaz() {
        initComponents();
        this.setTitle("JTable editable * https://www.jc-mouse.net/");

        Actualizar_Tabla();
        //oculta columna ID
        jTable1.getColumnModel().getColumn(0).setMaxWidth(0);
        jTable1.getColumnModel().getColumn(0).setMinWidth(0);
        jTable1.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
        jTable1.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);
        //editor de caldas
        jTable1.getColumnModel().getColumn( 1 ).setCellEditor(new MyTableCellEditor(db,"p_nombre"));//Columna Nombre
        jTable1.getColumnModel().getColumn( 2 ).setCellEditor(new MyTableCellEditor(db,"p_apellido"));//Columna Apellido
        jTable1.getColumnModel().getColumn( 3 ).setCellEditor(new MyTableCellEditor(db,"p_edad"));//Columna Edad
    }

Ejecuta y listo 🙂 Enjoy

JTable editable

Proyecto HERE

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Introducción a Scene Builder y MVC (Parte I)

Introducción a Scene Builder y MVC (Parte I)

En este tutorial realizaremos una introducción al diseño de interfaces gráficas en JavaFX y Scene Builder, así también v...

TextToSpeech: Convierte texto a voz

TextToSpeech: Convierte texto a voz

TextToSpeech o TTS, es el sintetizador de voz para android, en los celulares inteligentes viene un motor TTS por defecto...

Crear un plugin wordpress «Banned Word»

Crear un plugin wordpress «Banned Word»

En este post, escribiremos un sencillo plugin para wordpress el cual consistirá en reemplazar palabras en los comentario...

JSON Web Token para Java y Android

JSON Web Token para Java y Android

Un JSON Web Token es un estandar abierto para la creación de Token de Acceso el cual permite firmar digitalmente informa...

Leer Código QR desde un archivo de imagen

Leer Código QR desde un archivo de imagen

Los códigos QR del inglés Quick Response Code o código de respuesta rápida es un tipo de código para el almacenamiento d...

Script PHP – Mouse responde

Script PHP – Mouse responde

«Mouse Responde…» simula ser un alma en pena que responde cualquier pregunta que le hagan, al estilo del juego de...

39 comentarios en “JTable editable con base de datos”

  1. hugocc13 dice:

    excelente información, gracias por tomarte el tiempo para compartirla. saludos.

  2. Stiven dice:

    Gracias compañero, usted siempre compartiendo su conocimiento, tus post me han ayudado mucho a mejorar el proyecto en el que estoy trabajando para graduarme como tecnologo, pero tengo una pregunta. si se quiere implementar un checkbox al jtable para que luego con un boton se inserten a la base de datos mysql con el campo boolean. Sabes como hacer algo asi? estoy trabajando con la parte de asistencia y consta de una tabla que toma nombres, apellido de los alumnos, pero tiene un campo para chulear si asistio o no.

    1. Mouse dice:

      claro que se puede hacer eso, aunque lo preferible seria diseñar un componente propio a manera de JTable si es para un proyecto de grado, pero dame tiempo, ahora estoy corto de tiempo, no es difícil pero si cuesta escribir codigo, post y subir archivos 🙂 dame una semana hasta que este libre y pueda hacerlo con calma 🙂

  3. Carlos Arturo dice:

    Se ve muy interesante la forma como manipulas los objetos y lo metodos. muchas gracias.

  4. diegodesdecolombia dice:

    Que tal amigo, muy claro y bien explicado tu ejemplo, Muchas Gracias por compartir tan buen material. saludos desde Colombia.!!!

    1. Mouse dice:

      gracias 🙂 saludos desde Bolivia 🙂

      1. diegodesdecolombia dice:

        Mouse , No se si me pudieras por favor colaborar con lo siguiente.
        Implemente tu código y funciona perfecto pero a la hora necesito que actualice un total en un jlabel cuando se modifique una celda. Muchas gracias si me puedes dar respuesta.

          1. diegodesdecolombia dice:

            Que bien , excelente. Gracias.

  5. ceci dice:

    muy buen material, gracias por tomarte la molestia de compartir tus conocimientos

  6. Norma dice:

    hola yo tengo una duda, agradecería que me ayudaras pues resulta que tengo una tabla ventas cuando ingreso el código a esa tabla me muestra mis datos en el jtable pero cuando ingreso otro producto del mismo código como le hago para que no me lo ingrese en otra fila el mismo producto sino que me vaya sumando ahí la cantidad y si elimino un producto que me lo elimine desde la fila de la tabla por favor ayuda 🙁

  7. OSCAR dice:

    muy buen aporte solo tuve que acomodar algunas cosas para hacerlo funcionar con derby xD

  8. OSCAR dice:

    Hola tengo una duda como le hago para eliminar un dato dato de la tabla editable??

    1. Mouse dice:

      seguramente te refieres a eliminar todo un registro y no solo el contenido de una celda, pues si quieres hacerlo todo desde una interfaz JTable, debes añadir un campo jChecked o un JButton y manipular sus eventos cuando el usuario haga clic en uno de ellos

  9. Yamid dice:

    Jc he visto varios ejemplos de como hacer que los campos no sean editables, en tu ejemplo ¿ como harias que los campos nombres y apellidos no sean editables?

    1. Mouse dice:

      JTable ya tiene un método para habilitar o deshabilitar la edición de todas las celdas, si te refieres a inhabilitar la edición de una celda en especifico, pues esa celda debe cumplir alguna condición, por decir una columna de edades, las celdas con edades mayores a 20 no son editables, para que se cumpla esa condición, se la implementa en el DefaultCellEditor 🙂

  10. Alejandra Cardiel dice:

    Hola Mouse!
    Muchas Gracias por tu aportacion! Me has ayudado en un proyecto que estoy haciendo.

    Gracias!

  11. Ignacio dice:

    excelente blog lo que necesitaba, pregunta es posible con un jtable hacer para diferentes filas mostrar en una columna con jcombobox diferentes valores en el listado de opciones?

    1. Mouse dice:

      :/pues si, no veo porque no, buena idea para un siguiente post 🙂

  12. Jose Alex dice:

    Una pregunta se puede actualizar un Jtable en automático al haber un cambio en la base de datos.

    1. Mouse dice:

      pues si, para eso se debe verificar cada cierto los cambios en la base de datos y actualizar el JTable, puedes utilizar un TIMER

  13. Madek dice:

    Hola gracias por tu proyecto, hace rato anadaba buscando como lograr lo de las celdas editables.
    Ahora tengo una simple duda, implemente lo del jtable editable pero de otra forma, es decir con otras funciones.

    Como haria para actualizar la tabla junto con los datos?
    Es decir por ejemplo, yo elimino los datos de mi base de datos seleccionando una fila y presionando un boton, y si se elimina de la base de datos, pero NO del jtable.

    Para que la fila eliminada desparezca necesito ejecutar de nuevo el proyecto.

    Como seria para actualizar la tabla?
    Con el metodo Actualizar_tabla si lo llamo de nuevo lo unico que hace es colocarme el id de la tabla.

  14. Andres Orellana dice:

    Hola Mouse, mucgas gracias por tu post, me sirvio de mucho para una aplicacion que estoy creando. Te agradezco por tu tiempo y por compartir tus conocimientos.
    Una pregunta tal vez tienes alguna aplicacion que realice Facturacion en Java?

  15. Gabriel dice:

    excelente aporte. justo lo que buscaba. Me sirvio mucho la clase tableCellEditor, Felicidadess!!!!

  16. Henry J.P.B. dice:

    Excelente!!! – Agradecido contigo por compartir tus conocimientos, ilustrativo y de facil comprensión. Una gran ayuda para gente como YO que se esta preparando en este fascinante lenguaje de Programación.

    Saludos.

  17. AntraxSec dice:

    Gracias, lo tomare en cuenta

  18. orlando dice:

    quiero hacer esto para una tabla que tiene 8 campos ya la adapte pero me tira error en las demas columnas que yo agrege en la classe mytablecelleditor

  19. orlando dice:

    muy buen ejemplo me sirvio mucho despues de quebrarme por dias la cabeza encontre este ejemplo, por ultimo me podrias ayudar en otra cosa, quiero hacer esto para una tabla que tiene 8 campos ya la adapte pero me tira error en las demas columnas que yo agrege , el error me lo da en la classe mytablecelleditor en el metodo getablecelleditorcomponent. como lo podria solucionar eso?

    1. Mouse dice:

      al adaptar la tabla debes tener cuidado con el tipo de dato que le estés pasando, no me muestras el tipo de error que te sale solo me dices donde te sale, getablecelleditorcomponent se ocupa de pintar el componente en la celda, en este caso creo que es un jtextfield

  20. Carito dice:

    Antes que nada muchas gracias por compartir tu conocimiento, es justo lo que estaba buscando, probé el código y funcionó de maravilla. Me prodrías ayudar, ahora quiero que al actualizar un registro no tome como referencia el campo «id» (por ejemplo que ahora tome como id un nombre o apellido). De antemano muchas gracias!

  21. Mabell dice:

    Disculpa he leído varios de tus aportes y son muy buenos, pero necesito ayuda he buscado en varios tutos y foros pero no encuentro solución para mi problema por eso me estoy dirigiendo a ti.
    Lo que pasa es que me toca dar de baja unos equipos pero necesito guardar todo lo que se de de baja en un Jframe llamado DadosdeBaja no quiero que se me eliminen solo borrarlo de esa Jtabla y enviarlos a otro jFrame o jDialog no se como se me haga posible. por favor necesito ayuda es urgenteeeee plisssssssssss………

  22. Rodolfo Ruiz dice:

    Hola Mouse, gracias por tus aportes, me han sido de mucha ayuda, pero tengo una pregunta se puede usar el jtable como ingreso de datos, por ejemplo que pueda ingresar el código de un producto en la primera columna, que se valide en una base de datos mysql y que me llene los datos descripción y precio en las columnas siguientes.

    Gracias.

    1. Mouse dice:

      claro, tendrías que llevar el control columna por columna

      1. Rodolfo Ruiz dice:

        Hola Mouse, gracias por responder mi consulta, al referirte a «tendrías que llevar el control columna por columna», que información tendría que buscar para poder tener una guía para lograr esto.

        Gracias.

  23. Rodolfo Ruiz dice:

    Gracias por responder, no tenes un ejemplo para usarlo de guía?

  24. Ernesto Giraldo dice:

    Gracias por este gran aporte, estuve buscando algo así por una semana. Solo una pregunta: Es que estoy implementando un proyecto para administrar una video tienda y Quiero poder ingresar una imagen a cada película y guardarla en MySQL desde JAVA. Si me pudieras ayudar estaria muy agradecido, y de nuevo gracias por tus excelentes aportes.

  25. Ben dice:

    holas Jc Mouse… una consulta estoy realizando la importacion de datos en Java.
    pero al realizar la importacion del excel.. en mi codigo Java realizo el recorrido de las columas y filas pero no esta realizando la importacion .Hay que configurar la categoria del formato de celda en mi excel, para que en mi codigo Java compare si son iguales.. es decir en mi codigo estoy utilizando tipo de datos String,Float,date.. estos deberian ser iguales en mi hoja de excel??? como lo realio gracias por responder saludos

    1. Mouse dice:

      cuidado con el tipo de dato tal vez esto te sirva http://www.jc-mouse.net/base-de-datos/exportar-registros-mysql-a-excel

  26. Johnny Florez dice:

    Saludos hermano;

    al ejecutar el codigo me sale un error «java.lang.nullpointerexception»

    a que se puede beber esto?

    Gracias

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

Herramientas

Generador de Enlaces a Whatsapp