How to make JTable show refreshed data after updat

2019-08-07 01:49发布

问题:

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

}

回答1:

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.



回答2:

This link contains a similar discussion that might be just what you are looking for. The answer of user "nkvnkv" has an interesting concept.

Cheers.



回答3:

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.