Foros del Web » Programación para mayores de 30 ;) » Java »

Creación de tableModel

Estas en el tema de Creación de tableModel en el foro de Java en Foros del Web. Estoy intentando crear un tableModel a partir de información tomada de una base de datos. Hasta ahora he podido tomar el título de las columnas, ...
  #1 (permalink)  
Antiguo 15/03/2009, 20:44
 
Fecha de Ingreso: octubre-2005
Ubicación: Córdoba, Veracruz
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Creación de tableModel

Estoy intentando crear un tableModel a partir de información tomada de una base de datos.
Hasta ahora he podido tomar el título de las columnas, pero no encuentro cómo hacer el array de Objects[][] para llenar la tabla con los datos.
¿Hay algún método que me diga cuántas filas me ha devuelto un executeQuery?
La única forma que se me ocurre de hacerlo es con:

while (resultado.next()) linea++;

pero me parece una solución algo chapucera.

Código:
    public Probando() {
        Object datos[][]=null;
        String nombreColumnas[];

        initComponents();
        try{
            Class.forName(ControladorJDBC);
            conexion = DriverManager.getConnection(baseDatos);
            instruccion = conexion.createStatement();
            ResultSet resultados = instruccion.executeQuery("select  * from Articulos");
            ResultSetMetaData columnas = resultados.getMetaData();
            int numColumnas = columnas.getColumnCount();
            nombreColumnas = new String[numColumnas];
            for(int i=1; i<=numColumnas; i++)
                nombreColumnas[i-1] = new String(columnas.getColumnName(i));
            // Aquí debería llenar datos, que es un array que se le pasa al TableModel
            jTable1.setModel(new javax.swing.table.DefaultTableModel(datos, nombreColumnas) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Integer.class
            };
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        }
        catch(SQLException excepcionSql){
            System.out.println(excepcionSql);
        }
        catch(ClassNotFoundException claseNoEncontrada){
            System.out.println(claseNoEncontrada);
        }
    }
Es mi primera vez usando Object, así que se aceptan todo tipo de sugerencias.
De antemano gracias por su ayuda.
¡Saludos!
  #2 (permalink)  
Antiguo 15/03/2009, 22:08
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Creación de tableModel

Hola:

Aquí tienes un ejemplo de cómo meter un ResultSet en un JTable.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 16/03/2009, 23:40
 
Fecha de Ingreso: octubre-2005
Ubicación: Córdoba, Veracruz
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Creación de tableModel

Agradezco tu respuesta. Voy a leer el artículo.
¡Saludos!
  #4 (permalink)  
Antiguo 18/03/2009, 01:30
 
Fecha de Ingreso: octubre-2005
Ubicación: Córdoba, Veracruz
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Creación de tableModel

Después de leer el artículo, y leer el tutorial de sun respecto a jTables y TableModel, sigo sin estar muy enterado de este asunto.
Me gustaría crear un TableModel lo más genérico posible, y que me respete el tipo de datos que toma de la base de datos, y según entendí lo mejor que puedo hacer es crear el tableModel desde cero.
Este es el código:
Código:
jTable1.setModel(new javax.swing.table.DefaultTableModel(datos, nombreColumnas) {
       Class tipos[];
       public Class getColumnClass(int columnIndex) {
       return tipos[columnIndex];
       }
});
Ahora ya tengo creado el arreglo de Objects con info de la base de datos, pero me gustaría hacer el array de Class también dinámicamente, así que escribí este código:
Código:
Class tipos[] = new Class[numColumnas];
for(int i=0; i<numColumnas; i++)
      tipos[i] = datos[0][i].getClass();
Para después agregarlo al model de esta manera:
Código:
Class tipos[];
Pero por alguna razón que no alcanzo a comprender me lanza una excepción:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException en la línea de return tipos[columnIndex];
Si alguien pudiera orientarme al respecto se lo agradecería bastante.
¡Saludos!
  #5 (permalink)  
Antiguo 18/03/2009, 12:09
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Creación de tableModel

Hola:

Crearlo desde cero no es la mejor opción siempre, depende de lo que quieras. Tampoco lo estás creando desde cero, ya que usas DefaultTableModel y un la interface TableModel.

No sé si tienes más código, pero en el que muestras, Class tipos[] del table model está totalmente sin inicializar (ni le pones elementos ni lo rellenas), así que es normal que return tipos[columnIndex] devuelva todo tipo de excepciones.

El trozo de código que inicializa y que está en la segunda caja que has puesto, ¿dónde lo has puesto?

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 18/03/2009, 12:52
 
Fecha de Ingreso: octubre-2005
Ubicación: Córdoba, Veracruz
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Creación de tableModel

Tienes razón, no lo estoy creando de cero. Me gustaría crearlo de esta manera porque, según entiendo, así el tableModel sabe mejor cómo tratar los campos (los campos booleanos les pone un checkbox, los enteros los alinea a la derecha, etc).
Este es el trozo de código que puse anoche en orden:

