☆◆◆☆ 如何直接在jTable中添加,修改数据并操作在数据库中??

时间:2021-06-11 17:30:39
我用表格显示出了数据库中某表的信息
窗口中只包含一张表和两个按钮,一个‘添加’,一个‘删除’
实现了‘添加’按钮可添加一空行,和‘删除’按钮 删除指定行。
我现在如何在添加的空行中直接添加数据并保存在数据库中呢?如何修改指定表格中的数据呢?

不知道事件该如何处理似的。。。。。
(代码如下,哪位大侠能否详细指点指点,不胜感谢!)
public class ZhangHuSheZhiJFrame extends javax.swing.JFrame {
    public ZhangHuSheZhiJFrame() {
        initComponents();
        setLocationRelativeTo(null); //增加这一句,使窗口居中
    }
    
.....

private void jButtonDelActionPerformed(java.awt.event.ActionEvent evt) {
    //获取表格当前模型
    DefaultTableModel myModel=((DefaultTableModel)jTableZhangHu.getModel());    
    int rowNum=myModel.getRowCount();//获取表格行数
    int nowColNum=jTableZhangHu.getSelectedColumn();
    int nowRowNum=jTableZhangHu.getSelectedRow();
    System.out.println("行="+nowRowNum+"  "+"列="+nowColNum);
    if(rowNum>0){
        if(jTableZhangHu.getSelectedRow()!=-1){
            
            //先从数据库删除数据
             String ss=(String)jTableZhangHu.getValueAt(nowRowNum, 0);
            String del_sql="delete zhangHu where ZhangHuName='"+ss.trim()+"'";
            Connection con=DBConnection.getConnection();
            ResultSet rs = null;
            try
            {
                PreparedStatement pstmt=con.prepareStatement(del_sql);
                pstmt.executeUpdate(); 
            }
            catch(Exception e)
            {
                    JOptionPane.showMessageDialog(null, "删除行失败!", "提示", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            }           
            //然后从表格删除数据
        myModel.removeRow(nowRowNum);//删除指定行
        }else{
             JOptionPane.showMessageDialog(null, "请选定要删除行! ", "提示", JOptionPane.ERROR_MESSAGE);
        }                                                                                                                                            
    }
}

private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel myModel=((DefaultTableModel)jTableZhangHu.getModel());
    Vector newRow=new Vector();//创建一个用来存储新添加行内容的Vector
    int columnNum=myModel.getColumnCount();//获取表格的列数
    for(int i=0;i<columnNum;i++){
        newRow.add("");//将新行内容设置为空
    }
    myModel.getDataVector().add(newRow);
    ((DefaultTableModel)jTableZhangHu.getModel()).fireTableStructureChanged();
}

