JTable Cómo renovar el modelo de tabla después de insertar eliminar o actualizar los datos.

Esta es mi jtable

private JTable getJTable() { String[] colName = { "Name", "Email", "Contact No. 1", "Contact No. 2", "Group", "" }; if (jTable == null) { jTable = new JTable() { public boolean isCellEditable(int nRow, int nCol) { return false; } }; } DefaultTableModel contactTableModel = (DefaultTableModel) jTable .getModel(); contactTableModel.setColumnIdentifiers(colName); jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); return jTable; } 

Llamaré a este método para recuperar los datos de la base de datos y ponerlos en el modelo de tabla

 public void setUpTableData() { DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); ArrayList list = new ArrayList(); if (!con.equals("")) list = sql.getContactListsByGroup(con); else list = sql.getContactLists(); for (int i = 0; i < list.size(); i++) { String[] data = new String[7]; data[0] = list.get(i).getName(); data[1] = list.get(i).getEmail(); data[2] = list.get(i).getPhone1(); data[3] = list.get(i).getPhone2(); data[4] = list.get(i).getGroup(); data[5] = list.get(i).getId(); tableModel.addRow(data); } jTable.setModel(tableModel); } 

Actualmente estaba usando este método para actualizar la tabla después de actualizar los datos de la tabla. Primero limpiaré la mesa

 DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); tableModel.setRowCount(0); 

y luego reestructurar el modelo de tabla de nuevo para que actualice la tabla jTable. Pero estaba pensando ¿hay mejores prácticas o una mejor manera de hacerlo?

Si desea notificar a su JTable sobre cambios en sus datos, use
tableModel.fireTableDataChanged()

De la documentación :

Notifica a todos los oyentes que todos los valores de celda en las filas de la tabla pueden haber cambiado. El número de filas también puede haber cambiado y JTable debe volver a dibujar la tabla desde cero. La estructura de la tabla (como en el orden de las columnas) se supone que es la misma.

La forma más rápida para su caso es:

  jTable.repaint(); // Repaint all the component (all Cells). 

La forma optimizada cuando uno o pocos cambios celulares:

  ((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell. 

prueba esto

 public void setUpTableData() { DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); /** * additional code. **/ tableModel.setRowCount(0); /**/ ArrayList list = new ArrayList(); if (!con.equals("")) list = sql.getContactListsByGroup(con); else list = sql.getContactLists(); for (int i = 0; i < list.size(); i++) { String[] data = new String[7]; data[0] = list.get(i).getName(); data[1] = list.get(i).getEmail(); data[2] = list.get(i).getPhone1(); data[3] = list.get(i).getPhone2(); data[4] = list.get(i).getGroup(); data[5] = list.get(i).getId(); tableModel.addRow(data); } jTable.setModel(tableModel); /** * additional code. **/ tableModel.fireTableDataChanged(); /**/ } 
 DefaultTableModel dm = (DefaultTableModel)table.getModel(); dm.fireTableDataChanged(); // notifies the JTable that the model has changed 

¿No sería mejor usar java.util.Observable y java.util.Observer que harán que la tabla se actualice?

Lo hice así en mi Jtable es autorefrescante después de 300 ms;

 DefaultTableModel tableModel = new DefaultTableModel(){ public boolean isCellEditable(int nRow, int nCol) { return false; } }; JTable table = new JTable(); Timer t = new Timer(300, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addColumns(); remakeData(set); table.setModel(model); } }); t.start(); private void addColumns() { model.setColumnCount(0); model.addColumn("NAME"); model.addColumn("EMAIL");} private void remakeData(CollectionType< Objects > name) { model.setRowCount(0); for (CollectionType Objects : name){ String n = Object.getName(); String e = Object.getEmail(); model.insertRow(model.getRowCount(),new Object[] { n,e }); }} 

Dudo que vaya a funcionar con una gran cantidad de objetos como más de 500, solo que otra forma es implementar TableModelListener en su clase, pero no entendí cómo usarlo bien. mira http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange