How to make JTable show refreshed data after updating database?

ぃ、小莉子 提交于 2019-12-24 10:49:24

问题


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:


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.



来源:https://stackoverflow.com/questions/15076301/how-to-make-jtable-show-refreshed-data-after-updating-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!