//AbstractTableModel implementa TableModel y la mayoría de sus métodos
class TModelo extends AbstractTableModel {
private ArrayList lista;
//Cargamos los datos a una lista de POJO's
public TModelo(ResultSet rs) {
try {
rs.first();
do {
POJO pojo = new POJO();
pojo.campo1 = rs.getString(1);
pojo.campo2 = rs.getInteger(2);
pojo.campo3 = rs.getString(3);
lista.add(pojo);
} while(rs.next());
} catch(Exception e) { ; }
}
//Indicar cuantas filas va a tener la tabla
public int getRowCount() { return lista.size(); }
//Indicar cuantas columnas va a tener la tabla. El numero de campos en este caso
public int getColumnCount() { return 3; }
//Objeto en cada celda
public Object getValueAt(int fila, int columna) {
try {
POJO pojo = (POJO) lista.get(fila);
if(columna == 0)
return pojo.campo1;
if(columna == 1)
return new Integer(pojo.campo2);
if(columna == 2)
return pojo.campo3;
} catch(Exception e) {
//Regresamos un valor vacio por si las moscas
return "";
}
}
//nombre de las columnas
public String getColumnName(int col) {
if(columna == 0) return "Campo 1";
if(columna == 1) return "Campo 2";
if(columna == 2) return "Campo 3";
}
//Indicamos si determinada celda es editable
public boolean isCellEditable(int f, int c) {
return false;
}
}
//Una clase POJO muy sencilla
//Esto no deberia hacerse, deberiamos usar geters y seters
class POJO {
public String campo1;
public int campo2;
public String campo3;
}
Una vez que tenemos un TableModel podemos crear una Tabla con los datos que tiene el modelo mismo.
JTable tabla = new JTable(new TModelo(rs));
JFrame fra = new JFrame();
//Si se agrega la tabla de manera directa entonces no se muestran los encabezados
fra.add(new JScrollPane(tabla));
Ahora, un TableModel puede servir para hacer muchas cosas, por ejemplo, podemos filtrar los datos de uno de ellos por medio de otro, a esto se le conoce como Decorator.
class FilterModel extends AbstractModel {
private TableModel original;
private ArrayList pasan = new ArrayList();
public FilterModel(TableModel tm) {
original = tm;
}
//Implementamos un filtro sencillo para un solo campo sobre el modelo anterior
public void filtra(String valor) {
//Quitamos todo
pasan.clear();
//Filtramos cada valor y ponemos los que coinciden con el valor
for(int i = 0; i < original.getRowCount(); i++)
if(("" + original.getValueAt(i, 1)).indexOf(valor) != -1)
pasan.add(new Integer(i));
}
public String getColumnName(int c) { return original.getColumnName(c); }
public int getColumnCount() { return original.getColumnCount(); }
public int getRowCount() { return pasan.size(); }
public Object getValueAt(int f, int c) {
int real = ((Integer) pasan.get(f)).intValue();
return original.getValueAt(real, c);
}
}
Una forma sencilla de hacer las cosas.
Chaito sres...
No hay comentarios:
Publicar un comentario