webentwicklung-frage-antwort-db.com.de

JTable So aktualisieren Sie das Tabellenmodell nach dem Einfügen, löschen oder aktualisieren Sie die Daten.

Das ist mein 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;
}

Ich werde diese Methode aufrufen, um die Daten aus der Datenbank abzurufen und in das Tabellenmodell zu übernehmen

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

Derzeit habe ich diese Methode verwendet, um die Tabelle nach dem Aktualisieren der Tabellendaten zu aktualisieren. Ich werde zuerst den Tisch abräumen

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

und restrukturieren Sie dann das Tabellenmodell erneut, damit die jTable aktualisiert wird. Aber ich dachte, gibt es Best Practices oder einen besseren Weg, das zu tun?

85
user236501

Wenn Sie Ihr JTable über Änderungen Ihrer Daten informieren möchten, verwenden Sie
tableModel.fireTableDataChanged()

Aus der Dokumentation :

Benachrichtigt alle Listener, dass sich möglicherweise alle Zellenwerte in den Tabellenzeilen geändert haben. Möglicherweise hat sich auch die Anzahl der Zeilen geändert, und die JTable sollte die Tabelle von Grund auf neu zeichnen. Die Struktur der Tabelle (wie in der Reihenfolge der Spalten) wird als gleich angenommen.

112
Peter Lang

Der schnellste Weg für Ihren Fall ist:

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

Der optimierte Weg, wenn eine oder wenige Zellen wechseln:

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

versuche dies

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

Wäre es nicht besser, Java.util.Observable und Java.util.Observer, wodurch die Tabelle aktualisiert wird?

1
tom