    public DefaultTableModel initialTableModel(){ 
             Vector title=new Vector();
             title.add("账户名称");
             title.add("账号");
             title.add("余额");
             title.add("开户人");
             title.add("说明");
             Vector content=new Vector();
             int column=0;
                 try
 {
Connection con=DBConnection.getConnection();
                Statement stat=con.createStatement();
        ResultSet rs=stat.executeQuery("select * from zhangHu");
                        
                        while(rs.next()){
                             Vector rowsContent=new Vector();
                             rowsContent.add(rs.getString(1));
                             rowsContent.add(rs.getString(2));
                             rowsContent.add(rs.getFloat(3));
                             rowsContent.add(rs.getString(4));
                             rowsContent.add(rs.getString(5));
                             content.add(rowsContent);
                        }
                        con.close(); //关闭连接
                            rs.close();    //关闭查询
                 }catch(Exception e){
                     e.printStackTrace();
                 }

         DefaultTableModel myDefaultTableModel=new DefaultTableModel(content,title);
         return myDefaultTableModel;
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ZhangHuSheZhiJFrame().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButtonAdd;
    private javax.swing.JButton jButtonDel;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTableZhangHu;
}

10 个解决方案

#1


也有可能先添加了好多个空行,然后再添加了某一行数据,这个事件该怎么处理呢,怎么搞的没头绪似的,急求大侠帮忙!!!

#2


如何获取每个添加的数据,并放进Vector呢?

#3


怎么没人帮忙指点一下,是不是太简单了,还是给的分不够,下次多加点分给你们
求各位高手帮个忙吧

#4


给你个思路.如果某一行的数据是从数据库中读取出来的.那么它会多一个字段显示(界面多一列有值).如果是新添加的话,界面上的这一列就会没有值.比如说数据库里的主键.还没有添加的数据是没有主键的.可以按这个思路去做.每一行一行的读,判断一个那个列(主要列)里有没有值.没有值就再取其它的列的值出来,并存到数据库中去.个人建议写一个封装类.就是封装一条数据库的类

public class 帐户类名
{
private String 帐户名称;
private String 帐号;
...
....

对应的get/set方法.

}

得到所有的行
for()
{
得到一行
if(主键列没有值)
{

   创建一个"帐户类名"对像
   取下一列的值放到这个对像中
  ....
  ....
 把对像放到vector里去(现在可以用ArrayList);  
}
}

返回这个vector



保存的方法(Vector  v)
{
遍历这个V.
取得里边的"帐户类名"对像.

使用JDBC把对像里边的属性值保存到数据库中

}




没怎么做SWING说得不好别介意

#5


关注

#6


没太明白....

#7


这是一个非常复杂的问题,我研究了很长一段时间了,由于公司内部代码保密性,我只能给你思路和一部分代码,自己去实现,做这个东东要考虑很多问题的.
1,我们应该让整个表格不能编辑,如果需要编辑了,点一个按钮命令,调用
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
if(toolBarStatus)   //这里的toolBarStatus既控制了是否表格处于编辑状态
return colWritable == null ? false : (columnIndex == 0 ? true : (isAdd?true:colWritable[columnIndex - 1]));
else 
return false;
}
2,既然表格处于了编辑状态,那么就要锁定这一行,如果用户不小心选择了其它行就要弹出相应的提示:
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == 1) {    //鼠标单击左键
if(lockedRow==-1 || lockedRow==getSelectedRow()){
for (int i = 0; i < value.size(); i++) {
value.get(i).setSelected(false);
}
}else{
         final int i=new CpoysyDialog("数据未保存,您确认保存吗?\n点击\"是\"保存,点击\"否\"不保存,点击\"取消\"回到所编辑的行.").openConfirmOkNoCancel();
if(i==0){
_toolBarSaveAction();   //执行保存的命令
}else if(i==1){
_toolBarCancelAction();//执行不保存的命令
}else{
                setRowSelectionInterval(lockedRow, lockedRow);//执行取消的命令,既选中到原来被锁定的行

                return;        }
}

}
}

@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == 1) {
int myRow[] = getSelectedRows();
for (int i = 0; i < myRow.length; i++) {
setValueAt(true, myRow[i], 0);
}
_getNumAt();
}
}
});

#8


做好上面步骤后我想应该就比较好解决了,比如你再新加一个变量来判断是新增的还是修改的,如果是新增就把那一行插入到数据库,如果是修改那么就更新那一行.
祝你好运,呵呵 .

#9


该回复于2008-05-01 06:27:24被版主删除

#10


package newpackage;
import javax.swing.table.DefaultTableModel;
import java.util.Vector; 
import ucpplib.*;
import ucpplib.NetTable;
/**
 *
 * @author  Administrator
 */
public class NewJFrame extends javax.swing.JFrame {
    
    /** Creates new form NewJFrame */
    public NewJFrame() 
    {
        initComponents();
    } 
    public DefaultTableModel initialTableModel()
    {
        Vector title = new Vector();
//        title.add("编号");
//        title.add("姓名");
//        title.add("性别");
//        title.add("学校");
          title.add("id");
          title.add("name");
          title.add("shape");
        CString dbname = new CString("mail");
        CString tblname = new CString("table");
        NetManager netm ;
         __intp bret = new __intp();
        netm = new NetManager(20);
        newpackage.OsOperate my = new newpackage.OsOperate(netm);//创建一个mgrbaseif对象
        my.SetServer("127.0.0.1",9068);//指定服务器的端口
        NetTable rowids = new NetTable();
        my.TableGetRowidEx(dbname, tblname, 0, 3, bret, rowids);
        NetTable data = new NetTable();
        CString cols = new  CString();
        Vector content = new Vector();
        
        if(my.TableGet(dbname, tblname, rowids, cols, bret, data))
         {
            for(int i = 1,j = 0; i <= data.RowCount(); i++,j=0)
            { 
              Vector data1 = new Vector();
              while(j++ < data.ColCount())
              {
                 
                 data1.add(data.GetData(i, j));
                
              }
               content.add(data1);
            }
          }
       // Vector content = new Vector();
        DefaultTableModel myDefaultTableModel= new DefaultTableModel(content,title);
        return myDefaultTableModel;
        
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(this.initialTableModel());
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(15, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(15, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() 
        {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
    
}

#1


也有可能先添加了好多个空行,然后再添加了某一行数据,这个事件该怎么处理呢,怎么搞的没头绪似的,急求大侠帮忙!!!

#2


如何获取每个添加的数据,并放进Vector呢?

#3


怎么没人帮忙指点一下,是不是太简单了,还是给的分不够,下次多加点分给你们
求各位高手帮个忙吧

#4


给你个思路.如果某一行的数据是从数据库中读取出来的.那么它会多一个字段显示(界面多一列有值).如果是新添加的话,界面上的这一列就会没有值.比如说数据库里的主键.还没有添加的数据是没有主键的.可以按这个思路去做.每一行一行的读,判断一个那个列(主要列)里有没有值.没有值就再取其它的列的值出来,并存到数据库中去.个人建议写一个封装类.就是封装一条数据库的类

public class 帐户类名
{
private String 帐户名称;
private String 帐号;
...
....

对应的get/set方法.

}

得到所有的行
for()
{
得到一行
if(主键列没有值)
{

   创建一个"帐户类名"对像
   取下一列的值放到这个对像中
  ....
  ....
 把对像放到vector里去(现在可以用ArrayList);  
}
}

返回这个vector



保存的方法(Vector  v)
{
遍历这个V.
取得里边的"帐户类名"对像.

使用JDBC把对像里边的属性值保存到数据库中

}




没怎么做SWING说得不好别介意

#5


关注

#6


没太明白....

#7


这是一个非常复杂的问题,我研究了很长一段时间了,由于公司内部代码保密性,我只能给你思路和一部分代码,自己去实现,做这个东东要考虑很多问题的.
1,我们应该让整个表格不能编辑,如果需要编辑了,点一个按钮命令,调用
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
if(toolBarStatus)   //这里的toolBarStatus既控制了是否表格处于编辑状态
return colWritable == null ? false : (columnIndex == 0 ? true : (isAdd?true:colWritable[columnIndex - 1]));
else 
return false;
}
2,既然表格处于了编辑状态,那么就要锁定这一行,如果用户不小心选择了其它行就要弹出相应的提示:
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == 1) {    //鼠标单击左键
if(lockedRow==-1 || lockedRow==getSelectedRow()){
for (int i = 0; i < value.size(); i++) {
value.get(i).setSelected(false);
}
}else{
         final int i=new CpoysyDialog("数据未保存,您确认保存吗?\n点击\"是\"保存,点击\"否\"不保存,点击\"取消\"回到所编辑的行.").openConfirmOkNoCancel();
if(i==0){
_toolBarSaveAction();   //执行保存的命令
}else if(i==1){
_toolBarCancelAction();//执行不保存的命令
}else{
                setRowSelectionInterval(lockedRow, lockedRow);//执行取消的命令,既选中到原来被锁定的行

                return;        }
}

}
}

@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == 1) {
int myRow[] = getSelectedRows();
for (int i = 0; i < myRow.length; i++) {
setValueAt(true, myRow[i], 0);
}
_getNumAt();
}
}
});

#8


做好上面步骤后我想应该就比较好解决了,比如你再新加一个变量来判断是新增的还是修改的,如果是新增就把那一行插入到数据库,如果是修改那么就更新那一行.
祝你好运,呵呵 .

#9


该回复于2008-05-01 06:27:24被版主删除

#10


package newpackage;
import javax.swing.table.DefaultTableModel;
import java.util.Vector; 
import ucpplib.*;
import ucpplib.NetTable;
/**
 *
 * @author  Administrator
 */
public class NewJFrame extends javax.swing.JFrame {
    
    /** Creates new form NewJFrame */
    public NewJFrame() 
    {
        initComponents();
    } 
    public DefaultTableModel initialTableModel()
    {
        Vector title = new Vector();
//        title.add("编号");
//        title.add("姓名");
//        title.add("性别");
//        title.add("学校");
          title.add("id");
          title.add("name");
          title.add("shape");
        CString dbname = new CString("mail");
        CString tblname = new CString("table");
        NetManager netm ;
         __intp bret = new __intp();
        netm = new NetManager(20);
        newpackage.OsOperate my = new newpackage.OsOperate(netm);//创建一个mgrbaseif对象
        my.SetServer("127.0.0.1",9068);//指定服务器的端口
        NetTable rowids = new NetTable();
        my.TableGetRowidEx(dbname, tblname, 0, 3, bret, rowids);
        NetTable data = new NetTable();
        CString cols = new  CString();
        Vector content = new Vector();
        
        if(my.TableGet(dbname, tblname, rowids, cols, bret, data))
         {
            for(int i = 1,j = 0; i <= data.RowCount(); i++,j=0)
            { 
              Vector data1 = new Vector();
              while(j++ < data.ColCount())
              {
                 
                 data1.add(data.GetData(i, j));
                
              }
               content.add(data1);
            }
          }
       // Vector content = new Vector();
        DefaultTableModel myDefaultTableModel= new DefaultTableModel(content,title);
        return myDefaultTableModel;
        
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(this.initialTableModel());
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(15, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(15, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() 
        {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
    
}