Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Base de Datos / Componentes / Ejercicios / Java / JTable editable con base de datos

JTable editable con base de datos

Por 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

Artículos similares

Envío de correo HTML con php

PHP cuenta con la función mail que nos permite el envío de correo desde nuestro servidor web bool mail ( string $to , st[...]

Convierte tus dibujos web en Código HTML

Sketch2Code es un proyecto de Microsoft el cual usa IA (Inteligencia Artificial) para transformar el diseño de una inter[...]

Detección de rostros con android

La API de Android ha ido evolucionado rápidamente y cada vez contiene más funcionalidades que hacen que desarrollar sist[...]

iFrame Injection – Ocultar código malicioso

En ocasiones los administradores de sitios web experimentan problemas de lentitud en su carga o en el peor de los casos[...]

Personalizar JTable: Tabla con footer (Pie de página)

En muchas ocasiones es necesaria la personalización de componentes java para que estos se adecuen a nuestros requerimien[...]

Numero a Literal en Java

Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, c[...]