Código:
Class tipos[] = new Class[numColumnas];
for(int i=0; i<numColumnas; i++)
      tipos[i] = datos[0][i].getClass();
      jTable1.setModel(new javax.swing.table.DefaultTableModel(datos, nombreColumnas) {
           Class tipos[];
           public Class getColumnClass(int columnIndex) {
                return tipos[columnIndex];
           }
      });
Y tienes razón, el problema ha de ser que estoy declarando Class tipos[] sin inicializar, pero si sólo pongo tipos netbeans lanza error.
  #7 (permalink)  
Antiguo 19/03/2009, 00:01
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Creación de tableModel

Hola:

Tienes declaradas dos variables tipos, una fuera del DefaultTableModel y otra dentro. La de fuera y la dentro son distintas. Inicializando la de fuera, la de dentro sigue sin estar inizializada y dará error.

Poniendo sólo tipos, no la estás inicializando tampoco, sólo estás haciendo que no sea un array.

Tienes que hacer algo parecido al bucle CON el tipos de DENTRO del DefaultTableModel.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 19/03/2009, 03:07
 
Fecha de Ingreso: octubre-2005
Ubicación: Córdoba, Veracruz
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Creación de tableModel

Sí, supuse que sería eso, así que intenté pasarle tipos al constructor (junto con datos y nombreColumnas) de esta forma:

Código:
jTable1.setModel(new javax.swing.table.DefaultTableModel(datos, nombreColumnas, tipos) {
Pero netbeans me da este error:
Cita:
cannot find symbol
symbol constructor DefaultTableModel(java.lang.Object[][], java.lang.String[], java.lang.Class[])
location javax.swing.table.DefaultTableModel
Así que intenté inicializar tipos dentro de los corchetes del constructor DefaultTableModel:

Código:
jTable1.setModel(new javax.swing.table.DefaultTableModel(datos, nombreColumnas) {
      Class[] tipos = new Class[numColumnas];
      for (int i = 0; i < numColumnas; i++)
            tipos[i] = datos[0][i].getClass();
      public Class getColumnClass(int columnIndex) {
           return tipos[columnIndex];
      }
});
Pero si lo escribo así me lanza errores en las líneas coloreadas:
Rojo:
Cita:
local variable numColumnas is accessed from within inner class; needs to be declared final
Y aún declarándola final me marca error
Cita:
illegal start of type
Azul:
Cita:
Cannot find symbol
symbol: class i
Cannot find symbol
symbol: class numColumnas
> expected
Cannot find symbol
symbol: class i
<identifier> expected
Field hides another field
Verde:
Cita:
Cannot find symbol
Symbol: class tipos;
] expected
; expected
Cannot find symbol
Symbol: class datos;
] expected
Cannot find symbol
symbol: class i
<identifier> expected
invalid method declaration; return type required
Field hides another field
Add @Override Annotation
Y con esto es que me pierdo
Ojalá puedas echarme una mano con esto.
De antemano gracias.
¡Saludos!
  #9 (permalink)  
Antiguo 19/03/2009, 07:37
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Creación de tableModel

Hola:

En el primer caso, no existe un constructor de DefaultTableModel que admita esos parámetros. Si quieres hacerlo así, debes crear dicho constructor.

En el segundo caso, no se puede poner código java fuera de los métodos, así que el for no se puede poner ahí.

Si sabes los tipos de las clases que va a ir dentro y son siempre los mismos, inicializa los tipos así

Código:
jTable1.setModel(new javax.swing.table.DefaultTableModel(datos, nombreColumnas) {
      Class[] tipos = { Boolean.class, Integer.class, String.class, ... };
Por supuesto, pon los tipos que quieras y no estoy seguro de la sintaxis, la he puesto de memoria.

Un pequeño consejo, echa un ojo a un tutorial de java básico, para aprender la sintaxis y ver dónde se puede o no poner código, los constructores de las clases, etc.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #10 (permalink)  
Antiguo 19/03/2009, 09:36
 
Fecha de Ingreso: octubre-2005
Ubicación: Córdoba, Veracruz
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Creación de tableModel

¿Entonces no se puede de esta manera?
Lo dejaré como está por el momento, y cuando tenga más tiempo libre le echo un ojo a AbstractTableModel.
Gracias chuidiang por tu tiempo.
¡Saludos!
  #11 (permalink)  
Antiguo 13/01/2010, 15:53
 
Fecha de Ingreso: enero-2010
Mensajes: 1
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Creación de tableModel

se que es un poco tarde pero servira para otras personas, es un proyecto realizado con netbeans, una mase de datos en mysql en el wamp 5.. he tenido el problema de armar el modelo en una clase y traela a la tabla hecha, pero este es uno de mis primeros pasos para entender como pasan las cosas pasa.... deben tener netbeans para poder visualizar el codigo

import javax.swing.table.DefaultTableModel;
import java.sql.*;
import javax.swing.JOptionPane;

public class listadousuario extends javax.swing.JInternalFrame
{
int ban=0;
public listadousuario() {
initComponents();
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

contenedor = new javax.swing.JScrollPane();
tabla = new javax.swing.JTable();
jButton1 = new javax.swing.JButton();

setClosable(true);

tabla.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {

},
new String [] {
"id", "usuario", "password"
}
) {
boolean[] canEdit = new boolean [] {
false, true, true
};

public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
tabla.getTableHeader().setReorderingAllowed(false) ;
contenedor.setViewportView(tabla);

jButton1.setText("+");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(contenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 404, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.Component Placement.RELATED)
.addComponent(jButton1)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_S IZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.LEADING)
.addComponent(jButton1)
.addComponent(contenedor, javax.swing.GroupLayout.DEFAULT_SIZE, 357, Short.MAX_VALUE))
.addContainerGap())
);

