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