如何实现以下功能:
                 JTable中的单元格内容更改后,如何存入数据库。具体用怎么操作,用到JTable中的哪些类? 
我是新手,JavaAPI 不怎么会看,请大侠们指教,最好能给个例子,不胜感激!

解决方案 »

  1.   

    另外开辟个窗口用于修改的不好吗?我一般都把JTable设置为不可修改。。
      

  2.   

    JTable的数据在一个TableModel中。TableModelListener 监听 TableModel的变化,然后写入数据库。JTable table = ...;
    TableModel tableModel = table.getModel();tableModel.addTableModelListener(new TableModelListener(){
        public void tableChanged(TableModelEvent e){
            // 将变化的内容写入数据库
        }
    });
      

  3.   

    1、获得你选中的单元格所在的行和列,取消他的编辑状态
    int columnId = jTable1.getSelectedColumn();
    int rowId = jTable1.getSelectedRow();
    CellEditor ce = jTable1.getCellEditor(rowId, columnId);
    ce.stopCellEditing();
    2、获得你修改后的值和当前值的列名
    DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
    Object obj = dtm.getValueAt(i, j);
    Sting colName=dtm.getColumnName(j); 
    3、获得该行的数据库表id:
    Object id = dtm.getValueAt(i, 0);//这里id默认为第一列4、执行sql语句更新数据...这个我就不写了,JDBC连数据库六大步
      

  4.   


    在你所说的第一步中,取消它的编辑状态。
    我的原意是要在单元格中直接修改数据后存入数据库。如果取消它的编辑状态,我不就不能直接编辑?如果按照我的原意,那么你所说的在第二步骤中,i,j应该是rowID,columnID的值吧?麻烦再详细解答些,谢谢!
      

  5.   

    JTable是怎么生成的,如果你实现了TableModel这个接口则里面有setValueAt(Object aValue, int rowIndex, int columnIndex),aValue,就是你变化后的值 ,rowIndex,ColumnIndex,是他所在单元格的位置,你把这个函数把这个aValue存入到数据库就可以了
      

  6.   


    一般都是修改完毕后点击一个提交按钮才存入数据库的,如果你每次更改一个字母都存入数据库,效率很低
    而且,JTable在单元格没有取消编辑之前貌似是获得不了修改后的值的
      

  7.   

    这是我原来刚学JDBC时候写的代码,很不规范,思路是点击提交后获得当前页面表格的所有数据,同时去数据库中把数据表中对应条目的数据取出来,逐个空格对照,遇到不同的就生成update语句...还要注意格式...
    思路未必很好,主要是当时设定的是主键id 也可以修改,所以没办法用id来对照而只能逐个对照....
              //这里获得当前编辑的单元格取消其编辑状态
              int columnId = jTable1.getSelectedColumn();
    int rowId = jTable1.getSelectedRow();
    CellEditor ce = jTable1.getCellEditor(rowId, columnId);
    ce.stopCellEditing();
    //获得表格的tableModel,即可获得所有数据
    DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
    //这句话在我代码中的作用是获得表名
    String tablename = (String) selectedNode.getUserObject();
    //更新计数器
    int count = 0;
    //一个新的专门用于 update的statement,不能用原来的是因为用原来的执行更新以后,rs会清空 Statement sta1 = null;
    try {
    rs = sta.executeQuery("select * from " + tablename );
    ResultSetMetaData rsmd = rs.getMetaData();
    sta1 = con.createStatement();
    //逐个单元格对照数据库表内容和Jtable内容
    for (int i = 0; i < tableModel.getRowCount(); i++) {
    boolean update = false;
    for (int j = 0; j < tableModel.getColumnCount(); j++) {
    Object obj1 = tableModel.getValueAt(i, j);
    Object obj2 = dtm.getValueAt(i, j);
    //这些都是逻辑上的麻烦事,数据库取回来的很可能是null,而表格取回来的却是空串,还有包括格式的转换
    if (obj1 == null || obj1.equals("")) {
    obj1 = "null";
    }
    if (obj2 == null || obj2.equals("")) {
    obj2 = "null";
    }
    if (!obj1.equals(obj2)) {
    update = true;
    StringBuffer sb = new StringBuffer();
    int type = rsmd.getColumnType(j + 1);
    if (!obj2.equals("null")) {
    if (type == Types.CHAR || type == Types.VARCHAR) {
    obj2 = "'" + obj2 + "'";
    } else if (type == Types.DATE
    || type == Types.TIMESTAMP
    || type == Types.DATALINK) {
    obj2 = "to_date('" + obj2 + "','yyyy-mm-dd')";
    }
    }
    for (int k = 0; k < tableModel.getColumnCount(); k++) {
    String colunmName = tableModel.getColumnName(k);
    Object value = tableModel.getValueAt(i, k);
    if (value != null) {
    type = rsmd.getColumnType(k + 1);
    if (type == Types.CHAR || type == Types.VARCHAR) {
    sb.append(colunmName + "=" + "'" + value
    + "'");
    } else if (type == Types.DATE
    || type == Types.TIMESTAMP
    || type == Types.DATALINK) {
    sb.append(colunmName + "=" + "to_date('"
    + value.toString().trim()
    + "','yyyy-mm-dd')");
    } else {
    sb.append(colunmName + "=" + value);
    }
    } else {
    sb.append(colunmName + " is null");
    }
    sb.append(" and ");
    }
    sb.delete(sb.length() - 5, sb.length());
    String column = tableModel.getColumnName(j);
    System.out.println("Update " + str + " set " + column
    + "=" + obj2 + " where " + sb.toString());
    sta1.addBatch("Update " + str + " set " + column + "="
    + obj2 + " where " + sb.toString());
    }
    }
    if (update) {
    count++;
    }
    }
    //这部分是处理Jtable中添加的行数的,即table中数据行比数据库中多
    for (int i = tableModel.getRowCount(); i < dtm.getRowCount(); i++) {
    StringBuffer sb = new StringBuffer();
    for (int k = 0; k < dtm.getColumnCount(); k++) {
    Object value = dtm.getValueAt(i, k);
    if (value != null) {
    int type = rsmd.getColumnType(k + 1);
    if (type == Types.CHAR || type == Types.VARCHAR) {
    sb.append("'" + value + "'");
    } else if (type == Types.DATE
    || type == Types.TIMESTAMP
    || type == Types.DATALINK) {
    sb.append("to_date('" + value.toString().trim()
    + "','yyyy-mm-dd')");
    } else {
    sb.append(value);
    }
    } else {
    sb.append("null");
    }
    sb.append(",");
    }
    sb.delete(sb.length() - 1, sb.length());
    System.out.println("insert into " + str + " values ("
    + sb.toString() + ")");
    sta1.addBatch("insert into " + str + " values ("
    + sb.toString() + ")");
    count++;
    }
    sta1.executeBatch();
    if (count != 0) {
    JOptionPane.showMessageDialog(getContentPane(), "提交成功," + count
    + "条记录受影响");
    }
    con.commit();
    refresh();
    } catch (SQLException e) {
    try {
    con.rollback();
    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    e.printStackTrace();
    JOptionPane.showMessageDialog(getContentPane(), e.getMessage(),
    "Error", JOptionPane.ERROR_MESSAGE);
    } finally {
    fitTableColumns(jTable1);
    fitTableColumns(jTable2);
    JDBCTools.close(sta1);
    }