JTable How to refresh table model after insert delete or update the data.

JavaSwingRefreshJtableTablemodel

Java Problem Overview


This is my 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;
}

I will call this method to retrieve the data from database and put it into table model

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

Currently I was using this method to refresh the table after updating the table data. I will first clear the table

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

and then restructure the table model again so it will refresh the jTable. But I was thinking is there any best practices or better way to do that?

Java Solutions


Solution 1 - Java

If you want to notify your JTable about changes of your data, use
tableModel.fireTableDataChanged()

From the documentation:

> Notifies all listeners that all cell values in the table's rows may have changed. The number of rows may also have changed and the JTable should redraw the table from scratch. The structure of the table (as in the order of the columns) is assumed to be the same.

Solution 2 - Java

The faster way for your case is:

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

The optimized way when one or few cell change:

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

Solution 3 - Java

try this

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

Solution 4 - Java

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

Solution 5 - Java

Would it not be better to use java.util.Observable and java.util.Observer that will cause the table to update?

Solution 6 - Java

I did it like this in my Jtable its autorefreshing after 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 });
    }}

I doubt it will do good with large number of objects like over 500, only other way is to implement TableModelListener in your class, but i did not understand how to use it well. look at http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser236501View Question on Stackoverflow
Solution 1 - JavaPeter LangView Answer on Stackoverflow
Solution 2 - JavaDaniel De LeónView Answer on Stackoverflow
Solution 3 - JavaAchilleView Answer on Stackoverflow
Solution 4 - JavaSumit SinghView Answer on Stackoverflow
Solution 5 - JavatomView Answer on Stackoverflow
Solution 6 - JavankvnkvView Answer on Stackoverflow