javax.swing.JTable

Es un componente que nos permite mostrar una serie de datos en columnas.

Algunas propiedades importantes de Netbeans son:
  • model: Modelo que usa el componente para mostrar datos.
  • selectionModel: Modo de selección simple o múltiple.

Al pulsar sobre la propiedad model Netbeans nos ofrece un asistente que nos ayuda a la hora de crear tablas.

Lo más fácil es crear nosotros mismos un modelo personalizado extendiendo de AbstractTableModel y establecerlo como modelo de nuestra tabla. Esta tabla tendrá 3 columnas:
  1. Un campo de entrada de texto, por defecto es un JTextField. No hay que hacer nada particular para que aparezca o indicar en el modelo que el tipo de clase es un String.
  2. Un JCheckBox (true/false). Indicando en el modelo que el tipo de clase es un Boolean lo muestra.
  3. Un JComboBox. Hay que indicar en el modelo que el tipo de clase es un JComboBox y al inicializar la tabla establecer en esa columna un TableCellEditor específico. Por suerte es bastante simple. Más adelante se muestra.

Código del Modelo:
/**
 * Clase modelo de tabla.
 */
private class MyTableModel extends AbstractTableModel {

    /**
     * Lista de datos a mostrar en la tabla.
     */
    private List<Trabajador> datos = new ArrayList<>();

    /**
     * Columnas de la tabla.
     */
    private final String[] columnas = {"Nombre", "Activo", "Tipo Trabajo"};

    /**
     * Tipo de clase que contendran las columnas.
     */
    private final Class[] classTypes = new Class[]{
        java.lang.String.class, 
        java.lang.Boolean.class, 
        JComboBox.class
    };

    /**
     * Constructor.
     */
    public MyTableModel() {
    }

    /**
     * Constructor.
     *
     * @param datos lista de datos a mostrar.
     */
    public MyTableModel(List<Trabajador> datos) {
        this.datos = datos;
    }

    /**
     * Número total de filas.
     *
     * @return número de filas.
     */
    @Override
    public int getRowCount() {
        return datos.size();
    }

    /**
     * Número total de columnas.
     *
     * @return
     */
    @Override
    public int getColumnCount() {
        return columnas.length;
    }

    /**
     * Obtener el nombre de una columna según su índice.
     *
     * @param column índice de columna.
     * @return nombre a mostrar en la columna.
     */
    @Override
    public String getColumnName(int column) {
        return columnas[column];
    }

    /**
     * Obtener el tipo de clase de una columna según su índice.
     * 
     * @param columnIndex índice.
     * @return tipo de clase.
     */
    @Override
    public Class getColumnClass(int columnIndex) {
        return classTypes[columnIndex];
    }

    /**
     * Valor a mostrar en una determinada fila, columna.
     *
     * @param rowIndex número de fila.
     * @param columnIndex número de columna.
     * @return Objeto a mostrar en la celda.
     */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Trabajador get = this.datos.get(rowIndex);
            
        switch (columnIndex) {
            case 0:
                return get.getNombre();
            case 1:
                return get.getActivo();
            case 2:
                return get.getTipoTrabajo();
            default:
                return "";
        }
    }

    /**
     * Valor a establecer del usuario en el modelo. Dato obtenido de la UI.
     * 
     * @param aValue valor.
     * @param rowIndex fila.
     * @param columnIndex columna.
     */
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Trabajador get = this.datos.get(rowIndex);
            
        switch (columnIndex) {
            case 0:
                get.setNombre((String)aValue);
                break;
            case 1:
                get.setActivo((Boolean) aValue);
                break;
            case 2:
                get.setTipoTrabajo((TipoTrabajo) aValue);
                break;
        }
    }       

    /**
     * Es una determinada celda editable.
     *
     * @param rowIndex número de fila.
     * @param columnIndex número de columna.
     * @return editable o no.
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    /**
     * Añadir una nueva fila.
     *
     * @param trabajador objeto a añadir.
     */
    public void addObject(Trabajador trabajador) {
        this.datos.add(trabajador);
        // Notificación de una inserción
        fireTableRowsInserted(this.datos.size() - 1, this.datos.size() - 1);
    }

    /**
     * Eliminar la fila indicada.
     *
     * @param rowIndex índice de la fila a eliminar.
     */
    public void removeRow(int rowIndex) {
        this.datos.remove(rowIndex);
        // Notificación de un cambio en la tabla
        fireTableDataChanged();
    }

    /**
     * Obtener los datos de la tabla.
     *
     * @return lista de trabajadores.
     */
    public List<Trabajador> getDataTable() {
        return this.datos;
    }

}


Inicializar la tabla. Establecer nuestro modelo creado e indicar que la columna con índice 2 mostrará un ComboBox con una serie de datos:
MyTableModel myTableModel = new MyTableModel();
this.tabla.setModel(myTableModel);
// En la columna 2 se mostrará un comboBox
TableColumn comboColumn = this.tabla.getColumnModel().getColumn(2);
JComboBox<TipoTrabajo> cb = new JComboBox<>(TipoTrabajo.values());
comboColumn.setCellEditor(new DefaultCellEditor(cb));


Añadir una fila nueva en la tabla:
MyTableModel model = (MyTableModel) this.tabla.getModel();
model.addObject(new Trabajador());


Eliminar la fila seleccionada en la tabla:
int selectedRow = this.tabla.getSelectedRow();
if(selectedRow >= 0){
    MyTableModel model = (MyTableModel) this.tabla.getModel();
    model.removeRow(selectedRow);
}


Clase Trabajador:
public class Trabajador {

    private String nombre;
    private boolean activo;
    private TipoTrabajo tipoTrabajo;

    public Trabajador() {
    }

    public Trabajador(String nombre, Boolean activo, TipoTrabajo tipoTrabajo) {
        this.nombre = nombre;
        this.activo = activo;
        this.tipoTrabajo = tipoTrabajo;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public boolean getActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    public TipoTrabajo getTipoTrabajo() {
        return tipoTrabajo;
    }

    public void setTipoTrabajo(TipoTrabajo tipoTrabajo) {
        this.tipoTrabajo = tipoTrabajo;
    }

}


Enumerado TipoTrabajo:
public enum TipoTrabajo {
    /** Jefe */
    JEFE("Jefe"),
    /** Administrativo */
    ADMINISTRATIVO("Administrativo"),
    /** Segguridad */
    SEGURIDAD("Seguridad"),
    /** Ingeniero */
    INGENIERO("Ingeniero");
    
    /** Valor a guardar */
    private String valor;

    private TipoTrabajo(String valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return valor;
    }
    
}



Código del proyecto.

Más información.

Comentarios

Entradas populares de este blog

Java. Texto de colores en la consola

javax.swing.JList

javax.swing.JPasswordField