Tema : JTable y DefaultTableModel
Pregunta : Como llenar un jtable con un modelo propio.
Respuesta :
Gracias a varios compañeros foristas pude resolver un problema que me molestó unas dos semanas, no encontré la solución aca y por eso queria regresar algo de la inmensa ayuda que este foro me ha brindado. El codigo es una mezcla de los ejemplos de sun y de chuidiang.
En este ejemplo voy a crear una tabla con 5 columnas de las cuales las 4 primeras tendran datos y la ultima tendra un checkbox que permita seleccionar una de las filas.
Para crear el modelo personalizado se crea una clase que extienda de la clase DefaultTableModel y se sobreescriben algunos metodos de esta:
Código PHP:
class MyTableModel extends DefaultTableModel {
private String[] columnNames = {"Id",
"Nombre",
"Valor",
"Fecha solicitud",
" "}; //la ultima columna la dejo en blanco porque no quiero que tenga un encabezado.
private Object[] data; //data almacenara los datos que tendra la tabla.
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
/*Este metodo me dice que si la columna es la numero 4 (van de 0 a 4) me
retorne un objeto boolean, el jtable este tipo de datos los pinta como
checkbox, de lo contrario me retorne un object */
public Class getColumnClass(int columna) {
if (columna == 4) return Boolean.class;
return Object.class;
}
/* Le indico que solo la columna 4 se puede editar */
@Override
public boolean isCellEditable(int row, int col) {
if (col < 4) {
return false;
} else {
return true;
}
}
}
En la clase anterior se han sobreescrito los metodos basicos para ingresar datos en el modelo.
Luego debo instanciar esa clase para ingresar los datos al jtable, lo cual hago de la siguiente manera:
Código PHP:
public class TableDemo extends JPanel {
public TableDemo() {
/* creo una instancia de la clase que hereda de DefaultTableModel para
definir mi modelo*/
MyTableModel modelo = new MyTableModel();
/*Creo una tabla y le paso en el constructor el modelo de datos */
JTable table = new JTable(modelo);
/* Este es manejo propio de mi aplicacion. Donde esta esta definida en tres
capas y cada capa retorna mensaje a las superiores, estos datos se
retornar en arraylist */
Prestamo prestamo = new Prestamo();
ArrayList<String> colPrestamos = new ArrayList<String>();
ArrayList<String> temporal = new ArrayList<String>();
colPrestamos = prestamo.getOperacionesEmpleado(cedula);
int i;
for(i=0;i<colPrestamos.size();i++){
if(!colPrestamos.get(i).equals("-")){
temporal.add(colPrestamos.get(i));
}else{
/* Cada que voy a ingresar datos en mi modelo declaro un objeto fila a
este objeto le indico que debe tener en cada una de sus posicion y
por ultimo lo agrego con modelo.addRow(fila) */
Object [] fila = new Object[5];
fila[0] = temporal.get(0);
fila[1] = temporal.get(1);
fila[2] = temporal.get(2);
fila[3] = temporal.get(3);
fila[4] = new Boolean(false);
modelo.addRow(fila);
temporal.clear();
}
}
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
add(scrollPane);
}
}
Tal y como esta en el ejemplo de sun la aplicación se puede mostrar asi:
Código PHP:
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableDemo newContentPane = new TableDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
Este metodo se ejecuta desde donde queremos cargar el listado.
Espero que sea de ayuda, cualquier critica constructiva o sugerencia sera muy bien aceptada, pues apenas inicio mi camino en java y me gusta mucho aprender de quienes ya llevan tiempo en el.
Saludos.