新手求助! 如何更改Swing-JTable单元格中的内容后,存入数据库 如何实现以下功能: JTable中的单元格内容更改后,如何存入数据库。具体用怎么操作,用到JTable中的哪些类? 我是新手,JavaAPI 不怎么会看,请大侠们指教,最好能给个例子,不胜感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 另外开辟个窗口用于修改的不好吗?我一般都把JTable设置为不可修改。。 JTable的数据在一个TableModel中。TableModelListener 监听 TableModel的变化,然后写入数据库。JTable table = ...;TableModel tableModel = table.getModel();tableModel.addTableModelListener(new TableModelListener(){ public void tableChanged(TableModelEvent e){ // 将变化的内容写入数据库 }}); 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连数据库六大步 在你所说的第一步中,取消它的编辑状态。我的原意是要在单元格中直接修改数据后存入数据库。如果取消它的编辑状态,我不就不能直接编辑?如果按照我的原意,那么你所说的在第二步骤中,i,j应该是rowID,columnID的值吧?麻烦再详细解答些,谢谢! JTable是怎么生成的,如果你实现了TableModel这个接口则里面有setValueAt(Object aValue, int rowIndex, int columnIndex),aValue,就是你变化后的值 ,rowIndex,ColumnIndex,是他所在单元格的位置,你把这个函数把这个aValue存入到数据库就可以了 一般都是修改完毕后点击一个提交按钮才存入数据库的,如果你每次更改一个字母都存入数据库,效率很低而且,JTable在单元格没有取消编辑之前貌似是获得不了修改后的值的 这是我原来刚学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); } java的泛型参数问题 java 获取linux进程信息 关于字符串数组排序的问题 同志们:为什么我的菜单不显示,代码是。。。 Java中的File类 java Socket和apache TelnetClient 为什么内存溢出?? 关于接口的疑问 哥们,谁有Jbuilder 4的注册码,给小弟解围,小弟谢先!!! 关于C/S 项目,求推荐 急 如何将线程里连续得到的值在GUI里显示回来? 请问如何让JToggleButton按下和抬起的时候,显示不同且执行不同的功能呢?
TableModel tableModel = table.getModel();tableModel.addTableModelListener(new TableModelListener(){
public void tableChanged(TableModelEvent e){
// 将变化的内容写入数据库
}
});
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连数据库六大步
在你所说的第一步中,取消它的编辑状态。
我的原意是要在单元格中直接修改数据后存入数据库。如果取消它的编辑状态,我不就不能直接编辑?如果按照我的原意,那么你所说的在第二步骤中,i,j应该是rowID,columnID的值吧?麻烦再详细解答些,谢谢!
一般都是修改完毕后点击一个提交按钮才存入数据库的,如果你每次更改一个字母都存入数据库,效率很低
而且,JTable在单元格没有取消编辑之前貌似是获得不了修改后的值的
思路未必很好,主要是当时设定的是主键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);
}