Uso básico de elementos Swing con NetBeans – 32 – Uso de JTable, agregar y eliminar elementos de tabla.

Trabajando con JTable en Java

Las tablas son uno de los elementos más utilizados dentro de cualquier lenguaje de programación, se puede utilizar para desplegar lista de datos similares ordenados de una forma específica. Su uso es bastante amplio pues es bastante versátil. En este ejemplo utilizaremos la tabla para mostrar datos ingresados por el usuario. Con esto podremos ver como se agregan y eliminan filas de una tabla. Como agregado veremos cómo agregar un JCheckBox a la tabla utilizando CellEditor y CellRenderer.

La tabla se puede manipular en modo diseño, se especifican los nombres y cantidad de columnas haciendo clic derecho sobre la tabla y accediendo a “Contenidos de tabla (Table Contents)”. Para el combo agregamos “Sí” y “No” en modo diseño desde la propiedad del objeto y en el apartado “model”. Agregar icono para los botones es opcional.

Tomar en cuenta los nombres de variable de cada objeto, se especifican los nombres en el diseño. Esto es muy importante ya que desde los métodos se utilizan estos nombres para referencia a cada objeto. Se puede cambiar el “Nombre de variable” de cada objeto haciendo clic derecho sobre la misma y clic en “Cambiar nombre de variable…”. (clic sobre la imagen para ampliar)

Lista de importaciones que necesitamos para trabajar con ciertos objetos. Además los métodos llamados desde el constructor del JFrame y las variables de clase.

Código Java
package com.swing.basic;//Paquete

import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComponent;//Importaciones
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

/**
*
* @author Ariel
*/

public class UsoJTable extends javax.swing.JFrame {

/**
* Creates new form UsoJTable
*/

public UsoJTable() {
initComponents();
setLocationRelativeTo(null);//Centrar formulario
inicio();//Método de inicio
}
private DefaultTableModel model;//Modelo para tabla
private int sel;//Variable para obtener fila seleccionada de tabla.

Para el ejemplo utilizamos varios métodos que cumplen funciones específicas. El nombre que le damos a cada método nos da una idea de que función cumple. El método “inicio()” por ejemplo arranca desde el constructor del JFrame y nos permite inicializar algunas propiedades de la tabla. Se agregan comentarios para indicar la funciona de cada línea de código.

Código Java
    private void inicio(){ 
//Método para configurar el DefaultTableModel de la tabla.
//Especificamos el tamaño de cada columna
jTb.getColumnModel().getColumn(0).setPreferredWidth(100);
jTb.getColumnModel().getColumn(1).setPreferredWidth(100);
jTb.getColumnModel().getColumn(2).setPreferredWidth(50);
jTb.getColumnModel().getColumn(3).setPreferredWidth(100);
jTb.getColumnModel().getColumn(4).setPreferredWidth(100);
//Indicamos el DefaultTableModel de nuestra tabla
model = (DefaultTableModel) jTb.getModel();
//Indicamos el número de filas
model.setNumRows(0);
}

//Método para agregar datos a la tabla.
private void agregar(){
//También mostramos como agregar un JCheckBox a la tabla
JCheckBox check = new JCheckBox();
//Comprobamos que los campos de datos no esten vacíos
if(!nombre.getText().isEmpty() || !apellido.getText().isEmpty() ||
!edad.getText().isEmpty() || !profesion.getText().isEmpty()){
//Utilizamos un boolean para obtener el valor del combo.
boolean rp = casado.getSelectedItem().toString().equals("Sí");
//Utilizamos try para la controlar posibles errores de conversión.
try {
//Convertimos en entero lo obtenido del campo edad.
int edd = Integer.parseInt(edad.getText());
//agregamos los datos a la tabla utilizando Object[]
model.addRow(new Object[]{
nombre.getText(),apellido.getText(),edd, profesion.getText(),rp
});
limpiar();
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Edad debe ser numérico");
}

}
//Agregamos el JCheckBox utilizando CellEditor y la clase CellRenderer creado más abajo
jTb.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(check));
jTb.getColumnModel().getColumn(4).setCellRenderer(new Render_CheckBox());
}
//Método para obtener la fila seleccionada de la tabla
private void seleccion(){
if(jTb.getRowCount() > 0 ){
sel = jTb.getSelectedRow();
}
}
//Método para obtener la fila seleccionada de la tabla.
private void eliminar(){
if(sel >= 0){
model.removeRow(sel);
sel = -1;
}
else{
JOptionPane.showMessageDialog(null, "Selecciona una fila.");
}
}

//Método para limpiar campos después de agregar los datos a la tabla
private void limpiar(){
nombre.setText(null);
apellido.setText(null);
edad.setText(null);
profesion.setText(null);
casado.setSelectedIndex(-1);
}
//Clase para manejar el TableCellRenderer, que permitirá mostrar el JCheckBox
class Render_CheckBox extends JCheckBox implements TableCellRenderer {
//
private final JComponent component = new JCheckBox();

/** Constructor de clase */
public Render_CheckBox() {
setOpaque(true);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
//Color de fondo de la celda
( (JCheckBox) component).setBackground( new Color(98,138,183) );
//obtiene valor boolean y coloca valor en el JCheckBox
boolean b = ((Boolean) value).booleanValue();
( (JCheckBox) component).setSelected( b );
return ( (JCheckBox) component);
}
}

Para el ejemplo utilizamos dos tipos de evento, “ActionPerformed” para los botones y “MouseClicked” para la tabla. Abajo la lista de eventos. Obs.: En las primeras guías de esta serie vimos cómo se agregan eventos a objetos en modo diseño.

Código Java
    private void agregarActionPerformed(java.awt.event.ActionEvent evt) {                                        
agregar();
}

private void eliminarActionPerformed(java.awt.event.ActionEvent evt) {
eliminar();
}

private void jTbMouseClicked(java.awt.event.MouseEvent evt) {
seleccion();
}

Llegado a este punto podremos ejecutar y probar nuestro formulario. (Por si hay alguna duda en el proceso, debemos hacer clic derecho sobre nuestro archivo fuente y presionar “ejecutar archivo” ya que nuestro proyecto no tiene una clase principal definida) (clic sobre la imagen para ampliar)

10 comentarios :

  1. No tienes el codigo fuente de estos ejemplos ?

    ResponderEliminar
    Respuestas
    1. Que tal, estan arriba bien descritos, son las funciones y métodos.

      Eliminar
  2. Amigo, quisiera saber cómo puedo tomar varias celdas y unirlas para que sea un sólo campo ("Estados", por ejemplo y debajo de este, todos los estados). Algo así como en excel al combinar dos o más celdas. ¿Se puede con JTable

    ResponderEliminar
    Respuestas
    1. Las tablas en java, hasta donde se, no pueden manejarse como en Excel. Saludos.

      Eliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Hola amigo, puse tu código tal cual, pero me arroja el siguiente error:

    <>run:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
    at java.util.Vector.elementAt(Vector.java:474)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
    at fp_17031407.UsoJTable.inicio(UsoJTable.java:37)
    at fp_17031407.UsoJTable.(UsoJTable.java:25)
    at fp_17031407.UsoJTable$2.run(UsoJTable.java:319)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)<>

    Me podrías indicar cual puede ser la falla por favor?

    Saludos!

    ResponderEliminar
    Respuestas
    1. Que tal. "ArrayIndexOutOfBoundsException" según puedo entenden indica que tu tabla no contiene la cantidad de columnas necesarias, "DefaultTableColumnModel", podrias verificar esa parte. Saludos.

      Eliminar
  5. hola amigo disculpa podias poner el programa para poderlo descargar

    ResponderEliminar