javax.swing.JTable
Es un componente que nos permite mostrar una serie de datos en columnas.
Algunas propiedades importantes de Netbeans son:
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:
Código del Modelo:
Inicializar la tabla. Establecer nuestro modelo creado e indicar que la columna con índice 2 mostrará un ComboBox con una serie de datos:
Añadir una fila nueva en la tabla:
Eliminar la fila seleccionada en la tabla:
Clase Trabajador:
Enumerado TipoTrabajo:
Código del proyecto.
Más información.
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:
- 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.
- Un JCheckBox (true/false). Indicando en el modelo que el tipo de clase es un Boolean lo muestra.
- 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
Publicar un comentario