JTable Comment actualiser le modèle de table après l’insertion supprimer ou mettre à jour les données.

Ceci est ma jTable

private JTable getJTable() { Ssortingng[] 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; } 

Je vais appeler cette méthode pour récupérer les données de la firebase database et les mettre dans un modèle de table

 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); } 

Actuellement, j’utilisais cette méthode pour actualiser la table après la mise à jour des données de la table. Je vais d’abord effacer la table

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

puis restructurer à nouveau le modèle de table pour qu’il actualise la table jTable. Mais je pensais qu’il y avait des meilleures pratiques ou une meilleure façon de le faire?

Si vous souhaitez informer votre JTable des modifications de vos données, utilisez
tableModel.fireTableDataChanged()

De la documentation :

Avertit tous les auditeurs que toutes les valeurs de cellule des lignes de la table peuvent avoir changé. Le nombre de lignes peut également avoir changé et JTable doit redessiner la table à partir de zéro. La structure de la table (comme dans l’ordre des colonnes) est supposée être la même.

Le moyen le plus rapide pour votre cas est:

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

Le moyen optimisé quand une ou plusieurs cellules changent:

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

essaye ça

 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 

Ne serait-il pas préférable d’utiliser java.util.Observable et java.util.Observer que la table se mette à jour?

Je l’ai fait comme ça dans mon Jtable, son rafraîchissement automatique après 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){ Ssortingng n = Object.getName(); Ssortingng e = Object.getEmail(); model.insertRow(model.getRowCount(),new Object[] { n,e }); }} 

Je doute que cela fasse du bien avec un grand nombre d’objects comme plus de 500, seule une autre manière consiste à implémenter TableModelListener dans votre classe, mais je n’ai pas compris comment bien l’utiliser. regardez http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange