java se:删除JTable中一行记录的问题,在线等
写了一个学生管理系统,删除界面的部分代码如下:if(ae.getSource()==jb4){introwNum=this.jt.getSelectedRow();if(...
写了一个学生管理系统,删除界面的部分代码如下:
if (ae.getSource() == jb4) {
int rowNum = this.jt.getSelectedRow();
if (rowNum == -1) {
JOptionPane.showMessageDialog(this, "请选择一行");
return;
}
String stuId = sm.getValueAt(rowNum, 0).toString();
String sql = "delete from students where id=?";
String params[] = { stuId };
if (!new StuModel().cud(sql, params)) {
JOptionPane.showMessageDialog(this, "删除失败");
}
sm = new StuModel("");
jt.setModel(sm);}
StuModel是一个封装类,里面有函数cud(sql,params)
现在虽然可以做到删除一行记录,但是有一个bug,比方说总共有10行,id分别为1—10,从上往下依次排列;我先删除了id=5这行,这是没有问题的,6—10行的记录都上移了一位。可这时接着删除id=10行时,系统却把id=9行给删了(而删除id=1,2,3,4却没问题)。好像程序是按原来jtable生成的位置来识别的,而不是根据表记录的id号,请问这个问题该如何解决?希望高手指点,谢谢!
请大家说的详细点,因为这个系统是我照着教程敲的。。
seastar同学,能不能把你说的两种方法的代码写下来?(加点注释)谢谢了(刚刚提高了悬赏分)
谢谢各位,我下午出去了一趟,为什么回来以后删除功能就正常了?。。
我再看看。。 展开
if (ae.getSource() == jb4) {
int rowNum = this.jt.getSelectedRow();
if (rowNum == -1) {
JOptionPane.showMessageDialog(this, "请选择一行");
return;
}
String stuId = sm.getValueAt(rowNum, 0).toString();
String sql = "delete from students where id=?";
String params[] = { stuId };
if (!new StuModel().cud(sql, params)) {
JOptionPane.showMessageDialog(this, "删除失败");
}
sm = new StuModel("");
jt.setModel(sm);}
StuModel是一个封装类,里面有函数cud(sql,params)
现在虽然可以做到删除一行记录,但是有一个bug,比方说总共有10行,id分别为1—10,从上往下依次排列;我先删除了id=5这行,这是没有问题的,6—10行的记录都上移了一位。可这时接着删除id=10行时,系统却把id=9行给删了(而删除id=1,2,3,4却没问题)。好像程序是按原来jtable生成的位置来识别的,而不是根据表记录的id号,请问这个问题该如何解决?希望高手指点,谢谢!
请大家说的详细点,因为这个系统是我照着教程敲的。。
seastar同学,能不能把你说的两种方法的代码写下来?(加点注释)谢谢了(刚刚提高了悬赏分)
谢谢各位,我下午出去了一趟,为什么回来以后删除功能就正常了?。。
我再看看。。 展开
3个回答
展开全部
if (ae.getSource() == jb4) {
int rowNum = this.jt.getSelectedRow();
if (rowNum == -1) {
JOptionPane.showMessageDialog(this, "请选择一行");
return;
}
String stuId = jt.getValueAt(rowNum, 0).toString(); //取选择那一行的第一列的对象存入stuId,(原来是sm.getValueAt(rowNum, 0).toString(),但sm应该是table model吧,这里换成jt试试)
String sql = "delete from students where id=?"; //删除数据表的delete语句
String params[] = { stuId }; //删除时的id参数,这个应该也是对的,猜测删除时使用了PreparedStatement
if (!new StuModel().cud(sql, params)) { //这个地方很费解,直接new了一个stuModel,却不保留引用,难道这里是只对数据库做了操作?可以的话,想看看stuModel的代码
JOptionPane.showMessageDialog(this, "删除失败");
}
sm = new StuModel(""); //这里直接替换了原来的table model?从数据库里重新读入数据构建的?最后这几句非常费解,试试这样能不能解决吧
jt.setModel(sm);
}
int rowNum = this.jt.getSelectedRow();
if (rowNum == -1) {
JOptionPane.showMessageDialog(this, "请选择一行");
return;
}
String stuId = jt.getValueAt(rowNum, 0).toString(); //取选择那一行的第一列的对象存入stuId,(原来是sm.getValueAt(rowNum, 0).toString(),但sm应该是table model吧,这里换成jt试试)
String sql = "delete from students where id=?"; //删除数据表的delete语句
String params[] = { stuId }; //删除时的id参数,这个应该也是对的,猜测删除时使用了PreparedStatement
if (!new StuModel().cud(sql, params)) { //这个地方很费解,直接new了一个stuModel,却不保留引用,难道这里是只对数据库做了操作?可以的话,想看看stuModel的代码
JOptionPane.showMessageDialog(this, "删除失败");
}
sm = new StuModel(""); //这里直接替换了原来的table model?从数据库里重新读入数据构建的?最后这几句非常费解,试试这样能不能解决吧
jt.setModel(sm);
}
展开全部
在后面加上
DefaultTableModel model= (DefaultTableModel) jt.getModel();
model.removeRow(rowNum);
model.setRowCount(jt.getRowCount() - 1);
jt.revalidate();
这样你数据库里删掉后,把jtable里的也删掉,这样就同步了,我的程序中就这么做的
DefaultTableModel model= (DefaultTableModel) jt.getModel();
model.removeRow(rowNum);
model.setRowCount(jt.getRowCount() - 1);
jt.revalidate();
这样你数据库里删掉后,把jtable里的也删掉,这样就同步了,我的程序中就这么做的
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO 将在此处添加您的处理代码: int bb = jTable1.getSelectedRow(); DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel(); // Thread thread = new Thread(new TestThread(bb,dtm)); // thread.start(); jTable1.removeEditor();//添加这行。你这个主要原因是删除前没有取消单元格编辑,还导致单元格在哪个编辑状态 SwingUtilities.invokeLater(new TestThread(bb, dtm)); }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询