web-dev-qa-db-fra.com

JTable Comment actualiser le modèle de table après l’insertion, la suppression ou la mise à jour des données.

Ceci est mon tableau

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

J'appellerai cette méthode pour récupérer les données de la base de données et les mettre dans un modèle de table

public void setUpTableData() {
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();
    ArrayList<Contact> list = new ArrayList<Contact>();
    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 débarrasser la table

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

puis restructurez à nouveau le modèle de table pour qu'il actualise le jTable. Mais je pensais y at-il des meilleures pratiques ou une meilleure façon de le faire?

85
user236501

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

De la documentation :

Avertit tous les écouteurs que toutes les valeurs de cellule dans les lignes de la table peuvent avoir été modifiées. Le nombre de lignes peut également avoir changé et le 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.

112
Peter Lang

Le moyen le plus rapide pour votre cas est:

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

La manière optimisée de changer une ou plusieurs cellules:

    ((AbstractTableModel) jTable.getModel()).fireTableCellUpdated(x, 0); // Repaint one cell.
19
Daniel De León

essaye ça

public void setUpTableData() {
    DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel();

    /**
    * additional code.
    **/
    tableModel.setRowCount(0);
    /**/
    ArrayList<Contact> list = new ArrayList<Contact>();
    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();
    /**/
}
7
Achille
DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.fireTableDataChanged(); // notifies the JTable that the model has changed
2
Sumit Singh

Ne serait-il pas préférable d'utiliser Java.util.Observable et Java.util.Observer pour provoquer la mise à jour du tableau?

1
tom