[Solucionado] JAVA Como Refrescar JTable

Iniciado por MiguelP, 19 Marzo 2014, 17:32 PM

0 Miembros y 1 Visitante están viendo este tema.

MiguelP

Hola amigos buenos días tengo un gran problema al no poder refrescar mi JTable se que hay varios foros vídeos pero por mas que los aplico no me actualiza mi JTable espero puedan ayudarme, les explico un poco tengo en mi clase formulario mi JFrame con todos los controles y aparte mi clase modelo con los modelos que le adjunto al JTable para que de ahi pasen a mi formulario y lo pegue nada mas.Todo estaba bien hasta que ahora que quiero refrescar mi jtable no lo hace le hice seguimiento y llena mi modelo refrescarDatos pero al terminar con todos los datos cargados llega vació a mi jtable me bota el siguiente error : Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

aquí les dejo el código para que tengan una visión mas clara:

aquí lleno mi método de insertar datos y mi modelo para que se actualice al insertar los datos, están en un jdialog se llenan al presionar el botón aceptar:

info.InsertarDatosC(var1,var2,var3,varvalue1,varvalue2,varvalue3,vare1);
try {
DefaultTableModel modelo = new DefaultTableModel();
modelo = mod.refrescarDatos(opt);
table.setModel(modelo);
System.out.println(opt);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


Y este es mi modelo:


public DefaultTableModel refrescarDatos(String variable) throws SQLException {
DefaultTableModel modelotablabd = new DefaultTableModel();

for (String columna : man.LlenarTitulos(variable)) {
modelotablabd.addColumn(columna);
}


Statement sf = conn.getConnection().createStatement();
String cad = "select * from "+variable;
ResultSet rs = sf.executeQuery(cad);
ResultSetMetaData rsMd = rs.getMetaData();
int CantidadColumnas = rsMd.getColumnCount();

Object datos[]=new Object[CantidadColumnas];
try {
while (rs.next()) {
for (int i = 0; i <CantidadColumnas; i++) {
datos[i] = rs.getObject(i + 1);
System.out.println(datos[i]);
// System.out.println("fil : "+datos[i]);
}
modelotablabd.addRow(datos);

}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
return modelotablabd;
}


No se si deba usar algo como un método aparte para actualizarla...si fuera así por favor como debería hacer.
Espero en verdad puedan ayudarme necesito ayuda con urgencia estaré al tanto saludos amigos.

Mitsu

Hola,

Para poder brindar una mejor ayuda, por favor etiqueta tu código entre etiquetas GeSHi y coloca el rastreo de pila que te arroja printStackTrace().

Saludos.

MiguelP

ya lo hice amigo espero me puedas ayudar saludos

Mitsu

#3
Necesito el rastreo completo de pila no solamente el tipo de excepción. En el rastreo de pila te indica la causa, y la posible línea que lanza la excepción. Es muy importante el análisis de excepciones.

El rastreo de pila es parecido a ésto:

Código (=java) [Seleccionar]

    Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3067)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3509)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:286)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at pe.edu.unp.dao.LibroDAOI.guardar(LibroDAOI.java:39)
    at pe.edu.unp.biblioteca.Biblioteca.main(Biblioteca.java:18)
    Caused by: org.postgresql.util.PSQLException: ERROR: column "titul" of relation "libro" does not exist // AQUI LA CAUSA DE LA EXCEPCION!
     Position: 79
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:559)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:363)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
    ... 15 more
    Java Result: 1



PD: Primero tienes que agregar el modelo a la tabla, y a partir de ahí agregar los datos al modelo. Primero agrega un DefaultTableModel a tu tabla, y luego modifica el método refrescarDatos() para que reciba el modelo y le agregue las filas. Puede ser por esto que te lanza el NullPointerException.

MiguelP

Este es el rastro completo de la pila:


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
   at formulario.JDialog.actionPerformed(JDialog.java:170)
   at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
   at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
   at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
   at java.awt.Component.processMouseEvent(Unknown Source)
   at javax.swing.JComponent.processMouseEvent(Unknown Source)
   at java.awt.Component.processEvent(Unknown Source)
   at java.awt.Container.processEvent(Unknown Source)
   at java.awt.Component.dispatchEventImpl(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Window.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$200(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
   at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue$4.run(Unknown Source)
   at java.awt.EventQueue$4.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)


tambien he probado dandole :   table.setModel(form.refrescarDatos(opt));   y me da el mismo error.

Mitsu

Hmm ese log no ayuda en nada. Lo que tienes aquí es un problema de nullabilidad de algún objeto, es decir, algún objeto no ha sido inicalizado y estás tratando de acceder a él. Si tienes un NullPointerException en el catch colócalo y vuelve a probar para ver si te da un rastreo de pila más específico.

MiguelP

era porque no le pasaba mi JTable a mi clase ya se la paso, pero ahora no me muestra nada se queda ahi no me ejecuta mi boton...alguna idea? ayudame porfa

Mitsu

Ya ves, solo es cuestión de saber interpretar las Excepciones (te recomiendo leer sobre esto y sobre debug).

¿Dices que pulsas el botón y no pasa nada? Pega el código que tienes en el actionPerformed de tu botón para poder verlo.

MiguelP

Te explico :

Tengo mi clase formulario donde están ubicados todos mis controles la mayoría, he creado una clase JDialog que es una ventana que al seleccionar un radiobutton  y darle clic en aceptar (En la clase formulario) llamo a la clase JDialog lleno mi método JDialogdinamico le paso las variables y armo mi ventana donde me muestra campos para poder ingresarlos y realizar mi insert, hasta ahi todo bien hace lo que qiero me inserta n la base de datos perfecto, ahora el problema era como refresco mi JTable?pense en ponerle un select llenar mis filas y pasarselas al modelo, se llenan tengo mi objeto con los datos pero me salio el error de que no le pasaba la tabla ahora que se la paso no se muestra mi JDialog.

No se que pueda ser aqui te paso el codigo de mi boton aceptar formulario:

if(e.getSource()==btnAceptarM){
String tip="Alta de ",var="",opcion="",accion="",cod="";
ArrayList camps = new ArrayList();
//RadioButton Altaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
if(rbtAlta.isSelected()){
Ambc jd = new Ambc(tablabd);
if(variable.equals("Cliente")){
System.out.println("\n "+"Hola Cliente");
opcion="Cliente";
var="CLIENTE";
}
else if(variable.equals("Tasas")){
System.out.println("\n "+"Hola Tasas");
opcion="Tasas";
var="TASAS";
}
else if(variable.equals("Area")){
System.out.println("\n "+"Hola Area");
opcion="Area";
var="AREA";
}
jd.JdialogDianamico(var,opcion,tip,camps,accion);
}


Ahi ya llene mi Jdialogdinamico ahora te paso el codigo de mi boton aceptar de mi clase JDialog

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnCancelarC){
this.dispose();
}

if(e.getSource()==btnAceptarC){

String  var1=ListaCaja.get(0).getText(),var2=ListaCaja.get(1).getText(),var3=ListaCaja.get(2).getText();
String  varvalue1=ListaCaja.get(0).getName(),varvalue2=ListaCaja.get(1).getName(),varvalue3=ListaCaja.get(2).getName();


if(ListaCaja.get(0).getText().isEmpty() || ListaCaja.get(1).getText().isEmpty() || ListaCaja.get(2).getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"Se Requiere Llenar todos los Campos","Advertencia",JOptionPane.WARNING_MESSAGE);
}else{
switch(tipo){
case  "Alta de ":
info.InsertarDatosC(var1,var2,var3,varvalue1,varvalue2,varvalue3,vare1);
try {
DefaultTableModel model = new DefaultTableModel();
model = mod.refrescarDatos(opt);
table.setModel(model);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


Espero me puedas ayudar saludos.

Mitsu

Hola, disculpa la demora. La verdad te entiendo poco (quizás soy un poco lerdo para entender xD). Según tengo entendido a partir de un JFrame quieres crear un JDialog para inserción de datos y luego esos datos mostrarlos en una JTable. ¿Estoy bien?

Bien primero debes saber que un JDialog debe tener un padre, que debe ser un JFrame o Frame (AWT). Así que quizás es por eso que no te lo muestra. Te coloco un par de códigos de lo que yo entiendo que quieres hacer:

JFrame:
Código (=java) [Seleccionar]

public class GUI extends JFrame implements ActionListener {

public GUI() {
// tus controles
JButton btnAceptar = new JButton("Aceptar");
btnAceptar.addActionListener(this);
this.add(btnAceptar);

// configuracion del jframe, tamanio, setDefaultCloseOperation(int tipo),y setVisible(true) etc
}

@Override
public void actionPerformed(ActionEvent evt) {
new Dialogo(this,true); // creamos el JDialog e indicamos que este JFrame sera su padre
}

}


JDialog:
Código (=java) [Seleccionar]

public class Dialogo extends JDialog {

public Dialogo(JFrame padre, boolean modal) {
// JDialog necesita un padre, es decir siempre dependera de un JFrame o Frame (AWT)
// aqui puedes usar 'padre' para obtener los valores que se han elegido en el
// formulario (padre) para crer dinamicamente tu JDialog asi como tu quieres
// creamos la tabla, le asignamos un modelo y le agregamos una fila
JButton btnAceptar = new JButton("Insertar");
JTable tblDatos = new JTable();
DefaultTableModel modelo = new DefaultTableModel();
tblDatos.setModel(modelo);
btnAceptar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
try {
agregarFila(modelo);
} catch(SQLException ex) { System.err.println(ex.getMessage()); }
}
});
this.add(btnAceptar);
this.add(tblDatos);
}

public void agregarFila(DefaultTableModel modelo) throws SQLException {

Object[] data = null;
Connection conexion = null;
PreparedStatement estatuto = null;
ResultSetMetadata resultmeta = null;
String sql = "select * from TUTABLA;";

try {
// recuperamos lo que hay en la base de datos
conexion = Conexion.getConnection(); // Conexion es una clase que devuelve una conexion a la DB
estatuto = conexion.preparedStatement();
ResultSet rs = estatuto.executeQuery();
resultmeta = rs.getMetadaData();

int columnas = resultset.getColumnCount();
data = new Object[columnas];

while(rs.next()) {
for(byte i=0; i<columnas; i++) {
data[i] = resultmeta.getObject(i+1);
}
}

modelo.addRow(data);
} catch(SQLException ex) { throw ex; }
finally { if(conexion != null) conexion.close();
}

}
}



Esta sería la forma de a partir de un JFrame crear un JDialog y en éste crear una tabla. Saludos.