Ver Mensaje Individual
  #84 (permalink)  
Antiguo 27/04/2010, 11:47
Avatar de juamd
juamd
 
Fecha de Ingreso: marzo-2009
Ubicación: Bogotá
Mensajes: 285
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: FAQ's de Java

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 rowint 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<StringcolPrestamos = new ArrayList<String>();
        
ArrayList<Stringtemporal = 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(50070));
        
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.