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!.
Necesitas:
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.java y MyTableCellEditor.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
Proyecto HERE
El Ascii Art o Arte Ascii, consiste en realizar dibujos con los caracteres ASCII (Código Americano Estándar de Intercamb[...]
Crear una librería swing para java utilizando Netbeans no es nada del otro mundo y la cantidad de código que vayamos a e[...]
Todo producto tecnológico tiene un ciclo de vida, algunos bastante corto otros muy largo, podemos mencionar el software[...]
En este tutorial aprenderemos a crear nuestra propia aplicación java para generar códigos QR. ¿Que es un Código QR? «Un[...]
En este tutorial crearemos el botón de Google+ Google Circles para una interfaz de escritorio 🙂 si no sabes lo que son e[...]
Semanas atrás leí un articulo en el que se pensaba implementar los emojis como contraseñas en los dispositivos con andro[...]