1

我已经更新了一个数据库,我想JTable用这个绑定到按钮单击事件的代码来刷新一个,但它不起作用。当我关闭应用程序并再次打开它时,会JTable显示正确的数据。

我是否需要覆盖抽象表上的某些方法?

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

}
4

2 回答 2

1

因为它是(发布的代码)模型不知道数据库中的修改。您可以刷新模型中的数据,例如调用现有init()方法或创建类似的方法。作为替代方案,您可以构建一个新模型并将其重置在桌面上。

模型有责任触发通知,例如fireTableDataChanged您在actionPerformed. 表客户端不应执行这些方法。 fireTableDataChanged例如属于init()方法。有关更多详细信息和示例,请参阅触发数据更改事件

模型应该是关于数据的,所以最好将设置的逻辑textField移出模型。如果需要,您可以从模型中公开其他方法,以帮助客户获取有关数据和状态的更多详细信息。

于 2013-02-26T06:30:03.203 回答
0

尝试了很多东西,但最后这对我有用:

if (model.getRowCount() > 0) {
         for (int i = model.getRowCount() - 1; i > -1; i--) {
             model.removeRow(i);
         }
     }

     setTablevalue();

我从 JTable 中删除了所有行,并再次调用 setTableValue 方法来重新填充表。

于 2015-02-15T23:03:27.733 回答