pack();
}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//((DefaultTableModel) this.tabla.getModel()).addRow(new Object[]{null,null,null});
if( ban==0)
{
listadosql();
// ban=ban+1;
}
else
JOptionPane.showMessageDialog(null,"Datos Faltantes \nVerifique el ingreso correcto de informacion","Error Datos",JOptionPane.ERROR_MESSAGE);
}


// Variables declaration - do not modify
private javax.swing.JScrollPane contenedor;
private javax.swing.JButton jButton1;
private javax.swing.JTable tabla;
// End of variables declaration


public void listadosql()
{

try
{

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
Connection conexion = DriverManager.getConnection (
"jdbc:mysql://localhost/doctores","root", "");
Statement s = conexion.createStatement();

// Se realiza la consulta. Los resultados se guardan en el
// ResultSet rs
ResultSet rs = s.executeQuery ("select * from usarios");

// Se recorre el ResultSet, mostrando por pantalla los resultados.
while (rs.next())
{
System.out.println (rs.getInt ("id") + " " + rs.getString (2)+
" " + rs.getString(3));
((DefaultTableModel) this.tabla.getModel()).addRow(new Object[]{rs.getInt(1),rs.getString(2),rs.getString(3)});
}

// Se cierra la conexión con la base de datos.
conexion.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
  #12 (permalink)  
Antiguo 12/10/2010, 10:07
 
Fecha de Ingreso: octubre-2010
Mensajes: 6
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Creación de tableModel

Bueno espero no sea tarde, aqui esta mi solucion a este problema.
Esta es una manera dinamica de crear el tablemodel.
primero intente pasandole un ResultSet como parametro al TableModel y me funciono perfectamente, salvo un problemita. LA CONEXION SIEMPRE DEBIA ESTAR ABIERTA.

asi que realize esto:

1- Creo un TableMoble apartir del AbstractTableModel

Código:
import javax.swing.table.AbstractTableModel;

public class ModeloDeTablas extends AbstractTableModel{

    String[] colName; // arreglo tipo string que contendra los nombres de las colmnas
    Object[][] data;   // matriz tipo objeto que contredra los datos.


    @Override
    public String getColumnName( int c ) {
        return colName[c];

    }
/*************** getColumnCount() ******************/
    public int getColumnCount() {
        return colName.length;

}
/****************** getRowCount() *******************/
    public int getRowCount() {
        return data.length;

    }
/******************* getValueAt() *********************/
    public Object getValueAt( int fila, int col ) {

        return data[fila][col];

    }
    public Class getColumnClass(int fila, int col) {
        return data[fila][col].getClass();

    }
}
luego desde un metodo en otra clase creo una instancia del TableModel anterior

Código:
public ModeloDeTablas getModelo(String query){
       ModeloDeTablas modelo = new ModeloDeTablas();
       Conexion newcon = new Conexion();
       
       newcon.Consultar(query);
       ResultSet rs = newcon.getResultset();



       try {

           int colCount = rs.getMetaData().getColumnCount(); 
           String[] colName = new String[colCount]; //obtenemos la cantidad de columnas

           //obtenemos la cantidad de filas
           int rowCount = 0; 
           while(rs.next()){
               rowCount++;
           }
        
           rs.beforeFirst();//colocamos el puntero antes del primer registro para poder recorrerlo nuevamente
           
           Object[][] data = new Object[rowCount][colCount];

           //obtenemos el nombre de cada colunma
           for(int col=0;col<colCount;col++){
               colName[col]= rs.getMetaData().getColumnLabel(col+1);
           }
               rs.beforeFirst();

           //obtencion de datos
           int row=0;
           while(rs.next()){
               for(int col=0;col<colCount;col++){
                   data[row][col]= rs.getObject(col+1);
               }
               row++;
           }

           modelo.colName = colName;
           modelo.data = data;

       } catch (SQLException ex) {
            Logger.getLogger(MostrarDatos.class.getName()).log(Level.SEVERE, null, ex);
        }
       newcon.desconectar();      
       return modelo;
    }
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:14.