Reputation: 11
I have updated a database and I would like to refresh a JTable
with this code tied to a button click event, but it doesn't work. When I close aplication and open it again JTable
shows the right data.
Do I need to override some method on my abstract table?
try {
model=new MyTableModel(this.database);
table = new JTable(model);
} catch (SQLException e) {
e.printStackTrace();
}
scrollPane = new JScrollPane(table);
refresh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
((MyTableModel)table.getModel()).fireTableDataChanged();
}
});
class MyTableModel extends AbstractTableModel {
private int i;
private String[] columnNames = { "ID", "Code", "Country", "Radio",
"primljeno", "select" };
private Object[][] data = { { new Integer(0), "", "", "", "",
new Boolean(false) } };
public MyTableModel(My_class_Database database)throws SQLException {
init(database);
}
public void init(My_class_Database database) throws SQLException
{
this.i = database.checkIsDataThere();
Object[][] object;
if (i == 0) {
object = new Object[i][7];
object = database.getDatafromDatabase(this.i);
this.data = object;
dataAp = object;
} else {
object = database.getDatafromDatabase(this.i);
textField.setText("No data in database");
}
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public String getColumnName(int col) {
return columnNames[col];
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
// problem sa null vrijednostima,null exception
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col > 4) {
return true;
} else
return (false);
}
}
Upvotes: 1
Views: 11579
Reputation: 95
Tried many things but finally this worked for me:
if (model.getRowCount() > 0) {
for (int i = model.getRowCount() - 1; i > -1; i--) {
model.removeRow(i);
}
}
setTablevalue();
I removed all the rows from the JTable and again called the setTableValue method to re-populate the table.
Upvotes: 0
Reputation: 21243
As it is (posted code) the model is not aware of the modification in the database. You could either refresh the data in the model, such as calling existing init()
method or creating a similar one. As an alternative, you can build a new model and reset it on the table.
It is the responsibility of the model to fire notifications such as fireTableDataChanged
that you use in actionPerformed
. Table clients should not execute these methods. fireTableDataChanged
belongs to init()
method for example. See Firing Data Change Events for more details and examples.
The model should be about data, so it is best if you move the logic of setting textField
out of the model. If needed you can expose additional methods from the model to help clients get additional details about data and state.
Upvotes: 1