jtable在setModel中刷新

时间:2014-01-04 01:30:08

标签: java sql swing jdbc jtable

我正在按照此示例代码创建自己的tableModel类以使用cachedRowSet显示来自db的数据,并在插入行并删除行到cachedRowSet时使用rowSetEvent刷新表。 https://github.com/abissell/jdbctutorial/blob/master/src/com/oracle/tutorial/jdbc/CoffeesTableModel.java

public void rowChanged(RowSetEvent event) {
        try {
            tm.rs.moveToCurrentRow();
            tm = new MyTableModel(tm.rs); // to get right row nums
            table.setModel(tm);
        } catch (SQLException er) {
            er.printStackTrace();
        }
    }

public class MyTableModel extends AbstractTableModel {

CachedRowSet rs;
ResultSetMetaData meta;
int cols, rows;

public MyTableModel(CachedRowSet r) {
    rs = r;
    try {
        meta = rs.getMetaData();
        cols = meta.getColumnCount();
        rs.beforeFirst();
        rows = 0;
        while (rs.next()) {
            rows++;
        }
        rs.beforeFirst();
    } catch(SQLException e) {
        e.printStackTrace();
    }          
}

public void insert(String[] info) {
    try {
        rs.moveToInsertRow();
        for(int i = 0;i < cols;i++) {
            rs.updateString(i+1, info[i]);
        }
        rs.insertRow();
        rs.moveToCurrentRow();
    } catch(SQLException e) {
        e.printStackTrace();
    } 
}

public void delete(int id) {
    try {
        rs.beforeFirst();
        while(rs.next()) {
            if(Integer.parseInt(rs.getString(1))==id) {
                rs.deleteRow();
                break;
            }
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}

@Override
public int getRowCount() {
    return rows;
}

@Override
public int getColumnCount() {
    return cols;
}

@Override
public String getColumnName(int col) {
    try {
        return meta.getColumnLabel(col + 1);
    } catch (SQLException e) {
        return e.toString();
    }
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    return String.class;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    try {
        if (!rs.absolute(rowIndex + 1)) {
            return null;
        }
        rs.absolute(rowIndex + 1);
        Object o = rs.getObject(columnIndex + 1);
        if (o == null) {
            return null;
        } else {
            return o.toString();
        }
    } catch (SQLException e) {
        e.printStackTrace();
        return e.toString();
    }
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}

@Override
public void addTableModelListener(TableModelListener l) {
}

@Override
public void removeTableModelListener(TableModelListener l) {
}

}

con = DriverManager.getConnection(url);
        st = con.prepareStatement("SELECT id,name,sex,age,cell FROM PATIENTS");
        rs = st.executeQuery();
        crs = new CachedRowSetImpl();
        crs.setType(ResultSet.TYPE_SCROLL_SENSITIVE);
        crs.setConcurrency(ResultSet.CONCUR_UPDATABLE);
        crs.populate(rs);

tm是tableModel。 从cachedRowSet中删除一行后,该表将立即刷新,但是当我向cachedRowSet中插入一个新行时,该表不能立即显示新添加的行。我检查了rowChanged()被调用并且行插入了数据库。
甚至尝试每次都重新获取表数据或者repaint()仍然无法正常工作。我无法弄明白为什么。
也许会引起挥杆过程然后它不能立即刷新?我刚打开另一个JFrame来填写数据,然后插入。

另外,如果我直接在模型中使用resultSet怎么办?如果我没有关闭连接,那么当您在数据库中插入行时,表是否会自动更新。或者它只是用于获取初始数据,您必须再次运行查询才能刷新。

谢谢你 =================更新==================
我试图更改表模型以使用ArrayList来存储和更新db结果,然后插入将立即更新表。可能导致cachedRowSet更新变慢? 困惑,不知道为什么。

0 个答案:

没有答案