85 votes

JTable Comment rafraîchir le modèle de la table après l'insertion, la suppression ou la mise à jour des données.

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

Je vais appeler cette méthode pour récupérer les données de la base de données et les mettre dans le 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 rafraîchir le tableau après avoir mis à jour les données du tableau. Je vais d'abord effacer la table

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

et ensuite restructurer le modèle de table à nouveau pour qu'il rafraîchisse la jTable. Mais je me demandais s'il y avait de bonnes pratiques ou une meilleure façon de faire cela ?

113voto

Peter Lang Points 25877

Si vous voulez notifier votre JTable sur les modifications de vos données, utiliser
tableModel.fireTableDataChanged()

Desde el documentation :

Notifie à tous les auditeurs que les valeurs de toutes les cellules des lignes du tableau peuvent avoir changé. Le nombre de lignes peut également avoir changé et le JTable doit redessiner le tableau à partir de zéro. La structure du tableau (comme l'ordre des colonnes) est supposée être la même.

19voto

Daniel De León Points 2842

Le moyen le plus rapide pour votre cas est :

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

La manière optimisée quand une ou quelques cellules changent :

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

7voto

Achille Points 39

Essayez ceci

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();
    /**/
}

2voto

Sumit Singh Points 8601
DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.fireTableDataChanged(); // notifies the JTable that the model has changed

1voto

tom Points 11

Ne serait-il pas préférable d'utiliser java.util.Observable y java.util.Observer qui provoquera la mise à jour de la table ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X